首页 > 其他分享 >2个月搞定计算机二级C语言——真题(1)解析

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

时间:2024-07-24 17:43:30浏览次数:17  
标签:大写字母 搞定 真题 小写字母 tt 26 C语言 char ptr

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() {
    /* 请在此函数内打开文件,输入测试数据,调用 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. 后记

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

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

标签:大写字母,搞定,真题,小写字母,tt,26,C语言,char,ptr
From: https://www.cnblogs.com/main-studio/p/18319747

相关文章

  • 33.【C语言】实践扫雷游戏
    预备知识:第13篇一维数组 第13.5篇二维数组第28篇库函数 第29篇自定义函数 第30篇函数补充0x1游戏的运行:1.随机布置雷2.排雷基本规则:点开一个格子后,显示1,对于9*9,代表以1为中心的去心九宫格内有一个雷,找到后标记,直到标完所有的雷,游戏结束;如果中途点中雷,游戏结束......
  • 【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
    目录C语言结构体(`struct`)详解结构体概览表1.结构体的基本概念1.1结构体定义1.2结构体变量声明2.结构体成员的访问2.1使用点运算符(`.`)访问成员输出2.2使用箭头运算符(`->`)访问成员输出3.结构体的初始化3.1结构体初始化输出3.2使用指定初始化器输出4.结构......
  • NAS机友必知: 一个命令轻松搞定DockerHub被墙问题!
    最近因“不可控”之理由, DockerHub算是被全面封杀了,以前还只是污染了Web网站,现在连直接使用dockerpull都不能正常拉镜像了。如下,拉镜像一直卡在pulling阶段,重试数次后就会直接失败:这对于玩NAS的朋友来说是不可接受的(对于开发者来说简直是灾难,端午节没法过了),没了 Docker,NAS的可......
  • [c语言分支循环语句详解 -----选择结构、循环结构]
            c语言是结构化的程序设计语言,分为顺序结构、选择结构、循环结构。我们生活中的所有事情都可以用三种顺序结构表示。顺序结构顺序结构是C语言的基本结构程序由上而下运行,运行完上条语句再往下运行,平时写的程序基本都用到顺序结构。选择结构我们可以使用i......
  • C语言代码实现——扫雷
    目录前言1扫雷游戏的分析和实现1.1扫雷游戏的功能1.2扫雷游戏的分析1.3完整代码2扫雷游戏的扩展2.1扫雷扩展的实现总结前言扫雷,相信大家都或多或少的了解这款游戏,本篇文章将分析这个游戏的设计思路,并用C语言代码来实现这个游戏。1扫雷游戏的分析和实现1.1......
  • 2024.7.23 c语言学习笔记
    复习:什么是指针?   也叫地址address,就是内存块的首位置,英文名叫painter。他是一个常量,指针不能被赋值,不能自增自减,例如:数组名就是内存块首地址,他就是一个指针常量。Inta=10,&a就是首地址,是指针常量;什么是指针变量?顾名思义,存放指针(地址)数据的变量,也叫地址变量。就......
  • 【C语言】自定义类型——联合和枚举
    目录一、联合体1.1联合体类型的声明1.2联合体的特点1.2.1特点11.2.2特点21.2.3特点31.3联合体的大小1.4相同成员的结构体和联合体的对比1.5使用联合体节省空间的例子1.6运用联合体判断大小端1.7利用联合体打印存储的字节内容二、枚举类型2.1枚举类型的......
  • C语言课程设计:图书管理系统【源码+文档】
    【文章序言】:很高兴你能来阅读,博客分享日常编程,希望自己向着优秀程序员前行!博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起......
  • c语言的编译与调试
    1.GCC/G++gcc和g++是GNUCompilerCollection中的编译器,分别用于编译C和C++程序。它们的编译过程主要包括四个步骤:预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)。1.1编译过程预处理(Pre-Processing):gcc-Ehello.c-ohello.i对hello.c文件进行预处......
  • c语言实现猜数字游戏
    猜数字游戏是一种简单而有趣的编程实践项目,通常通过C语言来实现。 在这个游戏中,程序会在一个特定的范围内(例如100到200)随机生成一个数字作为要猜测的目标数字。玩家需要通过输入自己猜测的数字来尝试猜出这个目标数字。 每次玩家输入猜测后,程序会给出相应的提示,例如......