首页/文章列表/文章详情

2个月搞定计算机二级C语言——真题(1)解析

编程知识1842024-07-24评论

1. 前言

大家好,我是梁国庆。

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

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

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

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

image

2. 程序填空题

2.1 题目要求

image

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 题目要求

image

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 题目要求

image

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() {  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() {  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. 后记

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

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

神弓

博客园

这个人很懒...

用户评论 (0)

发表评论

captcha