二级C语言2024-3易错题

1 结构

一个C语言程序是由( )。

A. 一个主程序和若干子程序组成
B. 函数组成
C. 若干过程组成
D. 若干子程序组成

一个C语言程序是由多个部分组成的,其中最核心的部分是函数。在C语言中,函数是实现特定功能的代码块,它们可以被重复调用以执行相同的任务。因此,选项B是正确的。

而一个程序可能包含多个函数


2 输出相关

下列叙述中正确的是( )。

A. 调用printf()函数时,必须要有输出项
B. 使用putchar()函数时,必须在之前包含头文件stdio.h
C. 在C语言中,整数可以以二进制、八进制或十六进制的形式输出
D. 调节getchar()函数读入字符时,可以从键盘上输入字符所对应的ASCII码

正确答案:B
关于C语言中的输入和输出函数,以下是对各选项的解释:

  • A.
    错误。printf()函数可以没有输出项,例如,printf(“Hello, world!\n”); 中的 “Hello, world!” 就是一个输出项,它可以输出字符。 但这样的一种情况 printf(“”); 是合法的,只是它什么都不输出。
  • B.
    正确。putchar() 函数是标准库函数,它是定义在 stdio.h 中的。因此要使用 putchar(),必须包含头文件 stdio.h。正确的写法如下:
#include <stdio.h>int main() {putchar('A');return 0;
}
  • C.
    错误。C语言中的标准库函数 printf 并不直接支持二进制输出。整数可以使用八进制和十六进制的形式输出,但必须通过合适的格式控制符,例如,基于八进制使用 %o,基于十六进制使用 %x 或 %X。C语言中没有直接的格式化控制符来输出二进制。不过可以通过一定的逻辑实现二进制输出。
  • D.
    错误。getchar() 函数从标准输入读取下一个字符,并返回该字符的ASCII值。如果说”调节getchar()函数读入字符时,可以从键盘上输入字符所对应的ASCII码“,意思是要把字符转换成它的ASCII码来输入,这是不符合实际操作的。实际操作是直接输入字符,由getchar()捕获。例如输入 A 则 getchar() 返回 65(这是A的ASCII值)。

所以,正确答案是 B。


3 字符串比较

下述语句中,在字符串s1和s2相等时显示"they are Equal"的是( )。

A. if(*s1==*s2) puts(“they are Equal”);
B. if(!strcmp(s1,s2)) puts(“they are Equal”);
C. if(s1==s2) Puts(“they are Equal”);
D. if(strcmp(s1,s2)) puts(“they are Equal”);

正确答案 B.

  • A.
    这个条件仅比较了s1和s2的第一个字符是否相等。
  • C.
    这里使用的是直接指针比较(s1 == s2),它检查的是s1和s2这两个指针是否指向内存中的同一个地址,而不是比较它们所指向的内容是否相等。

strcmp

strcmp 是 C 语言标准库中的一个函数,用于比较两个字符串。它位于 <string.h> 头文件中。这个函数通过逐字节比较两个字符串来判断它们是否相等以及它们之间的顺序关系。下面是 strcmp 函数的一些关键点:

函数原型
int strcmp(const char *s1, const char *s2);
参数:

s1: 指向第一个要比较的以空字符终止的字符串。
s2: 指向第二个要比较的以空字符终止的字符串。

返回值:
  • 如果 s1 和 s2 完全相同,则返回 0。
  • 如果 s1 小于 s2(根据字典序),则返回一个小于 0 的整数。
  • 如果 s1 大于 s2(根据字典序),则返回一个大于 0 的整数。

这里的“小于”和“大于”是基于 ASCII 值进行比较的。例如,在 ASCII 中,大写字母 ‘A’ 到 ‘Z’ 的值小于小写字母 ‘a’ 到 ‘z’ 的值。


4 函数指针

给定程序中,函数fun的功能是用函数指针指向要调用的函数,并进行调用。规定在__2__处使fa指向函数f1,在__3__处使fb指向函数f2。当调用正确时,程序输出:

