1. 前言

大家好,我是梁国庆。

这段时间将持续发布计算机二级 C 语言真题的解析,想要同步练习,需要资源包的朋友可以跳转免费获取——《3个月搞定计算机二级C语言——准备工作》。

现在恐怕要改为 2 个月搞定计算机二级 C 语言了,不过没有关系,干就完了!

本篇博客将解析计算机二级 C 语言考试真题第1套,主要讲解程序填空题、程序修改题和程序设计题,选择题就不说了,主要我也没做。

在做题之前我先啰嗦两句,编程题的难易程度只有读了题目才知道,不要看着题目要求的字多就觉得难,其实那题纸老虎一个,就算是个硬骨头,我们照样能给它嚼碎了。

2. 程序填空题

2.1 题目要求

2.2 提供的代码

#include <stdio.h>
#pragma warning(disable : 4996)
void fun(char c, int d) {
int i;
char A[26], a[26], *ptr;
/**********found**********/
for (i = 0; i < ___(1) ____; i++) {
A[i] = 'A' + i;
a[i] = 'a' + i;
}
/**********found**********/
if ((c >= 'a') && (c ___(2) ____ 'z'))
ptr = a;
else
ptr = A;
/**********found**********/
for (i = 1; i <= d; i++)
printf("%c", ptr[(c - ptr[0] + i) % ____(3) ____]);
}
main() {
char c;
int d;
printf("please input c & d:\n");
scanf("%c%d", &c, &d);
fun(c, d);
}

2.3 解题思路

(1)处填空:for 循环的作用是初始化数组 A[]、a[],将大写字母、小写字母分别存入数组 A[]、a[],我们知道英文字母一共有 26 个,所以这里需要循环 26 次。

for 循环控制变量 i 的初始值是 0,在 i<___(1)____ 时结束,这里的关系运算符是 < 而非 <=,这就意味着在 < 后面填几就会循环几次,这里我们填入 26,则 i 从 0 加至 25 后停止循环,循环次数为 26 次。

for (i = 0; i < 26; i++)

(2)处填空:if 判断的作用是判断 fun 函数的形参 c 的字符范围。

实际是在判断传入的形参 c 是小写字母还是大写字母,若是小写字母,则将存储小写字母的数组 a 的首地址赋值给指针 ptr,若不是则将存储大写字母的数组 A 的首地址赋值给指针 ptr

在 C 语言中,指针可以像数组一样使用,这是因为数组名实际上是一个指向数组第一个元素(即首地址)的指针。我们可以通过指针来访问数组元素,并且指针和数组有许多相似的操作方式。

所以这里只需填入 <=,使其判断范围控制在 'a' ~ 'z' 即可。

if ((c >= 'a') && (c <= 'z'))

(3)处填空:前面将数组 a/A 的首地址赋值给了指针 ptr,指针 ptr 便可以当作数组来使用。

这里需要让 ptr 的下标变为 0,从而打印字符 'A' 或 'a',所以除 26 取余。

printf("%c", ptr[(c - ptr[0] + i) % 26]);

2.4 代码实现

填写完整的代码:

#include <stdio.h>
#pragma warning(disable : 4996)
void fun(char c, int d) {
int i;
char A[26], a[26], *ptr;
/**********found**********/
for (i = 0; i < 26; i++) {
A[i] = 'A' + i;
a[i] = 'a' + i;
}
/**********found**********/
if ((c >= 'a') && (c <= 'z'))
ptr = a;
else
ptr = A;
/**********found**********/
for (i = 1; i <= d; i++)
printf("%c", ptr[(c - ptr[0] + i) % 26]);
}
main() {
char c;
int d;
printf("please input c & d:\n");
scanf("%c%d", &c, &d);
fun(c, d);
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

3. 程序修改题

3.1 题目要求

3.2 提供的代码

#include <stdio.h>
#pragma warning(disable : 4996)
void fun(char* p, char* b) {
int i, k = 0;
while (*p) {
i = 1;
while (i <= 3 && *p) {
/**********found**********/
b[k] = p;
k++;
p++;
i++;
}
if (*p) {
/**********found**********/
b[k++] = " ";
}
}
b[k] = '\0';
}
main() {
char a[80], b[80];
printf("Enter a string: ");
gets(a);
printf("The original string: ");
puts(a);
fun(a, b);
printf("\nThe string after insert space: ");
puts(b);
printf("\n\n");
getchar();
}

3.3 解题思路

(1)处修改:p 是一个 char* 类型的指针,提供的代码试图将其直接赋值给 b[k],而 b[k] 是一个 char 类型的字符。很明显这是行不通的,因为 b[k] 只能存储单个字符,而不是指针。

我们需要进行解引用操作*p),即访问指针 p 所指向的内存地址中的值,在 p 的前面加上解引用运算符 *

b[k] = *p;

(2)处修改:" " 是一个字符串常量,它实际上是一个 char* 类型的指针,而 b[k++] 只能存储单个字符。' ' 是一个字符常量,所以将 " " 换为 ' ' 即可。

b[k++] = ' ';

