C言語の課題
1、整数型の変数を2個だけ使い、キーボードから5個の整数を読み込み負の整数のみの和を表示プログラムを作れ
2、1、の問題について使える変数を3個に増やしたうえでwhile文を使ったプログラムを作れ
3、1、の問題について使える変数を3個に増やしたうえfor文を使ったプログラムを作れ
1を作ろうとするとかなり長くなってしまうのです…
ヒントでもいいので教えてください。
- 次の回答10件
- |
回答(15件中1~10件)
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示
No.15ベストアンサー20pt
連休も今日まで。明日から授業が始まるでしょうから回答しましょう。ここで質問したついでに、課題にない do~while も覚えてしまいましょう。これで繰り返し文のカラクリをマスターしましたね。
なお、main()プログラムは「int main(void)」+「return 0;」の組み合わせで覚えておくことを勧めます。理由は gccで(コンパイラーによっては) warningが出るからです。
/* 回答1 *
#include <stdio.h>
int main(void) {// この定番を覚えよう。
int a, b;// 変数を2個使う。
b = 0;// まず、合計をゼロに設定する。
printf("Input a1: ");// わかるように入力をうながして
scanf("%d", &a);// データを取り込む。
if (a < 0)// もし、aが負ならば
b += a;// 加算する(b = b + a;)。
printf("Input a2: ");// 以下、これを残り4回繰り返す。
scanf("%d", &a);
if (a < 0)
b += a;
printf("Input a3: ");
scanf("%d", &a);
if (a < 0)
b += a;
printf("Input a4: ");
scanf("%d", &a);
if (a < 0)
b += a;
printf("Input a5: ");
scanf("%d", &a);
if (a < 0)
b += a;
printf("result= %d\n", b);// 最後に、合計を表示する。
return 0;// int main() ゆえ、システムにゼロを返す。
}
*/
/* 回答2
#include <stdio.h>
int main(void) {
int a, b, c;// 変数を3個使う。
b = 0;// まず、合計を0にする。
c = 0;// カウントも0にする。
while(c < 5) {// カウントが5以下なら {} を実行し
printf("Input a%d: ", c);// 以下、回答1と同じ。
scanf("%d", &a);
if (a < 0)
b += a;
c += 1;// カウントを1つ増やす( c++)。
}
printf("result= %d\n", b);// 最後に、合計を表示する。
return 0;
}
*/
/* 回答3
#include <stdio.h>
int main(void) {
int a, b, c;// 変数を3個使う。
b = 0;// まず、合計を0にする。
for (c = 0; c < 5; c += 1) {// ループを5回繰り返し、
printf("Input a%d: ", c);// 以下、回答1,2に同じ。
scanf("%d", &a);
if (a < 0)
b += a;
}
printf("result= %d\n", b);
return 0;
}
*/
/* ついでに、do~while も覚えよう。*/
#include <stdio.h>
int main(void) {
int a, b, c;// 変数を3個使う。
b = 0;// まず、合計を0にする。
c = 0;// カウントも0にする。
do {
printf("Input a%d: ", c);// 以下、回答1と同じ。
scanf("%d", &a);
if (a < 0)
b += a;
c += 1;// カウントを1つ増やす( c++)。
} while (c < 5);// カウントが5以下なら do{ へ
printf("result= %d\n", b);// 最後に、合計を表示する。
return 0;
}
この回答へのお礼
遅くなってしまいました。すいません。
課題は無事(?)提出しました。ありがとうございます。
提出はしたもののどこが間違っているか教えてくれないので回答を載せてくれて本当にたすかります。
(教えてくれないのが当たり前なのでしょうか…?)
No.14ベストアンサー10pt
まだ閉じてないのでついでで書いておきますと
厳密に言うと実はプログラムとしては深刻な問題箇所が一箇所あります
(ほとんど答えかいてるようなもんですが)ヒント
入力値の変数は int
和の変数も int
入力するのは5回
この5回でintの最大値入力されたら・・・・・・さあどうなる
修正自体は非常に簡単なのでお考えください(各変数型で扱えるデータ範囲を調べましょう)
>elseの部分をどうすればいかわからないんです…
#12さんの補足です。
「else」は if ~ else 文ですから、【9行の「if(a<0)」のとき10行の「c=a+c」の計算をしますが、11行のelseの「入力した値のa=0またはa>0」のときは「break」を実行せよ。】という内容になっています。
つまり、2とか5とかの正の整数を入力したら、「break」が機能し、while() 文を脱出することになります。while(b<5)文を継続するには11,12行は不要であるということです。
また、main()関数内の「int a,b,c」変数は、そのままではデタラメな数値が入った不定なものとなっています。ですから、その都度、bだけではなく cも0に設定しなければならないんですよ(b=c=0;)。この設定を抜くと答えが実行毎に変わったりします。「C言語は、手のかかる言語である」ことを前提にプログラミングしてください。
でも、第1問はクリアできたようですし、第3問の for()文は、この第2問の while() より簡単ですから7~8割は理解できたというところですよ。頑張ってください。
001: #include<stdio.h>
002: void main(void) // おまけ。末尾に「return 0;」なし、引数もなし。
003: {
004: int a,b,c;
005: b=0;
006: while(b<5){
007: printf("Enter an integer:");
008: scanf("%d",&a);
009: if(a<0)
010: c=a+c;
011: else
012: break;
013: b++;
014: }
015: printf("%d\n",c);
016: }
#10追記
どうも気が付かなくて追記になってしまう
更に余分な処理が入ってました if文のelse処理でどうなるかよく考えましょう
この回答への補足
ありがとうございます
elseの部分をどうすればいかわからないんです…
追記
>int a,b;
の後で和を代入する変数bを0クリア(代入)してください
そうしないと値が不定です
でもって
課題1は 一回の処理 5回書く(実行する)
課題2は 一回の処理を while分で5回実行させる
課題3は 一回の処理を for分で5回実行させる
ということになります
> b=b+aでいいのでしょうか…?
そうです
(b+=a; と書いても同じ意味です)
この回答への補足
#include<stdio.h>
main()
{
int a,b,c;
b=0;
while(b<5){
printf("Enter an integer:");
scanf("%d",&a);
if(a<0)
c=a+c;
else
break;
b++;
}
printf("%d\n",c);
}
と作ってみたのですが…
#6訂正
>質問者さんは
>初回の入力が負のときそのif文の中で更に残りの4回分の入力処理を
>使用として長くなっているようです
使用 しようの間違い
さらによく見たらそんな訳でもなさそうでした
なんか書いてあるコードでも200行行きそうな気はしませんが
括弧の書き忘れかなんかですかね?
なんか構文がおかしいですね (if文でprintだけ実行してるみたいですが)
やっぱり上の訂正部分のやり方しようとしてるのかな?
>これじゃややこしくなるだけでしょうか…?
ですね・・・・
まず5回の入力で 変数a と変数b 両方の変数使ってしまってますが
そんな必要ありません
1.変数a に値を入れてください --- キーボードからの入力値格納変数
2.入力された値が負の値であるかをif文使って判断します
3.負だった場合 変数 b に 入力された 変数a を加算します
1に戻る(5回同じ事を行う)
それで終わりとなります
質問者さんは
初回の入力が負のときそのif文の中で更に残りの4回分の入力処理を
使用として長くなっているようです
そんな必要ありません(一回の入力で判断 必要に応じて和の取得処理を完結させてください)
この回答への補足
>負だった場合 変数 b に 入力された 変数a を加算
これがよくわからないです…
b=b+aでいいのでしょうか…?
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示












