选择题一
已知函数的原型是: int fun(char b[10], int *a); 设定义: char c[10];int d; ,正确的调用语句是( ) A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d);
【答案】A
【分析】
数组:在传参时我们需要注意参数类型,对于数组而言,传参时我们可以直接省略[]和里面的数字
指针:当传参时为指针时,我们就需要注意了,指针int*a表示传入参数为整形类型的指针地址,因此表示整形地址则需&和整形类型的元素d
选择题二
请问下列表达式哪些会被编译器禁止【多选】( )
int a = 248, b = 4; int const *c = 21; const int *d = &a; int *const e = &b; int const * const f = &a;
A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f
【答案】ABCD
【分析】这道题注意是考察const的理解
int const c = 21因为const在c的左边,因此为常量指针,即c是不能改变的,所以c=32错误,但是只是*c不能改变,c是可以改变的,比如c=&a…
const int d = &a因为const在d的左边,因此d不能改变,这个和上边的错误一样
int const e = &b const只在e的左边,因此只有e不能被改变,而e是可以改变的,因此e=&a错误,但是e=248是正确的
int const * const f = &a,我们可以看到有两个const,一个在f左边,另一个在f左边,因此不管是f还是f都是不能被改变的,f=0x321f是16进制,表示的是地址,反正不管是f还是*f改变都是错的
选择题三
以下程序的输出结果为( )
#include <stdio.h> int i; void prt() { for (i = 5; i < 8; i++) printf("%c", '*'); printf("\t"); } int main() { for (i = 5; i <= 8; i++) prt(); return 0; }
A: *** B: *** *** *** *** C: *** *** D: * * *
【答案】A
【分析】注意int i是全局变量,因此生命周期和主函数一样,只有当程序销毁了才会消失
在prt循环后i=8,跳出prt后,主函数循环中i=8是满足i<=8,然后i++使i=9,由于i=9在prt中不满足循环条件i<8直接跳出循环,最终值输出了***
注意不是prt循环三次跳出后在主函数中再循环,然后又进prt中循环,这样的结果是B,是因为没有理解到全局变量的含义。
\t的含义约等于TAB键,可以理解为按了几次空格键
下面是我用调试对关键过程的截图
选择题四
下面代码段的输出是( )
int main() { int a=3; printf("%d\n",(a+=a-=a*a)); return 0; }
A: -6 B: 12 C: 0 D: -12
【答案】D
【分析】这种题我觉得就和我之前写的一篇博客讲的一样操作符详解下(非常详细)有点花里胡哨,根本没必要这样来写,如果分步骤来写的话清晰明了
下面是对这道题的分析
这种算法是从右向左进行的,因此先看a-=a*a,这样算出的结果a=-6,再看a+=a,这样算出结果是-12。
选择题五
下列不能实现死循环的是( ) A: while(1){} B: for(;1;){} C: do{}while(1); D: for(;0;){}
【答案】 D
【分析】对于while来说要想实现死循环,只需让while()里面的内容为真,并且while里面的语句没有break就可以实现死循环
而for中(;x;)x为1则为真死循环,为0则为假,不循环。
编程题一
首先输入要输入的整数个数 n ,然后输入 n 个整数。 输出为 n 个整数中负数的个数,和所有正整数的平均值 结果保留一位小数。 注意: 0 即不是正整数,也不是负数,不计入计算 本题有多组输入用例。 输入描述:首先输入一个正整数 n ,然后输入 n 个整数 输出描述:输出负数的个数,和所有正整数的平均值
【题目分析】题目要求输出负数的个数和正整数的平均值,并且要排除输入0的情况,因此需要用到if语句将这几种情况分开
我们假设sum=0为统计输入负数的个数,average=0为正整数的平均值,x为输入的数字,当输入负数是sum++,而输入正整数时average+x
0这种情况就有点麻烦,我们还需要设一个y=0,当输入0时y–,并且将x赋值为1,这样x有0变到1,y由0变到-1,这样输入0是x+y就可以抵消,并且y也就统计出了输入0的个数,之后我们就可以在计算平均值时加上y,就相当于减去输入0的个数,值得注意的是负数的个数也需要减去(我因为没有减所以一直没做出来)
【代码】
#include<stdio.h> int main() { int n, sum = 0, x, y = 0; double average = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &x); if (x == 0) { x = 1; average += x;/*因为这样做x+y=0, 这样就可以抵消, 并且n最后也可以减掉x=0的个数*/ y--; } else if (x > 0) { average += x;//x为正数 } else { sum++;//x为负数 } } if (n + y == 0) average = 0.0;//全部为0的情况 else { average = average + y;/*不全部为0的情况 +y后就把x=0变成x=1的都减掉*/ n = n + y-sum;//减去x=0的个数 average = average / n;//算平均值 } printf("%d %.1f", sum, average); return 0; }