# 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>
---
## 中・上級編
中・上級編は、必ずしも解ける必要はありませんが、解きたい人は是非解いてくださいね。
解説もあります。

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>