习题练习 C语言(暑期第二弹)

编程能力小提升!
- 前言
- 一、表达式判断
- 二、Assii码的理解应用
- 三、循环跳出判断
- 四、数字在升序数组中出现的次数
- 五、整数转换
- 六、循环语句的应用
- 七、函数调用
- 八、两个数组的交集
- 九、C语言基础
- 十、图片整理
- 十一、数组的引用
- 十二、数组的引用
- 十三、字符个数统计
- 十四、多数元素
- 总结
前言
重要的事说三遍!
学习!学习!学习!
一、表达式判断
对于代码段,下面描述正确的是( )
t=0;
while(printf("*"))
{t++;if (t<3)break;
}
A: 其中循环控制表达式与0等价
B: 其中循环控制表达式与’0’等价
C:其中循环控制表达式是不合法的
D: 以上说法都不对
题目解析:
因print(“*”)函数调用的返回值是字符串中字符的个数,即为1。
所以while后面的条件恒为真,所以循环控制表达式与’0’是等价的(字符’0’不是0)。
正确答案是B
题目答案:
B
二、Assii码的理解应用
以下程序运行时,若输入 1abcedf2df<回车> 输出结果是( )
#include <stdio.h>
int main()
{char ch;while ((ch = getchar()) != '\n'){if (ch % 2 != 0 && (ch >= 'a' && ch <= 'z'))ch = ch - 'a' + 'A';putchar(ch);}printf("\n");return 0;
}
A: 1abcedf2df
B: 1ABCEDF2DF
C: 1AbCEdf2df
D: 1aBceDF2DF
题目解析:
程序首先考虑ch的ASCII码值是不是奇数,再看是不是小写字母,同时满足时被改为大写字母
题目答案:
C
三、循环跳出判断
我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层 循环的做法正确的是【多选】( )
A: 将程序写成函数用return结束函数,便可跳出循环
B: 修改外层循环条件例如
for( int i = 0 ; i < MAX1 ; i ++ )
{for( int j = 0 ; j < MAX2 ; j ++ ){if( condition ){i = MAX1;break;}}
}
C:在外层循环设置判断条件例如
for( ; symbol != 1 && condition2 ; )
{for( ; symbol != 1 && condition3 ; ){if( condition1 )symbol = 1 ;}
}
D: 在外层循环后面加入break例如
for( ; condition2 ; )
{for( ; condition3 ; ){if( condition1 )symbol = 1 ;} if(symbol == 1 )break ;
}
题目解析:
此题旨在整理跳出多层循环的方法,每个选项都是正确的,代码为伪代码,condition代表逻辑表达式
题目答案:
ABCD
四、数字在升序数组中出现的次数
题目链接OJ链接

题目解析:
采用遍历也能搞定,不过数组为非降序,采用二分查找的思想最优,先二分找到最左边的数字位置,再二分查找最右边的数字位置,两个位置相减+1就是长度了
中间比找的值大:则要找的数字肯定在右边, left = mid + 1;
中间比找的值小:则要找的数字肯定在左边, right = mid - 1;
中间值与找的值相同:
找的最左边数字:如果mid就是left,则返回mid就行,否则重置right=mid-1,把中心不断向左偏移
找的最右边数字:如果mid就是right,则返回mid就行,否则重置left=mid+1,把中心不断向右偏移
题目答案:
int get_last_or_first_idx(int* data, int len, int k,int flag) {int left = 0, right = len - 1, mid;//左右指针下标及中间结点下标while (left <= right) {mid = left + (right - left) / 2;//找到中间结点if (data[mid] > k)right = mid - 1;//如果中间节点大于k,则将右节点左移else if (data[mid] < k)left = mid + 1;//如果中间节点小于k,则将左节点右移else {//如果中间节点值等于k,则判断flag的值来区分找的是哪边if (flag == 0) { if (mid == left || data[mid - 1] != k) return mid;//如果中间结点等于k,且前一个结点不等于k,以及和left位置相同,则找到最左边的k,返回下标else right = mid - 1;} else {if (mid == right || data[mid + 1] != k) return mid;//如果中间结点等于k,且后一个结点不等于k,以及和right位置相同,则找到最右边的k,返回下标else left = mid + 1;}}}return -1;
}
int GetNumberOfK(int* data, int dataLen, int k ) {if (dataLen == 0) return 0;int left = get_last_or_first_idx(data, dataLen, k, 0);int right = get_last_or_first_idx(data, dataLen, k, 1);if (left == -1 && right == -1) return 0; return right - left + 1;//左右下标相减得到k的个数
}
五、整数转换
题目链接:OJ链接

