- ベストアンサー
C言語(高校1年の内容)について
C言語のプログラムが分かりません。教えて下さい。 --------------------------------------- 課題3(kadai3.c) 次のプログラムでは、割り算が正しく行われないので、直しなさい。 LIST 3-1 1 /* 1500 工業太郎 */ 2 #include <stdio.h> 3 int main(void) 4 { 5 int a,b,wa,sa,seki,syo; 6 printf("数値を一つ入力してください ->"); 7 scanf("%d", &a); 8 printf("数値をもう一つ入力してください ->"); 9 scanf("%d", &b); 10 wa = a + b; 11 sa = a - b; 12 seki = a * b; 13 syo = s / b; 14 printf("a + b = %d\n", wa); 15 printf("a - b = %d\n", sa); 16 printf("a * b = %d\n", seki); 17 printf("a / b = %d\n", syo); 18 return 0; 19 } --------------------------------------- といった内容です。本当によく分かりません。助けて下さい。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
貴方の返事内容を見てきましたが・・・ その問題には、プログラムが異常終了することも考慮する! ということ?もしくは演算値の精度を保証すると言うこと? ・・割り込みは習ったのかな。 その問題は整数の計算なのに、なんで小数点以下も扱うのか? 先生と生徒で暗黙の了解事が、問題に含まれてるのでしょうね。 入力値に数値を入力しなかったら、どうなるか?とか・・・ 復習したら問題の意図がわかるかもしれません。 っと言うことで、私は問題の意味が理解できなくなりました。 対処方法はいろいろあるので。 もちろん、私は貴方は算数は出来ると思ってますので、 貴方を批判してることでは、ありませんよ。 問題の記述に誤記はあり貴方は訂正しましたので理解してると思います。 ただ、どの辺まで考慮するのか、それが私には判らない。 たぶん、問題は基本的な事と思いますが、次のプログラム自体が全て 間違ってる、もしくは、問いの内容自体が曖昧と言い切れる専門家の 方は多数居ると思います。 しかし、復習すれば、すぐ判ると思いますよ。 授業で受けた範囲が問題なのだから。
その他の回答 (10)
なるほどsは質問者さんの打ち間違いでしたか。それではbが0の時の処理を追加する以外考えられませんよね。整数の割算で小数点以下や余りが無視されるのは問題無いと思います。+-×でもオーバーフローについてこの出題では問題にされていません。 bが0の時は割算を実行しないでsyoに0などの値を代入して「0では割れない」などと表示するとか、ですかね。
- tatsu99
- ベストアンサー率52% (391/751)
#7です。 >ということは、「小数点以下が表示されない」と言うことをこの問題は言い>たいのでしょうか? 実は、問題の意図が不明なのです。 それで、この質問をしました。 全ての変数を整数型で行っている以上、 整数同士の演算の為、10/3は商=3 余り=1になります。 これを、「よし」とするなら、上記の問題点は、以下の点です。 a=10 b=0を入力したとき、どうなるかです。 10/0がいくつになるかです。 算数で10÷0は、いくつですか? これはやってみれば、わかりますが、プログラムが異常終了します。 従って、bが0の時は、わり算は行わないで、スキップするようにします。
お礼
解説、ご丁寧にありがとうございました。アドバイスを参考に、自分で、もう1度がんばってみようとおもいます。
- asuncion
- ベストアンサー率33% (2127/6289)
> a=10.0 > b=3.0と入力する必要がありますよね。 int型の変数に"%d"という書式文字列で値を格納しようとしていますので、 そういう入力はできません。あくまで、aは例えば10というint型、bは例えば3というint型です。 C言語では、整数÷整数の計算をするとき、商の小数点以下を切り捨てます。 一方、実数÷実数、実数÷整数、および整数÷実数の計算をするときは、商の小数点以下を保持します。 ということは、割られる数あるいは割る数の少なくとも一方を実数として扱えばよいのです。 整数を、いわば無理矢理に実数として扱う方法として、「キャスト」というものがあります。習ったことがありませんか?
お礼
ご回答ありがとうございます。 キャストというのは習ってません。
- tatsu99
- ベストアンサー率52% (391/751)
a=10 b=3 と入力したとき 商はいくつを期待していますか? a / b = 3 と表示されますが、それではだめですか? もし、だめなら、何の値がでればよいですか?
お礼
ということは、「小数点以下が表示されない」と言うことをこの問題は言いたいのでしょうか? でも、小数点以下を計算するときは、 a=10.0 b=3.0と入力する必要がありますよね。 すいません。よくわかりません。
- Gizensha
- ベストアンサー率34% (207/608)
>自分で試した所、1つも計算ミスは出てきていません。 最初の数字に 53 次の数字に 17 を入力したらどうなるかな。 無料のコンパイラはたくさんあるので自分で試してね。 >提出期限は、火曜日です。 まだ4日もある。がんばれ。
お礼
ありがとうございます。
- Gizensha
- ベストアンサー率34% (207/608)
お金払って学校通っているんだから先生に聞けばいいのに。
お礼
あくまでレポートなので・・・。 土曜日が文化祭で休みで、代わりに月曜日が代休です。 だから、提出期限は、火曜日です。
5行目でa,b,wa,sa,seki,syoという変数は符号付整数ですよと宣言しています。 6~9行目で、a,bに数値を入力しています。a,bという変数を見た時に、これは何だったかなとその宣言を探すべきです。そうすると、5行目を見て、a,bは符号付整数(int)だったと分かります。 10行目でa+bをwaに代入しています。ここで、waって何だったかなと思うべきです。その宣言は5行目にあって、符号付整数だと分かります。また、aとbを足すのですが、aとbの内容はなんだったかなと考えるべきです。そうすると、6~9行目を見返して、キーボードから入力した数値だったと分かります。 11行目でa-bをsaに代入しています。ここで、saって何だったかなと思うべきです。その宣言は5行目にあって、符号付整数でした。また、aからbを引くのですからこの値は確定しているべきです。それを調べると、6~9行目でキーボードから入力された数字だったと分かります。 12行目でa*bをsekiに代入しています。ここで、sekiって何だったかなと思うべきです。その宣言は5行目にあって、符号付整数でした。また、aとbをかけるのですからこの値は確定しているべきです。それを調べると、6~9行目でキーボードから入力された数字だったと分かります。 13行目でs*bをsyoに代入しています。ここで、初めて出てくるsって何だったかなと思うべきです。sに関する宣言はどこを探してもありません。sをbで割ろうとしているのにsには初期値もありません。10行目からここまでを見てくると、このsはaの打ち間違いだろうと言うことが予想できます。 プログラムの動作を考える時は、CPUと同じくらい馬鹿になって、CPUのように愚直にプログラムを自分で実行してみる必要があります。一番いいのは自分のパソコンでCを動かしてみることですね。
補足
すいません。13行目は、間違いでした。 × 13 syo = s / b; 正しくは、 ○ 13 syo = a / b;
- splwtr
- ベストアンサー率16% (75/461)
まずコンパイルが正しく行えませんので、実行もできません。 入力値と演算過程を確認したら直ぐに判ります。 何がどう判らないのか、説明さえもできないのですか?
お礼
なんか、割り算がうまくいかない事があるらしいです。 自分で試した所、1つも計算ミスは出てきていません。
補足
すいません。 13行目は、正しくは 13 syo = a / b; でした。 実習で、割り算やった時、計算が正しく行われてないものなんてなかったのですが。 どこかが違うみたいです。
- asuncion
- ベストアンサー率33% (2127/6289)
前の問題もそうですけど、お友達に教えてもらって、 お礼に昼食でもおごってあげてみたらいかがでしょうか。
補足
すいません。友達も全滅です。誰も分かりません。
- JaritenCat
- ベストアンサー率37% (122/322)
13行目の計算式がちがっているってことですか??
補足
すいません。 13行目は、正しくは 13 syo = a / b; でした。
お礼
みなさん、ご回答ありがとうございました。