目录
牛客网题号: JZ17 打印从1到最大的n位数】【难度:入门】
【牛客网题号: HJ73 计算日期到天数转换】【难度:简单】
一、选择题
考点一:全局变量与局部变量的打印顺序
执行下面程序,正确的输出是( )
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函数用的是全局的x和y,但是不会发生交换 注意:printf函数在进行输出的时候是就近原则的,所以输出的x和y是main函数里面的,而不是全局的x和y。输出语句这里,考虑局部优先的原则,故选C
考点二:转义字符
以下不正确的定义语句是( )
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
\xhh hh表示1到2位十六进制数 如:\x30
拓展:
考点三:宏定义和typedef的应用
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
正确答案:ACD
因为#define是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的 类型,b的类型是int,故此次b只是int类型。而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。
所以 a,c,d才是指针类型。
考点四:三目操作符
若给定条件表达式 (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++; 符合题意,选C
考点五:scanf的应用
有如下定义语句,则正确的输入语句是( )
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正确
二、编程题【全面深度解析】
牛客网题号: JZ17
打印从1到最大的n位数】【难度:入门】
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
1. 用返回一个整数列表来代替打印
2. n 为正整数,0 < n <= 5
示例1
输入:1
复制返回值:[1,2,3,4,5,6,7,8,9]
题目传送门:OJ链接
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 最大位数
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
static int a[100010];
int* printNumbers(int n, int* returnSize ) {
int k = 1;
int i = 0;
for (int i = 0; i < n; i++)
{
k *= 10;
}
for (i = 1; i < k; i++)
{
a[i - 1] = i;
}
*returnSize = --i;
return a;
}
【牛客网题号: HJ73
计算日期到天数转换】【难度:简单】
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(1)\O(1)
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例1
输入:2012 12 31
输出:366
题目传送门:OJ链接
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d %d %d", &year, &month, &day);
int every_month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
every_month[1]++;
}
int datecount = 0;
for (int i = 0; i < month - 1; i++)
{
datecount += every_month[i];
}
datecount += day;
printf("%d", datecount);
return 0;
}