提示:
A,B范围在[-2147483648, 2147483647]之间
题目解析:
其实问需要修改多少个比特位,问的就是有多少个比特位不同而已,因为有多少位不同就修改多少位而已;
题目答案:
int convertInteger(int A, int B){int a=A^B;//相同为0,相异为1double count=0;for(int i=0;i<32;i++){if((a>>i)&1==1){//通过与1与,得到求出的数二进制序列中有多少个1,从而确定个数;count++;}}return count;
}
六、循环语句的应用
以下叙述中正确的是( )
A: 只能在循环体内和switch语句体内使用break语句
B:当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并中止循环体执行
C:continue语句的作用是:在执行完本次循环体中剩余语句后,中止循环
D:在while语句和do-while语句中无法使用continue语句
题目解析:
break语句通常用在循环语句和switch语句中。当break用于switch语句中时,可使程序跳出switch而执行switch以后的语句;
当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,即满足条件时便跳出循环。
continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。B、C和D三个选项中均有错误。因此A选项正确
题目答案:
A
七、函数调用
设函数 fun 和实参数组的说明是如下形式,则对函数的调用语句中,正确的是( )
void fun(char ch,float x[]);
float a[10];
A: fun(“asd” , a[]); B: fun(‘x’ , A); C: fun(‘68’ , 2.8); D: fun(32 , a);
题目解析:
A选项数组传参只需要写数组名就行,a[]时错误的,B选项第二个参数写成了大写,错了。C选项第二个参数是浮点数,但是fun函数的第二参数是数组不匹配,fun函数参数x需要传一个数组或者float *指针,只有D选项的形式是正确的。
题目答案:
D
八、两个数组的交集
题目链接:OJ链接

提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <=1000
题目解析:
A选项数组传参只需要写数组名就行,a[]时错误的,B选项第二个参数写成了大写,错了。C选项第二个参数是浮点数,但是fun函数的第二参数是数组不匹配,fun函数参数x需要传一个数组或者float *指针,只有D选项的形式是正确的。
题目答案:
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {static int arr[1000];//定义静态,防止销毁*returnSize = 0;//返回数组大小for (int i = 0; i < nums1Size; i++) {//将nums1中的每个数遍历nums2找到相同的数for (int j = 0; j < nums2Size; j++) {if (nums1[i] == nums2[j]) {int k = 0;for (k = 0; k < *returnSize; k++) {//遍历arr数组看是否已经存在,找到了返回下标if (arr[k] == nums2[j])break;}if (k == *returnSize) {//如果k等于*returnSize则说明数组中不存在该数,则向数组中加入该数arr[*returnSize] = nums2[j];(*returnSize)++;//返回数组长度+1}}}}return arr;
}
九、C语言基础
以下对C语言函数的有关描述中,正确的有【多选】( )
A: 在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体
B:函数的实参和形参可以是相同的名字
C: 在main()中定义的变量都可以在其它被调函数中直接使用
D:在C程序中,函数调用不能出现在表达式语句中
题目解析:
主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,C错误;当函数有返回值时,可以出现在表达式中,D错误
题目答案:
AB
十、图片整理
题目链接:OJ链接