3.4 代码实现

修改后的代码:

#include <stdio.h>
#pragma warning(disable : 4996)
void fun(char* p, char* b) {
int i, k = 0;
while (*p) {
i = 1;
while (i <= 3 && *p) {
/**********found**********/
b[k] = *p;
k++;
p++;
i++;
}
if (*p) {
/**********found**********/
b[k++] = ' ';
}
}
b[k] = '\0';
}
main() {
char a[80], b[80];
printf("Enter a string: ");
gets(a);
printf("The original string: ");
puts(a);
fun(a, b);
printf("\nThe string after insert space: ");
puts(b);
printf("\n\n");
getchar();
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

4. 程序设计题

4.1 题目要求

4.2 提供的代码

#include <stdio.h>
#include <string.h>
void fun(char* ss) {
} void main(void) {
char tt[51];
void NONO();
printf("\nPlease enter an character string within 50 characters:\n");
gets(tt);
printf("\n\nAfter changing, the string\n \"%s\"", tt);
fun(tt);
printf("\nbecomes\n \"%s\"", tt);
NONO();
getchar();
} void NONO() {
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char tt[51], ch;
FILE *rf, *wf;
int len, i = 0; rf = fopen("in.dat", "r");
wf = fopen("out.dat", "w");
while (i < 10) {
fgets(tt, 50, rf);
len = strlen(tt) - 1;
ch = tt[len];
if (ch == '\n' || ch == 0x1a)
tt[len] = 0;
fun(tt);
fprintf(wf, "%s\n", tt);
i++;
}
fclose(rf);
fclose(wf);
}

4.3 解题思路

根据题目可以看出,程序中需要一个变量作为形参字符串 ss 的下标,可以将它初始化为 1,即从奇数下标开始读取字符串。在循环中遍历字符串中的奇数下标,判断该位置上的字母是否为小写字母,是则转换为大写字母

整体思路是这样的,那么对于大家来说可能的难点在哪?

  • 如何判断字符串是否结束
  • 如何将小写字母转为大写字母

PS:程序填空题的第二个空是判断字母是否为小写字母的,用 if 函数两个条件与一下就可以,这里不展开说了。

如何判断字符串是否结束

在 C 语言中,字符串是以空字符 '\0'(ASCII 值为 0)结尾的,这就意味着我们可以判断字符串当前下标中存储的是否为空字符 '\0',是则字符串结束,否则字符串未结束。

循环可以这样用:

while (ss[i] != '\0') {
// 其他操作
i++;
}

如何将小写字母转为大写字母

大小写转换需要用到 ASCII 编码表——《ASCII Table》。

对 ASCII 编码表熟悉的朋友应该了解,小写字母和大写字母有固定的偏移量,即对于任何一个小写字母和它对应的大写字母,它们的 ASCII 值相差 32。

如果你知道相差是 32,直接用小写字母减去 32 便得到了对应的大写字母。

ss[i] -= 32;

不知道也没有关系,可以写程序让计算机算出来,通过小写字母减去大写字母的方式求出偏移量,即 'a' - 'A' ,结果为 32。

那么假设 ss[i] 是小写字母 'c',其 ASCII 值是 99,'a' - 'A' 等于 32,所以 'c' - 32 就是对应的大写字母 'C' 的 ASCII 值,即 67。

ss[i] -= ('a' - 'A');

这样即可将小写字母转为大写字母。

4.4 代码实现

填写完整的代码:

#include <stdio.h>
#include <string.h>
void fun(char* ss) {
int i = 1; while (ss[i] != '\0') {
if ((ss[i] >= 'a') && (ss[i] <= 'z')) {
ss[i] -= ('a' - 'A');
} i += 2;
}
} void main(void) {
char tt[51];
void NONO();
printf("\nPlease enter an character string within 50 characters:\n");
gets(tt);
printf("\n\nAfter changing, the string\n \"%s\"", tt);
fun(tt);
printf("\nbecomes\n \"%s\"", tt);
NONO();
getchar();
} void NONO() {
/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,
输出数据,关闭文件。 */
char tt[51], ch;
FILE *rf, *wf;
int len, i = 0; rf = fopen("in.dat", "r");
wf = fopen("out.dat", "w");
while (i < 10) {
fgets(tt, 50, rf);
len = strlen(tt) - 1;
ch = tt[len];
if (ch == '\n' || ch == 0x1a)
tt[len] = 0;
fun(tt);
fprintf(wf, "%s\n", tt);
i++;
}
fclose(rf);
fclose(wf);
}

提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。

5. 后记

本篇博客解析了程序填空题、程序修改题和程序设计题,提供了详细的解题思路和代码实现。希望通过这些解析,大家能更好地理解和掌握,欢迎大家在留言区讨论和提问。

对于本篇博客的解题思路、代码实现以及文章架构,如果您有建议或意见欢迎您在留言区留言。

2个月搞定计算机二级C语言——真题(1)解析的更多相关文章

  1. 二级C语言真题笔记

    二级C语言真题笔记 1. 知识重点:数据类型.循环.数组.函数.指针.结构体与共同体 2. 求程序的运行结果 #include <stdio.h> main() {     short i ...

  2. 计算机二级-C语言-程序修改题-190108记录-字符串处理

    //程序修改题:给定程序MODI1.C中函数fun的功能是:先将字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面.例如:当s中的字符串为:“ABCDE”时,则t中的字符串应为 ...

  3. 计算机二级-C语言-程序修改题-190113记录-对指定字符串的大小写变换处理。

    //给定程序中fun函数的功能是:将p所指的字符串中每个单词的最后一个字母改成大写.(这里的“单词”是指由空格隔开的字符串) //重难点:指针对数组的遍历.大小写转换的方法.第一种使用加减32 得到, ...

  4. 计算机二级-C语言-程序设计题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。

    //程序设计题:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数低的学生数据放在b所指的数组中,注意:分数最低的学生可能不止一个,函数返回 ...

  5. 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用

    //程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...

  6. 计算机二级-C语言-程序修改题-190123记录-对整数进行取余和除以操作。

    //函数fun功能:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中.高位仍在高位,低位仍在低位. //重难点:思路:因为不是字符串,所以可以把问题变成整数的操作,采用取余和除的操作.对整 ...

  7. 计算机二级-C语言-程序设计题-190119记录-求出一个二维数组每一列的最小值。

    //编写一个函数:tt指向一个M行N列的二维数组,求出二维数组每列中最小的元素,并依次放入pp所指的一维数组中.二维数组中的数在主函数中赋予. //重难点:求出的是每一列的最小值,这里要注意,学会简化 ...

  8. 计算机二级-C语言-程序设计题-190118记录-通过数组和指针两种方式对字符串进行处理。

    //编写一个函数fun,比较两个字符串的长度,(不使用C语言提供的求字符串长度的函数),函数返回较长的字符串.若两个字符长度相同,则返回第一个字符串. //重难点:通过数组处理和通过指针进行处理的不同 ...

  9. 计算机二级-C语言-程序修改题-190116记录-对数组进行排序的两种方法。

    //函数fun的功能是:将n个无序整数从小到大排序. //冒泡排序法:小数往下浮,大数往上浮.把数都存到一个数组,然后两两比较,大数往后交换.双层递减循环. //第二种方法:都放入一个数组中,然后记录 ...

  10. 计算机二级-C语言-程序修改题-190114记录-对整型变量进行取余操作可以取得各个位上的值。

    //给定程序中fun函数的功能是:从低位开始取出长整形变量s中奇数位上的数,依次构成一个新的数放在t中.高位仍在高位,低位仍在低位.例如:当s中的数为7654321时,t中的数为7531. //重难点 ...

随机推荐

  1. wpf 双屏显示问题

    // 在WPF中处理双屏显示问题,通常需要确保应用程序能够识别两个显示器,并在每个显示器上正确渲染内容.以下是一个简化的示例,展示如何在WPF应用程序中设置窗口,使其跨越两个显示器:   using ...

  2. WPF 实现触摸滑动功能

    自定义ScrollViewer的Touch事件--触摸上下移动ScrollViewer滚动到指定位置   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  3. 高精度离线免费 的C#文字识别PaddleOCR库

    随便打开一个Microsoft Visual Studio,新建一个WinForms项目,从下面列表中随便选择一个NET框架.目标平台要设置成X64,该OCR仅支持64位. net35;net40;n ...

  4. 《剑指offer3- 从末尾到头打印链表》

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.   本质上是逆转链表   /** * struct ListNode { * int val; * struct ListN ...

  5. Xcode 自动化构建问题梳理

    一.Xcode Xcode是mac OS平台上面开发的官方IDE,可以用来开发iOS应用和mac应用.随着iOS系统的升级,Xcode也会更新,而且是强制更新. Xcode每次版本更新稳定性很差,经常 ...

  6. ABC319题解

    直接从 D 开始了. D 可可爱爱的二分捏. check 就按照题目里写的就行了. 然后 \(l\) 的初值要注意一下,就是 \(\max^{i \le n}_{i=1}a_i\). 代码: #inc ...

  7. C#.NET 国密 BASE64编码的私钥提取16进制私钥 (锦州银行、建行轻应用)

    C#.NET 国密 BASE64编码的私钥提取16进制私钥 (锦州银行.建行轻应用), 从BASE64编码的公钥中提取16进制字符串公钥, 从BASE64编码的私钥中提取16进制字符串私钥, 锦州银行 ...

  8. 荣耀无5G开关,荣耀手机,荣耀80GT

    荣耀无5G开关,荣耀手机,荣耀80GT. Magic OS 版本号是:7.0.0.138(C00E135R2P6). 解决方法: 1.进入设置-关于手机-连续点击7次版本号. 会提示,开发者选项已开启 ...

  9. Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法

    Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初 ...

  10. 记一次cdh6.3.2版本spark写入phoniex的错误:Incompatible jars detected between client and server. Ensure that phoenix-[version]-server.jar is put on the classpath of HBase in every region server:

    Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl. ...