2个月搞定计算机二级C语言——真题(8)解析
1. 前言
本篇我们讲解2个月搞定计算机二级C语言——真题8
2. 程序填空题
2.1 题目要求
2.2 提供的代码
#include <stdio.h>
#define N 3
#define M 4
/**********found**********/
void fun(int (*a)[N], int __1__) {
int i, temp;
/**********found**********/
for (i = 0; i < __2__; i++) {
temp = a[0][i];
/**********found**********/
a[0][i] = __3__;
a[k][i] = temp;
}
}
main() {
int x[M][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}, i, j;
printf("The array before moving:\n\n");
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
printf("%3d", x[i][j]);
printf("\n\n");
}
fun(x, 2);
printf("The array after moving:\n\n");
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
printf("%3d", x[i][j]);
printf("\n\n");
}
getchar();
}
2.3 解题思路
第(1)处填空:
该函数的形参中留了一个空,根据题目描述我们可以得到一共有两个形参:一个是指针a
,另一个是行k
,所以这里直接填入k
即可。
void fun(int (*a)[N], int k) {
第(2)处填空:
题目所给定得代码是想要通过循环到达第k
行,然后通过temp
作为临时存储变量,从而转换了第k
行与第 0 行的元素,这里需要填入=k
,即i<=k
。
for (i = 0; i <= k; i++) {
第(3)处填空:
这个空的上一条语句temp = a[0][i];
已经把第 0 行的元素a[0][i]
赋值给了temp
,这里要做的是把a[k][i]
赋值给a[0][i]
,再加上下一句a[k][i] = temp;
从而达到交换元素的效果。
原理和交换两个变量中存储的值差不多,这里也借用了一个中间的临时存储变量来暂存某一变量的值。
a[0][i] = a[k][i];
2.4 代码实现
填写完整的代码:
#include <stdio.h>
#define N 3
#define M 4
/**********found**********/
void fun(int (*a)[N], int k) {
int i, temp;
/**********found**********/
for (i = 0; i <= k; i++) {
temp = a[0][i];
/**********found**********/
a[0][i] = a[k][i];
a[k][i] = temp;
}
}
main() {
int x[M][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}, i, j;
printf("The array before moving:\n\n");
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
printf("%3d", x[i][j]);
printf("\n\n");
}
fun(x, 2);
printf("The array after moving:\n\n");
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
printf("%3d", x[i][j]);
printf("\n\n");
}
getchar();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
3. 程序修改题
3.1 题目要求
3.2 提供的代码
#include <stdio.h>
#include <string.h>
void fun(char* a, char* b, char* c) {
int i, j;
char ch;
i = 0;
j = strlen(b) - 1;
/************found************/
while (i > j) {
ch = b[i];
b[i] = b[j];
b[j] = ch;
i++;
j--;
}
while (*a || *b) {
/************found************/
If(*a) {
*c = *a;
c++;
a++;
}
if (*b) {
*c = *b;
c++;
b++;
}
}
*c = 0;
}
main() {
char s1[100], s2[100], t[200];
printf("\nEnter s1 string : ");
scanf("%s", s1);
printf("\nEnter s2 string : ");
scanf("%s", s2);
fun(s1, s2, t);
printf("\nThe result is : %s\n", t);
getchar();
}
3.3 解题思路
原题写的是i > j
,我们可以看到i
是 0,j
是b
所指字符串的长度减 1,只要b
所指字符串中有字符就永远不会满足这个条件,所以程序不会执行此while
循环。
这里要实现的是b
所指字符串中的字符逆序存放,其中i
和j
分别代表下标的头和尾,它俩在while
中会逐渐向数组中间下标移动,并且每次移动会将下标中的元素互换,从而达到字符串逆序的效果。
所以这里需要填写i < j
,i
在小于j
的时候说明还未走到数组中间,即未完成逆序,则循环。
第(1)处修改:
while (i < j) {
第(2)处修改:
这里没什么好说的,原本为小写的if
写成了If
,改过来即可。
if(*a) {
3.4 代码实现
修改后的代码:
#include <stdio.h>
#include <string.h>
void fun(char* a, char* b, char* c) {
int i, j;
char ch;
i = 0;
j = strlen(b) - 1;
/************found************/
while (i < j) {
ch = b[i];
b[i] = b[j];
b[j] = ch;
i++;
j--;
}
while (*a || *b) {
/************found************/
if(*a) {
*c = *a;
c++;
a++;
}
if (*b) {
*c = *b;
c++;
b++;
}
}
*c = 0;
}
main() {
char s1[100], s2[100], t[200];
printf("\nEnter s1 string : ");
scanf("%s", s1);
printf("\nEnter s2 string : ");
scanf("%s", s2);
fun(s1, s2, t);
printf("\nThe result is : %s\n", t);
getchar();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
4. 程序设计题
4.1 题目要求
4.2 提供的代码
#include <stdio.h>
#define N 50
#define M 11
void fun(int* a, int* b) {
}
double rnd() {
static t = 29, c = 217, m = 1024, r = 0;
r = (r * t + c) % m;
return ((double) r / m);
}
main() {
int age[N], i, d[M];
void NONO(int d[M]);
for (i = 0; i < N; i++)
age[i] = (int) (115 * rnd());
printf("The original data :\n");
for (i = 0; i < N; i++)
printf((i + 1) % 10 == 0 ? "%4d\n" : "%4d", age[i]);
printf("\n\n");
fun(age, d);
for (i = 0; i < 10; i++)
printf("%4d---%4d : %4d\n", i * 10, i * 10 + 9, d[i]);
printf(" Over 100 : %4d\n", d[10]);
NONO(d);
getchar();
}
void NONO(int d[M]) { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE* wf;
int i;
wf = fopen("out.dat", "w");
for (i = 0; i < 10; i++)
fprintf(wf, "%4d---%4d : %4d\n", i * 10, i * 10 + 9, d[i]);
fprintf(wf, " Over 100 : %4d\n", d[10]);
fclose(wf);
}
4.3 解题思路
针对这个题的解法是遍历age
数组,将其中存储的年龄分别判断后,把结果传给*d
。
判断的方式有很多,你可以通过判断范围、或判断十位上的数字等等。
我这里采用的是先判断年龄是否>=100
,是则让b[10]++;
,否则说明年龄是在 0~99之间的,之间将年龄除 10 得到的经过即可作为b
的下标。
例如年龄为 18,计算18 / 10 = 1
,因为是整形相除所以会自动取整,而结果1
正好对应题目要求的“把10至19岁年龄段的人数放在d[1]中”的下标,可以简化程序。
4.4 代码实现
填写完整的代码:
#include <stdio.h>
#define N 50
#define M 11
void fun(int* a, int* b) {
int i = 0;
// 初始化 *b,防止出现垃圾值
for (i = 0; i < M; i++) {
b[i] = 0;
}
// 遍历指针 *a 所指向的数组 age 的每个年龄
for (i = 0; i < N; i++) {
if (a[i] >= 100) { // 年龄 >= 100
b[10]++;
} else {
b[a[i] / 10]++;
}
}
}
double rnd() {
static t = 29, c = 217, m = 1024, r = 0;
r = (r * t + c) % m;
return ((double) r / m);
}
main() {
int age[N], i, d[M];
void NONO(int d[M]);
for (i = 0; i < N; i++)
age[i] = (int) (115 * rnd());
printf("The original data :\n");
for (i = 0; i < N; i++)
printf((i + 1) % 10 == 0 ? "%4d\n" : "%4d", age[i]);
printf("\n\n");
fun(age, d);
for (i = 0; i < 10; i++)
printf("%4d---%4d : %4d\n", i * 10, i * 10 + 9, d[i]);
printf(" Over 100 : %4d\n", d[10]);
NONO(d);
getchar();
}
void NONO(int d[M]) { /* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE* wf;
int i;
wf = fopen("out.dat", "w");
for (i = 0; i < 10; i++)
fprintf(wf, "%4d---%4d : %4d\n", i * 10, i * 10 + 9, d[i]);
fprintf(wf, " Over 100 : %4d\n", d[10]);
fclose(wf);
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
5. 后记
本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。
本文作者:main工作室
本文链接:https://www.cnblogs.com/main-studio/p/18523099
版权声明:本文为「main工作室」的原创文章,遵循 CC BY-NC-ND 4.0 版权协议,著作权归作者所有,转载请注明出处!
鼓励博主:如果您觉得文章对您有所帮助,可以点击文章右下角【推荐】一下。您的鼓励就是博主最大的动力!