初めまして、こんばんわ。
学校の課題で、二次方程式のXの解を求めるC言語のプログラムを作ったのですが
何故か巧く起動しません。
よくわかりません・・・。
是非、何処が悪いのか指摘していただくと嬉しいです。


/*2-10(su210.c)*/
#include <stdio.h>
#include <math.h>
main()
{
int a,b,c;
float D,x,y;

printf("a*x^2+b*x+c=0のときa.b.cを入力して下さい。\n");
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
printf("c=");
scanf("%d",&c);

if(a=0){
if(b=c=0) printf("xはすべての実数をとる。");
else{
if(c=0&&b!=0) printf("x=0");
else{
if(b=0&&c!=0) printf("解なし。");
else{
if(b!=0&&c!=0) {x=-c/b; printf("x=%f",x);}
}
}
}
}
else{
if(a!=0){
D=b^2-4*a*c;
if(D>0){
x=(-b+sqrt(D))/2/a;
y=(-b-sqrt(D))/2/a;

printf("判別式はD>0です。\n");
printf("x1=%f\n",x);
printf("x2=%f\n",y);}
else{
if(D=0){x=-b/2*a;printf("判別式はD=0です。\n");printf("x=%f",x);}
else{
if(D<0){printf("判別式はD<0です。\n");printf("解なし。");}
}
}
}
}
}

A 回答 (3件)

#1で回答したものです。



すいません。
if文直しても動きません。
ていうか、
間違えすぎててどこから指摘していいのか
判らないくらい間違ってますよ(汗)。

