这里是knous,假期已经过去,作业也写的差不多了,这里就写几个专栏分享一下,难度不高,适合新手
day 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
这道题非常简单,进去函数,我们创建了变量x y,随后我们调用函数swap,但在传值的时候我们什么也没传过去,那我们进入函数内部,这里又定义了几个变量,这里我们完全不用管它定义了什么,这是一个变量的作用域的相关知识,因为这里在函数内部创建的变量,所以一旦出了函数外部就自动销毁,最后打印出来的自然是c,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} ;
又是移到很简单的题,我们在创建数组的时候一定要注意:在创建数组的时候要么括号里面什么都
不加,它自动根据你初始化的内容创建大小,要么固定大小创建数组,一定不能在括号里面写表达式,所以这题选d
3 、 test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】(
)
#define INT_PTR int*
typedef int* int_ptr ;
INT_PTR a , b ;
int_ptr c , d ;
这题也不难,#define我们知道是将后面的内容定义为前面的内容,而typedef是该类型定义为一个别名,所以不符合我们题目要求,cd考的是int prt,这里可以理解为是进行一次宏替换,替换完应该是:int* a,int*c,所以这题选择acd
4 、 若给定条件表达式 (M)?(a++):(a -- ) ,则其中表达式 M ( )
A: 和 (M==0) 等价 B: 和 (M==1) 等价 C: 和 (M!=0) 等价 D: 和 (M!=1) 等价
我们先要判断这个表达式所表现的意思,先判断m,若m为假,则a++,若m为真,则a--,那么若以满足等价条件,则m取0的时候要为假,m取非零的时候要为真,这么看下来,也只有c可以选。
5 、有如下定义语句,则正确的输入语句是【多选】( )
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
二、编程题
输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3 ,则打印出 1 、 2 、 3 一直到最大的 3 位数
999 。
用返回一个整数列表来代替打印
n 为正整数
这是牛客网的一道题,链接是: 打印从1到最大的n位数_牛客题霸_牛客网 (nowcoder.com)
这道题不难,这里我教一个很简单暴力的办法,就是直接10*它输入的次方,再for循环打印,事例如下:
#include<stdio.h>
int main()
{
int i = 0;
scanf_s("%d", &i);
int k = 1;
while (i--)
{
k *= 10;
}
for (i = 1; i<k; i++)
{
printf("%d ", i);
}
system("pause");
return 0;
}
2 、根据输入的日期,计算是这一年的第几天。输入保证年份为 4 位数且日期合法。
输入描述:输入一行,每行空格分割,分别是年,月,日。
输出描述:输出是这一年的第几天
这题老朋友了,先判断这是否为闰年,其次将每个月的天数加上去,代码如下:
#include<stdio.h>
int main()
{
int day, month, year,i,time=0;
int arr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
while (~scanf_s("%d %d %d", &year, &month, &day))
{
if (month > 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
{
for (i = 0; i < month - 1; i++)
{
time = arr[i] + time;
}
printf("%d", time + 1 + day);
}
else
{
for (i = 0; i < month - 1; i++)
{
time = arr[i] + time;
}
printf("%d", time + day);
}
}
return 0;
}
day 2
1 、以下程序段的输出结果是( )
#include<stdio.h>
int main ()
{
char s [] = "\\123456\123456\t" ;
printf ( "%d\n" , strlen ( s ));
return 0 ;
}
A: 12 B: 13 C: 16 D: 以上都不对
这里我们要注意的是转义符号,\\ = \,\123 = {,\t = tap,所以我们仔细数的话是只有12个,选a
2 、若有以下程序,则运行后的输出结果是( )
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main ()
{
printf ( "%d\n" , NUM );
return 0 ;
}
A: 4 B: 8 C: 9 D: 6
这里就是很简单的计算题,没什么难度,经过计算,我们得出答案:8,选b
3 、如下函数的 f(1) 的值为( )
int f ( int n )
{
static int i = 1 ;
if ( n >= 5 )
return n ;
n = n + i ;
i ++ ;
return f ( n );
}
A: 5 B: 6 C: 7 D: 8
这道题是一道递归题,看上去可能稍有难度,但只有我们画出图形即可轻易解决,答案选c
4 、下面 3 段程序代码的效果一样吗( )
int b ;
( 1 ) const int * a = & b ;
( 2 ) int const * a = & b ;
( 3 ) int * const a = & b ;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样
这里主要考验的const的修饰成分,const在*左边的时候,则指针指向的值不能被修改,在*右边时,则指针的指向不能被修改,这是左定值,右定向,abconst都在*左边,所以选b
5、对于下面的说法,正确的是( )
A: 对于 struct X{short s ; int i ; char c ; } , sizeof(X) 等于 sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个 double 变量 a ,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!" ; 和 char a[14] ; a = "Hello, world!" ; 的效果相同
D: 以上说法都不对
a选项,我们之前专栏就写过结构体存在的数组对齐概念,b选项,我们在判断浮点数的时候不能直接进行 == 判断,应该考虑的是差值,c选项数组名是首元素地址,既然是地址则不可轻易赋值,估abc都错,选d
二、编程题
1 、验证尼科彻斯定理,即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入一个正整数 m (
m≤100 ) ,将 m 的立方写成 m 个连续奇数之和的形式输出。
注意:本题含有多组输入数据。
输入描述:输入一个 int 整数
输出描述:输出分解后的 string
示例:
输入: 6
输出: 31+33+35+37+39+41
牛客网链接: 尼科彻斯定理_牛客题霸_牛客网 (nowcoder.com)
这里,我们仔细观察右边相加的首元素,是不是:1*1-1+(1+2)的规律,假设是n,则是:n*n-(n-1) +(n+2 ),所以我们可以写出如下代码:
#include <stdio.h>
int main()
{
int m;
while(scanf("%d", &m) != EOF)
{
int k = m * m - (m - 1);
for(int i = 0; i < m-1 ; i++)
{
printf("%d+", k);
k += 2;
}
printf("%d\n", k);
}
return 0;
}
为什么我们不将最后的k也放在循环里面,是因为放进去的话就会多打印+号,这一点要注意
2 、等差数列 2 , 5 , 8 , 11 , 14 , ... 。(从 2 开始的 3 为公差的等差数列),求等差数列前 n 项和。
注意:本题有多组输入
输入描述:输入一个正整数 n 。
输出描述:输出一个相加后的整数。
这里我拿代码讲快一点;
#include<stdio.h>
int fun(int n)
{
return 3*n -1;
}
int main()
{
int n;
while(EOF != scanf("%d",&n))
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum += fun(i);
}
printf("%d\n",sum);
}
return 0;
}
可以看到我这里是用了递归来做,因为我看到示例如下:
示例1
输入:2 输出:7 说明:2+5=7
输入2的时候答案为7,我们可不可以将这个等差拿一个表达式表达,再将结果加起来呢?
1*3-1=2
2*3-1=5
3*3-1=8
发现了规律,我们就以此写代码,也是一道很简单的题。
明天更2-3