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. 后记
本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。
2个月搞定计算机二级C语言——真题(8)解析的更多相关文章
- 二级C语言真题笔记
二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() { short i ...
- 计算机二级-C语言-程序修改题-190108记录-字符串处理
//程序修改题:给定程序MODI1.C中函数fun的功能是:先将字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面.例如:当s中的字符串为:“ABCDE”时,则t中的字符串应为 ...
- 计算机二级-C语言-程序修改题-190113记录-对指定字符串的大小写变换处理。
//给定程序中fun函数的功能是:将p所指的字符串中每个单词的最后一个字母改成大写.(这里的“单词”是指由空格隔开的字符串) //重难点:指针对数组的遍历.大小写转换的方法.第一种使用加减32 得到, ...
- 计算机二级-C语言-程序设计题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。
//程序设计题:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回 ...
- 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用
//程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...
- 计算机二级-C语言-程序修改题-190123记录-对整数进行取余和除以操作。
//函数fun功能:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中.高位仍在高位,低位仍在低位. //重难点:思路:因为不是字符串,所以可以把问题变成整数的操作,采用取余和除的操作.对整 ...
- 计算机二级-C语言-程序设计题-190119记录-求出一个二维数组每一列的最小值。
//编写一个函数:tt指向一个M行N列的二维数组,求出二维数组每列中最小的元素,并依次放入pp所指的一维数组中.二维数组中的数在主函数中赋予. //重难点:求出的是每一列的最小值,这里要注意,学会简化 ...
- 计算机二级-C语言-程序设计题-190118记录-通过数组和指针两种方式对字符串进行处理。
//编写一个函数fun,比较两个字符串的长度,(不使用C语言提供的求字符串长度的函数),函数返回较长的字符串.若两个字符长度相同,则返回第一个字符串. //重难点:通过数组处理和通过指针进行处理的不同 ...
- 计算机二级-C语言-程序修改题-190116记录-对数组进行排序的两种方法。
//函数fun的功能是:将n个无序整数从小到大排序. //冒泡排序法:小数往下浮,大数往上浮.把数都存到一个数组,然后两两比较,大数往后交换.双层递减循环. //第二种方法:都放入一个数组中,然后记录 ...
- 计算机二级-C语言-程序修改题-190114记录-对整型变量进行取余操作可以取得各个位上的值。
//给定程序中fun函数的功能是:从低位开始取出长整形变量s中奇数位上的数,依次构成一个新的数放在t中.高位仍在高位,低位仍在低位.例如:当s中的数为7654321时,t中的数为7531. //重难点 ...
随机推荐
- https://eggjs.org/zh-cn/basics/env.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83
转载:https://eggjs.org/zh-cn/basics/env.html#自定义环境 运行环境 一个 Web 应用本身应该是无状态的,并拥有根据运行环境设置自身的能力. 指定运行环境 框架 ...
- JMeter使用指南+实验报告
JMeter使用指南 目录 JMeter使用指南 界面基本配置方法 1.选项里的放大与缩小--缩放字体 2.选项里的选择语言 3.命令行的调出 注意事项 一些指标介绍 1.TCP取样器 2.汇总/聚合 ...
- 【狂神说Java】Java零基础学习笔记-Java流程控制
[狂神说Java]Java零基础学习笔记-Java流程控制 Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.ja ...
- 前端学习openLayers配合vue3(偏移动画效果,限制范围)
我们原来的偏移感觉比较生硬,我们来学习一下偏移的动画,先列一下这节的知识点 限制经纬度范围和缩放范围(view层) view = new View({ center:[114.305469,30.59 ...
- 自主开发的OFD编辑器简介 -- 开ofd可编辑之先河
前言 OFD是板式文档格式,板式文档只管显示:怎么对板式文档编辑,那不是OFD标准考虑的事.有时使用者是"不讲道理的",我就是想要编辑ofd文件!需求就是开发软件的动力,毕竟开发 ...
- Netty3 核心代码-copy
Netty Hello Word-copy 概述https://github.com/csy512889371/learndemo/netty/NettyHellonetty版本大致版本分为 ne ...
- rabbitmq部署及配置与验证-copy
1. 场景描述 朋友项目需要弄个测试环境,稍微帮忙了下,系统不复杂,但是需要自己安装mysql.Reids.Es.RabbitMq等,Mq主要用在同步用户信息与发送站内消息和短信上,RabbitMq以 ...
- 【刷题】牛客模拟面试 > 模拟面试报告
https://www.nowcoder.com/interview/ai/index 1-TCP协议的流量控制和拥塞控制 TCP的流量控制是基于窗口机制实现的: 在建立连接时, 发送方和接收方都会建 ...
- w3cschool-Docker 入门到实践
https://www.w3cschool.cn/reqsgr/ 什么是 Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 ...
- 【译】使用 Visual Studio Profiler 进行基准测试
在 Visual Studio 17.13 预览版中,我们发布了更新的 BenchmarkDotNet 诊断器,允许您使用性能分析器中的更多工具来分析基准测试.有了这个变化,可以非常快速地挖掘 CPU ...