diff --git a/public/fc_1_10_for.drawio.svg b/public/fc_1_10_for.drawio.svg new file mode 100644 index 0000000..d4130fb --- /dev/null +++ b/public/fc_1_10_for.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
Yes
Yes
No
No
i <= 10
i <= 10
End
End
iを出力
iを出力
i ++
i ++
i = 1
i = 1
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/fc_99_for.drawio.svg b/public/fc_99_for.drawio.svg new file mode 100644 index 0000000..bdb8327 --- /dev/null +++ b/public/fc_99_for.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
No
No
i <= 9
i <= 9
End
End
i = 1
i = 1
j = 1
j = 1
Yes
Yes
No
No
j <= 9
j <= 9
i * jを出力
i * jを出力
j ++
j ++
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/fc_exam_else.drawio.svg b/public/fc_exam_else.drawio.svg new file mode 100644 index 0000000..0515dcf --- /dev/null +++ b/public/fc_exam_else.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
Yes
Yes
No
No
score >= 60
score >= 60
End
End
不合格
不合格
合格
合格
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/fc_exam_else_if.drawio.svg b/public/fc_exam_else_if.drawio.svg new file mode 100644 index 0000000..2737f2f --- /dev/null +++ b/public/fc_exam_else_if.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
Yes
Yes
score == 100
score == 100
End
End
合格
合格
満点
満点
No
No
No
No
Yes
Yes
score >= 60
score >= 60
不合格
不合格
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/fc_inf_loop.drawio.svg b/public/fc_inf_loop.drawio.svg new file mode 100644 index 0000000..49da68f --- /dev/null +++ b/public/fc_inf_loop.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
End
End
num = 1
num = 1
numに数値を入力
numに数値を入力
No
No
Yes
Yes
num != 0
num != 0
numを出力
numを出力
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/fc_menu_switch.drawio.svg b/public/fc_menu_switch.drawio.svg new file mode 100644 index 0000000..066fce3 --- /dev/null +++ b/public/fc_menu_switch.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
End
End
case 2 (チャーハン)
case 2 (チャーハン)
case 1(ラーメン)
case 1(ラーメン)
default
default
menu_numの値は?
menu_numの値は?
500円
500円
400円
400円
1000円
1000円
メニューに
ありません
メニューに ありません
case 3(餃子)
case 3(餃子)
menu_numを入力
menu_numを入力
Text is not SVG - cannot display
\ No newline at end of file diff --git a/public/fc_sample_break.drawio.svg b/public/fc_sample_break.drawio.svg new file mode 100644 index 0000000..9f8474a --- /dev/null +++ b/public/fc_sample_break.drawio.svg @@ -0,0 +1,4 @@ + + + +
Start
Start
End
End
case 2
case 2
case 3
case 3
case 1
case 1
case 5
case 5
default
default
menu_numの値は?
menu_numの値は?
2か3が
入力されました
2か3が...
4が入力されました
4が入力されました
1が入力されました
1が入力されました
不明
不明
numを入力
numを入力
case 4
case 4
4か5が
入力されました
4か5が...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/src/content/docs/textbook/c-lang/beginner/11--if-scope.mdx b/src/content/docs/textbook/c-lang/beginner/11--if-scope.mdx new file mode 100644 index 0000000..3590dc1 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/11--if-scope.mdx @@ -0,0 +1,526 @@ +--- +title: if文と条件分岐の基本 +description: if文と条件分岐の基本スコープについて学びます! +slug: textbook/c-lang/beginner/if-scope +--- + + +import { Aside } from "@astrojs/starlight/components"; +// import Quize from "@/components/astro/Quize.astro"; +// import Anser from "@/components/astro/Anser.astro"; + +## if +--- + +実行したい処理に条件を付けたい時は、if文を用いる。条件式が真の場合に処理を実行する。 + +```c +if (条件式) { + // 条件式が真の場合に実行される処理 +} +``` + +以下は、入力された点数が60点より大きいならば「合格」、そうでなければ「不合格」と表示するプログラムである。 + +```c +#include +int main(void) { + int score; + + printf("点数を入力してください: "); + scanf("%d", &score); + + if (score >= 60) { + printf("合格\n"); + } + if (score < 60) { + printf("不合格\n"); + } + + return 0; +} + +``` +
+ 実行結果 +実行結果1 +``` +点数を入力してください: 50 +不合格 +``` +--- +実行結果2 +``` +点数を入力してください: 60 +合格 +``` +--- +実行結果3 +``` +点数を入力してください: 70 +合格 +``` +--- +
+ + + +#### 比較演算子 +--- + +| 演算子 | 数学の記号 | +|:-------:|:--------:| +| `>=` | ≥ | +| `>` | > | +| `<` | < | +| `<=` | ≤ | +| `==` | = | +| `!=` | ≠ | + + + + +### 練習問題 + +変数`num`が10より大きいかどうかを判定しできるよう、`if`文を使って判定部分を追加してください。 + +```c +#include + +int main() { + int num = 15; + + // ここにif文を使って判定を書いてください + + return 0; +} +``` +#### 実行結果 +``` +numは10より大きいです +``` + + + +
+ 模範解答 +```c +#include + +int main() { + int num = 15; + + if (num > 10) { + printf("numは10より大きいです\n"); + } + + return 0; +} +``` +
+## else +--- + +else文を使うことで、条件式が偽の場合に実行する処理を指定できる。 + +```c +if (条件式) { + // 条件式が真の場合に実行される処理 +} else { + // 条件式が偽の場合に実行される処理 +} +``` + +ifで示した例の、60点以上でないときの処理をelseを使って簡単に記述できる。 + +```c +#include +int main(void) { + int score; + + printf("点数を入力してください: "); + scanf("%d", &score); + + if (score >= 60) { + printf("合格\n"); + } else { + printf("不合格\n"); + } + + return 0; +} +``` + +### 練習問題 + +変数`score`が60未満なら「不合格」と表示されるように、`if`と`else`文を使って処理を追加してください。 + +```c +#include + +int main() { + int score = 45; + + // ここにif-else文を使って条件分岐を記述してください + + return 0; +} +``` +#### 実行結果 +``` +不合格 +``` + +
+模範解答 +```c +#include +int main() { + int score = 45; + + if (score >= 60) { + printf("合格\n"); + } else { + printf("不合格\n"); + } + + return 0; +} +``` +
+ + +実行結果はif文と同じである。 + +フローチャートで表すと以下のようになる。 + +![フローチャート](/fc_exam_else.drawio.svg) + +## else if +--- + +else ifを使うことで、複数の条件を指定することができる。 + +```c +if (条件式1) { + // 条件式1が真の場合に実行される処理 +} else if (条件式2) { + // 条件式1が偽で条件式2が真の場合に実行される処理 +} else { + // 条件式1,2が偽の場合に実行される処理 +} +``` + +2.elseのコードに、入力された点数が100点ならば「満点」と出力させるコードを足す。 + +```c +#include +int main(void) { + int score; + + printf("点数を入力してください: "); + scanf("%d", &score); + + if (score == 100) { + printf("満点\n"); + } else if (score >= 60) { + printf("合格\n"); + } else { + printf("不合格\n"); + } + + return 0; +} +``` +
+ 実行結果 +実行結果1 +``` +点数を入力してください: 50 +不合格 +``` +--- + +実行結果2 +``` +点数を入力してください: 60 +合格 +``` +--- +実行結果3 +``` +点数を入力してください: 70 +合格 +``` +--- +実行結果4 +``` +点数を入力してください: 100 +満点 +``` +--- +
+フローチャートで表すと以下のようになる。 +![フローチャート](/fc_exam_else_if.drawio.svg) + +### 練習問題 + +変数`score`の値がによって成績を表示するよう、`else-if`文を使って判定部分を追加してください。 + +`score`の値が +90以上ならば「成績はA」、 +80以上ならば「成績はB」、 +70以上ならば「成績はC」、 +それ以外は「成績はD」などの文字を表示すること。 + +```c +#include + +int main() { + int score = 85; + + // ここにif-else if-else文を使って判定を書いてください + + return 0; +} +``` +#### 実行結果 +``` +成績はBです +``` + +
+ 模範解答 + ```c +#include +int main() { + int score = 85; + + if (score >= 90) { + printf("成績はAです\n"); + } else if (score >= 80) { + printf("成績はBです\n"); + } else if (score >= 70) { + printf("成績はCです\n"); + } else { + printf("成績はDです\n"); + } + + return 0; +} +``` +
+ +## and, or, not +--- + +複数の条件を指定する場合には、if文を複数個用いたり、以下の論理演算子を活用すると良い。 + + +| 演算子 | 数学の記号 | +|:-------|:--------| +| `&&` | ∧(かつ) | +| `\|\|` | ∨(または) | +| `!` | ¬(否定) | + + +```c +int x = 8; +int y = 6; + +if(x > 5) { + printf("x は 5 より大きい\n"); + if(y > 5) { + printf("x と y は 5 より大きい\n"); + } +} + +if (x < 10 && y < 10) { + printf("x と y は 10 より小さい\n"); +} +if (!(y >= 10)) { + printf("y は 10 より大きくない\n"); +} +``` + +x = 8,y = 6のときの実行結果 +``` +x は 5 より大きい +x と y は 5 より大きい +x と y は 10 より小さい +y は 10 より大きくない +``` +--- + +### 練習問題 + +3つの変数`a`, `b`, `c`において、`a`は10以上、または`b`が5以下で、かつ`c`が0でない場合に「条件を満たしました」と表示されるよう、`if`文を完成させてください。 + +```c +#include + +int main() { + int a = 12; + int b = 3; + int c = -1; + + // ここにif文を使って判定を書いてください + + return 0; +} +``` +#### 実行結果 +``` +条件を満たしました +``` + +
+ 模範解答 +```c +#include +int main() { + int a = 12; + int b = 3; + int c = -1; + + if ((a >= 10 || b <= 5) && c != 0) { + printf("条件を満たしました\n"); + } + + return 0; +} +``` +
+ +## 変数のスコープ +--- + +変数は使用できる範囲に制限がある。これを変数のスコープという。 +変数のスコープは、`{}`で囲まれたブロック内でのみ使用できる。 +以下のコードを例に説明する。 +変数xは一番外側のブロックで宣言されているため、どこでも使用できる。 +しかし、変数yは1つ目のif文の中で宣言されているため、そのif文の中(ブロック)でしか使用できない。 + +```c +int x = 8; + +if(x > 5) { + int y = 6; // 変数yはこのif文の中でのみ使用可能 + printf("x は 5 より大きい\n"); + if(y > 5) { + printf("x と y は 5 より大きい\n"); + printf("x = %d\n", x); // 変数xがスコープ内のため使用可能 + printf("y = %d\n", y); // 変数yがスコープ内のため使用可能 + } +} +printf("x = %d\n", x); +// printf("y = %d\n", y); // 変数yがスコープ外のためエラー +``` + +
+ 実行結果 +``` +x は 5 より大きい +x と y は 5 より大きい +x = 8 +y = 6 +x = 8 +``` +--- +
+ + + + +## 理解度チェック +--- + +{/* +{入力された値が10以上ならば「Yes」、それ以外なら「No」と出力するプログラムを書け。} + + + +int main(void) { + int num; + + printf("数値を入力してください: "); + scanf("%d", &num); + + if (num >= 10) { + printf("Yes\n"); + } else { + printf("No\n"); + } + + return 0; +} +``` +}> +{if_else文を使用して条件分岐ができる} + */} + +{/* +{else ifを使用して、ユーザーに数値を入力してもらい、その数値が以下の条件に当てはまるか判定してください。 +- 90以上 → "優" +- 70以上90未満 → "良" +- 50以上70未満 → "可" +- 50未満 → "不可" +} + + + + +int main(void) { + int score; + + printf("点数を入力してください: "); + scanf("%d", &score); + + // 条件分岐 + if (score >= 90) { + printf("評価: 優\n"); + } else if (score >= 70) { + printf("評価: 良\n"); + } else if (score >= 50) { + printf("評価: 可\n"); + } else { + printf("評価: 不可\n"); + } + + return 0; +``` +} +}> +{else if文を使用して複数の条件分岐ができる} + */} + + diff --git a/src/content/docs/textbook/c-lang/beginner/12--for.mdx b/src/content/docs/textbook/c-lang/beginner/12--for.mdx new file mode 100644 index 0000000..e5f6121 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/12--for.mdx @@ -0,0 +1,316 @@ +--- +title: for文 +description: for文について学びます! +slug: textbook/c-lang/beginner/for +--- + +import { Aside } from "@astrojs/starlight/components"; +// import Quize from "@/components/astro/Quize.astro"; +// import Anser from "@/components/astro/Anser.astro"; + +## for +--- +for文は、繰り返し処理を行うための構文である。 +繰り返し処理は、書き間違えが無限ループの原因になるので注意が必要である。 + +以下のように記述する。 + +```c +for (初期化; 条件式; 更新式) { + // 条件式が真の場合に実行される処理 + } +``` + +基本的な構造は、以下の通りである。 +- 初期化には、ループ変数の初期値を設定する。 +- 条件式には、真の場合にループを繰り返す条件を設定する。 +- 更新式には、ループ変数の値を更新する処理を記述する。 + +以下は、1から10までの数字を表示するプログラムである。 + +```c +#include +int main(void) { + int i; + for (i = 1; i <= 10; i++) { + printf("%d\n", i); + } + return 0; +} +``` +
+ 実行結果 +``` +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +``` +
+ +フローチャートで表すと以下のようになる。 +![フローチャート](/fc_1_10_for.drawio.svg) + + + + + + +### 練習問題 + +1から5までの数字を順番に表示するよう、`for`文を使って出力部分を完成させてください。 + +```c +#include + +int main() { + // ここにfor文を使って1から5まで表示してください + + return 0; +} +``` +#### 実行結果 +``` +1 +2 +3 +4 +5 +``` + +
+ 模範解答 +```c +#include + +int main() { + for (int i = 1; i <= 5; i++) { + printf("%d\n", i); + } + + return 0; +} +``` +
+ +## 複合代入演算子 +--- + +複合代入演算子は、代入演算子と算術演算子を組み合わせた演算子である。 +代入と演算のコードを省略して記述できる。 + +| 演算子 | 実際の動作 | +|:-------|:--------| +| `a += b` | `a = a + b` | +| `a -= b` | `a = a - b` | +| `a *= b` | `a = a * b` | +| `a /= b` | `a = a / b` | +| `a %= b` | `a = a % b` | + +## for文のネスト +--- + +ループの中にループを記述する構造のことをネスト(入れ子)構造と呼ぶ。 +以下は、九九の表を表示するプログラムである。 + +```c +#include +int main(void) { + int i, j; + for (i = 1; i <= 9; i++) { + for (j = 1; j <= 9; j++) { + printf("%d * %d = %d\n", i, j, i * j); + } + } + return 0; +} +``` + +
+ 実行結果 +``` +1 * 1 = 1 +1 * 2 = 2 +1 * 3 = 3 +1 * 4 = 4 +~~~ +省略 +~~~ +9 * 8 = 72 +9 * 9 = 81 +``` +
+ +### 練習問題 + +二重の`for`文を使って、3×3の掛け算表を表示してください。 + +```c +#include + +int main() { + // ここにfor文のネストを書いてください + + return 0; +} +``` +#### 実行結果 +``` +1 2 3 +2 4 6 +3 6 9 +``` + +
+ 模範解答 +```c + #include + +int main() { + int i, j, num = 1; + + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + printf("%d ", num); + num++; + } + printf("\n"); + } + + return 0; +} +``` +
+ + +フローチャートで表すと以下のようになる。 +![フローチャート](/fc_99_for.drawio.svg) + +## 理解度チェック +--- + +{/* +{ +for文を使用して、1から10までの合計を求め、その値を出力しなさい。 +} + + + + +int main(void) { + int sum = 0; + + // 1 から 10 までの合計を求める + for (int i = 1; i <= 10; i++) { + sum += i; // sum = sum + i + } + + // 結果を表示 + printf("1 から 10 までの合計: %d\n",sum); + + return 0; +} +``` +} +}> +{+= は合計を求めるときに便利} + */} + +{/* +{ +for文を2つ使用して、ユーザーが指定した行数 N で 右上がりの三角形 を * で描画しなさい。 +実行例 +``` +行数を入力してください: 5 +* +* * +* * * +* * * * +* * * * * +``` +} + + + + +int main(void) { + int N; + + // ユーザーに行数を入力してもらう + printf("行数を入力してください: "); + scanf("%d", &N); + + // 三角形を描画 + for (int i = 1; i <= N; i++) { // 行のループ + for (int j = 1; j <= i; j++) { // 列のループ + printf("*"); + } + printf("\n"); // 1行描画したら改行 + } + + return 0; +} +``` +}> +{j <= i を条件式にすると、iの値が1からNまで増えるごとに、*の数が増やすことができる} + */} + + + + + + + + + + diff --git a/src/content/docs/textbook/c-lang/beginner/13--while.mdx b/src/content/docs/textbook/c-lang/beginner/13--while.mdx new file mode 100644 index 0000000..4d10241 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/13--while.mdx @@ -0,0 +1,281 @@ +--- +title: while文 +description: while文について学びます! +slug: textbook/c-lang/beginner/while +--- + +import { Aside } from "@astrojs/starlight/components"; + +## while +--- + +while文は、条件式が真の間、繰り返し処理を行う構文である。 + +```c +while (条件式) { + // 条件式が真の場合に実行される処理 +} +``` + +以下は、1から10までの数字を表示するプログラムである。 +```c +#include +int main(void) { + int i = 1; + while (i <= 10) { + printf("%d\n", i); + i++; + } + return 0; +} +``` +
+ 実行結果 +``` +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +``` +
+ +{/* while文の条件式に1を指定することで無限ループを作成できる */} +{/* for文のフローチャートと同じもの */} +フローチャートで表すと以下のようになる。 +![フローチャート](/fc_1_10_for.drawio.svg) + +### 練習問題 + +変数`count`が5になるまで繰り返し処理をする`while`文を書いてください。 + +```c +#include + +int main() { + int count = 1; + + // ここにwhile文を書いてください + + return 0; +} +``` +#### 実行結果 +``` +count: 1 +count: 2 +count: 3 +count: 4 +count: 5 +``` + +
+ 模範解答 +```c +#include + +int main() { + int count = 1; + + while (count <= 5) { + printf("count: %d\n", count); + count++; + } + + return 0; +} +``` +
+ + + + +## do-while文 +--- + +do-while文は、while文と同様に、条件式が真の間繰り返し処理を行う構文である。 +while文との違いは、条件式の判定を処理の後に行うため、**条件式が偽であっても1回は処理を実行する。** +特に理由がなければ、while文を使用することが推奨される。 + +```c +do { + // 条件式が真の場合に実行される処理 +} while (条件式); +``` + +以下は、0が入力されるまで数値を入力し続けるプログラムである。 +```c +#include + +int main(void) { + int num = 1; // 0以外の数値で初期化 + printf("0 を入力すると終了します。\n"); + + do { // 無限ループ + printf("数値を入力してください: "); + scanf("%d", &num); + printf("入力された数値: %d\n", num); + }while(num != 0); // 0 が入力されたらループを抜ける + + printf("終了しました。\n"); + return 0; +} +``` +
+ 実行結果 +実行結果 +``` +0 を入力すると終了します。 +数値を入力してください: 2 +入力された数値: 2 +数値を入力してください: 1 +入力された数値: 1 +数値を入力してください: -5 +入力された数値: -5 +数値を入力してください: 0 +入力された数値: 0 +終了しました。 +``` +--- +
+ + + +フローチャートで表すと以下のようになる。 +![フローチャート](/fc_inf_loop.drawio.svg) + +### 練習問題 + +`do-while`文を使って、入力した数が0でない限り繰り返し続けるプログラムを作成してください。 + +```c +#include + +int main() { + int num; + + // ここにdo-while文を書いてください + // numが0のときにループを終了します + + return 0; +} +``` +#### 実行結果 +``` +数値を入力してください:5 +数値を入力してください:3 +数値を入力してください:0 +終了します +``` + + +
+ 模範解答 + ```c + #include + +int main() { + int num; + + do { + printf("数値を入力してください:"); + scanf("%d", &num); + } while (num != 0); + + printf("終了します\n"); + + return 0; +} +``` +
+ +## 理解度チェック +--- + +{/* +{ +while文を使用して、ユーザーが 0 を入力するまで数値を合計し表示しなさい +} + + + + +int main(void) { + int num; + int sum = 0; + + printf("数値を入力してください(0で終了):\n"); + + while (1) { // 無限ループ + scanf("%d", &num); // ユーザー入力 + if (num == 0) { // 0が入力されたらループ終了 + break; + } + sum += num; // 合計に加算 + } + + printf("合計: %d\n", sum); + return 0; +} +``` +}> +{while文の条件式に1を指定することで無限ループを作成できる} + */} \ No newline at end of file diff --git a/src/content/docs/textbook/c-lang/beginner/14--switch.mdx b/src/content/docs/textbook/c-lang/beginner/14--switch.mdx new file mode 100644 index 0000000..778b0f1 --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/14--switch.mdx @@ -0,0 +1,461 @@ +--- +title: switch文 +description: switch文について学びます! +slug: textbook/c-lang/beginner/switch +--- + +import { Aside } from "@astrojs/starlight/components"; + +## switch +--- + +switch文は、条件によって処理を分岐させる構文である。 +if文と違い、条件式ではなく、式とその値によって処理を分岐させる。 + +```c +switch (式) { + case 値1: + // 式の値が値1の場合に実行される処理 + break; + case 値2: + // 式の値が値2の場合に実行される処理 + break; + default: + // どのcaseにも当てはまらない場合に実行される処理 + break; +} +``` + +以下は、選択したメニューの値段を返すプログラムである。 + +```c +#include + +int main(void) { + int menu_num; + + printf("メニューを選んでください:\n"); + printf("1: ラーメン\n"); + printf("2: チャーハン\n"); + printf("3: 餃子\n"); + + scanf("%d", &menu_num); + + switch (menu_num) { + case 1: + printf("1000円\n"); + break; + case 2: + printf("500円\n"); + break; + case 3: + printf("400円\n"); + break; + default: + printf("メニューにありません\n"); + break; + } + return 0; +} +``` +
+ 実行結果 +実行結果1 +``` +メニューを選んでください: +1: ラーメン +2: チャーハン +3: 餃子 +1 +1000円 +``` +--- +実行結果2 +``` +メニューを選んでください: +1: ラーメン +2: チャーハン +3: 餃子 +4 +メニューにありません +``` +--- +フローチャートで表すと以下のようになる。 +![フローチャート](/fc_menu_switch.drawio.svg) +
+ +## break +--- + +break文は、実行されるとループ処理やswitch文を抜け、次の処理へ移る構文である。 +break文を省略すると、次のcase文が実行される。 + +以下は、1から5までの数字が入力されたときに、メッセージを返すコードである。 +```c +#include +int main(void) { + int num; + printf("数字を入力してください: "); + scanf("%d", &num); + + switch (num) { + case 1: + printf("1が入力されました\n"); + break; + + // case 2,3の処理をまとめることもできる + case 2: + case 3: + printf("2か3が入力されました\n"); + break; + + // case 4の処理後にbreakがないため、case 5の処理も実行される。 + // しかし、break文が無いコードは、可読性が低いため、 + // breakを書くか、コメント文を残すことを推奨する。 + case 4: + printf("4が入力されました\n"); + case 5: + printf("4か5が入力されました\n"); + break; + + default: + printf("不明\n"); + break; + } + return 0; +} +``` +
+ 実行結果 +実行結果1 +``` +数字を入力してください: 1 +1が入力されました +``` +--- +実行結果2 +``` +数字を入力してください: 2 +2か3が入力されました +``` +--- +実行結果3 +``` +数字を入力してください: 3 +2か3が入力されました +``` +--- +実行結果4 +``` +数字を入力してください: 4 +4が入力されました +4か5が入力されました +``` +--- +実行結果5 +``` +数字を入力してください: 5 +4か5が入力されました +``` +--- +実行結果6 +``` +数字を入力してください: 6 +不明 +``` +--- +
+ +フローチャートで表すと以下のようになる。 +![フローチャート](/fc_sample_break.drawio.svg) + +### 練習問題 + +変数`num`の値に応じて曜日を表示する`switch`文を作成してください。 + +```c +#include + +int main() { + int num; + + printf("1から7の数字を入力してください: "); + scanf("%d", &num); + + // ここにswitch文を書いてください + + return 0; +} +``` +#### 実行結果 +
+``` +1から7の数字を入力してください: 1 +月曜日 +``` +``` +1から7の数字を入力してください: 2 +火曜日 +``` +``` +1から7の数字を入力してください: 3 +水曜日 +``` +``` +1から7の数字を入力してください: 4 +木曜日 +``` +``` +1から7の数字を入力してください: 5 +金曜日 +``` +``` +1から7の数字を入力してください: 6 +土曜日 +``` +``` +1から7の数字を入力してください: 7 +日曜日 +``` +
+ +
+ 模範解答 +```c +#include + +int main() { + int num; + + printf("1から7の数字を入力してください: "); + scanf("%d", &num); + + switch (num) { + case 1: + printf("月曜日\n"); + break; + case 2: + printf("火曜日\n"); + break; + case 3: + printf("水曜日\n"); + break; + case 4: + printf("木曜日\n"); + break; + case 5: + printf("金曜日\n"); + break; + case 6: + printf("土曜日\n"); + break; + case 7: + printf("日曜日\n"); + break; + default: + printf("1から7の数字を入力してください\n"); + break; + } + + return 0; +} +``` +
+ +## continue +--- + +continue文は、ループ処理を抜けずに次の処理へ移る構文である。 +以下は、1から100までの数字が入力されるとその数字を出力し、入力された数字が1から100まででないときは再入力させるコードである。 +```c +#include + +int main(void) { + int num = 1; // 0以外の数値で初期化 + + printf("0 を入力するとループを終了します。"); + + while (1) { + printf("1~100 の数値を入力してください: "); + scanf("%d", &num); + + if (num == 0) { + break; // break文はループそのものを抜ける + } else if (num < 1 || num > 100) { + printf("無効な入力です。もう一度入力してください。\n"); + continue; // continue文はループ処理を抜けずに次のループへ移る + } + + printf("入力された数値: %d\n", num); + } + return 0; +} +``` +
+ 実行結果 +``` +0 を入力するとループを終了します。 +1~100 の数値を入力してください: 50 +入力された数値: 50 +1~100 の数値を入力してください: 200 +無効な入力です。もう一度入力してください。 +1~100 の数値を入力してください: 0 +``` +
+--- + + + +### 練習問題 + +1から10までの数のうち、偶数だけを表示するように`continue`文を使ってください。 + +```c +#include + +int main() { + for (int i = 1; i <= 10; i++) { + // ここにcontinue文を使って偶数だけ表示してください + } + + return 0; +} +``` +#### 実行結果 +``` +2 +4 +6 +8 +10 +``` + + +
+ 模範解答 +```c +#include + +int main() { + for (int i = 1; i <= 10; i++) { + if (i % 2 != 0) { + continue; + } + printf("%d\n", i); + } + + return 0; +} +``` +
+ +## 理解度チェック +--- + +{/* +{ +swtich文を用いて月を入力すると対応する季節を表示しなさい。 +} + + + + +#include + +int main(void) { + int month; + + // ユーザーに入力を求める + printf("1~12の数字を入力してください (例: 3 → 春): "); + scanf("%d", &month); + + // switch文を使用して季節を判定 + switch (month) { + case 3: + case 4: + case 5: + printf("春です!\n"); + break; + case 6: + case 7: + case 8: + printf("夏です!\n"); + break; + case 9: + case 10: + case 11: + printf("秋です!\n"); + break; + case 12: + case 1: + case 2: + printf("冬です!\n"); + break; + default: + printf("エラー: 1~12の範囲で入力してください。\n"); + } + + return 0; +} +``` +}> +{case文をまとめることで、同じ処理をまとめることができる。} + */} diff --git a/src/content/docs/textbook/c-lang/beginner/15--ex-library.mdx b/src/content/docs/textbook/c-lang/beginner/15--ex-library.mdx new file mode 100644 index 0000000..4b2597a --- /dev/null +++ b/src/content/docs/textbook/c-lang/beginner/15--ex-library.mdx @@ -0,0 +1,202 @@ +--- +title: ex-標準ライブラリ +description: 標準ライブラリについて学びます! +slug: textbook/c-lang/beginner/library +--- + +import { Aside } from "@astrojs/starlight/components"; + +## 標準ライブラリとは +--- + +標準ライブラリとは、C言語の標準で提供されているCプログラムで利用できる関数やマクロの集合のことである。 +標準ライブラリには、様々な関数が用意されており、それらを利用することで、プログラムの開発が容易になる。 +標準ライブラリは、`#include`ディレクティブを用いてプログラムに取り込むことができる。 + +## stdio.h +--- + +`stdio.h`は、**標準入出力**を行うためのヘッダファイルである。 +ヘッダファイルとは、関数やマクロ、型定義などを記述し、他のCファイルで再利用できるようにするファイルであり、拡張子に`.h`を用いるものである。 +以下は、stdio.hで提供されている関数の一部である。 + +- `printf()` / `scanf()`: 画面への出力・キーボードからの入力 +- `fopen()` / `fclose()`: ファイルのオープン・クローズ +- `fgets()` / `fputs()`: ファイルからの読み込み・書き込み + +## math.h +--- +`math.h`は、**数学関数**を提供するヘッダファイルである。 +以下は、math.hで提供されている関数の一部である。 + +- `sin()`, `cos()`, `tan()`: 三角関数 +- `sqrt()`: 平方根 +- `pow()`: べき乗 +```c +#include +#define _USE_MATH_DEFINES // VSCodeでM_PIを使うための定義 +#include +#include + +int main(void) { + double angle = 45.0; // 角度(度数法) + double radians = angle * M_PI / 180.0; // ラジアン変換 M_PIは非推奨 + + // 三角関数 + printf("sin(%.2f度) = %.5f\n", angle, sin(radians)); + printf("cos(%.2f度) = %.5f\n", angle, cos(radians)); + printf("tan(%.2f度) = %.5f\n", angle, tan(radians)); + + // 平方根 + double num = 25.0; + printf("sqrt(%.2f) = %.2f\n", num, sqrt(num)); + + // 累乗 + printf("2^3 = %.2f\n", pow(2.0, 3.0)); + + return 0; +} + +``` +
+ 実行結果 +``` +sin(45.00度) = 0.70711 +cos(45.00度) = 0.70711 +tan(45.00度) = 1.00000 +sqrt(25.00) = 5.00 +2^3 = 8.00 +``` +
+ + + +## string.h +--- +`string.h`は、**文字列操作**を行うためのヘッダファイルである。 +以下は、string.hで提供されている関数の一部である。 + +- `strlen()`: 文字列の長さを取得 +- `strcpy()`: 文字列のコピー +- `strcat()`: 文字列の連結 +- `strcmp()`: 文字列の比較 + +```c +#include +#include + +int main(void) { + // 1. strlen() - 文字列の長さ + char str1[] = "Hello"; + printf("文字列: \"%s\"\n", str1); + printf("長さ: %lu\n\n", strlen(str1)); // ヌル終端を除いた長さ + + // 2. strcpy() - 文字列のコピー + char source[] = "C Programming"; + char destination[50]; // 十分なサイズの配列を確保 + strcpy(destination, source); + printf("コピー後の文字列: \"%s\"\n\n", destination); + + // 3. strcat() - 文字列の連結 + char str2[50] = "Hello, "; + char str3[] = "World!"; + strcat(str2, str3); + printf("連結結果: \"%s\"\n\n", str2); + + // 4. strcmp() - 文字列の比較 + char cmp1[] = "apple"; + char cmp2[] = "banana"; + char cmp3[] = "apple"; + + printf("strcmp(cmp1, cmp2) = %d\n", strcmp(cmp1, cmp2)); // "apple" < "banana" → 負の値 + printf("strcmp(cmp1, cmp3) = %d\n", strcmp(cmp1, cmp3)); // "apple" == "apple" → 0 + printf("strcmp(cmp2, cmp1) = %d\n", strcmp(cmp2, cmp1)); // "banana" > "apple" → 正の値 + + return 0; +} +``` +
+ 実行結果 +``` +文字列: "Hello" +長さ: 5 + +コピー後の文字列: "C Programming" + +連結結果: "Hello, World!" + +strcmp(cmp1, cmp2) = -1 +strcmp(cmp1, cmp3) = 0 +strcmp(cmp2, cmp1) = 1 +``` +
+## stdlib.h +--- + +`stdlib.h`は、**乱数生成やメモリの確保・解放など**を行うためのヘッダファイルである。 +以下は、stdlib.hで提供されている関数の一部である。 + +- `abs()`: 整数の絶対値を取得 +- `rand()`: 乱数の生成 +- `malloc()`: メモリの確保 +- `free()`: メモリの解放 + +```c +#include +#include +#include + +int main(void) { + + // 絶対値 + int x = -10; + printf("abs(%d) = %d\n", x, abs(x)); + + // 乱数の生成(rand()) + srand(time(NULL)); // 乱数の種を設定 + int random_number = rand() % 100; // 0〜99の乱数を生成 + printf("生成された乱数: %d\n\n", random_number); + + // メモリの確保(malloc()) + int size = 5; + int *arr = (int *)malloc(size * sizeof(int)); // int型5個分のメモリを確保 + if (arr == NULL) { + printf("メモリの確保に失敗しました。\n"); + return 1; // エラー終了 + } + + // 配列に乱数を格納 + printf("確保したメモリに乱数を格納:\n"); + for (int i = 0; i < size; i++) { + arr[i] = rand() % 100; // 0〜99の乱数を代入 + printf("arr[%d] = %d\n", i, arr[i]); + } + + // メモリの解放(free()) + free(arr); + printf("\n確保したメモリを解放しました。\n"); + + return 0; +} +``` +
+ 実行結果 +``` +abs(-10) = 10 +生成された乱数: 7 + +確保したメモリに乱数を格納: +arr[0] = 4 +arr[1] = 98 +arr[2] = 37 +arr[3] = 57 +arr[4] = 23 + +確保したメモリを解放しました。 +``` +
\ No newline at end of file