In this program we input a number. Our PC tries to guess this number.
After every try PC asks us:"Are your number more or less than?".
We input 'l' if our number is less, and input 'h' if our number is greater?
A range of possible values is created.
I think this code is bad. What do you think?
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int Random(int min, int max) {
return min + rand() % (max - min);
}
int main()
{
setlocale(LC_ALL, "rus");
int our_num;
srand(static_cast<unsigned int>(time(0)));
cout << "Input a positive number: " << endl;
cin >> our_num;
int t = 0; //number of attempts
int max = rand() + our_num; //maximum possible value
int min = 0; //minimum possible value
int d = Random(min, max);
do {
char lh;
cout << d << " Is this your number?(my number is greater: 'h'; less: 'l')" << endl;
cin >> lh;
++t;
if (lh == 'h') {
min = d;
d = Random(min, max);
}
else if (lh == 'l') {
max = d;
d = Random(min, max);
}
} while (d != our_num);
cout << "I guessed thus number with " << t << " attempts. " << "This number is " << d << endl;
return 0;
}
2 Answers 2
Some things stand out here:
return 0
can be dropped from main as it's optionalYou really need better variable names. Names should explain what the variable is used for. If you pick better names your superfluous comments can be removed alltogether
-
2\$\begingroup\$ Elaborating on your final point, it's best not to use
min
andmax
potentially confusing since OP has broughtstd::min/max
into the namespace. \$\endgroup\$cmh– cmh2018年03月04日 21:21:56 +00:00Commented Mar 4, 2018 at 21:21 -
2\$\begingroup\$ I personally prefer to
return EXIT_SUCCESS;
frommain()
, albeit largely because that was the only correct way to do it when I was learning the language. I still prefer the consistency of not using the special-case rules formain()
, and treating it like any other function that returns anint
. \$\endgroup\$Davislor– Davislor2018年03月04日 22:10:20 +00:00Commented Mar 4, 2018 at 22:10 -
1\$\begingroup\$ @Yuri you have basically invalidated how I learned to write C++ code \$\endgroup\$Matthew Barclay– Matthew Barclay2018年03月05日 03:34:29 +00:00Commented Mar 5, 2018 at 3:34
Some considerations on user experience rather than programming style:
cout << "Input a positive number: " << endl; cin >> our_num;
Why user should enter his number before the computer start guessing?? That's not a guessing game.
int max = rand() + our_num; //maximum possible value
should be the maximum number can be stored in an int
(or give a range to the user ("choose a number between __ and __"))
" Is this your number?(my number is greater: 'h'; less: 'l')"
I really miss the option when the guess is correct.
int Random(int min, int max) { return min + rand() % (max - min); }
I think it's really a good idea to put some variability in guessing instead of always going for boring binary search.
"rus"
locale would not be portable. You are probably better off setting the locale to""
and having the user specify their preferred locale in the environment. However, in this example, you’re doing all the output in English anyway. \$\endgroup\$