Help. Where is my error?

R

Red Dragon

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

printf ("\nYour quadratic equation has two distinct real roots: x1=%1.6f ,x2=%1.6f",x1,x2);
}



else if (E == 0)
{

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

printf ("\nYour quadratic equation has two same: x1=x2=%1.6f\n",x1);
}

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;

}
}
 
G

Geoff Turner

Red Dragon said:
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);
printf ("\nYour quadratic equation has two distinct real roots: x1=%1.6f ,x2=%1.6f",x1,x2);

else if (E == 0)
{
x1 = (float)(-b+sqrt(E))/(2*a);
printf ("\nYour quadratic equation has two same: x1=x2=%1.6f\n",x1);
}

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)?");

/********************************************************
fflush (stdin );
/********************************************************
scanf ("%c",&q);
printf ("\nq = %c\n",q);/* Test statement*/
/snip>
 
M

Michael Mair

Red said:
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
 
K

Keith Thompson

Red Dragon said:
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.)
 
O

Old Wolf

Red said:
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.
 
R

Red Dragon

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
http://groups.google.ca/group/comp.lang.c/msg/3f65f0744a89f300
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.
 
R

Red Dragon

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

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.
 
R

Red Dragon

Keith Thompson said:
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.
 
R

Red Dragon

Old Wolf said:
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"

Thank you for your help and I very much appreciate it. I am doing the exercise in my book and since precision is not an issue here, I have put it on lower priority. But as you rightly point out. I will adopt it as I will be dealing with big figures.
2) You MUST check the return value of scanf() and take appropriate
action if it is wrong

I was doing this. That is why I call it "test statement".
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.

Thanks
Khoon.
 
P

pete

Red said:
Thank you for your help and I very much appreciate it. I am doing the
exercise in my book and since precision is not an issue here, I have
put it on lower priority. But as you rightly point out. I will
adopt it as I will be dealing with big figures.

What are you waiting for?
Unless you have an array of them,
small arithmetic types like float, short, and char,
which often get quietly converted to larger types,
are very probably a poor choice.

I was doing this. That is why I call it "test statement".

int rc;

rc = scanf("%c", &q);
printf("scanf returned a value of %d\n", rc); /* Test statement*/
 
R

Red Dragon

I have got all the results by using 2 scanf(). One is a dummy. I am also using double instead of float.
Below are the results. I am copying and paste from Notepad, so I hope I dont have HTML problem.
Regards,
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; double x1; double x2; double E; int E1; double R; double I;double S;
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);

printf ("\nYour quadratic equation has two distinct real roots: x1=%1.6f ,x2=%1.6f",x1,x2);
}

else if (E == 0)
{

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

printf ("\nYour quadratic equation has two same: x1=x2=%1.6f\n",x1);
}

else

{

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

scanf ("%c",&q); /* Dummy. The computer jumps this scanf() */

scanf ("%c",&q);

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

if ('Y'==q)
{
R = (float)-b/(2*a);
S=abs(E);
S=sqrt(S);
I = S/(2*a);
printf ("\nThe imaginary roots are:\n");
printf (" x1=%1.6f + %1.6fi , x2=%1.6f - %1.6fi\n",R,I,R,I);
}
else
printf ("Thank you for using this computer\n");
}
return 0;
}

/* RESULT
Please key in the value of constant a,b and c for finding the roots of quadratic
equation ax²+bx+c=0 :3 4 1

Your quadratic equation has two distinct real roots: x1=-0.333333 ,x2=-1.000000
Press any key to continue */

/*Please key in the value of constant a,b and c for finding the roots of quadratic
equation ax²+bx+c=0 :1 8 16

Your quadratic equation has two same: x1=x2=-4.000000
Press any key to continue */

/*Please key in the value of constant a,b and c for finding the roots of quadrati
equation ax²+bx+c=0 :4 2 5
Your quadratic equation has two distinct imaginary roots. Do you want to know
the values of the imaginary roots (Y/N)?Y
q = Y

The imaginary roots are:
x1=-0.250000 + 1.089725i , x2=-0.250000 - 1.089725i
Press any key to continue*/

