题目
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) ;
二、编程题
T1:JZ17 打印从1到最大的n位数
题目链接:打印从1到最大的n位数_牛客题霸_牛客网
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
1. 用返回一个整数列表来代替打印
2. n 为正整数
示例1
输入:1
返回值:[1,2,3,4,5,6,7,8,9]
T2:HJ73 计算日期到天数转换
题目链接:计算日期到天数转换_牛客题霸_牛客网
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n),空间复杂度:O(1);
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例1
输入:2012 12 31
输出:366
示例2
输入:1982 3 4
输出:63
题解:
一、选择题
1、【答案解析】
答案解析:
正确答案: C
swap 函数调用时用的是全局变量,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系;输出语句这里,考虑局部优先的原则,故选C
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 是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。所以 a , c , d 才是指针类型
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 正确
二、编程题
1 、【答案解析】:
这里首先要清楚 n 位数中最大的数字,实际上就是 10^n - 1 。 比如:
这个清楚后动态申请空间,将数值填入就可以了,需要注意的是数组下标从 0 开始,而数值从 1 开始
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 最大位数 * @return int整型一维数组 * @return int* returnSize 返回数组行数 * * C语言声明定义全局变量请加上static,防止重复定义 */ static int arr[100000000] = { 0 }; int* printNumbers(int n, int* returnSize ) { // write code here int i=1; scanf("%d", &n); int param=0; param=pow(10,n)-1; for(i=1;i<=param;i++) { arr[i-1]=i; } *returnSize=i-1; return arr; }
2、【答案解析】
这道题简单解法其实将每个月的天数枚举出来,然后根据当前月份向前累加满月的天数,然后再加上当前月所在的天 数。最终考虑平闰年的 2 月份区别是否增加一天。 其中需要注意的是平年和闰年的判断,而且是闰年的月份大于 2 的时候,也就是 2 月走完,总天数才能加 1 (比如 2000年2月18日 ,虽然是闰年,但是 2月 都没走完那是不能加上闰年多出的一天的).
#include <stdio.h> int main() { int month_day[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int year, month, day; scanf("%d %d %d", &year, &month, &day); if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { month_day[1]++; } int res = 0; for (int i = 0; i < month - 1; i++) { res += month_day[i]; } res += day; printf("%d", res); return 0; }
文章知识点与官方知识档案匹配,可进一步学习相关知识