まず、「^」これは、乗記号ではありません。
Cの演算子にべき乗はないんで、普通にかけるか、pow関数を使います。
それから、else{ if( ... じゃなくて、else if と一気に書いてOKです。
ていうか、カッコの対応が間違ってました。
さらに、int型の変数をint型で割ると小数点以下は打ち切られます。
(b/c)の値が、整数にしかなりません。

文法、もうちょい勉強したほうがよろしいでしょう。
(って生意気なこと言えたクチではありませんが...)

以下、修正したものを。

#include <stdio.h>
#include <math.h>
main()
{
int a,b,c;
float D;

printf("a*x^2+b*x+c=0のときa.b.cを入力して下さい。\n");
printf("a=");
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
printf("c=");
scanf("%d",&c);

if(a==0){
if(b==0&&c==0)printf("xはすべての実数をとる。");
else if(c==0&&b!=0)printf("x=0");
else if(b==0&&c!=0)printf("解なし。");
else if(b!=0&&c!=0)printf("x=%lf",-(c/b));
}
else{
D=(float)((b*b)-4*a*c);
if(D>0){
printf("判別式はD>0です。\n");
printf("x1=%f\n",(-b+sqrt(D))/(2*a));
printf("x2=%f\n",(-b-sqrt(D))/(2*a));
}
else if(D==0){ printf("判別式はD=0です。\n");printf("x=%lf", (double)-b/(2*a));}
else if(D<0){ printf("判別式はD<0です。\n");printf("解なし。");}
}
return 0;
}
    • good
    • 0
この回答へのお礼

わざわざありがとうございます!!
本当助かりました・・・ありがとうございます!!

全部間違えてたんですね・・・
私もまだ、C言語を触って数ヶ月なんで…
これからfatal_error様のお言葉とおり
勉強しなおしてきます。

本当ありがとうございました。

お礼日時:2001/11/17 22:13

No.1の方の補足です。



No.1の方の回答で間違いはないと思います。
現在コンパイル出来る環境にないので試せません。ごめんなさい。

一応、if、else ifを使ったら、慣れないうちは万が一の条件に備えて
(絶対に、これ以外の条件はない!と言い切れる場合を除いて)

else
  printf("無効な条件分岐です");

といった感じの”else文”を付けることをお勧めします。
意外な盲点をついて、このelse文に引っ掛かる場合があります。
もしもの時のバグ探しにも役立ちますよー。
    • good
    • 0
この回答へのお礼

本当にありがとうございます~!!!!!!!

else文ですね~!!
わかりました!!これからあとの課題もそれを使ってやってみます!!
アドバイスの方、本当にありがとうございました!!

お礼日時:2001/11/17 22:18

パッと読んでみただけですが...



if文の中が間違ってますよ。コレ。
(a=b)みたいに書かれてますが、
一致かどうか比較するときは
(a==b)とやります。

たぶんこれを直すと動くんじゃないかな、
と思います。(試してません。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qprintfで0x600000番地の次の0x600001番地の値を出力したい。

H8マイコンの0x600000番地につながるSRAMメモリの内容を見たくて、

#define SRAM_BASE_ADDR0x600000

#defineSRAM_TEST_ADDR*((volatile u8 *)SRAM_BASE_ADDR)

printf("data:%X addr:%p\n\r", SRAM_TEST_ADDR,(void*)&SRAM_TEST_ADDR);

このような形でアドレス0x600000番地のデータをprintf関数で出力してUARTで確認していたのですが、次の0x600001番地のデータをみたい場合はprintf関数をどのように書いたらよいのでしょうか?

Aベストアンサー

((volatile u8 *)SRAM_BASE_ADDR)[1]
とか.

Qif ( fp == NULL ){ を if ( fp == 0){ へ変更した場合

http://oshiete.goo.ne.jp/qa/8897349.html
 ですが
if ( fp == NULL ){ を
if ( fp == 0){
 fopen dekina と表示してくれるのでしょうか?
  試す環境がございませんので
 よろしくお願いいたします。

Aベストアンサー

>if ( fp == 0){
> fopen dekina と表示してくれるのでしょうか?

はい、表示してくれます。
NULLは、通常、(void*)0 の値が定義されていますので、実体は0と同じです。
しかし、NULLはポインターに対して定義されているのなので、
if ( fp == NULL) と書いたほうがよいでしょう。
一方、0は数値を表すので、
if (fp == 0)とは、書かないほうがよいでしょう。
int a;
が定義されていたとき、
if (a ==0) は、a(という数値を表す変数)の値が0か否かを判断するので、これでよいですが
if ( a== NULL) は、a(という数値を表す変数)の値がNULLか否かを判断するので、
違和感がありますから、使用しないほうが良いでしょう。

Qint nII[10] = { 0 }について

久々にCを使ってプログラムを組んでいるのですが、基本的な構文を思い出せず
いくつか教えていただきたく質問させていただきました。

1)配列すべてを初期化するのに、宣言時に

int nII[10] = { 0 };

で大丈夫だった(全ての要素が0で初期化)と記憶しているのですが、間違いないでしょうか?

2)構造体の初期化は

struct tm tm;
memset(&tm, 0, sizeof(struct tm))

で大丈夫でしょうか?

3)構造体の宣言は

typedef struct{
int a;
}HOGE, *LPHOGE;

HOGE st; // <- struct HOGE stと同じ
LPHOGE pst; // <- struct HOGE* pstと同じ

で問題ないでしょうか?

以上、3つ質問になって申し訳ないのですが、よろしくお願いします。

Aベストアンサー

1)OK
2)たぶんOK
3)HOGEという名前の構造体はない(当該の構造体には名前がない)ので、
// 以下のコメント記述が誤っています。ただし、

HOGE st;
LPHOGE pst;
という定義そのものはOK

Qif~else文の中にまたif~else文をいれるには。

 このプログラムを思うように実行したいのですが、できません。
コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。
プログラムのどこを改善すべきか教えてください。
OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。
#include<stdio.h>
int main(){
int a,b,c,d;
printf("1か0を入力してください。\n");
scanf("%d",&a);
if(a=0)
{
printf("2か3を入力してください。\n");
scanf("%d",&b);
if(b=2){
printf("今まで合計は%dです。\n",a+b);
}
if(b=3){
printf("今まで合計は%dです。\n",a+b);
}
else {
printf("指定した数字を入力して下さい。\n");
}
}
else if(a=1)
{
printf("あなたは%dを入力しました。\n",a);
}
else
{
printf("指定した数字を入力してください。\n");
}
return 0;
}

 このプログラムを思うように実行したいのですが、できません。
コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。
プログラムのどこを改善すべきか教えてください。
OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。
#include<stdio.h>
int main(){
int a,b,c,d;
printf("1か0を入力してください。\n");
scanf("%d",&a);
if(a=0)
{
printf("2か3を入力してください。\n");
scanf("%d",&b);
if(b=2){
printf("今まで合計...続きを読む

Aベストアンサー

No1に追加です。No6のかたが回答されていますが、せっかく途中まで書いたので参考までに回答させていただきます。矢印のある行が変更したところです。(矢印は入力しないでください)今は試せないんですけど多分これでできると思います。うまくいかなかったらすいません。あと字下げしても投稿する際に左寄せになってしまうようなので見づらいかもしれませんが許してください。もっといいやり方があると思いますけど参考にしてみてください。

#include<stdio.h>
int main(){
int a,b,c,d;
printf("1か0を入力してください。\n");
scanf("%d",&a);
if(a==0) ←
{
printf("2か3を入力してください。\n");
scanf("%d",&b);
if(b==2) ←
{
printf("今まで合計は%dです。\n",a+b);
}
else  ←
{ 
if(b==3) ←
{ 
printf("今まで合計は%dです。\n",a+b); 
}
else  
{
  printf("指定した数字を入力して下さい。\n"); 
}  ←この } は20行目のelseを終了する意味
}  ←この } は14行目のelseを終了する意味
}  ←この } は7行目のifを終了する意味

if(a==1) ←初めのifが当てはまらなかったり、初めのifの処理を終えるとここへ来る。
{
printf("あなたは%dを入力しました。\n",a);
}
else ←
{
printf("指定した数字を入力してください。\n");
}
return 0;
}

No1に追加です。No6のかたが回答されていますが、せっかく途中まで書いたので参考までに回答させていただきます。矢印のある行が変更したところです。(矢印は入力しないでください)今は試せないんですけど多分これでできると思います。うまくいかなかったらすいません。あと字下げしても投稿する際に左寄せになってしまうようなので見づらいかもしれませんが許してください。もっといいやり方があると思いますけど参考にしてみてください。

#include<stdio.h>
int main(){
int a,b,c,d;
printf("1か0を入...続きを読む


人気Q&Aランキング

おすすめ情報