Velocity Reviews > Help. Where is my error?

# Help. Where is my error?

Red Dragon
Guest
Posts: n/a

 10-17-2005
I am self study C student. I got stuck in the program below on quadratic equation and will be most grateful if someone could help me to unravel the mystery.
Why does the computer refuse to execute my scanf ("%c",&q);
On input 3 4 1 (for a,b and c) I had real roots OK
On input 1 8 16 I had same real roots OK.

However on 4 2 5, (for imaginary roots ) the computer cannot see the scanf ("%c",&q); statement. It just jumps over it.
How can I make the computer not to ignore this statement? I am on Visual C++ platform.
Thanks
Khoon.

/* Roots of a Quadratic Equation.
12.10.05 */

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

int main (void)

{
int a; int b; int c; float x1; float x2; int E; int E1; float R; float I;float S;
char p; char q; char y;

printf ("Please key in the value of constant a,b and c for finding the roots of quadratic");
printf ("equation ax%c+bx+c=0 :",253);
scanf ("%d%d%d", &a,&b,&c);

E =(b*b)-(4*a*c);

if ( E > 0)
{
x1 = (float)(-b+sqrt(E))/(2*a);
x2 = (float)(-b-sqrt(E))/(2*a);

}

else if (E == 0)
{

x1 = (float)(-b+sqrt(E))/(2*a);

}

else
{

p = 'y';

printf ("Your quadratic equation has two distinct imaginary roots. Do you want to know\n");
printf ("the values of the imaginary roots (Y/N)?");

scanf ("%c",&q);

printf ("\nq = %c\n",q);/* Test statement*/

if (p==q)
printf ("OK I will show your the imaginary roots tomorrow.\n");

else
printf ("Good bye\n");

return 0;

}
}

Geoff Turner
Guest
Posts: n/a

 10-17-2005

"Red Dragon" <(E-Mail Removed)> wrote in message
>news:(E-Mail Removed)...
>I am self study C student. I got stuck in the program below on quadratic

equation and will be >most grateful if someone could help me to unravel the
mystery.
>Why does the computer refuse to execute my scanf ("%c",&q);
>On input 3 4 1 (for a,b and c) I had real roots OK
>On input 1 8 16 I had same real roots OK.

>However on 4 2 5, (for imaginary roots ) the computer cannot see the

scanf ("%c",&q); >statement. It just jumps over it.
>How can I make the computer not to ignore this statement? I am on Visual

C++ platform.
>Thanks
>Khoon.

>/* Roots of a Quadratic Equation.
> 12.10.05 */

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

>int main (void)

>{
>int a; int b; int c; float x1; float x2; int E; int E1; float R; float

I;float S;
>char p; char q; char y;

>printf ("Please key in the value of constant a,b and c for finding the

> printf ("equation ax%c+bx+c=0 :",253);
>scanf ("%d%d%d", &a,&b,&c);

> E =(b*b)-(4*a*c);

> if ( E > 0)
> {
> x1 = (float)(-b+sqrt(E))/(2*a);
> x2 = (float)(-b-sqrt(E))/(2*a);

,x2=%1.6f",x1,x2);
> }

> else if (E == 0)
> {

> x1 = (float)(-b+sqrt(E))/(2*a);

> }

> else
> {

> p = 'y';

you want to know\n");
> printf ("the values of the imaginary roots (Y/N)?");

/************************************************** ******
fflush (stdin );
/************************************************** ******
> scanf ("%c",&q);

> printf ("\nq = %c\n",q);/* Test statement*/

/snip>

Walter Roberson
Guest
Posts: n/a

 10-17-2005
In article <dj0cbe\$nc\$(E-Mail Removed)>,
Geoff Turner <(E-Mail Removed)> wrote:

> fflush (stdin );

No! fflush() has no defined behaviour on an input stream!!

--
I am spammed, therefore I am.

Walter Roberson
Guest
Posts: n/a

 10-17-2005
In article <(E-Mail Removed)>,
Red Dragon <(E-Mail Removed)> wrote:
>I am self study C student. I got stuck in the program below on
>quadratic equation and will be most grateful if someone could help me to
>unravel the mystery.
>Why does the computer refuse to execute my scanf ("%c",&q);

We go through this about every second day, and it is surely
in the FAQ.

My explanation of a week ago can be found at

--
Is there any thing whereof it may be said, See, this is new? It hath
been already of old time, which was before us. -- Ecclesiastes

Michael Mair
Guest
Posts: n/a

 10-17-2005
Red Dragon wrote:
> I am self study C student. I got stuck in the program below on
> quadratic equation and will be most grateful if someone could help me to
> unravel the mystery.
> Why does the computer refuse to execute my * scanf ("%c",&q); *
> On input 3 4 1 (for a,b and c) I had real roots OK
> On input 1 8 16 I had same real roots OK.
>
> However on 4 2 5, (for imaginary roots ) the computer cannot see the
> *scanf ("%c",&q);* statement. It just jumps over it.
> How can I make the computer not to ignore this statement? I am on
> Visual C++ platform.
> Thanks
> Khoon.

<snip!>

You have been repeatedly asked not to post using HTML.
Please stop it. This is usenet, not some mailing list or forum.

Read the FAQ on input using scanf() -- it is not advisable.
At all.

Apart from that: You did not look at the return value of scanf()
so how do you know what happened? You also seem not to have used
the debugger which comes with your IDE.

-Michael
--
E-Mail: Mine is an /at/ gmx /dot/ de address.

Keith Thompson
Guest
Posts: n/a

 10-17-2005
"Red Dragon" <(E-Mail Removed)> writes:
> I am self study C student. I got stuck in the program below on quadratic
> equation and will be most grateful if someone could help me to unravel the
> mystery.
> Why does the computer refuse to execute my scanf ("%c",&q);

It doesn't. Your call to scanf("%c", &q) is doing exactly what it's
supposed to do.

To find out what it's supposed to do, read the documentation for
scanf().

You're almost certainly better off using a different method to read
input. A common technique is to use fgets() to read a line at a time,
then use sscanf() to parse the string. (This can have its own
drawbacks; fgets() either leaves the newline character in the input
string, or truncates the line if it's too long.)

--
Keith Thompson (The_Other_Keith) http://www.velocityreviews.com/forums/(E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.

Old Wolf
Guest
Posts: n/a

 10-17-2005
Red Dragon wrote:
> I am self study C student. I got stuck in the program below on
> quadratic equation and will be most grateful if someone could help
> me to unravel the mystery.
> Why does the computer refuse to execute my scanf ("%c",&q);

You posted this program a couple of weeks ago and got lots
of advice. But you seem to have ignored most of this advice.
Here it is again:

1) x1, x2, R, I, S should be "double", not "float"
2) You MUST check the return value of scanf() and take appropriate
action if it is wrong
3) Don't do any casting (eg. in the line "x1 = (float)FOO")
4) The "return 0" goes AFTER the "else" block, not inside it.

