Problems with extensive algorithm [closed]

1

I do not know what to do, I think I've made some mistake that I do not know.

In my program the user must think of a number, and the computer should try to guess what number the user thought. The computer may ask the user for a few times whether the number he thought is greater, less than 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);
}
    
asked by anonymous 14.01.2017 / 22:11

2 answers

4

First of all, instead of using this bunch of% s of gambarrados and horrible ones, use math. Imagine if you wanted to make this program for numbers from 1 to 1,000,000,000? It would be monstrous!

Second, do not copy and paste code. Whenever you copy and paste code, an Alaskan seal baby swallows leaking oil into the sea and dies.

So, never copy and paste code!

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

Refined your entire program. It looks like this:

#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);
}

Aside from converting the string to uppercase, I've taken this SOen response .

Ah, if you want to change it to a number from 1 to 1,000,000, just change the ctrl of max and do not need to rewrite everything.

    
15.01.2017 / 01:33
-1

You do not 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;
}
    
14.01.2017 / 22:49