🇯🇵 日本語

STEP 1 総合復習 ― 変数・printf・scanf

第1〜7回までの要点を チートシート でおさらいし、コード読み取り6問「よくあるミス」チェックリスト で定着度を確認します。

① 要点チートシート

STEP 1 で押さえておきたい要点を、表で一気に 見直しましょう。

🦴 プログラムの骨格

#include <stdio.h>

int main(void) {
    printf("Hello\n");
    return 0;
}
  • #include <stdio.h> ― printf/scanf を使う宣言
  • int main(void) ― ここから実行が始まる
  • return 0; ― 正常終了の合図

📦 データ型と書式指定子

printfscanf
int42%d%d
double3.14%f%lf
  • printf の double は %f、scanf は %lf(要注意)
  • 整数は %d、実数は %f を使う(混ぜない)
  • 桁指定は %.2f(小数2桁)%5d(5桁右寄せ)など

🖨️ printf の使い方

printf("x=%d, y=%d\n", x, y);
printf("%.2f", 3.145); // → 3.14(四捨五入)
printf("%5d", 42);   // →    42(5桁右寄せ)
printf("%05d", 42);  // → 00042(0埋め)
  • 第1引数の "..." 内の %d/%f の数だけ、第2引数以降に 変数 を並べる
  • \n で改行(書き忘れると同じ行に続く)

⌨️ scanf のお約束

int n;
scanf("%d", &n);   // & 必須!

double x;
scanf("%lf", &x); // double は %lf
  • 変数の 住所(&) を渡す(& 忘れはクラッシュ原因 No.1)
  • scanf の double は %lf(printf の %f とズレる)

🔁 代入は「上から順に」上書き

int a = 10;  // a:10
int b = 30;  // b:30
b = a;        // b:10 (30 は消える)
a = 5;        // a:5  (10 は消える)
// 結果: a=5, b=10
  • = は等しいではなく「右辺を左辺に入れる」
  • 後ろに代入があれば、前の値は 上書きされて消える

② コード読み取り 6問

頭の中で実行 してから選択肢をクリック。間違えても解説を読めば必ず腑に落ちます。

Q1. 代入の順序

int a = 10, b = 30;
b = a;
a = 5;
printf("%d %d\n", a, b);

出力は?

10 30
5 10
5 30
10 10
解説: 上から順に追います。
① a=10, b=30
② b=a → b に a の値(10) を入れる → b=10(30 は消える)
③ a=5 → a を上書き → a=5(10 は消える)
5 10

Q2. 整数を %f で表示すると?

int x = 7;
printf("%f\n", x);

出力は?

7
7.000000
不定(0.000000 や意味不明な数値になることが多い)
コンパイルエラー
解説: int 型に %f(実数用)を指定すると、メモリの解釈がズレ 正しい値が表示されません
コンパイルエラーは出ない(多くのコンパイラは警告のみ)ため、実行してから気づくのがやっかい。
int には %d、double には %f を徹底しましょう。

Q3. %.2f の丸め方

double a = 3.145, b = 3.144;
printf("%.2f %.2f\n", a, b);

出力は?

3.14 3.14(切り捨て)
3.14 3.14(四捨五入だが a も切り下げ)
3.15 3.14(四捨五入)
3.145 3.144(そのまま)
解説: %.2f四捨五入
・3.145 → 小数第3位が「5」なので繰り上がり → 3.15
・3.144 → 小数第3位が「4」なので切り捨て → 3.14
※ 浮動小数点の内部表現で 3.145 が稀に「3.144999...」となり 3.14 になる環境もありますが、原則は四捨五入と覚えてOK。

Q4. \n を書かないとどうなる?

printf("x=%d", 3);
printf("y=%d\n", 7);

出力は?

x=3y=7
x=3
y=7
x=3 y=7(自動でスペース)
コンパイルエラー
解説: printf は \n が無ければ改行されません。スペースも自動で入りません。
1回目の出力 x=3 の直後に y=7 がそのままくっつき、x=3y=7 が1行で表示されます。
改行したい所には必ず \n を入れる癖を。

Q5. scanf で & を忘れると?

int n;
scanf("%d", n); // ← & を忘れた
printf("%d\n", n);

このプログラム、どうなる?

問題なく動く(コンパイラが自動で & を補う)
コンパイル時にエラーで止まる
コンパイルは通るが、実行時に クラッシュ(Segmentation fault)しやすい
入力した値が n の代わりに 0 になる
解説: scanf は 変数のアドレス を受け取って、その場所に書き込みます。
& を忘れると、変数の中身(未初期化のゴミ)がアドレスとして使われ、書き込み先が不正になり クラッシュ しやすくなります。
コンパイラは警告は出すものの、コンパイル自体は通ることが多いので注意。

Q6. double を scanf で読むには?

double x;
scanf("???", &x);
printf("%f\n", x);

"???" に書く書式は?

%f(printf と同じ)
%lf
%d
%lld
解説: double を scanf で読むときは %lf(エルエフ)。
printf 側は %f でも %lf でも double として扱われますが、scanf 側だけは違う ので要注意。
この非対称が C言語の代表的な引っかけポイントです。

③ よくあるミス・難所チェックリスト

読みながら「やったことある…」と思ったら、その項目はもう一度元のページに戻って確認しておきましょう。
  1. 1
    int 型に %f / double 型に %d を指定した
    コンパイルが通っても 表示が崩れる。エラーが出ないので原因不明になりがち。型と書式指定子は 必ずセット で覚える。
  2. 2
    scanf の & を忘れた
    実行時に Segfault でクラッシュ。scanf("%d", n) ではなく scanf("%d", &n) が正解。配列名(文字列)は例外的に & 不要。
  3. 3
    scanf で double を %f で読んだ
    printf は %f でも、scanf は %lf。printf と scanf で書式が 非対称 な点に注意。
  4. 4
    \n を書き忘れて出力が同じ行に続いた
    printf は 自動で改行されません。改行したい所には必ず \n を入れる。
  5. 5
    セミコロン ; 忘れ
    どこの行に ; が無いかは、エラー位置の 1〜2 行上 を疑うのが定石。
  6. 6
    printf の引数の個数や順番を間違えた
    "x=%d, y=%d" なら、第2引数以降に x, y の順 で並べる。順番が逆だと値も逆に表示される。
  7. 7
    代入 = と比較 == を混同した
    a = 5 は「a に 5 を入れる」、a == 5 は「a は 5 か?」。

④ 戻るページ ― つまずいたらここに戻る

特定の項目で迷ったら、対応する元ページにすぐ戻れるよう一覧にしました。
第1回 プログラミングとはそもそも何が起きているのか怪しい時に 第2回 Hello World骨格(include, main, return)が曖昧な時に 第3回 変数型・代入の上書きが曖昧な時に 第4回 printf%d/%f/%.2f/\n の使い分けが曖昧な時に 第5回 scanf& の意味と %lf を確認したい時に チートシート(早見表)書式指定子・型を1ページで再確認