题目解析:
这道题考察的其实就是字符排序,每个 ascii 字符在内存都有一个对应的 ascii 值,通过内存中数据的存储进行排序就行。
冒泡排序:相邻数据之间进行比较交换,将较大或较小的数据向后推到数组末尾,然后开始下一轮次大数据的冒泡
过程。
题目答案:
方法一:
#include <stdio.h>
void Qsort(char*arr,int len){for(int i=0;i<len;i++){//冒泡排序for(int j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){char temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}
}
int main() {char arr[1001] = {0};while (scanf("%s", arr)!= EOF) {char digit[1001] = {0};//将数字入到该数组int digits = 0;//数字个数char upper[1001] = {0};//将大写字母入到该数组int uppers = 0;//大写字母个数char lower[1001] = {0};//将小写字母入到该数组int lowers = 0;//小写字母个数char* ptr = arr;while (*ptr) {//查找并添加if (*ptr >= '0' && *ptr <= '9') {digit[digits] = *ptr;digits++;}if (*ptr >= 'A' && *ptr <= 'Z') {upper[uppers] = *ptr;uppers++;}if (*ptr >= 'a' && *ptr <= 'z') {lower[lowers] = *ptr;lowers++;}ptr++;} //进行排序 Qsort(digit,strlen(digit));Qsort(upper,strlen(upper));Qsort(lower,strlen(lower));//进行输出for (int j = 0; j < digits; j++) {printf("%c", digit[j]);}for (int j = 0; j < uppers; j++) {printf("%c", upper[j]);}for (int j = 0; j < lowers; j++) {printf("%c", lower[j]);}}
return 0;
}
方法二:
#include <stdio.h>
int main()
{char str[1024] = {0};while(gets(str)) {int len = strlen(str);for (int i = 0; i < len; i++) {for (int j = 1; j < len - i; j++) {if (str[j] < str[j - 1]) {char ch = str[j - 1];str[j - 1] = str[j];str[j] = ch;}}}printf("%s\n", str);}return 0;
}
十一、数组的引用
若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )
A: a[2][0]
B: a[2][3]
C:a[0][3]
D: a[1>2][1]
题目解析:
本题主要考虑数组越界访问的情况,二维数组的行和列都是从0开始的,对于a数组来说,行下标最大是1,列下标最大是2,D选项中1>2表达式的值是0,是正确的,其他选项行和列都可能存在越界,A是行越界,B是行和列都越界,C是列越界。
题目答案:
D
十二、数组的引用
已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )
A: (X[i]+j)
B:(X+i)[j]
C: *(X+i+j)
D: ((X+i)+j)
题目解析:
本题考查的是二维数组的元素访问,A选项是 正确的,X[i]就是第i行的数组名,数组名表示首元素的地址,X[i]表示第i行的第一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是X[i][j],A正确。B选项因为[]的优先级高于*,所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],所以错误。C选项也明显不对,X是二维数组的数组名,数组名相当于第一行的地址X+i+j,跳过了i+j行,就越界了,C错误。D选项是标准的指针形式访问二位数组的一个元素。
题目答案:
BC
十三、字符个数统计
题目链接:OJ链接

