Hoạt động 1:
1 #include <stdio.h>
2
3 char convert_score_to_grade(int point);
4
5 int main() {
6 int point;
7 char level;
8 while(scanf("%d", &point) != EOF) {
9 level = convert_score_to_grade(point);
10 printf("Điểm: %d, Xếp loại: %c\n\n", point, level);
11 }
12 return 0;
13 }
14
15 char convert_score_to_grade(int point) {
16 char result;
17 switch(point/10) {
18 case 10:
19 case 9: result = 'A'; break;
20 case 8: result = 'B'; break;
21 case 7: result = 'C'; break;
22 case 6: result = 'D'; break;
23 default: result = 'E';
24 }
25 return result;
26 }
Câu hỏi 1: Hàm này nhận một điểm số nguyên và trả về ký tự tương ứng với xếp loại. Tham số đầu vào là số nguyên point, giá trị trả về là ký tự result.
Câu hỏi 2: Có, nếu thiếu lệnh break sẽ khiến chương trình không dừng đúng lúc; dấu ngoặc kép nên được thay bằng dấu ngoặc đơn.
Hoạt động 2:
1 #include <stdio.h>
2
3 int calculate_digit_sum(int number);
4
5 int main() {
6 int number;
7 int total;
8 while(printf("Nhập n: "), scanf("%d", &number) != EOF) {
9 total = calculate_digit_sum(number);
10 printf("n = %d, tổng = %d\n\n", number, total);
11 }
12 return 0;
13 }
14
15 int calculate_digit_sum(int number) {
16 int total = 0;
17 while(number != 0) {
18 total += number % 10;
19 number /= 10;
20 }
21 return total;
22 }
Câu hỏi 1: Tính tổng các chữ số của một số nguyên.
Câu hỏi 2: Có thể, hàm ban đầu sử dụng lặp để tính từng chữ số rồi cộng lại, hàm mới sử dụng đệ quy bằng cách gọi chính nó để đạt được kết quả.
Hoạt động 3:
1 #include <stdio.h>
2
3 int compute_power(int base, int exponent);
4
5 int main() {
6 int base, exponent;
7 int result;
8 while(printf("Nhập x và n: "), scanf("%d%d", &base, &exponent) != EOF) {
9 result = compute_power(base, exponent);
10 printf("n = %d, kết quả = %d\n\n", exponent, result);
11 }
12
13 return 0;
14 }
15
16 int compute_power(int base, int exponent) {
17 int temp;
18 if(exponent == 0)
19 return 1;
20 else if(exponent % 2)
21 return base * compute_power(base, exponent-1);
22 else {
23 temp = compute_power(base, exponent/2);
24 return temp*temp;
25 }
26 }
Câu hỏi 1: Tính lũy thừa của một số nguyên.
Câu hỏi 2: Có, với số chẵn, ta tính lũy thừa bậc n/2 trước rồi bình phương kết quả. Với số lẻ, giảm mũ xuống 1 để chuyển thành chẵn, tính lũy thừa bậc n-1 rồi nhân thêm base.
Hoạt động 4:
1 #include <stdio.h>
2 #include <math.h>
3
4 int check_prime(int num);
5
6 int main()
7 {
8 int num;
9 int count = 0;
10 printf("Số nguyên tố sinh đôi trong khoảng 1 đến 100:\n");
11 for (num = 1; num <= 98; num++)
12 {
13 if (check_prime(num) && check_prime(num + 2))
14 {
15 printf("%d %d\n", num, num + 2);
16 count++;
17 }
18 }
19 printf("Tổng cộng có %d cặp số nguyên tố sinh đôi trong khoảng 1 đến 100\n", count);
20 return 0;
21 }
22
23 int check_prime(int num)
24 {
25 int i;
26 if (num == 1)
27 return 0;
28 if (num == 2)
29 {
30 return 1;
31 }
32 if (num % 2 == 0)
33 return 0;
34 for (i = 3; i <= sqrt(num); i += 2)
35 {
36 if (num % i == 0)
37 {
38 return 0;
39 }
40 }
41 return 1;
42 }
Hoạt động 5:
1 #include <stdio.h>
2
3 int move_count = 0;
4 void display_move(unsigned int disk_number, char source, char destination)
5 {
6 move_count++;
7 printf("%u : %c-->%c\n", disk_number, source, destination);
8 }
9 void hanoi_tower(unsigned int disks, char tower_A, char tower_B, char tower_C)
10 {
11 if (disks == 1)
12 {
13 display_move(disks, tower_A, tower_C);
14 }
15 else
16 {
17 hanoi_tower(disks - 1, tower_A, tower_C, tower_B);
18 display_move(disks, tower_A, tower_C);
19 hanoi_tower(disks - 1, tower_B, tower_A, tower_C);
20 }
21 }
22 int main()
23 {
24 unsigned int n;
25 while (scanf("%u", &n) != EOF)
26 {
27 hanoi_tower(n, 'A', 'B', 'C');
28 printf("Tổng số lần di chuyển: %d\n", move_count);
29 move_count = 0;
30 }
31 return 0;
32 }
Hoạt động 6:
1 #include <stdio.h>
2
3 int combination(int n, int m);
4 int main()
5 {
6 int n, m;
7 int result;
8 while (scanf("%d%d", &n, &m) != EOF)
9 {
10 result = combination(n, m);
11 printf("n = %d, m = %d, kết quả = %d\n\n", n, m, result);
12 }
13 return 0;
14 }
15
16 int combination(int n, int m)
17 {
18 int result;
19 int numerator = 1, denominator = 1;
20 int i;
21 for (i = n; i >= n - m + 1; i--)
22 {
23 numerator *= i;
24 }
25 for (i = m; i >= 1; i--)
26 {
27 denominator *= i;
28 }
29 result = numerator / denominator;
30 return result;
31 }
1 #include <stdio.h>
2 int combination(int n, int m);
3 int main()
4 {
5 int n, m;
6 int result;
7 while (scanf("%d%d", &n, &m) != EOF)
8 {
9 result = combination(n, m);
10 printf("n = %d, m = %d, kết quả = %d\n\n", n, m, result);
11 }
12 return 0;
13 }
14
15 int combination(int n, int m)
16 {
17 if (m == 0 || n == m)
18 return 1;
19 else
20 return combination(n - 1, m) + combination(n - 1, m - 1);
21 }
Hoạt động 7:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 static int layer_a = 0, layer_b = 0, layer_c = 0;
5 void draw_pattern();
6 int main()
7 {
8 int layers;
9 printf("Nhập số tầng:");
10 scanf("%d", &layers);
11 draw_pattern(layers);
12 return 0;
13 }
14
15 void draw_pattern(int layers)
16 {
17 int i;
18 if (layers == 0)
19 {
20 return;
21 }
22 for (i = 0; i < layer_a; i++)
23 {
24 printf(" ");
25 printf("\t");
26 }
27 layer_a++;
28 for (i = 0; i < 2 * layers - 1; i++)
29 {
30 printf(" O ");
31 printf("\t");
32 }
33 printf("\n");
34 for (i = 0; i < layer_b; i++)
35 {
36 printf(" ");
37 printf("\t");
38 }
39 layer_b++;
40 for (i = 0; i < 2 * layers - 1; i++)
41 {
42 printf("<H>");
43 printf("\t");
44 }
45 printf("\n");
46 for (i = 0; i < layer_c; i++)
47 {
48 printf(" ");
49 printf("\t");
50 }
51 layer_c++;
52 for (i = 0; i < 2 * layers - 1; i++)
53 {
54 printf("I I");
55 printf("\t");
56 }
57 printf("\n");
58 draw_pattern(layers - 1);
59 }