C言語 の演習問題を解いてみましょう。今回は配列について扱います。
問題文で提示された要件を満たすプログラムを作成してみて下さい。
この記事はシリーズ記事です。全シリーズはこちらからご覧になれます。
(C言語の基礎、操作方法等の記事⼀覧は こちら)
第1問
キーボードから希望する人数の点数を入力し、入力された点数のうちで最大点数と最小点数を画面表示するコードを作成して下さい。(人数は上限500人までとしてよい)
◆回答例◆
#include <stdio.h>
int main(void) {
int i;
int max;
int min;
int count = 0;
int num = 0;
printf("何人分の結果を集計しますか? -> ");
scanf("%d", &num);
int scores[500];
printf("テストの点数を入力して下さい。\n");
for (i = 0; i < num; i++) {
scanf("%d", &scores[i]);
if (i == 0) {
max = scores[0];
min = scores[0];
continue;
}
if (max < scores[i]) {
max = scores[i];
}
if (min > scores[i]) {
min = scores[i];
}
}
printf("最高点: %d, 最低点: %d\n", max, min);
return 0;
}
第2問
第1問のコードに修正を加えてください。
点数を入力して最大・最小を画面表示後、テストの合格点を入力することで何人が合格したかを表示するコードを作成して下さい。
◆回答例◆
#include <stdio.h>
int main(void) {
int i;
int max;
int min;
int count = 0;
int num = 0;
int pass = 0;
printf("何人分の結果を集計しますか? -> ");
scanf("%d", &num);
int scores[500];
printf("テストの点数を入力して下さい。\n");
for (i = 0; i < num; i++) {
if (i == 0) {
max = scores[0];
min = scores[0];
continue;
}
if (max < scores[i]) {
max = scores[i];
}
if (min > scores[i]) {
min = scores[i];
}
}
printf("最高点: %d, 最低点: %d\n", max, min);
printf("何点以上の人数を調べたいですか? -> ");
scanf("%d", &pass);
for (i = 0; i < num; i++) {
if (scores[i] >= pass) {
count++;
}
}
printf("%d点以上の人数:%d人\n", pass, count);
return 0;
}
第3問(応用)
ユーザーから任意の1文字の入力を受け取り、下記の文字列の中にいくつ任意の1文字が存在するかを調べるコードを作成して下さい。
「The C programming language is a versatile, hardware-like, low-level manipulation programming language, developed in the 1970s and widely used for system programs and operating system development. It is also the basis for many other languages.」
◆回答例◆
#include <stdio.h>
int main(void) {
char text[] = "The C programming language is a versatile, hardware-like, low-level manipulation programming language, developed in the 1970s and widely used for system programs and operating system development. It is also the basis for many other languages.";
char target;
int count = 0;
printf("任意の1文字を入力してください: ");
scanf(" %c", &target); // 前にスペースを置くことで前の改行を無視
for (int i = 0; text[i] != '\0'; i++) {
if (text[i] == target) {
count++;
}
}
printf("文字 '%c' は文字列の中に %d 回含まれています。\n", target, count);
return 0;
}
scanf
のフォーマット指定子の前にスペースを置くと、scanf
はその時点で改行(\n
)、スペース()、タブ(\t
)といったホワイトスペース文字を全て読み飛ばします。
第4問
int型の整数を15個格納する配列を作成し、for文を使ってフィボナッチ数列を計算して格納し、出力するコードを作成して下さい。初めの2桁(1桁目:1、2桁目:1)は事前に与えてよいです。
※フィボナッチ数列とは: 前の2つの数の和が次の数になるような数列のこと(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …)
◆回答例◆
#include <stdio.h>
int main(void) {
int fibonacci[15]; // フィボナッチ数列を格納する配列
int i;
fibonacci[0] = 1;
fibonacci[1] = 1;
for (i = 2; i < 15; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
printf("フィボナッチ数列: ");
for (i = 0; i < 15; i++) {
printf("%d ", fibonacci[i]);
}
printf("\n");
return 0;
}
第5問
文字列”Hello,C!Goodbye!\n”を格納するchar型の配列msgを作成し、文字を後ろから順番に出力するプログラムを書いてください。
◆回答例◆
#include <stdio.h>
#include <string.h>
int main(void) {
char msg[] = "Hello,C!Goodbye!\n";
int length = strlen(msg); // 文字列の長さを取得
printf("文字を後ろから順番に出力\n");
for (int i = length - 1; i >= 0; i--) {
putchar(msg[i]); // 1文字ずつ出力
}
return 0;
}
第6問
任意の数字10個を配列に格納し、その値を小さい順に並び替えるプログラムを作成してください。
配列の並べ替えの代表的な手法に「バブルソート」があります。調べて使ってみましょう。
※(任意)下記の配列を利用して頂いてもかまいません。
int arr[10] = {64, 34, 25, 12, 22, 11, 90, 77, 45, 89}; // 任意の10個の数字
◆回答例◆
#include <stdio.h>
int main(void) {
int arr[10] = {64, 34, 25, 12, 22, 11, 90, 77, 45, 89}; // 任意の10個の数字
int n = 10;
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 隣接する要素を交換
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("並び替え後の配列:\n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
上記のような回答例の並び替え方法をバブルソートと言います。隣り合う要素の大小を比較しながら整列させるソートアルゴリズムです。
プログラミングは、練習と経験が鍵となります。ぜひ問題に挑戦し続けてください。別の記事で、より複雑な課題にも取り組みスキルをさらに磨いていきましょう。
この記事はシリーズ記事です。全シリーズはこちらからご覧になれます。
コメント