C语言日常刷题 1

文章目录


题目

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

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

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

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

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

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

5、有如下定义语句,则正确的输入语句是【多选】( )

A: scanf("%d%s",&b,&c); B: scanf("%d%s",&b,c);

C: scanf("%d%s",b,c); D: scanf("%d%s",b,&c);

6.根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。

输入描述:输入一行,每行空格分割,分别是年,月,日。

输出描述:输出是这一年的第几天

示例:

输入:2012 12 31 输入:1982 3 4

输出:366 输出:63

7.输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。

比如输入 3 ,则打印出 1、2、3 一直到最大的 3 位数 999 。

用返回一个整数列表来代替打印

n 为正整数

答案与解析

1

正确答案:C

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

c 复制代码
int x = 5, y = 7;
//x,y为全局变量,在整个代码进程中都可使用

void swap()//未传输参数,所以下面的x,y是使用全局变量的x,y
{
	int z;
	z = x;
	x = y;
	y = z;
}
int main()
{
	int x = 3, y = 8;//main 函数中的局部变量 
	swap();//调用swap函数,但无参数传输
	printf("%d,%d\n",x, y);//根据局部优先的原则,会先使用局部变量
	return 0;
}

2

正确答案:B

本题B选项考查转义字符,有如下格式,但八进制数字是0-7,没有8,故B选项中'\8'是错误的

\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X

\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0

3

正确答案:ACD

因为#define是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的类型,b的类型是int,故此次b只是int类型。

而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。

4.

正确答案: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

5.

正确答案:AB

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

6.

这道题的解法其实将每个月的天数列举出来,然后根据当前月份向前累加满月的天数,然后再加上当前月所在的天数。最终考虑平闰年的 2 月份区别是否增加一天。

其中需要注意的是平年和闰年的判断,而且是闰年的月份大于 2 的时候,也就是 2 月走完,总天数才能加 1 (比如 2000年2月18日 ,虽然是闰年,但是 2月 都没走完那是不能加上闰年多出的一天的).

解法1:

c 复制代码
int main() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    int count = 0;
    int i = 0;
    for (i = 1; i < b; i++)//每走过一个月就把这个月的天数加上
        //i<b 是因为只有这个月走完了才能将这个月的天数加起来
        //比如1月1日,那么就不能把1月的天数加上,1<1 ,不满足,则不会进入
    {
        if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
            count += 31;
        if (i == 4 || i == 6 || i == 9 || i == 11)
            count += 30;
        if (i == 2)
            count += 28;
    }
    count += c;//将剩余的天数加起来
    if (b > 2)//在为闰年,且月数超过二(2月走完)单位时候才会加一天
    {
        if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)//闰年判定条件
            count++;
    }

    printf("%d\n", count);

    return 0;
}

解法2:

c 复制代码
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)) {
        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);
    }
    return 0;
}
相关推荐
pzx_0012 分钟前
【内积】内积计算公式及物理意义
数据结构·python·opencv·算法·线性回归
元气代码鼠4 分钟前
C语言程序设计(进阶)
c语言·开发语言·算法
十雾九晴丶38 分钟前
攻防世界--->gametime
算法
做完作业了1 小时前
【C语言】预处理详解
c语言·预处理
Aurora_th1 小时前
树与图的深度优先遍历(dfs的图论中的应用)
c++·算法·深度优先·图论·dfs·树的直径
aqymnkstkw2 小时前
2024年【电气试验】考试题库及电气试验模拟试题
大数据·c语言·人工智能·嵌入式硬件·安全
马剑威(威哥爱编程)3 小时前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization
算法萌新——13 小时前
洛谷P2240——贪心算法
算法·贪心算法
湖北二师的咸鱼4 小时前
专题:二叉树递归遍历
算法·深度优先
重生之我要进大厂4 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode