c语言基础刷题 Day 1

欢迎大家来到浩克c语言刷题训练营,话不多说,直接肝!

文章目录

  • 一、选择题(5道)
  • 二、编程题(2道)
  • 总结

一、选择题(5道)

1、执行下面程序,正确的输出是()

#include
int x = 5, y = 7;
void swap()
{
	int z = 0;
	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

答案解析:
swap函数调用时用的是全局变量,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系;输出语句这里,考虑局部优先的原则,故选C

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选项考查转义字符,有如下格式,但八进制数字是0-7,没有8,故B选项中’\8’是错误的 。
\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X
\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0

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

答案解析:
因为#define是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的 类型,b的类型是int,故此次b只是int类型。而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。所以 a,c,d才是指针类型。
故选:A,C,D。

4、 若给定条件表达式 (M)?(a++):(a–) ,则其中表达式 M ( )

A: 和(M0)等价      B:和(M1)等价
C: 和(M!=0)等价       D: 和(M!=1)等价

答案解析:
给定条件表达式(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

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);

答案解析:
&c和c两个地址值是一样的,程序的效果相同,也没错,但同时也必须把变量b的地址给scanf,故CD错误,AB正确

二、编程题(2道)

OJ链接【牛客网题号: JZ17 打印从1到最大的n位数】【难度:入门】

大家可以点开上面这个链接自己先做一下,然后再看我的解析。

1.输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3 ,则打印出 1、2、3 一直到最大的 3 位数999 。

答案解析:

这里首先要清楚n位数中最大的数字,实际上就是 10^n - 1 。 比如:
1位数:10^-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;
}

OJ链接【牛客网题号: HJ73 计算日期到天数转换】【难度:简单】
大家可以点开上面这个链接自己先做一下,然后再看我的解析。

2、根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。
输入描述:输入一行,每行空格分割,分别是年,月,日。
输出描述:输出是这一年的第几天
c语言基础刷题 Day 1_第1张图片

答案解析:
这道题简单解法其实将每个月的天数枚举出来,然后根据当前月份向前累加满月的天数,然后再加上当前月所在的天数。最终考虑平闰年的 2月份区别是否增加一天。
其中需要注意的是平年和闰年的判断,而且是闰年的月份大于 2 的时候,也就是 2 月走完,总天数才能加 1(比如2000年2月18日 ,虽然是闰年,但是 2月 都没走完那是不能加上闰年多出的一天的).

#include
int is_leap_year(int year) //判断是否为闰年
{ 
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 
	{
		return 1; 
	}
	return 0; 
}
int main()
{
	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) != EOF)
	{
		int total_day = day;//先把当前月份天数加上
		if (is_leap_year(year) && month > 2)//若为闰年且月份大于2个月,总天数+1.
		{
			total_day+=1;
		}
		for (int i = month - 1; i > 0; i--)
		{
			total_day += month_day[i];//向前累加每个月的天数即可得到总天数。
		}
		printf("%d\n", total_day);
	}	
}

总结

努力是最好的天赋,所以行动起来吧!

如果觉得浩克写的还不错的话,记得关注浩克奥,我们一起努力!
c语言基础刷题 Day 1_第2张图片

你可能感兴趣的:(c语言刷题训练营,c语言,算法,数据结构)