10個作る前に力尽きました。
これは何?
これは、大学の授業等で教養としてC言語を学習した人、またはC言語を独学で身につけようとしている人が、基礎的なトピックを十分理解しているか?を確認するための問題です。
まずソースコードのみを見て問題を考えた後、実際に実行して答え合わせをしてください。
もしまだ未習の部分がある場合は、Waseda Course Channel等で確認してください。
問題
変数・標準出力
何が出力されるでしょうか?
#include <stdio.h>
int main(void) {
int i, b = 3;
for (i = 0; i < 5; i++) {
int b = 5;
printf("%d %d\n", i, b);
}
printf("%d %d\n", i, b);
}
繰り返し
N
を自由に設定するとき、for
で記述されたループと同じ挙動になるのは(a),(b),(c)のどれでしょうか?(for (;;)
は無限ループの意味です)
int i;
for (i = 0; i < N; i++) {
printf("%d\n", i);
}
// (a)
i = 0;
for (;;) {
if (!(i < N)) break;
printf("%d\n", i);
i++;
}
// (b)
i = 0;
for (;;) {
printf("%d\n", i);
if (!(i < N)) break;
i++;
}
// (c)
i = 0;
for (;;) {
printf("%d\n", i);
i++;
if (!(i < N)) break;
}
他にも、while文, do-while文について確認しましょう。
配列・ポインタ
ポインタについては言いたいことがいっぱいありますが、とりあえず以下の問題がわかれば授業が求めるレベルには達しているといえるでしょう。
int *p, a[] = {3, 2, 5, 7, 9, 0};
p = a;
while (*p) printf("%d\n", *++p); // 何が表示される?
char *s = "hello";
while (*s) printf("%d\n", *s++); // 何が表示される?
int b, *c, **d;
c = &b;
d = &c;
**d = 5;
printf("%d\n", b); // 何が表示される?
int m[][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
int i, *m1 = m[1];
for (i = 0; i < 3; i++) printf("%d\n", m1[i]); // 何が表示される?
関数呼び出し
何が表示されるでしょうか?
#include <stdio.h>
void f(int r) {
if (r < 0) return;
printf("%d\n", r);
f(r - 1);
f(r - 2);
}
int main(void) {
f(5);
}
文字列
何が表示されるでしょうか?(間違いを修正しました。下のコメント参照)
int main(void) {
char a[] = "ABCDabcd", *c = a;
while (*c) printf("%c\n", *c++ - 'A' + 'G');
}
その他のトピック
上に挙げた他にも、条件分岐, switch文, 構造体, 文字列, 数学関数, プリプロセッサマクロなどの理解を確認してみてください。