x1=5.000000,x2=3.000000,x1x1+x1x2=40.000000

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include  <stdio.h>
double f1(double x)
{return x*x;}
double f2(double x, double y)
{return x*y;}
double fun(double a, double b)
{
/**********found**********/__1__ (*f)();double r1, r2;
/**********found**********/f = __2__ ;   /* point fountion f1 */r1 = f(a);
/**********found**********/f = __3__ ;   /* point fountion f2 */r2 = (*f)(a, b);return r1 + r2;
}
main()
{double x1=5, x2=3, r;r = fun(x1, x2);printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n",x1, x2, r);
}

函数指针的基础

声明函数指针

在C/C++中,声明一个函数指针需要遵循一定的语法格式,因为这关系到函数返回类型以及参数类型的准确性。最基本的格式如下:

返回类型 (*指针名称)(参数类型1, 参数类型2, ...);

例如,对于一个无参数且返回值为void的函数,函数指针的声明如下:

void (*funcPtr)();

而对于一个有两个int参数并返回int的函数,声明如下:

int (*func_ptr)(int, int);
函数指针的初始化

函数指针可以通过将函数的名称(函数名在程序中作为它的地址)赋值给它来初始化:

int add(int a, int b) {return a + b;
}int (*func_ptr)(int, int) = add;//或者可以采用另一种方式,先声明后赋值:
int (*func_ptr)(int, int);
func_ptr= add;
使用函数指针
  • 通过指针调用函数
    初始化后,你就可以通过函数指针调用函数了:

  • 使用函数指针调用函数
    一旦函数指针指向了一个具体的函数,我们就可以使用 (*指针变量名)(参数列表) 的形式来通过该指针调用函数。

int result = (*func_ptr)(3, 4); // 调用 add 函数,传入参数 3 和 4
//或者,由于函数指针的语法糖,我们也可以这样写:
int result = func_ptr(3, 4); // 同样调用 add 函数int result = add(3, 4);
函数指针作为参数

函数指针可以作为参数传递给其他函数,这是编写回调函数的一种常用方法:

实现简易的计算函数:

#include <stdio.h>int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int calculate(int a, int b, int (*operation)(int, int)) {return operation(a, b);
}int main() {int a = 5, b = 3;printf("Add: %d\n", calculate(a, b, add));printf("Subtract: %d\n", calculate(a, b, subtract));return 0;
}

排序:

