アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。

C言語を学習中です。

参考書の例文に、自分なりにコメントを付けて読み進めましたが、どうしても下記のfor文の処理が理解ずに困っております。


for (j = 0;j < i;j++) printf("%d\n",val[j]);


なぜval[j](ジェイ)が出てくるのかがわかりません。

val[j](ジェイ)はval[i](アイ)とどのような関連性があるのでしょうか。

また、最後のfor文はどのような処理をしているのでしょうか。

どうか教えていただきたく、お願い致します。



●例文

次のプログラムは、入力された数値の一覧を表示する例です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
int i,j,val[10];
char str[32],*ch;

fgets(str,sizeof(str),stdin);/*キーボードで入力された文字列strを読込む*/

ch = strtok(str,",\n");   /* 文字列strの中から単語を取り出して変数chに代入*/
for (i = 0;i < 10;i++) {  /*for文(初期化i=0;条件式i<10;更新i++)*/
if (ch == NULL) {  /*文字列strの中に単語が無ければ*/
break;  /*ループを抜ける*/
} else {  /*文字列strの中に単語があれば*/
val[i] = atoi(ch); /*文字列strの中の最初の単語を数値に変換して配列valの
                       i要素に代入する*/
}
ch = strtok(NULL,",\n");  /*文字列strの中の次の単語を取り出す*/
}

for (j = 0;j < i;j++) printf("%d\n",val[j]);

return;
}


このプログラムの実行結果は次の通りになります。

85,41,26,956,12 入力した文字列

85
41
26
956
12

A 回答 (3件)

配列の[]の中は、その値が重要です。


val[i]だろうがval[j]だろうがval[nanika]だろうが、その[]の中を評価(計算)した最終的な値だけが関係します。

> なぜval[j](ジェイ)が出てくるのかがわかりません。
↓のjの値を使いたいからです。
> for (j = 0;j < i;j++) printf("%d\n",val[j]);

int k;を使うなら
for (k = 0;k < i;k++) printf("%d\n",val[k]);

int nanika;を使うなら
for (nanika = 0;nanika < i;nanika++) printf("%d\n",val[nanika]);

です。「j」には意味はありません。


> val[j](ジェイ)はval[i](アイ)とどのような関連性があるのでしょうか。

valは配列の名前です。
j==i ならval[j]==val[i] という関連があります。


> また、最後のfor文はどのような処理をしているのでしょうか。

見たままの処理です。単純にforループで、printfを繰り返しているだけです。
Cの文法では、forに{}は必ずしも必要ではありません。繰り返す式文が一つだけのときは、{}はいりません。

このとき、iは、その前にある
> for (i = 0;i < 10;i++) {  /*for文(初期化i=0;条件式i<10;更新i++)*/
のループ終了時のiになります。このループの終了は、 i<10を満さなくなったときと、
> break;  /*ループを抜ける*/
でループを抜けたときです。

それぞれ、iが何になるか、考えてみましょう。考えてわかなかったら
> ch = strtok(NULL,",\n");  /*文字列strの中の次の単語を取り出す*/
> }
printf("i:%d\n",i) ; /*ループ終了時のiを表示 */
> for (j = 0;j < i;j++) printf("%d\n",val[j]);
とでもして確認してください。

※ ところで
/*for文(初期化i=0;条件式i<10;更新i++)*/
というコメントはよくありません。プログラムをただ書き写しただけ。なんの説明にもなってません。
何のためのものか、どんな意味があるのか、を考えるようにしましょう。例えば
/* i = 0から9までの整数。順番に */
とか
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

勉強になりました。

お礼日時:2012/08/11 14:13

配列の要素を指定することができれば、なんでもいい。


所詮、ただの変数名だし。

i でも j でもいいし yanbarukuina でもいい。

最後のfor は、 配列valの要素を一つずつ printfで表示させてるだけでしょ。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/08/17 21:28

ただのカウンタじゃないんですか?



val配列の要素数はiが把握してますが、それを1つ1つ取り出したいが為に、
jを利用してiまで繰り返してるようにしか見えません。

最後のループでval[i]を出力しようとしても要素数を超えた(つまりi=10)のエラー、
もしくは初期化されていない何かしらの値、しか出力されないでしょう。
valは、val[0]~val[i-1]までしか入力した値が入っていませんので。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

参考になりました。

お礼日時:2012/08/11 14:14

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