#include <stdio.h>
#include <time.h>
int CheckNumbers(int, int);
int main()
{
// Generates random number between 1-10
srand(time(NULL));
int comp_num = (rand() % 10 +1);
// Gets the users number
int player_num = 0;
do
{
printf("Enter in a number (1-10): ");
scanf("%d", &player_num);
int result = CheckNumbers(player_num, comp_num);
// determines if the numbers are the same
if(result == 1)
{
printf("The number you entered is the same as the computers.\n");
getchar();
}
else
{
printf("You and the computers numbers are different.\n");
printf("computer number: %d & your number is: %d\n\n", comp_num, player_num);
printf("Try again!\n\n");
getchar();
}
}while(result != 1);
return 0;
}
///////////////////////////
//
// FUNCTION DEFINITIONS
//
///////////////////////////
int CheckNumbers(int num, int comp_num)
{
if(num == comp_num)
return 1;
else
return 0;
}
C Do/While Loop problem
#1 Members - Reputation: 173
Posted 30 November 2012 - 02:30 PM
#2 Members - Reputation: 173
Posted 30 November 2012 - 02:37 PM
#4 Members - Reputation: 1880
Posted 30 November 2012 - 02:41 PM
for(;;) // this syntax loops indefinitely, so the only way out is a break, return, or exception.
{
// stuff
int result = whatever;
if (result == x)
break;
}
Edited by Nypyren, 30 November 2012 - 02:42 PM.
#5 Members - Reputation: 214
Posted 03 December 2012 - 03:13 AM
I tend to use a "manual break" pattern when I don't want to lift the variable out of the loop. Some people might argue that this is a code smell, but I prioritize "narrowest variable scoping" and "use the least number of variables that work" in this case.
for(;;) // this syntax loops indefinitely, so the only way out is a break, return, or exception. { // stuff int result = whatever; if (result == x) break; }
I sometime do the same thing, but without "for". I consider this a bit safer approach as it doesn't hit you so bad when you forget the break:
{
// stuff
int result = whatever;
if (result == x)
// other stuff
}
#6 Members - Reputation: 1588
Posted 03 December 2012 - 06:30 PM
I tend to use a "manual break" pattern when I don't want to lift the variable out of the loop. Some people might argue that this is a code smell, but I prioritize "narrowest variable scoping" and "use the least number of variables that work" in this case.
for(;;) // this syntax loops indefinitely, so the only way out is a break, return, or exception. { // stuff int result = whatever; if (result == x) break; }
for(int result; result != x; ) // this syntax loops indefinitely, so the only way out is a break, return, or exception.
{
// stuff
result = whatever;
}
?
There are ten kinds of people in this world: those who understand binary and those who don't.
#7 Members - Reputation: 5899
Posted 03 December 2012 - 09:47 PM
That syntax uses `result' uninitialized. I am perfectly happy with the infinite-loop-with-break solution.for(int result; result != x; ) // this syntax loops indefinitely, so the only way out is a break, return, or exception. { // stuff result = whatever; }
?
#8 Members - Reputation: 1307
Posted 03 December 2012 - 11:37 PM
So if x is unknown, you would have to initialized with something like "result = x+1" to be safe, resulting in awkward code that is more confusing than it has to be..
#9 Moderator* - Reputation: 5411
Posted 03 December 2012 - 11:43 PM
Am I missing something? Because the way I read that, there's no looping, and if there's no looping, it's purpose is entirely different than the looping version, in which case you don't do the same thing...I sometime do the same thing, but without "for". I consider this a bit safer approach as it doesn't hit you so bad when you forget the break:
{ // stuff int result = whatever; if (result == x) // other stuff }
#10 Members - Reputation: 214
Posted 04 December 2012 - 01:11 AM
Am I missing something? Because the way I read that, there's no looping, and if there's no looping, it's purpose is entirely different than the looping version, in which case you don't do the same thing...
I sometime do the same thing, but without "for". I consider this a bit safer approach as it doesn't hit you so bad when you forget the break:{ // stuff int result = whatever; if (result == x) // other stuff }
No you're absolutely correct. I was just focusing on the scoping part of Nypyren's post. However now that you mentioned I probably misinterpreted Nypyren's reason for the block as the topic of the discussion is loops after all..
#11 Members - Reputation: 1588
Posted 04 December 2012 - 01:46 AM
Here's an upgraded version:
[source lang="cpp"]void operator,() { for(int result = initial_val; result != x; ) { //do stuff result = whatever; }}[/source]
Anyway, I'll use 'while(true)' sometimes, although MSVC has an annoying warning about it. Suppose it's a matter of preference.
Edited by Khatharr, 04 December 2012 - 01:54 AM.
There are ten kinds of people in this world: those who understand binary and those who don't.
#12 Crossbones+ - Reputation: 3590
Posted 04 December 2012 - 04:28 AM
What does the warning say? If it's because of "true", you can just use 1 (or any value different from zero, really). Or does it literally babysit you saying "this is an infinite loop"?Anyway, I'll use 'while(true)' sometimes, although MSVC has an annoying warning about it. Suppose it's a matter of preference.
#14 Members - Reputation: 3830
Posted 04 December 2012 - 05:46 AM
What does the warning say? If it's because of "true", you can just use 1 (or any value different from zero, really). Or does it literally babysit you saying "this is an infinite loop"?
Anyway, I'll use 'while(true)' sometimes, although MSVC has an annoying warning about it. Suppose it's a matter of preference.
"while (1)" throws the warning as well - conditional expression is constant. Personally I prefer to have the warning and just use "for (;;)" instead - the warning is far more useful than being able to do "while (1)".
It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.
#15 Members - Reputation: 1588
Posted 04 December 2012 - 03:37 PM
Pity there's no explicit unconditional loop.
"for(;;)" looks like the arachnid version of a revolutionary's wall art. Or maybe it's a walrus?
Do we have an ASCII expert in here?
There are ten kinds of people in this world: those who understand binary and those who don't.
#16 Moderator* - Reputation: 5411
Posted 04 December 2012 - 04:43 PM
What do you need an ASCII expert for (not claiming to be one)?Do we have an ASCII expert in here?
#18 Crossbones+ - Reputation: 3590
Posted 04 December 2012 - 05:51 PM
Well, I agree that for(;;) looks horrible and is much less readable at a glance than while(true), but if you can just remember that it means "loop indefinitely" then I guess it's fine."for(;;)" looks like the arachnid version of a revolutionary's wall art. Or maybe it's a walrus?
#20 Members - Reputation: 3830
Posted 04 December 2012 - 07:12 PM
I agree that the warning could potentially be useful, but I've probably triggered it a million times and it was always an intentional unconditional loop.
Have a read: http://stackoverflow.com/questions/3490823/why-msvc-generates-warning-c4127-whan-constant-is-used-in-while-c - it outlines the general usefulness of the warning. My general philosophy on this is that if it saves your ass even just once then it's probably worth it.
The one case where I do agree that it's a pain is "do { ... } while (1)".
Pity there's no explicit unconditional loop.
According to the link above "for (;;)" is actually what is explicitly defined to be an infinite/unconditional loop, but I haven't cross-checked with the standard so take it with the appropriately sized grain of salt.
"for(;;)" looks like the arachnid version of a revolutionary's wall art. Or maybe it's a walrus?
Definitely a walrus.
It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.






