質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

4回答

1425閲覧

C言語のforのやつ無限

Totyun

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/08 15:47

#include <stdio.h>

int main()
{
int a[5];
int b[5];
b[0] = 78;
b[1] = 86;
b[2] = 72;
b[3] = 97;
b[4] = 83;
int i,j,score;
for(j=1;j<6;j++){
printf("%d:%d\n",j, j+2072000);
}
printf("表示したい学生の番号(1~5):");
scanf("%d",&i);
for(score=0;score<=97;score=b[5]++){
printf("学籍番号%dの学生の英語の点数は%dです",i,b[i]);
}
}
番号と点数が無限に書かれてしまうのですがどうすればよいですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/05/08 17:55

for 文は C 言語の基本なので、しっかり勉強してくださいとしか…。 というか、入力された i 番目の学生の点数を表示するには、後ろの for 文は不要なのでは…。
episteme

2021/05/08 19:20

>「C言語のforのやつ無限」 せめて日本語でお願いします。
guest

回答4

0

無限に書かれてしまうのですがどうすればよいですか?

次の** for ループを最初から作りなおせばよい**でしょう。

C

1for(score=0;score<=97;score=b[5]++){ 2printf("学籍番号%dの学生の英語の点数は%dです",i,b[i]); 3}

何をしたくてこんなループを書いたのか、意図がわかりません。間違い・勘違いがいくつか積み重なっているようです。

一番の問題は int b[5]; と配列を定義したのに b[5] をアクセスしていることです。確保されているのは b[0] から b[4] まで、5つの要素しかありません。そのループは b[5] という、アクセスしてはいけないメモリをアクセスしています。

二番目、「score=0;score<=97;score=b[5]++」という部分がループを作るのですが、何を意図してこう書いたのか、わかりません。意図はわかりませんが、それでもコンパイルできる以上、プログラムは動作します。
このループがどんな動作をするのか、確認することを目的にコードを書き変えてみました。

C

1#include <stdio.h> 2int main() 3{ 4 int b[6]; /* b[5] を確保する */ 5 b[0] = 78; 6 b[1] = 86; 7 b[2] = 72; 8 b[3] = 97; 9 b[4] = 83; 10 b[5] = 95; /* b[5] が 95 なら、どうなるか */ 11 int i, score; 12 13 i = 1; /* 仮に表示したい学生番号を 1 にする */ 14 for (score = 0; score <= 97; score = b[5]++) { 15 printf("学籍番号%dの点数は%dです(score = %d, b[5] = %d)\n", 16 i, b[i], score, b[5]); 17 } 18} 19

「(score = %d, b[5] = %d)」の部分で、ループ中に score と b[5] の値がどう変化するか、表示させています。動作させると次の表示になります。

学籍番号1の点数は86です(score = 0, b[5] = 95) 学籍番号1の点数は86です(score = 95, b[5] = 96) 学籍番号1の点数は86です(score = 96, b[5] = 97) 学籍番号1の点数は86です(score = 97, b[5] = 98)

私は表示する行数が4行に収まることを意図して b[5] = 95; としました。
しかし質問者のコードは、本来アクセスしてはいけない b[5] をアクセスしていました。その場合、b[5] の値がいくつだったのか、誰にもわかりません。値がわからない以上、どうなるかは運を天に任すようなものです。

質問者は上記コードをお手元でコンパイルして動作を確かめてください。さらに、b[5] の初期値を様々に変えて、例えば 90, 50, 0, -10, -100 等に変えて動作を確かめていただきたい。その頃には「無限に書かれてしまう」状況が見えてくるはずです。
そのうえで、結論に戻りますが、上記ループを最初から考え直すことです。

投稿2021/05/09 01:26

rubato6809

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※ 回答ではありません

C

1for(score=0;score<=97;score=b[5]++){ 2 printf("学籍番号%dの学生の英語の点数は%dです",i,b[i]); 3}

この for-loop は何を意図していますか? これによってどんなふるまいを期待していますか?

投稿2021/05/08 19:16

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

for(score=0;score<=97;score=b[5]++){

の部分

for(i=0;i<5;i++){

です。
このプログラムでどういった挙動をしたいのか、その意図が読解できていないと思います。

for文の文法についてもう1度復習した後、この問題の説明文をよく読んでみると良いでしょう。

投稿2021/05/08 17:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/05/08 22:00

> for(i=0;i<5;i++){ なぜに?
guest

0

https://teratail.com/questions/337264
自分の質問の回答に書かれていることを直してから新しく質問を作ってください

「期待する入出力」と「実際の挙動」が書かれていないと、「どうすれば意図した動作なのか」が質問者以外にわかりません。

回答をもらったらちゃんと対応してください

投稿2021/05/08 16:20

jamjam3

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問