OECU１年C言語復習会用問題

#初級問題
####1.次の流れ図は、2次方程式ax²+bx+c=0について係数a, b, cを入力し、解の個数を判別するものである。空欄を語群から選べ。
***語群***
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/8de02a7a-605d-8047-5c64-7d6dd9f23b67.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/19e68743-f64e-cbb3-89dd-5acf83d32d46.png)

<details><summary>解答例</summary>
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/1c259277-0039-4464-e8d6-9d60c42e17a7.png)
</details>


####2.int型変数num1,num2にそれぞれ任意の数を入れそれぞれを足した値をsumに入れsumを出力するプログラムの作成。
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/423575bf-aa59-96c0-1fc2-2ddc18c348f0.png)

<details><summary>フローチャート</summary>
![1-1frow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/b0d51188-5d65-0d6f-647c-51848bec4bf6.png)
</details>

<details><summary>解答例</summary><div>

```c
#include <stdio.h>
int main(void) {

	int num1, num2, sum;

	scanf("%d", &num1);
	scanf("%d", &num2);

	sum = num1 + num2;

	printf("sum = %d", sum);

	return 0;
}
```
</div></details>



####3.キーボードから任意のテストの点数を入力して60点以上なら"合格"、60点未満なら"不合格"と表示するプログラムの作成。
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/21a93a3f-89aa-67ff-b010-4905ffcc3933.png)

<details><summary>フローチャート</summary>
![1-2f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/8d58b611-28e2-5653-471c-7e28aab32d2f.png)
</details>


<details><summary>解答例</summary><div>

```c
#include<stdio.h>
int main(void)
{
	int a;
	printf("テストの点数を入力してください\n");
	scanf("%d", &a);
	if (a >= 60) {
		printf("合格\n");
	}
	else {
		printf("不合格\n");
	}
	return 0;
}
```
</div></details>

####4.任意の数を５つ入力してそれらの平均を求めるプログラムの作成。

:::note info
５つ入力はfor文を使って実装するのが望ましい。
:::

![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/389a7f9f-76c5-331d-ea66-9bd249932e33.png)

<details><summary>フローチャート</summary>
![1-3fvar2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/90d1b064-83a9-6ffa-da35-fc771a41ce84.png)

</details>



<details><summary>解答例</summary><div>

```c
#include<stdio.h>
int main(void) {
	int a, i, sum;
	sum = 0;

	printf("整数を5つ入力してください\n");
	for (i = 0; i < 5; i++) {
		scanf("%d", &a);
		sum += a;
	}

	printf("平均 %.2f\n", sum / 5.0);

	return 0;
}
```
</div></details>

####5.次の流れ図は、配列n(1)～n(5)に格納されているデータを昇順にバブルソートで並び替えるものである。①～⑤にあてはまるものを解答群から選びなさい。また、そのプログラムを完成させなさい。

:::note info
バブルソートとはデータを配列の下段から上段に移動させながら並べ替える手法である。
:::
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/aab90dd5-1d02-5398-6eb9-84d190c828d7.png)

![1-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/b9116ea3-b7e2-9bec-d0c5-12d9591595f8.png)


![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/c3cfeb63-436d-563a-4de7-0beacabc98de.png)
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/60623a22-ed93-cc44-4d99-9fcde79c753a.png)

<details><summary>フローチャート解答例</summary>
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/866f0449-4f47-cc27-81ed-1b0c755eceb7.png)
</details>

<details><summary>プログラム解答例</summary><div>

```c
#include <stdio.h>
int main(void)
{
	int i, j, d, tmp;
	int n[5] = { 34, 83, 41, 29, 76 };
	for (i = 0; i < 4; i++)
	{
		for (j = 4; i < j; j--)
		{
			if (n[j - 1] > n[j])
			{
				tmp = n[j];
				n[j] = n[j - 1];
				n[j - 1] = tmp;
			}
		}
	}
	printf("n[");
	for (i = 0; i < 4; i++)
	{
		printf("%d,", n[i]);
	}
	printf("%d]", n[i]);
	return 0;
}
```
</div></details>


#中級問題
####1.５の配列にそれぞれデータを入力しその各値分の*を出力するプログラムの作成。
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/263524d4-7d76-b45d-f155-28934fe3444b.png)

<details><summary>解答例</summary><div>

```c
#include <stdio.h>
int main(void) {
	int d[5], i, j;
	for (i = 0; i < 5; i++) {
		scanf("%d", &d[i]);
	}
	for (i = 0; i < 5; i++) {
		printf("d[%d]", i);
		for (j = 1; j <= d[i]; j++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;
}
```
</div></details>

####2.１～１０の乱数を１０個生成してそれらのave、min、maxを求めるプログラムの作成。

![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/6b1505be-bd37-6527-9cbc-5f2bc490336a.png)

<details><summary>解答例</summary><div>

```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
	int a[10];
	int max, min, i;
	float ave;

	srand(time(NULL));

	for (i = 0; i < 10; i++) {
		a[i] = rand() % 10 + 1;
		printf("%d,", a[i]);
	}

	printf("\n");

	ave = a[0];
	max = a[0];
	min = a[0];

	for (i = 1; i < 10; i++) {
		ave += a[i];
		if (a[i] > max) {
			max = a[i];
		}
		if (a[i] < min) {
			min = a[i];
		}
	}
	ave = ave / 10;

	printf("max = %d,min = %d,ave = %.1f", max, min, ave);


	return 0;
}
```
</div></details>

#上級問題
####1.モンテカルロ法を用いて円周率を算出するプログラムの作成。

**原理**
モンテカルロ法とは乱数を用いたシミュレーションのことです。
下記のように４分の１の円の中に疑似乱数で点を打つ。（半径１）円弧の内側に入った点の数をin、すべての点の数をallとする。この時inとallの関係は*$in:all = \frac{π}{4}:1$*である。よって*$π = \frac{4\times in}{all}$* となる。なお点が円の中に入ってるかどうかは座標が１の円の内側にあるかを考えたらよいので、$x^2+y^2 \leqq 1$の場合が内側にあるといえる。
![モンテカルロ法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/3376d3bc-a27e-21ad-0a93-b80b993ae6a6.png)
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/58602683-badb-9e74-2204-96fe97278c5e.png)


<details><summary>解答例</summary><div>

```c
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ALL 100000

int main(void) {
	int i, in;
	float x, y, pi;

	in = 0;
	srand(time(NULL));

	for (i = 0; i < ALL; i++) {
		x = (float)rand() / RAND_MAX;
		y = (float)rand() / RAND_MAX;

		if (x * x + y * y <= 1) {
			in++;
		}
	}

	pi = 4.0 * in / ALL;
	printf("円周率は%f", pi);

	return 0;
}
```
</div></details>

####2.素因数分解を行い、それぞれの素数とその指数を出力するプログラムを作成。
![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/59b8894a-6b62-d094-a3b5-aef7945a14d0.png)

<details><summary>解答例</summary><div>

```c
#include <stdio.h>
int main(void)
{
	int num;
	int i, c = 0;
	do {
		printf("自然数を入力してください　");
		scanf("%d", &num);
	} while (num < 1);
	if (num == 1)
	{
		c++;
		printf("素因数：1　指数：1");
	}
	else
	{
		for (i = 2; i <= num; i++)
		{
			while (num % i == 0)
			{
				c++;
				num = num / i;
			}
			if (c != 0)
				printf("素因数：%d　指数：%d\n", i, c);

			c = 0;
		}
	}
	return 0;
}
```
</div></details>