Claude 3 Opus 在 C 语言考试中的表现
填空题
-
计算机的工作原理是(A)。
A = 存储程序和程序控制
-
整数在内存中用二进制(B)码表示。
B = 补码
-
关系运算符有(C)6种。
C = <、<=、>、>=、==、!=
-
循环语句的形式有(D)3种。
D = while、do-while、for
-
使用函数要经过三个步骤(E)、定义和调用。
E = 声明
-
数组元素在内存中是(F)存放的。
F = 连续
-
指针的两个要素是地址和(G)。
G = 类型
-
使用数学库函数,要包含的头文件为(H)。
H = <math.h>
-
在函数外部定义的变量称为(I)变量。
I = 全局
-
定义结构类型的关键字是(J)。
J = struct
简答题
-
break和continue语句的作用:
break语句用于跳出当前循环体,结束循环的执行。当执行到break语句时,程序将立即跳出所在的循环,开始执行循环后面的语句。
continue语句用于跳过本次循环的剩余语句,直接进入下一次循环。当执行到continue语句时,程序将立即跳到循环控制表达式处,开始下一次循环。
-
函数返回多个值的解决办法:
可以使用指针作为函数参数,通过指针传递多个变量的地址,在函数内部修改这些变量的值,从而实现返回多个值的效果。
例如,编写一个函数,用于计算两个整数的和与差,并通过指针返回结果:
1 2 3 4
void calc(int a, int b, int *sum, int *diff) { *sum = a + b; *diff = a - b; }
在主函数中调用:
1 2 3 4 5 6
int main() { int x = 10, y = 5, sum, diff; calc(x, y, &sum, &diff); printf("Sum: %d, Diff: %d\n", sum, diff); return 0; }
-
需要使用动态内存分配的情况:
当程序运行时才能确定所需内存大小,或者需要频繁地申请和释放内存时,就需要使用动态内存分配。
例如,读取一个文件,将文件内容存储到内存中。由于文件大小事先未知,需要根据实际读取的字节数动态分配内存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
FILE *fp = fopen("data.txt", "r"); char *buffer = NULL; int size = 0; int capacity = 0; char ch; while ((ch = fgetc(fp)) != EOF) { if (size + 1 > capacity) { capacity = (capacity == 0) ? 1 : capacity * 2; buffer = (char *)realloc(buffer, capacity); } buffer[size++] = ch; } buffer[size] = '\0'; fclose(fp);
-
穷举法的基本思想:
穷举法是一种基本的算法思想,它的基本思路是:列举出所有可能的情况,逐一判断每种情况是否满足题目要求,从而得到问题的解。
例如,求解1100之间所有的素数。可以使用穷举法,遍历1100的每个数,判断它是否为素数:
1 2 3 4 5 6 7 8 9 10 11 12
for (int i = 2; i <= 100; i++) { int isPrime = 1; for (int j = 2; j < i; j++) { if (i % j == 0) { isPrime = 0; break; } } if (isPrime) { printf("%d ", i); } }
-
适宜用数组存储数据的实际问题:
(1) 学生成绩管理系统:可以使用数组存储每个学生的各科成绩,方便进行成绩的录入、查询和统计。
(2) 图像处理:图像可以看作是一个二维数组,数组的每个元素表示图像上对应位置的像素值。使用数组可以方便地进行图像的读取、修改和显示。
应用题
-
一个三位的十进制整数,如果它的三个数位数字的立方和等于这个数的数值,那么它就被称为一个“水仙花数”(例如:$153 = 13 + 53 + 3^3$)。请定义函数,判断一个整数是否为水仙花数,并利用这个函数打印出所有的水仙花数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include <stdio.h> #include <math.h> int isNarcissistic(int num) { int sum = 0; int temp = num; while (temp > 0) { int digit = temp % 10; sum += pow(digit, 3); temp /= 10; } return (sum == num); } int main() { printf("所有的水仙花数:\n"); for (int i = 100; i <= 999; i++) { if (isNarcissistic(i)) { printf("%d ", i); } } return 0; }
-
已知有迭代关系 $x_{k+1} = \frac{4}{3}x_{k} - \frac{a}{3x^{2}_{k}}$,其中 $\alpha \isin \Reals$, 且 $\{ x_k \}$ 收敛。写程序估算 $x_k$ 的极限值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <stdio.h> #include <math.h> #define EPSILON 1e-6 double iterate(double x, double a) { return (4.0 / 3.0) * x - a / (3 * x * x); } int main() { double a; printf("请输入参数a的值:"); scanf("%lf", &a); double x0 = 1.0; // 初始值 double x1 = iterate(x0, a); while (fabs(x1 - x0) > EPSILON) { x0 = x1; x1 = iterate(x0, a); } printf("迭代序列的极限值估计为:%.6f\n", x1); return 0; }
-
有 n 个学生,每个学生的信息为:姓名,成绩。用动态存储分配方式存储数据,完成以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 20 typedef struct { char name[MAX_NAME]; int score; } Student; void inputStudents(Student *students, int n) { for (int i = 0; i < n; i++) { printf("请输入第%d个学生的姓名和成绩:", i + 1); scanf("%s %d", students[i].name, &students[i].score); } } void printStudents(Student *students, int n) { printf("学生信息:\n"); for (int i = 0; i < n; i++) { printf("姓名:%s\t成绩:%d\n", students[i].name, students[i].score); } } void sortStudents(Student *students, int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (students[j].score < students[j + 1].score) { Student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } } int main() { int n; printf("请输入学生人数:"); scanf("%d", &n); Student *students = (Student *)malloc(n * sizeof(Student)); inputStudents(students, n); printStudents(students, n); sortStudents(students, n); printf("按成绩降序排列后的学生信息:\n"); printStudents(students, n); free(students); return 0; }
以上程序实现了以下功能:
-
定义了学生结构体,包含姓名和成绩两个字段。
-
使用动态内存分配创建了一个学生结构体数组,大小为n。
-
提供了输入学生信息、打印学生信息和按成绩降序排序学生信息的函数。
-
在主函数中,先输入学生人数,然后动态分配内存创建学生数组。
-
调用相应函数输入学生信息、打印学生信息、对学生按成绩降序排序并打印排序后的结果。
-
最后释放动态分配的内存。
-