#include <stdio.h>// 比较函数原型可以留空,因为在你的示例中并未直接使用到这个函数
int compare(int a, int b);// 排序函数,接受一个数组、数组长度和一个比较函数指针
void sort(int *array, int length, int (*compare_func)(int, int)) {for (int i = 0; i < length - 1; ++i) {for (int j = 0; j < length - 1 - i; ++j) {if (compare_func(array[j], array[j + 1]) > 0) {// 交换元素int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}
}// 比较函数,用于升序排序
int ascending(int a, int b) {return a - b;
}// 比较函数,用于降序排序
int descending(int a, int b) {return b - a;
}int main() {int numbers[] = {5, 2, 9, 1, 5, 6};int length = sizeof(numbers) / sizeof(numbers[0]);// 使用升序比较函数进行排序sort(numbers, length, ascending);printf("Ascending order: ");for (int i = 0; i < length; i++) {printf("%d ", numbers[i]);}printf("\n");// 重新排序为降序,需重新赋初值for (int i = 0; i < length; i++) {numbers[i] = {5, 2, 9, 1, 5, 6}; // 若想重复上述数组,需要重新设置此数组的值}// 使用降序比较函数进行排序sort(numbers, length, descending);printf("Descending order: ");for (int i = 0; i < length; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
函数指针的应用场景
  • 回调函数:函数指针让我们在运行时决定调用哪个函数,这对于实现回调函数机制非常有用。
  • 状态机:在状态机模式中,函数指针可以用来表示不同状态下的行为。
  • 简化函数列表:通过函数指针数组,可以简化对一组函数的引用和管理。
  • 提高性能:在某些情况下,函数指针可以减少函数调用的开销,尤其是在循环内部调用时。
注意事项
  • 类型安全:确保函数指针类型与其指向的函数原型完全匹配,否则会导致不可预期的错误。
  • 空指针风险:未初始化的函数指针或被故意设置为NULL(或nullptr)的函数指针在使用前应该总是被检查是否为空,以避免运行时错误。
  • 可读性和复杂性:虽然函数指针非常强大,但它们也会增加代码的复杂性。明智的做法是在需要它们的强大功能时才使用它们。
C++中的额外考量

在C++中,函数指针仍然有其用途,但是现代C++越来越倾向于使用std::function和lambda表达式来实现类似的功能,这些方法提供了更好的类型安全和异常安全性。

#include <functional>
#include <iostream>int add(int a, int b) {return a + b;
}int main() {std::function<int(int, int)> func = add;std::cout << "Add Result: " << func(3, 4) << std::endl;auto multiply = [](int x, int y) { return x * y; };std::cout << "Multiply Result: " << multiply(3, 4) << std::endl;return 0;
}

std::function是C++11引入的一个类模板,能封装任何可调用的对象(包括函数指针、成员函数指针、甚至functor),提供了一个相对安全的调用方式。Lambda表达式则提供了一种便捷的方式来定义匿名函数。

总结来说,函数指针是C和C++中一种强大的特性,它为软件设计提供了灵活性,特别是在需要动态行为选择的场合。然而,随着C++的发展,一些更安全、更现代的替代方案正在变得流行。


写在后面的话

这套卷子就分析到这里,说实话,现在和几年前已经不是一个时代了。在如今这个时代,拥抱大模型是大势所趋。放在以前,想查找一些资料,一般就是上网自行查找,到书上找,或者向他人请教,但现在只需要打开网页,随便搜索一个大模型就能提问,甚至部分浏览器也集成了大模型,搜索时还会自动帮你总结整理,十分方便!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540608.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LTE和NR空口技术区别

LTE和NR空口技术区别

一起对话式学习-机器学习03——模型评估与模型选择

【一】前言 这一部分其实已在第二节中介绍到&#xff0c;这节起到回顾归纳的作用。 【二】训练误差与测试误差 首先&#xff0c;在分类问题中&#xff0c;有误差率和准确率两个概念&#xff0c;二者和为1。 误差率&#xff1a;分类错误的样本数占总数的比例。 其次&#xff0c…

【Node.js Vue】还在为选什么乐器发愁?乐器推荐系统帮你解决难题,基于用户行为分析的智能推荐,让你不再为音乐器材烦恼

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

用AI制作专属欧美漫画头像!FLUX大模型-漫画情侣lora应用教程

​ ​ 新上线了一个漫画风格的lora《漫画情侣&#xff08;欧美黄金时代风&#xff09;v1.0》 感兴趣的朋友可以去下载使用&#xff0c;下载是免费的。 下面跟大家说一下这个lora的特点、使用方法以及这个lora的延伸应用&#xff1a;欧美漫画头像制作 lora风格特点 欧美漫画/人…

【2024/09/20更新】植物大战僵尸杂交版V2.5下载

植物大战僵尸杂交版V2.5 2.5版本更新公告&#xff1a; 增加新关卡– 益智模式–两面夹击模式关卡 挑战模式关卡 增加新铲子–骷髅铲子 --银币购买-挖掉植物触发亡语或召唤骷髅僵尸 增加新植物– 4张白卡植物-通过两面夹击获得 2张金卡植物和4张星卡植物 游戏调整– 调整…

单片机——ADC采样

1、什么是ADC采样&#xff1f; ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压&#xff0c;通过数值的方式表现出来。以STM32F103系列为例&#xff0c;它可以反应0~4095&#xff0c;换句话说&#xff0c;它采集的电压数值上表现为0~4095&#xf…

动态线程池(四)

动态线程池 dtp生命周期管理 生命周期相关类图 DtpExecutor EagerEtpExecutor OrderedDtpExecutor TaskWrapper任务包装器 MdcRunnable TaskWrappers NotifyEnum NoticeManager通知管理器 InvokerChain调用链

Unborn安装CUDA Toolkit 12.2

Unborn安装CUDA Toolkit 12.2 Unborn安装CUDA Toolkit前言下载安装配置验证 Unborn安装CUDA Toolkit 前言 今天在某台Unborn系统上安装某个依赖库时&#xff0c;提示环境中缺少CUDA_HOME环境变量&#xff0c;导致在安装某些依赖时出现问题。具体异常如下&#xff1a; Lookin…

什么是大数据?一文讲清大数据的概念、演进、趋势、产业链及关键技术!

前言 数字经济浪潮下&#xff0c;数据已成为当今最为核心的资源之一&#xff0c;数据成为推动企业和社会发展、转型、创新的新型生产要素。 大数据这个词&#xff0c;不管您是不是相关行业的从业者&#xff0c;也都听过无数遍了&#xff0c;但对于大多数人来说&#xff0c;并…

共享单车轨迹数据分析:以厦门市共享单车数据为例(五)

先来聊聊啥是共享单车电子围栏&#xff1f; 共享单车电子围栏是一种基于地理位置技术的虚拟边界&#xff0c;用于管理和规范共享单车的停放和使用。这种技术通过在地图上划定特定区域&#xff0c;帮助用户了解哪些地方可以停车&#xff0c;哪些地方不能停车&#xff0c;从而减…

博导团队指导、解读实验结果、SCI论文润色

表观组&#xff1a; DAP-seq:转录因子-DNA互作研究工具 ATAC-seq :染色质开放程度研究工具 H3K4me3 ChIP-seq:组蛋白甲基化修饰工具 BS-seq :DNA甲基化研究工具 H3K27ac ChIP-seq:组蛋白乙酰化修饰研究工具 Cut&Tag:转录因子研究工具 ChIP-seq:转录因子-DNA互作工具 互作组…

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战&#xff1a;开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址&#xff1a; 通过关系型…

IDEA配置全局的maven环境

1、关闭掉所有打开的项目&#xff0c;然后点击All settings 2、配置maven home path、user setting file、local repository。 3、配置JRE的版本 4、配置字节码版本

【RabbitMQ】死信队列、延迟队列

死信队列 死信&#xff0c;简单理解就是因为种种原因&#xff0c;无法被消费的消息。 有死信&#xff0c;自然就有死信队列。当一个消息在一个队列中变成死信消息之后&#xff0c;就会被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff08;Dead Letter Excha…

对于C++继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

谷歌做外链的文章一定要原创吗?

在谷歌上做外链发布时&#xff0c;原创文章是必须的。虽然你可能会想到用一篇文章群发到很多网站&#xff0c;但这种做法并不会带来太大的SEO效果。谷歌非常重视内容的独特性和相关性。如果同样的文章重复发布到多个网站&#xff0c;搜索引擎很快就会识别出这种策略&#xff0c…

开发谷歌插件之GA埋点

目录 一、背景 二、踩坑 三、谷歌插件开发的GA埋点的实现方式 一、背景 开发了一个谷歌插件&#xff0c;领导需要对用户的一些行为进行分析&#xff0c;于是让我在代码里面加上GA埋点。由于我们的PC端的项目一直都有进行GA埋点&#xff0c;当时就想着&#xff0c;这不就是把…

页面关键路径渲染详解

关键路径渲染 浏览器不会等待全部资源都下载完后才进行渲染&#xff0c;而是采用渐进式的渲染方式&#xff0c;本文就介绍一下这种渐进式的渲染方式。 当浏览器获取到用于呈现网页的资源后&#xff0c;通常就会开始渲染网页。那么究竟是在什么时候就会开始渲染&#xff1f; …

LeetCode讲解篇之220. 存在重复元素 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 我们可以考虑存储数组中连续indexDiff个数字&#xff0c;这样我们只需要在这连续的indexDiff个数字中查找相差小于等于valueDiff的两个数字的问题 对于该查找问题&#xff0c;我们可以考虑使用以valueDiff大小为一个桶&a…

大厂程序员的健身之路

大厂程序员的健身之路 基本信息饮食正餐营养补剂 睡眠训练计划 基本信息 健身时间&#xff1a;2023.03 -> 2024.09体重变化&#xff1a;52kg -> 67kg 饮食 正餐 早餐&#xff1a;不吃午餐&#xff1a;两碗米饭 鱼/鸡肉 蔬菜 酸奶晚餐&#xff1a;两碗米饭 鱼/鸡肉…