Hint: If you printf the result of your scanf("%c") using
%d, you might understand what is going on.

Red Dragon
Guest
Posts: n/a

 10-18-2005
> We go through this about every second day, and it is surely
> in the FAQ.
>
> My explanation of a week ago can be found at
>
> --
>Quote from Google: Is there any thing whereof it may be said, See, this is new? It hath

scanf() with a %c format element reads *exactly* one character. You
are entering two characters, the input you want and the newline to
terminate the line. Thus after the first scanf(), you still have
a character in the input buffer waiting to be read by the second
scanf().

Dear Walter,
Yes Mr. Walter. This is the exact problem I am having. I dont quite understand the phrase "newline to terminate the line". What is it? It is the "\n" thing? Or a "space"? Can you explain what is the "newline to terminate the line"? How shall I solve the problem? I can use two scanf() line and it will solve the problem. The first scanf() reads the "newline..." and the second scanf() will read my input. Is this the normal way to solve the problem? What is the proper way? Sorry for asking you so many questions.
Thank you.
Khoon.

Red Dragon
Guest
Posts: n/a

 10-18-2005
>
> You have been repeatedly asked not to post using HTML.
> Please stop it. This is usenet, not some mailing list or forum.
>
> Read the FAQ on input using scanf() -- it is not advisable.
> At all.
>
> Apart from that: You did not look at the return value of scanf()
> so how do you know what happened? You also seem not to have used
> the debugger which comes with your IDE.
>
> -Michael
> --
> E-Mail: Mine is an /at/ gmx /dot/ de address.

Mr. Michael,
I wish to apologize for causing you problem. I did not know I was causing a
problem.
1. The dont understand the HTML thing. I did not use HTML. What I did was
to copy from my Visual C++ platform and paste on the Outlook Express
screen. With Mr. Skarmander's instruction, I have set the radio button to
"Plain Text" on the Send Tab and thought the problem is solved. I have
actually sent a copy of the outgoing mail to myself and I dont see any HTML
thing on my screen on the returned copy. So I dont know what else to do.

2. Yes. I tried to look at the return value of scanf() but got nothing
because the computer skipped it . As I just found out, it actually read
the "newline" (I dont know what it is ) so it registered nothing, creating
the problem in question.

3. What is debugger and IDE.? Hope you can bear with me because I am new
to all this and am doing self study. I have nobody else to ask.

Thank you and sorry again.
Khoon.

Red Dragon
Guest
Posts: n/a

 10-18-2005

"Keith Thompson" <(E-Mail Removed)> wrote in message news:(E-Mail Removed)...
> "Red Dragon" <(E-Mail Removed)> writes:
>> I am self study C student. I got stuck in the program below on quadratic
>> equation and will be most grateful if someone could help me to unravel the
>> mystery.
>> Why does the computer refuse to execute my scanf ("%c",&q);

>
> It doesn't. Your call to scanf("%c", &q) is doing exactly what it's
> supposed to do.
>
> To find out what it's supposed to do, read the documentation for
> scanf().

I have read the documentation in the Google as recommended by Walter. I understand now what has happened. On program running, my scanf() read the "newline" instruction in the buffer and jumped to the next statement. So I dont have a chance to make an input. To solve the problem, I can put in 2 scanf()s. But is this the correct way?
Rgds,
Khoon.

> You're almost certainly better off using a different method to read
> input. A common technique is to use fgets() to read a line at a time,
> then use sscanf() to parse the string. (This can have its ow
> drawbacks; fgets() either leaves the newline character in the input
> string, or truncates the line if it's too long.)