例えばうちの大学の情報電子工学科の計算機実習では 主に C 言語の実習のみを行っているようですが、 4 年生になって研究室に配属される学生のプログラミングスキルを見ていると、 ある段階で C 言語がわからなくなったんだろうな、 と見受けられる場合があります。
特に、for 文や while 文などのループでこけたと見られる場合もあるのですが、 その場合は、多くの教科書が割と始めの方に for 文を置いていることからして、 多分 C 言語のほとんどがついていけないのではないかと心配します。
そこで、ここに for 文の基礎的な問題を置くことで for 文にコケた人がわかるようになるための手掛かりになれば、 と思います。
なお、C 言語だけでなく、awk や perl にも for 文はあるのですが、 少し違っているところもなくはないので、 ここでは一応「C 言語」での for 文としておきます。
一度に全部を完成させる、というわけではなく、 適宜問題を追加していきたいと考えています。
バグが多少ありましたので、修正しました。
for 文は、for 文内で実行する文が 1 つの場合は、
for ( [初期値] ; [条件] ; [増分式] )
[実行文];
の形に書きます。
ここで、[初期値]、[条件]、[増分式]、[実行文] は適当な C の文です。
では、これをフローチャートにすると下のどれになるでしょうか。
[1]
[2]
[3]
[4]
[5]
[6]
(03/08 2011; 04/20 2013 修正)
for 文は、for 文内で実行する文が 1 つの場合は、
for ( [初期値] ; [条件] ; [増分式] )
[実行文];
複数ある場合は、
for ( [初期値] ; [条件] ; [増分式] ) {
[実行文 1];
[実行文 2];
....
}
のように書きます。
ここで、[初期値]、[条件]、[増分式]、[実行文] は適当な C の文です。
では、次は間違いでしょうか。
for ( [初期値] ; [条件] ; [増分式] ) {
[実行文];
}
for ( [初期値] ; [条件] ; [増分式] )
[実行文 1];
[実行文 2];
[実行文 3];
for ( [初期値] ; [条件] ; [増分式] ) [実行文];
for([初期値];[条件];[増分式])[実行文];
for (
[初期値] ;
[条件] ;
[増分式] )
[実行文];
for ( ; ; ) [実行文];
for ( ) [実行文];
for { [初期値] ; [条件] ; [増分式] }
[実行文];
(02/25 2011; 04/20 2013 修正)
次の文の内容を for 文を使わずに (他のループも使わずに) 書くとどうなるでしょうか。
int j;
for (j=1; j<=3; j=j+1)
printf("[%d]\n", j);
(02/25 2011)
次の文の内容を for 文を使わずに (他のループも使わずに) 書くとどうなるでしょうか。 また、for 文が終わった後では longname の値は何になっているでしょうか。
int longname;
for (longname=4; longname<7; longname++)
printf("[%d]\n", longname);
(02/25 2011)
次の文の内容を for 文を使わずに (他のループも使わずに) 書くとどうなるでしょうか。 また、for 文が終わった後では k の値は何になっているでしょうか。
int k;
for (k=2; k<=8; k+=2)
printf("[%d]\n", k);
int k;
for (k=2; k<8; k+=2)
printf("[%d]\n", k);
(02/28 2011)
次の for 文を [a] とします:
int k;
for (k=2; k<=8; k+=2) {
printf("[%d]\n", k);
}
また、次の for 文を [b] とします:
int j;
(ア)
for ( ; j<=8; j=j+2) {
(イ)
printf("[%d]\n", j);
(ウ)
}
(エ)
[a] と [b] の結果が同じになるようにするには、
(ア)-(エ) のいずれかの場所に式を 1 行入れれば済みます。
どこにどんな式を入れればいいでしょうか。
(02/28 2011; 04/20 2013 修正)
次の文の内容を for 文も n も使わずに (他のループも使わずに) 書くとどうなるでしょうか。
int n;
for (n=0; n<=4; n+=2) {
printf("[%d]\n", n);
printf("[%d]\n", n+1);
}
(03/10 2011)
次の文の内容を for 文も x も使わずに (他のループも使わずに) 書くとどうなるでしょうか。
int x, y;
y = 0;
for (x=1; x<=4; x++)
y = y+x;
printf("[%d]\n", y);
(03/10 2011)
次の文の内容を for 文も x も使わずに (他のループも使わずに) 書くとどうなるでしょうか。
int x, Total;
Total = 1;
for (x=5; x>0; x--)
Total *= x;
printf("[%d]\n", Total);
(03/10 2011)
for 文の「初期値」の部分、「増分式」の部分には、 「,」(カンマ演算子) を用いて複数の式を書くことができます。 では、次の for 文を使わずに (他のループも使わずに)、 ただし p, q, N は残して書くとどうなるでしょうか。
int p, q, N;
N = 0;
for (p=1, q=5; p<=5; p++, q--)
N += p*q;
printf("[%d]\n", N);
(03/10 2011)
次の for 文は初期値、増分式に複数の式が入っています:
int p, q, N;
N = 0;
for (p=1, q=5; p<=5; p++, q--)
N += p*q;
printf("[%d]\n", N);
この for 文の初期値、増分式の q に関する式を
for 文の初期値、増分式から出すには、
次の (ア) - (エ) のどこに、どのような q の式を書けばいいでしょうか。
int p, q, N;
N = 0;
(ア)
for (p=1; p<=5; p++) {
(イ)
N += p*q;
(ウ)
}
(エ)
printf("[%d]\n", N);
(03/10 2011)
次の for 文は、どのような j に対して実行されるかを答えなさい。
int j;
for (j=1; j<=10; j+=2)
printf("j=%d\n", j);
int j;
for (j=3; 2*j<10; j++)
printf("j=%d\n", j);
int j;
for (j=1; j%5 != 0; j++)
printf("j=%d\n", j);
int j;
for (j=0; (j+4)%7 != 0; j+=2)
printf("j=%d\n", j);
int j;
for (j=1; j<1; j+=2)
printf("j=%d\n", j);
(03/14 2011)
次の for 文:
int j, a[10];
for (j=1; j<=10; j++)
a[j - 1] = 2 * j + 1;
を、「for (k=0; k<10; k++)
」の形の
for 文に書き直しなさい。
(04/28 2013)
次の for 文:
int j, a[10];
for (j=1; j<=10; j++)
a[j - 1] = 2 * j + 1;
を、「for (m=10; m>0; m--)
」の形の
for 文に書き直しなさい。
(04/28 2013)
次の繰り返しの実行文を for 文を使って書き直しなさい。
printf("3× %d = %d\n", 1, 3*1);
printf("3× %d = %d\n", 2, 3*2);
printf("3× %d = %d\n", 3, 3*3);
printf("3× %d = %d\n", 4, 3*4);
printf("3× %d = %d\n", 5, 3*5);
(03/14 2011)
次の繰り返しの実行文を for 文を使って書き直しなさい。
printf("5× %d = %d\n", 1, 5*1);
printf("5× %d = %d\n", 3, 5*3);
printf("5× %d = %d\n", 5, 5*5);
printf("5× %d = %d\n", 7, 5*7);
printf("5× %d = %d\n", 9, 5*9);
(03/14 2011)
次の x, y, z の値を計算する for 文をそれぞれ書きなさい (z は double で)。
x = 1 + 2 + 3 + ... + 100
y = 12 + 22 + 32 + ... + 1002
z = 1/1 + 1/3 + 1/5 + ... + 1/99
(04/28 2013)
a[0] = 1, a[1] = 2, a[2] = 3, a[3] = 4, ...
b[0] = 1, b[1] = 3, b[2] = 5, b[3] = 7, ...
のようになるように a[0] から a[49] までと
b[0] から b[49] までの値をセットするような
for 文を書きなさい。
(04/28 2013)
a[2] = 1, a[4] = 2, a[6] = 3, ..., a[100] = 50
のように値をセットするような for 文を書きなさい。
(04/28 2013)
配列 a を
a[0] = 100, a[1] = 98, a[2] = 96, a[3] = 94, ...
のようになるように a[0] から a[49] まで値をセットするような
for 文を書きなさい。
(04/20 2013)
配列 a を
a[0] = 1, a[1] = -1, a[2] = 1, a[3] = -1, ...
のようになるように a[0] から a[49] まで値をセットするような
for 文を書きなさい。
(04/20 2013)
配列 a を
a[0] = 0, a[1] = 1, a[2] = 0, a[3] = 1, ...
のようになるように a[0] から a[49] まで値をセットするような
for 文を書きなさい。
また、逆に
b[0] = 1, b[1] = 0, b[2] = 1, b[3] = 0, ...
とする for 文も書きなさい。
(04/20 2013)
配列 a を
a[0] = 1, a[1] = 1, a[2] = 2, a[3] = 2, a[4] = 3, a[5] = 3, ...
のようになるように a[0] から a[49] まで値をセットするような
for 文を書きなさい。
(04/20 2013; 04/26 2013 修正)
文字配列 a に、
a[0] = '0', a[1] = '1', ... a[9] = '9', a[10] = '\0'
のように設定する作業を for 文を使って行いなさい
(ヒント: '3' = '0' + 3 となります)。
(04/26 2013)
配列 a[0] ~ a[49] に値が既に設定されているとして、 配列 b[0] ~ b[49] に a[ ] の値をひとつずらして、
b[0] = a[1], b[1] = a[2], b[2] = a[3], ..., b[48] = a[49], b[49] = a[0]
のように設定する作業を for 文で行いなさい。
(04/26 2013)