“人生是用来体验的,不是用来绎示完美的,接受迟钝和平庸,允许出错,允许自己偶尔断电,带着遗憾,拼命绽放,这是与自己达成和解的唯一办法。放下焦虑,和不完美的自己和解,然后去爱那个完整的自己!”
前面,关于C语言的基础知识都学的差不多,但是想要好好掌握这门语言,还是要勤加练习,从现在到开学,每天会更新一个小练笔,大家可以一起来做一下❗
1.执行下面程序,正确的输出是( )
#include
int x = 5, y = 7;
void swap()
{
int z;
z = x;
x = y;
y = z;
}
int main()
{
int x = 3, y = 8;
swap();
printf("%d,%d\n", x, y);
return 0;
}
A: 5,7 B: 7,5 C: 3,8 D: 8,3
答案:C
答题思路:swap函数
调用的是全局变量,int x = 3, y = 8;
属于局部变量,只在主函数内生效。而主函数内的printf函数
考虑局部优先的原则,会输出3,8
。
2.以下不正确的定义语句是( )
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选项,就用到了转义字符的知识,详细的也可以去看我另外一篇博客:链接: 转义字符
✅ 这里,我们就知道\ddd中ddd表示1~3个八进制的数字
。如:\130 X
八进制数是由0~7组成,题目中B选项就错在了'\8'中出现了8.
而\ xdd中dd表示2个十六进制的数字
。如:\x30 0
十六进制的数是由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A-F分别表示十进制数字10-15.
3. test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;
A: a B: b C: c D: d
答案:ACD
答题思路:本题主要需要弄清楚define和typedef
。#define
是一种宏,一般会用在预处理阶段,在预处理阶段,define只会替换
,不会做任何的算计逻辑等处理。而typedef
是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef
。用typedef
定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。
那么,在上述代码中,INT_PTR a, b;
在预处理阶段就会转化成int*a,b;
这里,int *是a的类型,而b的类型是int.
而typedef
是起了一个别名,别名是一个独立的类型,使用这个类型创建的变量都是这个类型,因此c和d都是int*.
我们也可以通过调试来验证一下:
4.若给定条件表达式 (M)?(a++):(a–) ,则其中表达式 M ( )
A: 和(M==0)等价 B: 和(M ==1)等价C: 和(M!=0)等价 D: 和(M!=1)等价
答案:B
答题思路:本题考察的主要是三目运算符表达式1?表达式2:表达式3
✅唯一 一个三目操作符。
表达式1为真,表达式2的结果为整个表达式的结果,表达式3不算.
表达式1为假,表达式3的结果为整个表达式的结果,表达式2不算。
关于操作符的详细知识点,可以跳转见博客:操作符(上)
操作符(下)本题只要知道了操作符的相关知识,就不难解出!
5.有如下定义语句,则正确的输入语句是【多选】( )
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和&c
的地址一致,但是,对于整型变量b
,想要取它的地址,必须是&b.
1.输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
OJ链接【牛客网题号: JZ17 打印从1到最大的n位数】【难度:入门】
答题思路:从题目中,我们知道
n的取值范围是正整数1~5
,当n为1,应当输出[1,2,3,4,5,6,7,8,9]
当n为2时,应当输出[1,2,3...99]
,当n为3,应当输出[1,2,3...999]
当n为4时,应当输出[1,2,3...9999]
当n为5时,应当输出[1,2,3...99999]
我们发现最大的那位数都可以用10^n^-1
来表示,那么打印的过程,我们可以用for循环
来实现。
int* printNumbers(int n, int* returnSize)
{
*returnSize = pow(10, n) - 1;
int* ret = (int*)malloc(sizeof(int) * (*returnSize));//申请足够大的空间
//malloc函数是用于动态内存分配的
int i = 0;
for (i = 0; i < *returnSize; i++)
{
*(ret + i) = i + 1;//下标从0开始,数值从1开始
}
return ret;
}
malloc
是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型
返回分配的内存区域地址。如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
✅注意:malloc函数的返回的是无类型指针,在使用时一定要强制转换为所需要的类型。❗
在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。
在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配。
具体使用方法:指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)
2.根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。
输入描述:输入一行,每行空格分割,分别是年,月,日。
输出描述:输出是这一年的第几天
OJ链接【牛客网题号: HJ73 计算日期到天数转换】【难度:简单】
答题思路:拿到这个题目,我们首先想到的是,我们需要
判断这一年是否为闰年
,闰年的二月有29天
,而其他普通年份二月只有28天
。那么如果月份大于2
,总天数就要进行+1
的操作。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int year = 0, month = 0, day = 0;
scanf("%d%d%d", &year, &month, &day);
int month_day[12] = { 31,59,90,120,151,181,212,243,273,304,334,365 };
//建立一个整型数组,表示普通年份,前month个月数的天数和
int days = 0;
if (month >= 2)
{
days = month_day[month - 2] + day;
}
else
days = day;
if (month > 2)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//如果是闰年,天数+1
{
days++;
}
}
printf("%d\n", days);
return 0;
}
好啦,第一天的练习到这里就结束啦!后期会继续更新C语言的小练笔,欢迎大家持续关注、点赞和评论!❤️❤️❤️