# C言語復習勉強会:初級編 ## 問1:お酒は二十歳になってから P学科の全学年で飲み会が開催されることになりました。 しかし、お酒は20歳以上でないと飲めないため、 お酒が飲める人と飲めない人を下記のように分類してください。 Aテーブルは、**20歳以上**で**お酒を飲む**人。 Bテーブルは、**20歳未満**、または**お酒を飲まない**人。 ### 入力例:1 ``` 年齢:21 飲まない=0、飲む=1 お酒を飲みますか?:1 ``` ### 出力:1 ``` 20歳以上でお酒を飲むため、A ``` ### 入力例:2 ``` 年齢:19 飲まない=0、飲む=1 お酒を飲みますか?:1 ``` ### 出力:2 ``` 20歳未満、またはお酒を飲まないため、B ``` --- ### C言語の文法(ヒント) #### scanf() <details><summary>表示</summary> scanf()を使うことで、数値として変数に格納することができます。 数値として変数に格納されるため、算術演算子を使って計算をすることも可能です。 ```cpp= #include <stdio.h> int main(void) { double d; printf("数値を入力\n"); scanf("%lf", &d); printf("計算結果は:%lf\n", d + 1.0); return 0; } ``` ``` 数値を入力 0.5 計算結果は:1.500000 ``` </details> #### if文の書き方 <details><summary>表示</summary> ##### if文の書き方 「if文」は、条件分岐、つまり、この条件の時にこの処理を行うといった命令を書くための文です。 ``` if (条件式、x > yなど) printf("処理1"); ``` 複数の処理を書くためには、`{}`でくくります。 ``` if (条件式、x > yなど) { printf("処理1"); printf("処理2"); } ``` 下記のコードを試してみましょう。 ```cpp= #include<stdio.h> int main(void) { int x; int y; scanf("%d", &x); scanf("%d", &y); if (x > y) // ここを >= に変えて違いを見てみましょう。xはy以上となります。 printf("xはyより大きい"); } ``` ##### 条件式とif else | 演算子 | 使い方 | 意味 | | -------- | -------- | -------- | |==|a == b|aとbの値が等しい |!=|a != b|aとbの値が等しくない |< | a < b|aはb未満 |> | a > b|bはa未満 |<=|a <= b|aはb以上 |>=|a >= b|aはb以下 下記のコードを試してみましょう。 ``` `score`が 80点以上なら、優 70点以上なら、良 60点以上なら、可 それ以外、不可 ``` ```cpp= #include <stdio.h> int main(void) { int score; scanf("%d", &score); if (score >= 80) { printf("優"); } else if (score >= 70) { printf("良"); } else if (score >= 60) { printf("可"); } else { printf("不可"); } } ``` これらの知識をもとに問題を解いてみましょう。 </details> ##### 論理演算子 <details><summary>表示</summary> 論理演算子を使うことで「a と bが等しい」かつ「c は dよりも大きい」 といった条件式を組み合わせた複雑な条件式を作れます。 ```cpp= #include <stdio.h> int main(void) { int x = 10; if (x > 3 && x < 20) { printf("x は3より大きく20未満\n"); } return 0; } ``` | 演算子 | 名前 | 記述例 |意味| | -------- | -------- | -------- | -------- | |`&&`|AND | `a && b`|aかつb | `||` | OR | `a || b` | aまたはb |`!=`| NOT|`a != b`|aとbは異なる </details> :::info 変数宣言、エスケープシーケンス、if文、scanf()、論理演算子を扱う問題。 ::: --- ### ロジック(わからない場合) <details><summary>表示</summary> ```cpp= #include<stdio.h> int main(void) { 整数型 age alcohol; "年齢:"を表示 ageをscanf "飲まない=0、飲む=1\nお酒を飲みますか?:"を表示 alcoholをscanf もしageが20以上かつalcoholが1 "20歳以上でお酒を飲むため、A\n"を表示 それ以外もしageが20未満またはalcoholが0 "20歳未満、またはお酒が飲まないため、B\n"を表示 終了 } ``` </details> --- ### 答え(最後に見る) <details><summary>表示</summary> ```cpp= #include <stdio.h> int main(void) { int age, alcohol; printf("年齢:"); scanf("%d", &age); printf("飲まない=0、飲む=1\nお酒を飲みますか?:"); scanf("%d", &alcohol); if (age >= 20 && alcohol == 1) { printf("20歳以上でお酒を飲むため、A\n"); } else if (age < 20 || alcohol == 0) { printf("20歳未満、またはお酒が飲まないため、B\n"); } return 0; } ``` </details> --- ## 問2:会費の徴収(for文) 飲み会の開始前に会費を徴収することになりました。 合計人数、各個人の年齢、お酒を飲むか?を入力し、一人ずつの会費を求めて下さい。 ただし、 お酒を**飲む**Aテーブルは、**3000**円。 お酒を**飲まない**Bテーブルは、**2000**円 とします。 ### 入出力例 ``` 人数を入力:3 1人目の年齢:20 飲まない=0、飲む=1 お酒を飲みますか?:1 1人目の会費:3000 2人目の年齢:18 飲まない=0、飲む=1 お酒を飲みますか?:1 2人目の会費:2000 3人目の年齢:23 飲まない=0、飲む=1 お酒を飲みますか?:0 3人目の会費:2000 ``` --- ### C言語の文法(ヒント) ##### for文の書き方 <details><summary>表示</summary> 「for」文は、同じ処理を繰り返して行ったり、変数の値を変えながら同じ処理を行うための命令文です。 ``` for (初期化;条件式;変化式){ 処理1; 処理2; } ``` 1から始まり、3まで処理を繰り返す場合、 初期化:`i`は1から 条件式:`i`は3以上 変化式:`i`に1を足し算(インクリメント) ```cpp= #include <stdio.h> int main(void){ int i; for (i = 1; i <= 3; i++){ printf("こんにちは\n"); printf("%d回目の繰り返しです\n", i); } return 0; } ``` </details> --- ### ロジック(わからない場合) <details><summary>表示</summary> ```cpp= 整数型 age alcohol, num, i; printf("人数を入力:"); numをscanf forで1~numまで繰り返す printf("%d人目の年齢:", i); printf("飲まない=0、飲む=1\nお酒を飲みますか?:"); alcoholをscanf printf("%d人目の会費:", i); もしageが20以上かつalcoholが1 "3000\n"を表示 それいがいの場合、ageが20未満またはalcoholが0 "2000\n"を表示 終了 ``` </details> --- ### 答え(最後に見る) <details><summary>表示</summary> ```cpp= #include <stdio.h> int main(void) { int age, alcohol; int num, i, sum; printf("人数を入力:"); scanf("%d", &num); for (i = 1; i <= num; i++) { printf("%d人目の年齢:", i); scanf("%d", &age); printf("飲まない=0、飲む=1\nお酒を飲みますか?:"); scanf("%d", &alcohol); printf("%d人目の会費:", i); if (age >= 20 && alcohol == 1) { printf("3000\n"); } else if (age < 20 || alcohol == 0) { printf("2000\n"); } } return 0; } ``` </details> --- ## 中・上級編 中・上級編は、必ずしも解ける必要はありませんが、解きたい人は是非解いてくださいね。 解説もあります。 ![](https://i.imgur.com/wkJhWVJ.png) http://witheart.html.xdomain.jp/stanhard.html ## アンケート <iframe src="https://docs.google.com/forms/d/e/1FAIpQLSf4cKuLE7gzO2Uay7dYx_ewYDU4N1S9Ht8hVxGf-650ixWD4w/viewform?embedded=true" width="640" height="895" frameborder="0" marginheight="0" marginwidth="0">読み込んでいます…</iframe>