1. 点数評価システム
#include <stdio.h>
char calculateGrade(int score);
int main() {
int score;
char result;
while (printf("点数を入力してください: "), scanf("%d", &score) != EOF) {
result = calculateGrade(score);
printf("Score: %d, Grade: %c\n\n", score, result);
}
return 0;
}
char calculateGrade(int score) {
char grade;
switch (score / 10) {
case 10:
case 9: grade = 'A'; break;
case 8: grade = 'B'; break;
case 7: grade = 'C'; break;
case 6: grade = 'D'; break;
default: grade = 'E';
}
return grade;
}
問題1: 100点満点の点数を評価等級に変換するシステムを作成します。
問題2: 70-100点の範囲で不正な評価が発生するバグを修正します。
2. 数字の桁和計算
#include <stdio.h>
int sumDigits(int num);
int main() {
int num;
int total;
while (printf("整数を入力してください: "), scanf("%d", &num) != EOF) {
total = sumDigits(num);
printf("入力された数: %d, �桁和: %d\n\n", num, total);
}
return 0;
}
int sumDigits(int num) {
int sum = 0;
int digit;
while (num != 0) {
digit = num % 10;
sum += digit;
num /= 10;
}
return sum;
}
問題1: 整数の各桁の数字の和を計算します。
問題2: 桁和を計算するための2つのアルゴリズム(再帰と反復)を説明します。
3. 幂数計算
#include <stdio.h>
int computePower(int base, int exponent);
int main() {
int base, exponent;
int result;
while (printf("基数と指数を入力してください: "), scanf("%d%d", &base, &exponent) != EOF) {
result = computePower(base, exponent);
printf("指数: %d, 結果: %d\n\n", exponent, result);
}
return 0;
}
int computePower(int base, int exponent) {
if (exponent == 0) {
return 1;
} else if (exponent % 2 == 1) {
return base * computePower(base, exponent - 1);
} else {
int temp = computePower(base, exponent / 2);
return temp * temp;
}
}
4. 孪生素数検出
#include <stdio.h>
int checkPrime(int number);
int main() {
int i, number, twin, count = 0;
printf("100以下の孨生素数:\n");
for (i = 2; ; ++i) {
number = i;
twin = i + 2;
if (twin > 100) {
break;
}
if (checkPrime(number) && checkPrime(twin)) {
printf("%d, %d\n", number, twin);
count++;
}
}
printf("100以下の孨生素数の個数: %d個\n", count);
return 0;
}
int checkPrime(int number) {
if (number <= 1) {
return 0;
}
for (int divisor = 2; divisor * divisor <= number; ++divisor) {
if (number % divisor == 0) {
return 0;
}
}
return 1;
}
5. ハノイの塔
#include <stdio.h>
int solveHanoi(unsigned int disks, char source, char target, char auxiliary);
void moveDisk(unsigned int diskNum, char from, char to);
int main() {
unsigned int disks;
while (printf("ディスクの数を入力してください: "), scanf("%u", &disks) != EOF) {
int moveCount = solveHanoi(disks, 'A', 'C', 'B');
printf("%u個のディスクを移動した回数: %d回\n\n", disks, moveCount);
}
return 0;
}
int solveHanoi(unsigned int disks, char source, char target, char auxiliary) {
int moveCount = 0;
if (disks == 1) {
moveDisk(1, source, target);
moveCount++;
} else {
moveCount += solveHanoi(disks - 1, source, auxiliary, target);
moveDisk(disks, source, target);
moveCount++;
moveCount += solveHanoi(disks - 1, auxiliary, target, source);
}
return moveCount;
}
void moveDisk(unsigned int diskNum, char from, char to) {
printf("%u: %c → %c\n", diskNum, from, to);
}
6. 組み合わせ計算
方法1:
#include <stdio.h>
int combination(int n, int m);
int main() {
int n, m;
int result;
while (printf("nとmを入力してください: "), scanf("%d%d", &n, &m) != EOF) {
result = combination(n, m);
printf("n = %d, m = %d, 組み合わせ数 = %d\n\n", n, m, result);
}
return 0;
}
int combination(int n, int m) {
if (m < 0 || n < m) {
return 0;
}
int numerator = 1;
int denominator1 = 1;
int denominator2 = 1;
for (int i = 1; i <= n; ++i) {
numerator *= i;
}
for (int i = 1; i <= m; ++i) {
denominator1 *= i;
}
for (int i = 1; i <= n - m; ++i) {
denominator2 *= i;
}
return numerator / (denominator1 * denominator2);
}
方法2:
#include <stdio.h>
int combination(int n, int m);
int main() {
int n, m;
int result;
while (printf("nとmを入力してください: "), scanf("%d%d", &n, &m) != EOF) {
result = combination(n, m);
printf("n = %d, m = %d, 組み合わせ数 = %d\n\n", n, m, result);
}
return 0;
}
int combination(int n, int m) {
if (n == m) {
return 1;
} else if (m == 0) {
return 1;
} else if (n < m) {
return 0;
} else {
return combination(n - 1, m) + combination(n - 1, m - 1);
}
}
7. 最大公約数計算
#include <stdio.h>
int gcd(int a, int b, int c);
int main() {
int a, b, c;
int result;
while (printf("3つの整数を入力してください: "), scanf("%d%d%d", &a, &b, &c) != EOF) {
result = gcd(a, b, c);
printf("最大公約数: %d\n\n", result);
}
return 0;
}
int gcd(int a, int b, int c) {
int temp;
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
temp = a;
a = c;
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
7月19日 17:22 投稿