目录
选择题
1、执行下面程序,正确的输出是
cpp
int x=5,y=7;
void swap(int x, int y)
{
int z;
z=x;
x=y;
y=z;
}
int main()
{
int x=3,y=8;
swap(int x, int y);
printf("%d,%d\n",x, y);
return 0;
}
- A 5, 7
- B 7, 5
- C 3, 8
- D 8, 3
答案:C
💡
解析:
本题涉及到传值调用和传址调用的问题,在本题中,swap
函数的形参只是接收到了x
和y
空间的值,而不是x
和y
所在空间的地址,所以在swap
函数中交换x
和y
的数据不影响main
函数中的x
和y
,最后输出依旧是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
💡
解析:
在八进制表示中,最大的数值为7,没有8的存在,故'\8'
不存在,注意D是正确答案
3、(多选题)test.c文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为
cpp
#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
为int*
,在代码预处理阶段会被替换为int*
,每一个*
只对紧随着的变量有效,即int* a, b
,但是用typedef
更名int*
为int_ptr
时并不存在这个问题 ,tydedef
本质是将每一个变量都初始化为更名的类型的变量,即int_ptr c
与int_ptr d
,要使b
都成为指针类型,则写成int *a, *b;
4、 若给定条件表达式(M)?(a++):(a--)
,则其中表达式 M
- A 和
(M==0)
等价 - 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++
5、(多选题)有如下定义语句,则正确的输入语句是
cpp
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[0]
,和c
的地址值是一样的,而%s
占位符期望一个指向字符数组的指针作为参数,以便将输入的字符串存储到该数组中,程序的效果相同,也没错,但同时也必须把变量b
的地址给scanf
编程题
打印从1到最大的n位数
题目链接:打印从1到最大的n位数_牛客题霸_牛客网 (nowcoder.com)
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
- 用返回一个整数列表来代替打印
- n 为正整数,0 < n <= 5
思路解析:
本题的关键就是解决位权,当输入3时最大打印999,故可以知道3可以用于作为以10为底数的位权,那么此时最大数即为小于103的数值,依次生成数值存入数组中返回即可
参考代码
cpp
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 最大位数
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
int* printNumbers(int n, int* returnSize ) {
int num = (int)pow(10, n);
int* p = (int*)malloc(num * sizeof(int));
for (int i = 1; i < num; i++) {
p[i - 1] = i;
}
*returnSize = num - 1;
return p;
}
计算日期到天数转换
题目链接:计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com)
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
思路解析:
本题需要处理好闰年和非闰年的天数,注意是否要包括某个月整月的天数,其余直接加和即可
参考代码
cpp
#include <stdio.h>
int main() {
int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day = 0;
int month = 0;
int year = 0;
int sum = 0;
scanf("%d%d%d", &year, &month, &day);
//判断是否是闰年
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
//是闰年,一年共366天,二月29天
for (int i = 1; i <= month; i++) {
sum += days[i - 1];
}
sum += day;
//当输入的月份大于2月份时,需要算二月份的总数
if (month > 2) {
sum++;
}
} else {
//不是闰年,一年共365天,二月28天
for (int i = 1; i <= month; i++) {//month = 4
sum += days[i - 1];
}
sum += day;
}
printf("%d", sum);
return 0;
}