re Which is better

D

darklight

Q: write a program so that excepts six even numbers
or until the number 99 is entered.
I should of add display only the even numbers entered
sorry!!
the two programs that were wrote done this:

First posted on 21/12/03

one of the replys Wrote:

#include<stdio.h>

int main(void) {
int variable[6], ctr = 0, nbr=0;

printf("Enter 6 values no decimal point or 99 to Quit\n");

for(ctr=0;ctr<6;ctr++) {
scanf("%d",&nbr);

if(nbr % 2 == 0) {
variable[ctr] = nbr;
}
else if(nbr == 99) {
variable[ctr]=99;
puts("Exiting program");
break;
}
else {
puts("number not an even number try again");
}
}
puts("");

for(ctr = 0; ctr < 6 && variable[ctr] != 99; ctr++)
{
printf("%d value %d\n",ctr +1,variable[ctr]);
}
return 0;
}
_________________________________________________________________
When i run program i get
the output

input 43,24,46,78,99

out put
1 value 1073934432
2 value 24
3 value 48
4 value 78
____________________
input 24,43,46,78,99

output
1 value 24
2 value 0
3 value 46
4 value 78
____________________
input 24,46,43,78,99

output
1 value 2
2 value 46
3 value -1073744904
4 value 78

And when i enter four even numbers and two odd numbers it displays
the four even numbers and garbage for the two odd numbers.
What makes me laugh is i am sure when i ran it for the first time
it worked but now i get the output as above.

Could one tell me what is going on?
 
N

nrk

<posted & mailed>
Q: write a program so that excepts six even numbers
or until the number 99 is entered.
I should of add display only the even numbers entered
sorry!!
the two programs that were wrote done this:

First posted on 21/12/03

one of the replys Wrote:

#include<stdio.h>

int main(void) {
int variable[6], ctr = 0, nbr=0;

printf("Enter 6 values no decimal point or 99 to Quit\n");

for(ctr=0;ctr<6;ctr++) {

Note that ctr is always incremented, even if the number entered was odd, or
worse, if the input was not even a number.
scanf("%d",&nbr);

Ideally, you should check the return code of scanf to see if the input was
valid or not. Otherwise, you'll have to eat up the line from the input.
For instance:
int rc;

nbr = 0; /* always initialize nbr */
rc = scanf("%d", &nbr);
if ( rc == 0 ) {
/* invalid input, eat away the line */
scanf("%*[^\n]") != EOF && getchar();
}
else if ( !feof(stdin) ) getchar();

if(nbr % 2 == 0) {
variable[ctr] = nbr;
}

If number was even, variable[ctr] will contain that number.
else if(nbr == 99) {
variable[ctr]=99;
puts("Exiting program");
break;
}

If number was 99, variable[ctr] will contail that number.

However, if number was odd, ctr will be incremented without initializing
variable[ctr] to anything valid!! So, this program results in undefined
behavior as you end up using an uninitialized int. Here's the fix:

else
--ctr; /* dec. ctr so that the for increment is nullified */
else {
puts("number not an even number try again");
}
}
puts("");

for(ctr = 0; ctr < 6 && variable[ctr] != 99; ctr++)
{
printf("%d value %d\n",ctr +1,variable[ctr]);
}
return 0;
}
_________________________________________________________________
When i run program i get
the output

input 43,24,46,78,99

out put
1 value 1073934432
2 value 24
3 value 48
4 value 78
____________________
input 24,43,46,78,99

output
1 value 24
2 value 0
3 value 46
4 value 78
____________________
input 24,46,43,78,99

output
1 value 2
2 value 46
3 value -1073744904
4 value 78

And when i enter four even numbers and two odd numbers it displays
the four even numbers and garbage for the two odd numbers.
What makes me laugh is i am sure when i ran it for the first time
it worked but now i get the output as above.

Same problem as above.

HTH,
-nrk.
 
R

Robert Stankowic

darklight said:
Q: write a program so that excepts six even numbers
or until the number 99 is entered.
I should of add display only the even numbers entered
sorry!!
the two programs that were wrote done this:

First posted on 21/12/03

one of the replys Wrote:

#include<stdio.h>

int main(void) {
int variable[6], ctr = 0, nbr=0;

Here you have an array of 6 _uninitialized_ int
printf("Enter 6 values no decimal point or 99 to Quit\n");

for(ctr=0;ctr<6;ctr++) {

Your counter is incremented at each iteration.
scanf("%d",&nbr);

Ask Dan Pop about the safe use of scanf() or use fgets() and do the
conversion yourself :)
What if the user enters garbage?
OK, let's assume she/he entered a valid number...
if(nbr % 2 == 0) {
variable[ctr] = nbr;

Fine, here you assign a valid int into the int at the current position of
your array
}
else if(nbr == 99) {
variable[ctr]=99;
puts("Exiting program");

Same here..
break;
}
else {
puts("number not an even number try again");

But not here. However you increment ctr, so you leave an uninitialized
member in your array, which in your case happens to be a strange number, but
could as well crash your program later in the call to printf()
}
}
puts("");

for(ctr = 0; ctr < 6 && variable[ctr] != 99; ctr++)
{
printf("%d value %d\n",ctr +1,variable[ctr]);
}
return 0;
}
_________________________________________________________________
When i run program i get
the output

input 43,24,46,78,99

out put
1 value 1073934432

This is the garbage in the uninitialized int variable[0]
2 value 24
3 value 48

I'd expect 46 here...
4 value 78
____________________
input 24,43,46,78,99

output
1 value 24
2 value 0


This is the garbage in the uninitialized int variable[1]
3 value 46
4 value 78
____________________
input 24,46,43,78,99

output
1 value 2

24 maybe?
2 value 46
3 value -1073744904


This is the garbage in the uninitialized int variable[2]
4 value 78

And when i enter four even numbers and two odd numbers it displays
the four even numbers and garbage for the two odd numbers.

See above.
What makes me laugh is i am sure when i ran it for the first time
it worked but now i get the output as above.

Maybe. One of the outcomes of UB is "works as expected, but only on monday
1st when the moon is full"... :)

Merry christmas to all of you
Robert
 
P

Peter Shaggy Haywood

Groovy hepcat darklight was jivin' on Thu, 25 Dec 2003 10:58:35 +0000
(UTC) in comp.lang.c.
re Which is better's a cool scene! Dig it!
Q: write a program so that excepts six even numbers

Goddamnit! Pay attention to what you were told. You were told before
that there is no such word as "excepts", and that what you probably
mean is "accepts". People who don't listen when they're asking for
help are very rude and annoying!
Why did you begin a new thread to discuss something from an existing
thread? Don't do that! It is very irritating.
or until the number 99 is entered.
I should of add display only the even numbers entered
sorry!!
the two programs that were wrote done this:

The above makes no sense.

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,795
Messages
2,569,644
Members
45,359
Latest member
1854578

Latest Threads

Top