/*Please key in the value of constant a,b and c for finding the roots of quadratic
equation ax²+bx+c=0 :4 2 5
Your quadratic equation has two distinct imaginary roots. Do you want to know
the values of the imaginary roots (Y/N)?N
q = N
Thank you for using this computer
Press any key to continue*/
 
C

Christopher Benson-Manica

Red Dragon said:
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.

Well, whatever you've done worked for this post, at least - we'll let
you know if the problem occurs again.
 
R

Red Dragon

What are you waiting for?
Unless you have an array of them,
small arithmetic types like float, short, and char,
which often get quietly converted to larger types,
are very probably a poor choice.



int rc;

rc = scanf("%c", &q);
printf("scanf returned a value of %d\n", rc); /* Test statement*/

Hi Pete,
I have already been using double.
As for the test, I find that for all inputs of q, "rc" registers 1.
So what is it suppose to test? What does it suppose to show?
I cannot see how to make use of it because everything I do, "scanf returned
a value of 1".
Thanks
Khoon.
 
R

Red Dragon

Well, whatever you've done worked for this post, at least - we'll let
you know if the problem occurs again.

This post of course works because I dont have any C- program loaded on it.
I have yet to see when I paste a C-program on it, what will be its
outcome.

Now I paste from Notepad and not directly from Visual C++ platform.
Please let me know if the problem occurs again.
Thanks
Khoon.
 
T

Tim Rentsch

Red Dragon said:
You have been repeatedly asked not to post using HTML.
Please stop it. This is usenet, not some mailing list or forum.
[snip]

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.

I suggest trying a mail tool other than Microsoft Outlook Express.
Microsoft mail software is well known for behaving in ways that
can cause problems like this.

Probably what you're using to read news hides the HTML-ness
of what you're posting. FYI, here is what gets transmitted
(each line has '>->-> ' at the beginning). I expect you can
see why other people don't like reading postings like this.

->-> From: "Red Dragon" <[email protected]>
->-> Subject: Re: Help. Where is my error?
->-> Newsgroups: comp.lang.c
->-> Date: Tue, 18 Oct 2005 20:43:20 +0800
->-> Organization: TMnet Malaysia
References: <[email protected]> <[email protected]> <[email protected]>
Lines: 281
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_000E_01C5D424.94159240"
X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
NNTP-Posting-Host: 218.111.62.120
X-Original-NNTP-Posting-Host: 218.111.62.120
Message-ID: <[email protected]>
X-Trace: news.tm.net.my 1129639409 218.111.62.120 (18 Oct 2005 20:43:29 +0800)
Path: nntp-server.caltech.edu!hammer.uoregon.edu!news.glorb.com!news-feed01.roc.ny.frontiernet.net!nntp.frontiernet.net!uunet!spool.news.uu.net!ash.uu.net!news1.tm.net.my!not-for-mail
Xref: nntp-server.caltech.edu comp.lang.c:761878
 
R

Red Dragon

->-> any key to=20

Thank you Tim,
I absolutely have no idea of the problem until I saw your post to me. Not
even I dont like to read it, I am unable to read it.
I had purposely sent myself a returned copy of the mail and it was not like
this. The returned copy had not a single line of HTML code.
I suppose why this problem arises is because only readers with Outlook
Express get the mail in its perfect state. Others with different platform
will get it all in HTML.
Thanks for enlightening me.
Regards,
Khoon.
 
R

Red Dragon

Mark McIntyre said:
How many keys do you press, when you supply user input value of 1? One
key or two?

2 keys. One for 1 and One for Enter.
Can you kindly tell me is using 2 scanf() the best solution to the problem?
What is a better method?
Thanks
Rgds,
Khoon.
 

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,768
Messages
2,569,574
Members
45,049
Latest member
Allen00Reed

Latest Threads

Top