一、阅读程序题
1、代码
#include<stdio.h> int main() { int k, j, m, n, a[6][6], b[6]; m = 3, n = 2; for (k = 0; k < m; k++) for (j = 0; j < n; j++) a[k][j] = k * n + j + 1; for (k = 0; k < m; k++) { b[k] = 0; for (j = 0; j < n; j++) b[k] += a[k][j]; } for (k = 0; k < m; k++) printf("%3d", b[k]); return 0; }
运行结果
粗浅理解:第一题主要是一维数组和二维数组的定义和引用,引用是根据数组之间下标存储的值进行引用的,要清晰明白数组长度和数组下标的关系,二维数组同理。
2、代码
#include<stdio.h> int main() { int i, j, k, t, b[3][3] = { {9,8,7},{6,5,4},{3,2,1} }; for (j = 0; j < 3; j++) for (k = 0; k < 2; k++) for (i = 0; i < 2; i++) if (b[i][j] > b[i + 1][j]) t = b[i][j], b[i][j] = b[i + 1][j], b[i + 1][j] = t; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%3d", b[i][j]); printf("\n"); } return 0; }
运行结果
粗浅理解:这一题主要是二维数组的定义,引用和初始化,把一个3×3的矩阵的行位置进行调换的一个代码,可以把它理解为3个一维数组进行逐级分解,减低维数,对于理解多维数组的存储方法,初始化及指针有很大帮助。
3、代码
#include<stdio.h> int main() { int i, j, a[4][4]; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) if (i < j) a[i][j] = 1; else a[i][j] = i - j + 1; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf("%3d", a[i][j]); printf("\n"); } return 0; }
运行结果
粗浅理解:本题主要是对二维数组各个元素进行赋值,然后依次输出,要熟悉行下标和列下标的关系,就能基本理解本题的运行结果。
4、代码
#include<stdio.h> #include<string.h> int main() { char a[7] = "a0\0a0\0"; int i, j; i = sizeof(a); j = strlen(a); printf("%d %d",i,j); return 0; }
运行结果
粗浅理解:本题主要是对比sizeof()函数和strlen()函数的区别,前者计算字符串所占空间字节数,后者计算字符串长度,遇‘\0’结束。
5、代码
#include<stdio.h> int main() { int i, j, b[3][3] = { 0 }; for (i = 0; i < 3; i++) { for(j=0;j<3;j++) switch (i - j + 2) { case 0: case 1:b[i][j] = 1; break; case 2:b[i][j] = 2; break; case 3:b[i][j] = 3; break; case 4:b[i][j] = 4; break; } } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%2d", b[i][j]); printf("\n"); } return 0; }
运算结果
粗浅理解:这题也是对二维数组的进行赋值,利用两个for循环和switch语句对3×3的二维数组赋值,然后输出此数组的代码。
6、代码
#include<stdio.h> int main() { int a[3][3], b[3 * 3] = { 1,2 }, i, j; for (i = 2; i < 3 * 3; i++) b[i] = b[i - 1] + b[i - 2]; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) a[j][i] = b[i * 3 + j]; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%3d", a[i][j]); printf("\n"); } return 0; }
运行结果
粗浅理解:此题主要是对一维数组进行赋值,然后再根据一维数组的值,把一维数组的值依次赋值给二维数组,然后输出结果。主要注意的是对二维数组进行赋值时的行下标和列下标的位置问题,然后根据一维数组表达式的值对二维数组赋值。
二、编程题
(1)假设10个整数存储在数组a[10]中,要求把其中能被12整除的数标记为T,其他标记为F。标记存储在字符数组b[10]中下标相同的对应位置。试编写程序,实现以上功能,并输出两个数组。
代码
#include<stdio.h> int main() { int i, a[] = { 11,12,23,36,48,56,72,78,89,96 }; char b[10]; for (i = 0; i < 10; i++) { printf("%d ", a[i]); if (a[i] % 12 == 0)b[i] = 'T'; else b[i] = 'F'; } printf("\n"); for (i = 0; i < 10; i++) printf("%c ", b[i]); return 0; }
运行结果
粗浅理解:此题根据要求先初始化一个有10个元素的一维数组,然后再定义一个字符数组用于存放字符‘T’和‘F’,先用for循环把已经初始化的a数组进行输出,然后判断a数组里的数是否能被12整除,能在字符数组b中存入字符‘T’,否则存入字符‘F’,第一个for循环结束后换行,再把b字符数组在a数组下面输出。
(2)编写程序,将输入的10名学生的成绩保存到数组中,求出其最高分、最低分及平均分。
#include<stdio.h> int main() { int i; float a[10], max = 0, min = 100, avg = 0; for (i = 0; i < 10; i++) { scanf("%f", &a[i]); if (a[i] > max)max = a[i]; if (a[i] < min)min = a[i]; avg = avg + a[i]; } avg = avg / 10; printf("max=%.1f\n", max); printf("min=%.1f\n", min); printf("avg=%.1f\n", avg); return 0; }
运行结果
粗浅理解:根据题目要求,定义一个for循环,依次输入学生的成绩,存入a数组中,在其中用两个if判断语句判断最大值和最小值,再把总成绩累加到avg变量,结束for循环后进行求平均成绩,此时输入的10名学生成绩的最高分、最低分、平均分都以得出,依次输出即可。
(3)设计一个程序统计某个班全体学生3门课的考试成绩。要求能输入学生人数,并按编号从小到大的顺序依次输入学生的成绩,再统计出每门课程的全班总分、平均分及每个考生所在考试的总分和平均分。
#include<stdio.h> int main() { int i, j, n; float a[80][3], sumcj[80] = { 0 }, avg[4] = { 0 }, s[3] = { 0 }; printf("Pease input rs:"); scanf("%d", &n); for (i = 0; i < n; i++) { printf("Please input %d student cj:",i+1); scanf("%f,%f,%f", &a[i][0], &a[i][1], &a[i][2]); for (j = 0; j < 3; j++) { sumcj[i] = sumcj[i] + a[i][j]; s[j] = s[j] + a[i][j]; } } for (i = 0; i < n; i++) { printf("Sum=%.1f Avg=%.1f\n", sumcj[i], sumcj[i] / 3); } for (i = 0; i < 3; i++) printf("Sum=%.1f Avg=%.1f\n", s[i], s[i] / n); return 0; }
运行结果
粗浅理解:根据此题要求,需要一个二维数组记录全班学生的3门成绩,利用for循环依次输入每个学生的成绩,然后再嵌套一个for循环累加出每个学生的总分和每科成绩的总分,再利用for循环把每个学生的总分和平均分,每科的总分和平均分输出。