作者|我是奔跑的键盘侠
来源|奔跑的键盘侠(ID:runningkeyboardhero)
转载请联系授权(微信ID:ctwott)
搬砖继续……
今天做个了结,试卷B来一个大终结。
年级只是代表题型,难度不做区分。规则:
一年级:选择题;
二年级:填空题;
三年级:阅读题;
四年级: 编程题。
一、选择题
第6题,简单说明:系统有默认的转化规则,就是从精度底的转化为精度高的,避免计算时精度的丢失。coding一下:
来一个%d,输出试试,系统自动提示是double……
第7题if中的a=b是赋值语句,不是比较是否相等,赋值结果默认为True。
第9题有点难度,反正我是做错了,coding一下:
#include <stdio.h>
int main(){ int a=3; int b=2; int c=1; printf("%d\n",a>b==c);}
编译运行输出结果是1。也就是说先算了a>b结果true也就是1,然后1和c比较是否相等,结果相等。
再切回原题,想必答案就一目了然了。
第13题这题整型表达式也是ok的。coding了一个:
#include <stdio.h>
int main(){ int x=3,y=1; int arr[10]={1,2,3,4,5,6,7,8,}; printf("%d\n",arr[x+2*y]); return 0;}
上面的代码是可以正常输出数组元素的。
第14题这个属于C语言的规则类的题目,第二维是3,2x3=6,3x3=9,题目给的数组元素是7个,所以至少是3x3,也就是第一维是3喽。默认按最节省空间的逻辑来给定一维的大小。
如果非要coding一下,可以用下面代码:
#include <stdio.h>
int main(){ int a[][3]={1,2,3,4,5,6,7}; printf("%lu\n",sizeof(a)/sizeof(a[0][0]));}
直接就知道数组a共有多少个元素,然后就知道是怎么排列的了。
第17题因为定义的是一个局部变量,局部变量只在定义该局部变量的函数体内有效,函数执行完成后其内存就会被释放
第19题B选项应该写成ptr2=&k。
第22题,简要说明,*p指向data,也就是data[0],然后再指向x,y,对应的是1和10;指针++后指向data[1],再指向x,y,对应的就是2和20了。题目是指向的data[0]的y和data[1]的x。
第23题,最后一句通常的用法是x=*p++,就是将*p的值赋给x,然后指针往后移动一位,并未涉及到2009+1的运算。
第24题,A选项有点干扰,如果写成*p+4,应该也ok的。
二、程序填空题
填空题难度不大,就不一一coding测试了,感兴趣的童鞋可以自己试验。
三、程序阅读题
输入一个正整数,倒序输出。比如输入1203,输出结果3021。
四、编程题
#include <stdio.h>
int main(){ int i,j,k;/*i,j,k分别代表要取的红白黑球个数*/ int cnt=0; for(i=0;i<=3;i++){ for(j=0;j<=3;j++){ for(k=0;k<=6;k++){ if(i+j+k==8){ cnt++; printf("cnt%d:i=%d,j=%d,k=%d\n",cnt,i,j,k); } } } } printf("共有%d种不同的颜色搭配\n",cnt);}
总结一下,题目都是考试基础的语法,所以按最直白的方式去写答案即可,虽然看着怎么会这么直白,但事实如此。其中第12行可省略,上面代码已测试过。如果题目一遍,要保证每种至少一个球,那i,j,k初始值改成1即可。
关于这题,可以揉成一段代码,不用函数,但是我并不建议这么写。
还是给整成两个函数来算,简单清晰。阅卷人一看就懂,即使中间出现一个小差错,也就扣个一两分。如果揉成一段,出个小差错,给阅卷人的感觉会是画虎不成反类犬,多扣一分也没人知道。
#include <stdio.h>int fact(int x);int main(){ int n; int sum=0; printf("请输入正整数n的值:\n"); scanf("%d",&n); for(int i=1;i<=n;i++){ sum+=fact(i); } printf("sum=%d\n",sum); return 0;}int fact(int x){ int fact=1; for(int i=1;i<=x;i++){ fact*=i; } return fact;}
万一不慎脑短路,硬是不知道n的阶乘怎么表示,那求和总会吧,把求和的部分写好,求阶乘的写个开头,这题差不多就能得一半分
#include <stdio.h>
int main(){ char x[100]; printf("请输入一个字符串(长度须在100以内):\n"); gets(x); char a[100],b[100],c[100]; int cntb=0; int cntc=0; for(int i=0;i<100;i++){ a[i]=x[i]; if(x[i]>='0'&&x[i]<='9'){ b[cntb++]=x[i]; }else c[cntc++]=x[i]; } printf("数组a:%s\n",a); printf("数组b:%s\n",b); printf("数组c:%s\n",c); return 0;}
数组字符串的题目,对业余新手来讲,是有点难度的,scanf一个带空格的字符串真是难倒我了,后来网上翻到一个gets,命令行编译时warning不安全
所幸运行结果正常,大概貌似没什么问题吧?这就先贴这么个答案吧。
注意一点,数组a虽说跟x一模一样,但是依旧要用遍历的形式来赋值,而不能直接等号赋值。
有小伙伴说B卷会难一点,没太多感觉,不知道是我水平提高了,还是真的差不多?
终于,可以收尾了!今年的C语言要告一段落了!!!
写贴不易,大家且看且珍惜吧!