Problems with extensive algorithm

Asked

Viewed 104 times

1

I don’t know what to do, I think I made a mistake I don’t know.

In my program the user must think of a number, and the computer must try to guess which number the user thought. The computer may ask the user for a few times if the number he thought is larger, smaller or equal to the number the user thought.

#include <iostream>
#include <locale>
#include <algorithm>
using namespace std;

string resp;
int res;
int contr;

int resposta(int valor){
    cout<<"O número que você digitou é "<<valor<<endl;
}

int metade(int meta){
    if(contr == 50){
        if(meta == 1){
            contr = contr + contr/2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - contr/2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr == 75 || contr == 25){
        if(meta == 1){
            contr = contr + 12;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 12;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr ==  87|| contr == 63 ){
        if(meta == 1){
            contr = contr + 6;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 6;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr == 13 || contr == 37 ){
        if(meta == 1){
            contr = contr + 6;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 6;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr == 93 || contr == 81){
        if(meta == 1){
            contr = contr + 3;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 3;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr == 69 || contr == 57){
        if(meta == 1){
            contr = contr + 3;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 3;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr == 7  || contr == 19){
        if(meta == 1){
            contr = contr + 3;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 3;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(contr == 31 || contr == 43){
        if(meta == 1){
            contr = contr + 3;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 3;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 96 || crtl == 90){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 72 || crtl == 66){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 78 || crtl == 84){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 60 || crtl == 54){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 10 || crtl == 4){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 22 || crtl == 16){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 28 || crtl == 34){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }else if(crtl == 40 || crtl == 46){
        if(meta == 1){
            contr = contr + 2;
            descobridor(contr);
        }else if(meta == 2){
            contr = contr - 2;
            descobridor(contr);
        }else{
            cout<<"Cheiro de Erro... interno"<<endl;
        }
    }

}

int descobridor(int crtl){
    if(crtl == 75 || crtl == 25){ //1 parte
        cout<<"Seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 87 || crtl == 63 ){ //2 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 13 || crtl == 37 ){ //2 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 93 || crtl == 81){ //3 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 69 || crtl == 57){ //3 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 7 || crtl == 19){ //3parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 31 || crtl == 43){ //3 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 96 || crtl == 90){ //4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 72 || crtl == 66){ //4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);]
        compres();
    }else if(crtl == 78 || crtl == 84){ //4parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 60 || crtl == 54){ //4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 10 || crtl == 4){//4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 22 || crtl == 16){ // 4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 28 || crtl == 34){//4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }else if(crtl == 40 || crtl == 46){//4 parte
        cout<<"O seu número é maior ou igual a "<<contr<<"?"<<endl;
        cin>>resp;
        res = compUni(resp,contr);
        compres();
    }/*else if(crtl == ) codigo esta por terminar */

}

int compUni(string digitado, int control){
    int valor;
    if(digitado == "Sim"){
        valor = 1;
        return valor;
    }else if(digitado == "Nao"){
        valor = 2;
        return valor;
    }else if(digitado == "Igual"){
        valor = 3;
        return valor;
    }else{
        cerr<<"Não sou burro, só pra constar viu, mas confesso que não entendi você";
        valor = 4;
        return valor;
    }
}

int compres(){
    int val;
    switch(res){
        case 1:
            cout<<"Então é maior que "<<contr<<endl;
            val = 1;
            metade(val);
        case 2:
            cout<<"Então é menor que "<<contr<<endl;
            val = 2;
            metade(val);
        case 3:
            resposta(contr);
        case 4:
            cout<<"Digite novamente"<<endl;
            cin>>resp;
            ::res = compUni(resp,contr);
            compres();
        default:
            cout<<"To bugadão tio, malz ae"<<endl;
    }
}

int main(){ //versão 2.0 pq tava muito extenso //esse ficou maior ainda pelo menos eu evito varios if atras do outro e dentro do outro sla mo bagunça
    setlocale(LC_ALL,"Portuguese");
    cout<<"Este programa funciona da seguinte maneira... \n"
        <<"Pense num número de 1 a 100 que eu vou usar minhas habilidades... \n"
        <<"Agora quero que responda usando Sim , Nao e Igual... \n Boa Sorte!! \n"
        <<"Tipo assim, Sim quando for maior, Nao quando for menor, e igual... quando for igual né poxa! \n"
        <<"Seu número é maior ou igual a 50?"
        <<endl;
    cin>>resp;
    contr = 50;
    ::res = compUni(resp,contr);
    compres();
    resposta(contr);
    descobridor(contr);
}
  • 1

    Which error message is it? Looking over your top, your code seems to be too "amateur" not to say worse, of a refactored in it, impossible to need all these ifs to deal only with numbers!

  • I started with c++ recently

  • I have no idea how to make the program find its number thought

2 answers

4


First of all, instead of using this pile of ifs mischievous and hideous, use math. Imagine if you wanted to do this program for numbers from 1 to 1,000,000,000? It would look monstrous!

Second, don’t copy and paste code. Whenever you copy and glue code, a baby Alaskan seal swallows oil poured into the sea and dies. So never copy and paste code!

Third, your code has build errors. Sometimes you use contr and sometimes ctrl. You also put the functions out of order. There are a lot of mistakes, nor did I bother to see everything.

I redid your entire program. That’s how it was:

#include <iostream>
#include <locale>
#include <algorithm>
using namespace std;

enum Resposta {
    Maior, Menor, Igual
};

void maiusculas(string &s) {
    transform(s.begin(), s.end(), s.begin(), std::ptr_fun<int, int>(std::toupper));
}

Resposta perguntar(int valor) {
    while (1) {
        cout << "Seu número é 'Maior', 'Menor' ou 'Igual' a " << valor << "?" << endl;
        string resp;
        cin >> resp;
        maiusculas(resp);
        if (resp == "MAIOR") return Maior;
        if (resp == "MENOR") return Menor;
        if (resp == "IGUAL") return Igual;
        cout << "Não sou burro, só pra constar viu, mas confesso que não entendi você." << endl;
    }
}

void descobridor(int min, int max) {
    while (1) {
        if (max < min) {
            cout << "Sabe o que você é?" << endl
                 << "UM BAITA DE UM MENTIROSO." << endl
                 << "BABACA!" << endl
                 << "Não quero mais brincar com você..." << endl;
            return;
        }
        if (max == min) {
            cout << "O número que você pensou é " << max << "." << endl;
            return;
        }
        int meio = (max + min) / 2;
        Resposta resp = perguntar(meio);
        if (resp == Menor) {
            max = meio - 1;
        } else if (resp == Maior) {
            min = meio + 1;
        } else if (resp == Igual) {
            min = max = meio;
        } else {
            cout << "Tô bugadão tio, malz aê..." << endl;
            return;
        }
    }
}

int main() {
    int min = 1;
    int max = 100;
    setlocale(LC_ALL, "Portuguese");
    cout << "Este programa funciona da seguinte maneira..." << endl
         << "Pense num número de " << min << " a " << max << " que eu vou usar minhas habilidades..." << endl
         << "Agora quero que responda usando 'Maior', 'Menor' e 'Igual'..."
         << "Boa Sorte!" << endl;
    descobridor(min, max);
}

The part of converting the string to uppercase, I took of Soen’s reply.

Ah, if you want to change it to a number from 1 to 1,000,000, just change the max of main and you don’t have to rewrite everything.

  • I’ve never used Num, I didn’t really get to that part of the book, but thank you, I’ll avoid gambiarradas comparisons and use more logic

-1

You don’t need to compare each number, something like that is enough.

#include <stdio.h>
#include <stdlib.h>

int main() {

    srand(time(NULL));
    int numero, acertou = 0;
    int aleatorio = rand() % 100 + 1;

    while(!acertou) {

        printf("\nDigite um numero: ");
        scanf("%d", &numero);

        if(numero > aleatorio) {
            printf("E maior.\n");
        } else if(numero < aleatorio) {
            printf("E menor.\n");
        } else {
            printf("\nVoce acertou, %d era o numero", aleatorio);
            acertou = 1;
        }
    }
    return 0;
}
  • From what I understand, it is not the user who has to guess what number the computer thought, but the computer guess the number the user thought.

  • That’s the idea, one of the algorithms I thought would be this... but then it went bad

Browser other questions tagged

You are not signed in. Login or sign up in order to post.