#初級問題
####1.次の流れ図は、2次方程式ax²+bx+c=0について係数a, b, cを入力し、解の個数を判別するものである。空欄を語群から選べ。
語群
解答例
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/1c259277-0039-4464-e8d6-9d60c42e17a7.png)####2.int型変数num1,num2にそれぞれ任意の数を入れそれぞれを足した値をsumに入れsumを出力するプログラムの作成。
フローチャート
![1-1frow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/b0d51188-5d65-0d6f-647c-51848bec4bf6.png)解答例
#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;
}
####3.キーボードから任意のテストの点数を入力して60点以上なら"合格"、60点未満なら"不合格"と表示するプログラムの作成。
フローチャート
![1-2f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/8d58b611-28e2-5653-471c-7e28aab32d2f.png)解答例
#include<stdio.h>
int main(void)
{
int a;
printf("テストの点数を入力してください\n");
scanf("%d", &a);
if (a >= 60) {
printf("合格\n");
}
else {
printf("不合格\n");
}
return 0;
}
####4.任意の数を5つ入力してそれらの平均を求めるプログラムの作成。
5つ入力はfor文を使って実装するのが望ましい。
フローチャート
![1-3fvar2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/90d1b064-83a9-6ffa-da35-fc771a41ce84.png)解答例
#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;
}
####5.次の流れ図は、配列n(1)~n(5)に格納されているデータを昇順にバブルソートで並び替えるものである。①~⑤にあてはまるものを解答群から選びなさい。また、そのプログラムを完成させなさい。
バブルソートとはデータを配列の下段から上段に移動させながら並べ替える手法である。
フローチャート解答例
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767214/866f0449-4f47-cc27-81ed-1b0c755eceb7.png)プログラム解答例
#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;
}
#中級問題
####1.5の配列にそれぞれデータを入力しその各値分の*を出力するプログラムの作成。
解答例
#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;
}
####2.1~10の乱数を10個生成してそれらのave、min、maxを求めるプログラムの作成。
解答例
#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;
}
#上級問題
####1.モンテカルロ法を用いて円周率を算出するプログラムの作成。
原理
モンテカルロ法とは乱数を用いたシミュレーションのことです。
下記のように4分の1の円の中に疑似乱数で点を打つ。(半径1)円弧の内側に入った点の数をin、すべての点の数をallとする。この時inとallの関係は*$in:all = \frac{π}{4}:1$である。よって$π = \frac{4\times in}{all}$* となる。なお点が円の中に入ってるかどうかは座標が1の円の内側にあるかを考えたらよいので、$x^2+y^2 \leqq 1$の場合が内側にあるといえる。
解答例
#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;
}
####2.素因数分解を行い、それぞれの素数とその指数を出力するプログラムを作成。
解答例
#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;
}