- 💓博客主页:江池俊的博客
- ⏩收录专栏:C语言刷题专栏
- 👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路
- 💻代码仓库:江池俊的代码仓库
- 🎉欢迎大家点赞👍评论📝收藏⭐
- 🤝表情分享:🔎📷🥇🎈🐬🍁💯⭕️💮📍🚩👀🚨🧩💥📌🌴
文章目录
🎈前言:
- 本专栏每篇练习将包括 **
5个选择题 + 2个编程题
**,将涵盖C语言的不同方面,包括基础语法、数据类型、控制结构、数组、指针和函数等。通过练习,你将逐步掌握C语言的基础知识和常见问题,提高你的编程技巧和解决问题的能力。- 我希望这个博客能够为你提供有价值的练习资源,让你在实践中不断进步。同时,我们也鼓励你在练习过程中进行思考和创新,尝试使用不同的编程方法和技巧。
- 让我们一起挑战C语言练习题,攻克每一个难点,不断提升自己的编程技能!
在评论区分享你的练习心得和问题,与我们一起交流和成长。
🌴选择题
- 执行下面程序,
正确
的输出是( )
int x =5, y =7;voidswap(){int z;
z = x;
x = y;
y = z;}intmain(){int x =3, y =8;swap();printf("%d,%d\n",x, y);return0;}
A: 5,7 B: 7,5 C: 3,8 D: 8,3
🔎正确答案:**
C
**
【解析】:swap
函数调用时用的是
全局变量
,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系;输出语句这里,考虑局部优先的原则,故打印的
x
值为
3
,
y
的值为
8
。
- 以下
不正确
的定义语句是( )
A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[] = {‘\x10’, ‘\xa’, ‘\8’};
C: char c1[] = {‘1’,‘2’,‘3’,‘4’,‘5’};
D: int y[5+3]={0, 1, 3, 5, 7, 9};
🔎正确答案:**
B
**
【解析】:
本题B选项考查转义字符,有如下格式,但八进制数字是0-7,没有8,故B选项中’\8’是错误的\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X
\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0
- test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )
#defineINT_PTRint*typedefint* int_ptr;
INT_PTR a, b;
int_ptr c, d;
A: a B: b C: cD: d
🔎正确答案:**
ACD
**
【解析】:易错题
因为#define是宏定义,仅仅是直接替换;INT_PTR a, b
, 进行宏替换后代码是这样的:
int *a, b
;这里的
int *
是
a
的类型,
b
的类型是
int
,故此次
b
只是
int
类型。而
typedef
是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。所以
a,c,d
才是指针类型。
- 若给定条件表达式
(M)?(a++):(a--)
,则其中表达式M
( )
A: 和 (M ==0) 等价 B: 和 (M ==1) 等价 C: 和(M !=0 )等价 D: 和(M != 1)等价
🔎正确答案:**
C
**
【解析】:易错题
给定条件表达式(M)?(a++):(a--)
。 (表达式1)? (表达式2): (表达式3)为
三目运算符
。
- 三目运算符计算规则为:先判断
表达式1
是否为真,若为真,则计算表达式2
,并将表达式2
的结果作为整个表达式最终的结果,表达式3
不计算;否则,表达式3
的结果为最终结果,表达式2
不计算。- 在此表达式中,若
M=0
,为假,计算a--
; 若M≠0
,为真,计算a++
; 若要求与M
等价,则要满足M
取0
时为假,取非0
数值时为真。 C选项中:假定M
取0
,则M
表示假,当M
是0
时,表达式M!=0
不成立,为假,计算a--
;当M
取非0
数值时,M
为真,表达式M!=0
成立,为真,计算a++
; 符合题意,选C
- 有如下定义语句,则
正确
的输入语句是【多选】( )
int b;char c[10];
A: scanf(“%d%s”,&b,&c);B: scanf(“%d%s”,&b,c);
C: scanf(“%d%s”,b,c); D: scanf(“%d%s”,b,&c);
🔎正确答案:**
AB
**
【解析】:
根据C语言中的scanf
函数,正确的输入语句应该将
变量的地址
作为参数传递给
scanf
函数。
选项A和B是正确的输入语句。在选项A中,虽然在第二个参数中使用"&c" 与一般情况下使用数组名" c " (即选项B) 稍有不同,但两者地址值是一样的,程序的效果相同,因为它表示数组首元素的地址。而选项C和D均不正确,因为在读取整数时需要使用"&b"来获取变量b的地址。
🌴编程题
📌打印从1到最大的n位数
【牛客网链接:JZ17 打印从1到最大的n位数】
【题目信息】:
【答案解析】:
这里首先要清楚n位数中最大的数字,实际上就是 **
10^n - 1
** 。 比如:
1位数: 10^1 - 1
2位数: 10^2 - 1
3位数: 10^3 - 1
...
这个清楚后动态申请空间,将数值填入就可以了,需要注意的是数组下标从0开始,而数值从1开始
int*printNumbers(int n,int* returnSize){*returnSize =pow(10, n)-1;//确定最大的数字int* arr =(int*)malloc(sizeof(int)*(*returnSize));//申请足够大小的空间for(int i =0; i <*returnSize; i++){
arr[i]= i +1;//下标从0开始,而数值从1开始}return arr;}
【知识拓展】:
(1)pow函数
(2)malloc函数
这里只是简单的介绍了malloc函数的原型,具体如何使用还是需要大家多多探索,毕竟熟能生巧,大家只有多多练习才能提升自己的代码水平。
📌计算日期到天数转换
【牛客网链接:HJ73 计算日期到天数转换】
【题目信息】:
【答案解析】:
- 这道题简单解法其实将每个月的天数枚举出来,然后根据当前月份向前累加满月的天数,然后再加上当前月所在的 天数。最终考虑平闰年的 2 月份区别是否增加一天。
- 其中需要注意的是平年和闰年的判断,而且是闰年的月份大于 2 的时候,也就是 2 月走完,总天数才能加 1 (比 如 2000年2月18日 ,虽然是闰年,但是 2月 都没走完那是不能加上闰年多出的一天的).
#include<stdio.h>intis_leap_year(int year)//判断是否为闰年的函数{if(year %4==0&& year %100!=0|| year %400==0){return1;}return0;}intmain(){int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//下标对应月份int year, month, day;while(~scanf("%d %d %d",&year,&month,&day))//多组输入{int total_day = day;//先把当前月份天数加上if(is_leap_year(year)&& month >2){
total_day +=1;//若闰年,且月份大于2月,则在平年基础上+1}for(int i = month -1; i >0; i--){
total_day += month_day[i];//向前累加每月的天数即可}printf("%d\n", total_day);}return0;}
【拓展】:注意上述代码中的 while (~scanf(“%d %d %d”, &year, &month, &day)),这条语句也可以写成 while (scanf(“%d %d %d”, &year, &month, &day)!=EOF)。
scanf
是一个函数,用于从标准输入(通常是键盘)读取数据并将其存储到变量中。它的基本语法是:
scanf("%format",&variable1, variable2,...)
其中"%format"是用于指定输入数据的格式,如整数(%d),浮点数(%f),字符(%c)等。"&variable1, variable2, …"是要存储输入的变量的地址。
然后,~是一个位运算符,表示按位取反。它对操作数的每一位进行取反,即把0变为1,把1变为0。在计算机中,数的存储是以二进制的形式进行的,所以按位取反操作可以实现对一个数的所有二进制位取反。
scanf
返回值是成功读取数据的个数,如果
scanf
遇到问题(如用户输入的不是数字,或者已经到达了文件尾),那么
scanf
会返回-1,-1在内存中存储的是补码,其补码是全1,所以
~scanf
取反后就变为全0,就会返回0,循环就会停止。
🔥今天的内容就到这里了,有什么问题的话欢迎大家在评论区讨论,也可以私信博主为你解答,如果觉得博主的文章还不错的话, 请👍三连支持一下博主哦🤞
版权归原作者 江池俊 所有, 如有侵权,请联系我们删除。