题目解析:
本题思路,先建立一个大小为128的数组,从而保证0~127的各种字符都能在数组中找到它的assii值所对应的位置,将找到的位置变为1,最后将数组中的值相加,所得的就是字符的种类
题目答案:
#include <stdio.h>
int main() {char arr[501]={0};while (scanf("%s",arr) != EOF) { char*ptr=arr;int count[128]={0};while(*ptr){int temp=*ptr;//通过Assii码值作为下标找到count数组中对应的位置count[temp]=1;//将值变为1;ptr++;}int ret=0;for(int i=0;i<=129;i++){//遍历相加ret+=count[i];}printf("%d\n",ret);}return 0;
}
十四、多数元素
题目链接:OJ链接

提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
题目解析:
一个数组中有一个数字出现次数大于 n/2 ,从第 0 个字符开始,假设它就是最多的那个数字,遇到相同的数字则计数 +1 , 遇到不同的则计数 -1 ,其实就是互相消耗,等到计数为 0 的时候,表示本次互拼完毕,从下一个字符重新开始互拼,但是归根结底出现次数大于 n/2 的这个数字数量更多,因此也是最后保留的字符。
示例: “23335” 首先从字符 2 开始计数 1 ,遇到 3 ,不同则 -1 ,互拼消耗 重新从剩下的 “335” 开始的过程,这时候保存的字符为 3 ,遇到 3 则计数 +1 , 遇到5则计数 -1 ,在计数不为 0 时,走到末尾保存的字符就是个数超过n/2 的字符
题目答案:
int majorityElement(int* nums, int numsSize){int count=1;//记录多数元素的个数与非多数元素出现个数的差int more=nums[0];//将第一个作为多数元素int i=1;for(i;i<numsSize;i++){if(more==nums[i]){//下标对应的数为多数元素,则count++count++;}else{//下标对应的数不是多数元素,则count--count--;}if(count==0){//如果count等于0,那就可能该数不是多数元素,将下一个作为多数元素继续遍历more=nums[i+1];}}if(count>0){//多数元素的个数与非多数元素出现个数的差大于0,则说明此时记录的元素多于总数的一半,为多数元素,return more;}else{return 0;}
}
总结
重要的事说三遍!
加油!加油!加油!
相关文章:
习题练习 C语言(暑期第二弹)
编程能力小提升! 前言一、表达式判断二、Assii码的理解应用三、循环跳出判断四、数字在升序数组中出现的次数五、整数转换六、循环语句的应用七、函数调用八、两个数组的交集九、C语言基础十、图片整理十一、数组的引用十二、数组的引用十三、字符个数统计十四、多数…...
树莓派使用Nginx+cpolar内网穿透实现无公网IP访问内网本地站点
文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Ngi…...
攻防世界-Web_php_unserialize
原题 解题思路 注释说了flag存在f14g.php中,但是在wakeup函数中,会把传入的文件名变成index.php。看wp知道,如果被反序列话的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得__wakeup 失效(CV…...
云化背景下的接口测试覆盖率自动化检查
一、问题来源 在云化场景下,API的测试覆盖是一项重要评估与考察指标。除了开发者自测试外(UT),还可以利用云化测试平台、流水线等方法进行相关指标的检查与考核。利用这种方法既可以减轻开发者测试工作量,不必在本地做…...
QCC_BES 音频重采样算法实现
+V hezkz17进数字音频系统研究开发交流答疑群(课题组) 这段代码是一个用于将音频数据进行立体声重采样的函数。以下是对代码的解读: 函数接受以下参数: pcm_buf:16位有符号整型的音频缓冲区,存储了输入的音频数据。pcm_len:音频缓冲区的长度。mic1:16位有符号整型的音频…...
如何使用CSS实现一个3D旋转效果?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 3D效果实现⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域…...
联想电脑装系统无法按F9后无法从系统盘启动的解决方案
开机时按F9发现没有加载系统盘. 打开BIOS设置界面,调整设置如下: BOOT MODE: Legacy Support.允许legacy方式boot. BOOT PRIORITY: Legacy First. Legacy方式作为首选的boot方式. USB BOOT: ENABLED. 允许以usb方式boot. Legacy: 这里设置legacy boot的优先级,…...
AMEYA360:大唐恩智浦电池管理芯片DNB1168-新能源汽车BMS系统的选择
DNB1168是一款全球独有的集成(EIS)交流阻抗谱监测功能的单电池监测芯片。该芯片通过车规级AEC-Q100和汽车行业最高功能安全等级ISO 26262:2018 ASIL-D双重认证。芯片?内部集成多种高精度电池参数监测,支持电压、温度、交流阻抗检…...
【Python进阶学习】【Excel读写】使用openpyxl写入xlsx文件
1、当前文件不存在指定的子文件夹则创建 2、文件存在追加写入 3、文件不存在创建文件并写入表头 # -*- coding: utf-8 -*- import openpyxl as xl import osdef write_excel_file(folder_path):if not os.path.exists(folder_path):os.makedirs(folder_path)result_path os.p…...
Docker(md版)
Docker 一、Docker二、更换apt源三、docker搭建四、停启管理五、配置加速器5.1、方法一5.2、方法二 六、使用docker运行漏洞靶场1、拉取tomcat8镜像2、拉取成功3、开启服务4、查看kali的IP地址5、访问靶场6、关闭漏洞靶场 七、vulapps靶场搭建 一、Docker Docker是一个开源的应…...
如何使用CSS实现一个无限循环滚动的图片轮播效果?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐HTML 结构⭐ CSS 样式⭐ JavaScript 控制⭐ 注意事项:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅࿰…...
你使用过WebSocket吗?
什么是WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现是为了解决 Web 应用中实时通信的需求。传统的 HTTP 协议是基于请求-响应模式的,即客户端发送请求,服务器响应请求,然后连接关闭。…...
Spark整合hive的时候出错
Spark整合hive的时候 连接Hdfs不从我hive所在的机器上找,而是去连接我的集群里的另外两台机器 但是我的集群没有开 所以下面就一直在retry 猜测: 出现这个错误的原因可能与core-site.xml和hdfs-site.xml有关,因为这里面配置了集群的nameno…...
SocketTools.NET 11.0.2148.1554 Crack
添加新功能以简化使用 URL 建立 TCP 连接的过程。 2023 年 8 月 23 日 - 12:35新版本 特征 添加了“HttpGetTextEx”函数,该函数在返回字符串缓冲区中的文本内容时提供附加选项。添加了对“FileTransfer”.NET 类和 ActiveX 控件中的“GetText”和“PutText”方法的…...
【深度学习-seq2seq模型-附核心encoder和decoder代码】
深度学习 深度学习-seq2seq模型什么是seq2seq模型应用场景架构编码器解码器训练 & 预测损失预测评估BLEUBELU背后的数学意义 模型参考论文 深度学习-seq2seq模型 本文的网络架构模型参考 Sutskever et al., 2014以及Cho et al., 2014 什么是seq2seq模型 Sequence to seq…...
videojs 实现自定义组件(视频画质/清晰度切换) React
前言 最近使用videojs作为视频处理第三方库,用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现,目前看了许多文章也不全,官方文档写的也不是很详细,自己摸索了一段时间陆陆续续完成了,这是实现后的效果.…...
python 模块urllib3 HTTP 客户端库
官网文档地址:https://urllib3.readthedocs.io/en/stable/reference/index.html 一、安装 pip install urlib3二、基本使用 import urllib3 import threadingimg_list ["https://pic.netbian.com/uploads/allimg/220211/004115-1644511275bc26.jpg",&…...
2023 CCPC 华为云计算挑战赛 D-塔
首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度,就是总共增加的高度 下面是…...
手搓大模型值just gru
这些类是构建神经网络模型的有用工具,并提供了一些关键功能: EmAdd类使文本输入数据嵌入成为可能,在自然语言处理任务中被广泛使用。通过屏蔽处理填充序列的能力对许多应用程序也很重要。 HeadLoss类是训练神经网络模型进行分类任务的常见损失函数。它计算损失和准确率的能力…...
eslint
什么是eslint ESLint 是一个根据方案识别并报告 ECMAScript/JavaScript 代码问题的工具,其目的是使代码风格更加一致并避免错误。 安装eslint npm init eslint/config执行后会有很多选项,按照自己的需求去选择就好,运行成功后会生成 .esli…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
