【C语言好题系列二】

一. 选择题

  1. 执行下面程序,正确的输出是(C)
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函数调用时用的是全局变量,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系;输出语句这里,考虑局部优先的原则,故选C

2. 以下不正确的定义语句是(B)
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

3. test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】(ACD)

#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是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的类型,b的类型是int,故此次b只是int类型。而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。
所以 a,c,d才是指针类型 **
4. 若给定条件表达式 (M)?(a++):(a–) ,则其中表达式 M(C)
A: 和(M0)等价
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

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

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的地址给scanf,故CD错误,AB正确

二. 编程题

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

    • 用返回一个整数列表来代替打印
    • n 为正整数

示例:
输入:1
返回值:[1,2,3,4,5,6,7,8,9]
解析:这里首先要清楚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. 根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。
  • 输入描述:输入一行,每行空格分割,分别是年,月,日。
  • 输出描述:输出是这一年的第几天

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

#include <stdio.h>

int main()
 {
    int year = 0, month = 0, day = 0;
    int sum = 0;
    scanf("%d %d %d", &year, &month, &day);
    int arr[12] ={31,28,31,30,31,30,31,31,30,31,30,31};
    int i = 0;
    if((year%400==0)||(year%100!=0&&year%4==0))
    {
        arr[1]+=1;
    }
    for(i=0;i<month-1;i++)
    {
        sum+=arr[i];
    }
    sum+=day;
    printf("%d",sum);
    return 0;
}

小编会持续分享编程好题的详细解题步骤,希望大家给个小小的点赞,谢谢了,谢谢,谢谢兄弟们

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维生素C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值