• ベストアンサー

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 } --------------------------------------- といった内容です。本当によく分かりません。助けて下さい。

noname#129461
noname#129461

質問者が選んだベストアンサー

  • ベストアンサー
  • splwtr
  • ベストアンサー率16% (75/461)
回答No.10

貴方の返事内容を見てきましたが・・・ その問題には、プログラムが異常終了することも考慮する! ということ?もしくは演算値の精度を保証すると言うこと? ・・割り込みは習ったのかな。 その問題は整数の計算なのに、なんで小数点以下も扱うのか? 先生と生徒で暗黙の了解事が、問題に含まれてるのでしょうね。 入力値に数値を入力しなかったら、どうなるか?とか・・・ 復習したら問題の意図がわかるかもしれません。 っと言うことで、私は問題の意味が理解できなくなりました。 対処方法はいろいろあるので。 もちろん、私は貴方は算数は出来ると思ってますので、 貴方を批判してることでは、ありませんよ。 問題の記述に誤記はあり貴方は訂正しましたので理解してると思います。 ただ、どの辺まで考慮するのか、それが私には判らない。 たぶん、問題は基本的な事と思いますが、次のプログラム自体が全て 間違ってる、もしくは、問いの内容自体が曖昧と言い切れる専門家の 方は多数居ると思います。 しかし、復習すれば、すぐ判ると思いますよ。 授業で受けた範囲が問題なのだから。

その他の回答 (10)

noname#81590
noname#81590
回答No.11

 なるほどsは質問者さんの打ち間違いでしたか。それではbが0の時の処理を追加する以外考えられませんよね。整数の割算で小数点以下や余りが無視されるのは問題無いと思います。+-×でもオーバーフローについてこの出題では問題にされていません。  bが0の時は割算を実行しないでsyoに0などの値を代入して「0では割れない」などと表示するとか、ですかね。

noname#129461
質問者

お礼

みなさん、ご回答ありがとうございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.9

#7です。 >ということは、「小数点以下が表示されない」と言うことをこの問題は言い>たいのでしょうか? 実は、問題の意図が不明なのです。 それで、この質問をしました。 全ての変数を整数型で行っている以上、 整数同士の演算の為、10/3は商=3 余り=1になります。 これを、「よし」とするなら、上記の問題点は、以下の点です。 a=10 b=0を入力したとき、どうなるかです。 10/0がいくつになるかです。 算数で10÷0は、いくつですか? これはやってみれば、わかりますが、プログラムが異常終了します。 従って、bが0の時は、わり算は行わないで、スキップするようにします。

noname#129461
質問者

お礼

解説、ご丁寧にありがとうございました。アドバイスを参考に、自分で、もう1度がんばってみようとおもいます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.8

> a=10.0 > b=3.0と入力する必要がありますよね。 int型の変数に"%d"という書式文字列で値を格納しようとしていますので、 そういう入力はできません。あくまで、aは例えば10というint型、bは例えば3というint型です。 C言語では、整数÷整数の計算をするとき、商の小数点以下を切り捨てます。 一方、実数÷実数、実数÷整数、および整数÷実数の計算をするときは、商の小数点以下を保持します。 ということは、割られる数あるいは割る数の少なくとも一方を実数として扱えばよいのです。 整数を、いわば無理矢理に実数として扱う方法として、「キャスト」というものがあります。習ったことがありませんか?

noname#129461
質問者

お礼

ご回答ありがとうございます。 キャストというのは習ってません。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.7

a=10 b=3 と入力したとき 商はいくつを期待していますか? a / b = 3 と表示されますが、それではだめですか? もし、だめなら、何の値がでればよいですか?

noname#129461
質問者

お礼

ということは、「小数点以下が表示されない」と言うことをこの問題は言いたいのでしょうか? でも、小数点以下を計算するときは、 a=10.0 b=3.0と入力する必要がありますよね。 すいません。よくわかりません。

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.6

>自分で試した所、1つも計算ミスは出てきていません。 最初の数字に 53 次の数字に 17 を入力したらどうなるかな。 無料のコンパイラはたくさんあるので自分で試してね。 >提出期限は、火曜日です。 まだ4日もある。がんばれ。

noname#129461
質問者

お礼

ありがとうございます。

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.5

お金払って学校通っているんだから先生に聞けばいいのに。

noname#129461
質問者

お礼

あくまでレポートなので・・・。 土曜日が文化祭で休みで、代わりに月曜日が代休です。 だから、提出期限は、火曜日です。

noname#81590
noname#81590
回答No.4

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を動かしてみることですね。

noname#129461
質問者

補足

すいません。13行目は、間違いでした。 × 13 syo = s / b; 正しくは、 ○ 13 syo = a / b;

  • splwtr
  • ベストアンサー率16% (75/461)
回答No.3

まずコンパイルが正しく行えませんので、実行もできません。 入力値と演算過程を確認したら直ぐに判ります。 何がどう判らないのか、説明さえもできないのですか?

noname#129461
質問者

お礼

なんか、割り算がうまくいかない事があるらしいです。 自分で試した所、1つも計算ミスは出てきていません。

noname#129461
質問者

補足

すいません。 13行目は、正しくは 13 syo = a / b; でした。 実習で、割り算やった時、計算が正しく行われてないものなんてなかったのですが。 どこかが違うみたいです。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

前の問題もそうですけど、お友達に教えてもらって、 お礼に昼食でもおごってあげてみたらいかがでしょうか。

noname#129461
質問者

補足

すいません。友達も全滅です。誰も分かりません。

回答No.1

13行目の計算式がちがっているってことですか??

noname#129461
質問者

補足

すいません。 13行目は、正しくは 13 syo = a / b; でした。

関連するQ&A

  • このC言語プログラムでどこをいじればいいのか教えて下さい。

    このC言語プログラムでどこをいじればいいのか教えて下さい。 //2 つの整数を入力し、和、差、積、商を計算し表示する。 #include<stdio.h> int main(void) { int a,b,wa,sa,seki,syou; scanf("%d %d",&a,&b); wa=a+b; sa=a-b; seki=a*b; syou=a/b; printf("%d+%d=%d\n",a,b,wa); printf("%d-%d=%d\n",a,b,sa); printf("%d*%d=%d\n",a,b,seki); printf("%d/%d=%d\n",a,b,syou); return (0); } これを繰り返し実行する形にしたいです。できれば今勉強中のwhileでお願いします。 また間違っている部分、指摘などありましたら宜しくお願いします。 大きな値をいれると足し算がダメになったり、割り算がおかしくなります。 また実数の時はどうなのかなど教えて下さい。

  • プログラミングCの四則計算について質問です

    どうしてもわからなかったのでご指摘お願いします。 以下のプログラムを四則計算ができるプログラムに変更したいのですがどこを直せばいいのでしょうか? /* ansp5_7 */ #include <stdio.h> void wasa(int a,int b,int *w,int *x,int *y,float *z); main() { int d1,d2,wa,sa,seki; float syou; printf("data1,data2="); scanf("%d,%d",&d1,&d2); wasa(d1,d2,&wa,&sa,&seki,&syou); printf("wa=%d,sa=%d,seki=%d,syou=%5.2f\n",wa,sa,seki,syou); } void wasa(int a,int b,int *w,int *x,int *y,float *z) { *w=a+b; *x=a-b; *y=a*b; *z=(float)a/b; }

  • c言語で

    c言語で /*a==bのとき商と余を求めるそれ以外は積を求める*/ # include<stdio.h> main () { int a,b,seki,sho,joyo; printf("aとbを入力してください\n"); scanf("%d %d", &a,&b); if(a==b) printf("sho=%d\n",(a/b)); printf("joyo=%d\n",(a%b)); else printf("seki=%d\n",(a*b)); return(0); } はどこがおかしいでしょうか? あと /*小数点*/ # include<stdio,h> main () { float a,b,seki,sho,joyo; printf("%f %f",&a,&b); if(a>b) printf("sho=%f4.3\n",(a/b)); printf("joyo=%f4.3\n",(a%b)); else printf("seki=%f4.3\n",(a*b)); return (0) にいたってはエラーの嵐なのですがどうすればいいでしょうか

  • C言語のswitch文について間違っているところを教えてください

    初めに初心者ですので間違っているところは説明つきの回答をしていただければありがたいです。 今回switch文を使って 「足し算、引き算、掛け算、割り算」のプログラムを作ったつもりなのですが、intを使うと割り算の小数点が出ないしfioat文を使うとswitch文には、使えないと出るしどのようにしたら良いのか御回答よろしくお願いします。 (今は、int文でプログラムを作っているつもりです。) #include <stdio.h> void main (void) { int a,b,k; printf("どのような計算をしたいか数字を選んでください。\n"); printf(" 1.足し算 (例 a+b)\n"); printf(" 2.引き算 (例 aーb)\n"); printf(" 3.掛け算 (例 a×b)\n"); printf(" 4.割り算 (例 a÷b)\n"); printf("計算したい番号を入力してください "); scanf("%d",&k); switch (k){ case 1: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a+b で %d です\n",a+b); break; case 2: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは aーb で %d です\n",a-b); break; case 3: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a×b で %d です\n",a*b); break; case 4: printf("aを入力してください "); scanf("%d",&a); printf("bを入力してください "); scanf("%d",&b); printf("\n答えは a÷b で %d です\n",a/b); break; default: printf("明記してあるどれかの数字を再入力してください"); } }

  • C言語

    このプログラムを作りたいのですが… ??????????? 物の総数を入れてください:12 取り出す物の数を入れてください:2 12個の異なる物から2個をを取り出す組み合わせの数は66です ?????????????? ここに出てくる数字は scanfで入れます。 だいたい こんな感じだと思うのですが… ***********の部分が わかりません。 ??????????????? #include<stdio.h> int factorial(int m,int r) { ************** } int main(void) {int a,b; printf("物の総数を入れてください:") scanf("%d",&a); printf("取り出す物の数を入れてください:") scanf("%d",&b); printf("12個の異なる物から2個を取り出す組み合わせの数は%dです。\n",a,b,factorial(a,b));) ?????????????? お願いします(>_<)

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • c言語についてですが

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define D_ABC 50 #define S_NUMBER 5 int main( void ) { int abc[ D_ABC ]; int goukei; int homi; int sa[S_NUMBER]; int s; int m; int p; int k; s = 0; printf( "指定する数値を入力して下さい。\n"); do{ scanf( "%d", &sa[s++] ); } while(sa[s-1] > 0 ); --s; p = 0; printf( "指定する数字を入力して下さい。\n" ); do{ scanf( "%d", &abc[p++] ); } while( abc[p - 1] > 0 ); --p; srand( time(NULL)); for( m = 0; m < 5; m++ ) { do{ for( k = 0; k < 100; k++ ) { int o = rand() % p; int t = rand() % p; int buf; buf = abc[o]; abc[o] = abc[t]; abc[t] = buf; } goukei = 0; homi = 0; for( k = 0; k < 5; k++ ) { goukei += abc[k]; if( ( abc[k] % 2 ) == 0 ) ++homi; } } while( goukei < (50 - [sa] || goukei > (110 - [sa]) || homi < 2 || homi > 3 ); for( k = 0; k <4; k++ ) printf( "%d%d\t",sa[s], abc[k] ); printf( "\n" ); } return 0; } このようなソースプログラムを書いてみたんですがうまくいきません。 最初の数値はS_NUMBER からの入力で後に通ずく数値はシャッフルした数値を入力したいとおもっていますがうまくいきません。どなたかお願いします。      〇  ●●●●(イメージです)

  • C言語の問題でわからないところがあります

    先ほども似たような内容で質問させて頂いたのですが、もう一度質問させてください。 最近C言語を勉強し始めたのですが、わからないところがあります。 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成するものなのですが、うまくいかなく困っています。 他の書き方でやれば普通にいけると思うのですが、これだとできない理由がわからないと、もやもやしてしまうので・・・・ プログラムは以下の通りです #include <stdio.h> int main(void) { int n1,n2,n3,n4; puts("二つの整数を入力してください"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); n3=(n1>n2) ? n2 : n1; n4=(n1>n2) ? n1 : n2; printf("%d以上%d以下の全整数の和は", n3,n4); int num=n3; /* numの最初の値は小さい方の値 */ int wa=0; /* n3が小さい方の数、n4は大きい方の数 */ do{ if (n1>n2) { wa=n4+num; /* 大きいほうの数(num)にsub(小さい方の数+0,2,3,4・・・)を足していく */ num=num+1;/* ここを通るたびにsubに+1 */ printf("%d",wa);} else { wa=n4+num; num=num+1; printf("%d",wa);} }while(num<n4); /* num<n4を満たさない=numが大きいほうの数よりも大きくなったらループを終了 */ printf ("です\n"); /* ですっす */ return 0; } これで大きい方に37、小さいほうに28と入力すると656667686970717273ととても大きな数値になってしまいます。 ループが間違っているのでしょうか? whileは whileの後の()の中身の条件を満たしているとにループする、と認識しているので、numが大きい方の数値より大きくなったとき、ループを終了するようにしているつもりです。 ここがどこか間違っているのでしょうか・・・? それから、初期化というのもいまいち理解していないのですが、intで宣言するときに、中に数値を格納しておく、という物だと思っています。 宣言の後にprintf("%d",num);などで確認すると、代入できているようなので、これは間違っていないと思うのですが・・・・、 間違っているところがざっとみて解りましたら、回答頂けるとありがたいです。 C言語を始めたばかりなので、できれば簡単に説明して頂けるとありがたいです。

  • C言語、ポインタについて。

    C言語初心者です。"やさしいC"などの入門書を呼んでいて「ポインタ」につまづきました。 別書を買ったり、サイトを見たりしたのですが、理解できませんでした。 "やさしいC"からの引用なのですが、 正: #include <stdio.h> int add(int *x1,int *x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(&n1,&n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int *x1, int *x2,int a){ *x1+=a; *x2+=a; } 誤: #include <stdio.h> int add(int x1,int x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(n1,n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int x1, int x2,int a){ x1+=a; x2+=a; } この2つの違いはなんでしょうか。 アドレスか、そうでないか、という違いはわかりますが、なぜ"誤"のコードだと正しく処理されないのかがわかりません。 教えてください、お願いします。 (「やさしいC」の回答より引用)