2011年秋江苏省计算机c语言笔试答案及讲解.doc_第1页
2011年秋江苏省计算机c语言笔试答案及讲解.doc_第2页
2011年秋江苏省计算机c语言笔试答案及讲解.doc_第3页
2011年秋江苏省计算机c语言笔试答案及讲解.doc_第4页
2011年秋江苏省计算机c语言笔试答案及讲解.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二部分 C语言程序设计 一选择题21. 某程序需要使用一个代表常数3.14的符号常量P,以下定义中正确的是 D A. #define P 3.14 ; B. #define P(3.14)C#define P=3.14 ; D. #define P 3.14宏定义指令以“#define”开头,宏定义有两种使用方式:简单宏定义,带参数的宏定义。1,简单宏定义 格式: #define 宏名 表达式 例,#define PI 3.1415926532,带参数的宏定义 格式: #define 宏名 (形式参数)宏串表达式 例,#define Sqrt(x) (x)*(x) 注意:这里只是简单的替换,x要在必要时加括号k=Sqrt(2+3) /编译时替换成(2+3)*(2+3),如果不加括号则替换成(2+3*2+3)22. 下列四个选项中,属于C语言关键字的是 C A. Float B. single C. double D. real 标示符的命名规则:标示符只能是字母(AZ, a z)、数字(09)、下划线(-)组成的符号,并且第一个字符必须是字母或下划线C语言共有32个关键字,这些关键字如下:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while23. 已知某编译系统中signed int 类型数据的长度是16位,该类型数据的最大值是 A A. 32767 B. 32768 C. 127 D. 65535此题signed int 类型数据长度是16位,所以最大值=215-1=32767(有符号的)24. 以下关于if语句和switch语句的叙述中错误的是 D A. if语句和switch语句都可以实现算法的选择结构 B. if语句和switch语句都能实现多路(两路以上)选择 C. if语句可以嵌套使用 D. switch语句不可以嵌套使用switch语句多路功能 都能用if语句实现嵌套处理,但程序冗长。25. 已有声明“char *s1=”China”,s210,*s3=”Nanjing”,*s4;”,以下字符串赋值语句在执行时可能出现错误的是 B A. strcpy(s3,s1); B. strcpy(s4,s1);strcpy(s2,s1); D. strcpy(s2,s3);字符串数组变量在定义和初始化时,s210形式可以在初始化不赋值;但*s4形式初始化不赋值,在采用strcpy(s4,s1);时在编译时会产生“local variable s4 used without having been initialized”警告,无法得出结果;而非编译错误(要给*s4一个初始的地址指向)。26. 已有声明“int x=0,*p=&x;”,以下语句中有语法错误的是 A A. printf(”%d”,*x); B. printf(”%d”,&x); C. printf(”%d”,*p); D. printf(”%d”,x);变量x的值可以有如下形式输出:x *p ;&x指输出变量x所在的地址;*x错误的原因是x是变量,不是指针!27. 以下叙述中错误的是 C A. 在函数外可以声明变量 B. 变量声明的位置决定了该变量名的使用范围 C. 函数调用时在函数内声明的变量所得到的值将无法保存到该函数的下一次调用 D. 在函数外声明的变量,其值可以保存到该程序运行结束在被调用函数中含static声明的变量,具有两大特征:不初始化赋值,自动取0;每次函数调用开始,该项变量的起始值为上一次最终运行的结果。28. 已有声明“int t=1;”,则执行“printf(”%d”,(t+5,t+));”时输出结果是 A A.1 B.6 C.2 D.7逗号表达式expr1,expr2,expr3,exprn 逗号表达式的执行过程是先计算expr1的值,在计算expr2的值然后是expr3的值。最后计算exprn 的值,整个逗号表达式的值是exprn的值29 已有声明“static char *p=”Apple”;”,则执行语句“puts(p+2);”时输出为 D A. Apple B. Cpple C. pple D. ple第一,指针*p指向的是A的地址p+2则是第二个p的位置,put()是从括号内的地址开始输出到最后0,所以输出结果是ple ; 第二,对于增量指令“+”,若单独出现,“+”的前后位置不影响值,但是若作为表达式出现,比若说:a=t+;a的值等于t的值,为1,但是a=+t的是为“+t”的值,应该为2!30. 以下选项均欲声明变量p,其中错误的是 C A. typedef struct Person B. struct Person char name 20; char name 20; int age; int age; Per; ; Per p; struct Person p; Cstruct D. struct char name 20; char name 20; int age; int age; Per; p; Per p; /这种方式只能在定义结构体类型时定义变量,在程序其他地方不能再定义结构体变量,它是没有结构体标记名的。结构体变量定义方式:1、定义结构体后,在结构体类型后添加结构体变量名(此时可以赋初值)例如选项A、B;2、在说明结构体类型的同时,说明结构体变量;3、省略结构体标记名,直接定义结构体变量,例如D选项;第三种定义,只能使用定义时的变量,不得在别处在此定义变量,故选项C错误。按照结构体定义规定C.定义中Per是结构体变量,不是结构体变量类型,不准对其他变量定义!二填空题(30分)基本概念(5分)1. C语言源程序中用十六进制表示整型常数必须以_(1)_0x_开头。 十六进制为0x, 八进制的是以0开头2. 如果一个循环结构的循环体至少要执行一遍,则最适合描述该循环结构的语句是_(2)_ do-while_语句 For语句、while语句,都是先判断执行条件,再执行,故可能一次也不执行,但是,do-while语句为先无条件执行一次,再判断执行条件(其判断语句在最后);3. 若要声明一个无符号整型变量x,则正确的声明形式是“_(3)_unsigned_int x;”。 有符号类型为signzed,也为默认数据类型,可以不写,但是无符号数据类型为unsigned,若需要则必须说明功能上主要区别在与数据表达范围的不同,signzed型存在一位符号位4. 已有声明“int n=12;double a;”,则执行语句“a=n/=5;”之后,a的值为_(4)_2.000000_。 要理解C语言运算的“左结合性”,还是“右结合性”。符合右结合性的有:赋值运算符、自加或自减运算符。这里等于,先运算n=n/2;后n赋为2,后来以2赋给双精度变量a,所以其值为2.0000005. 若有数据类型定义如下: union Afloat a1;float a2; 则表达式sizeof(union A)的值为_(5)_这是一个联合体变量类型,联合体的所有内容都存放在同一个地址空间内,所以其空间大小应为最大成员所占的空间大小,而float数据类型占空间一般大小为4的字节阅读程序(13分)6. 以下程序运行时,输出到屏幕的结果是_(6)_ Yellow _ #include enum colorBLACK,YELLOW,BLUE=3,GREEN,WHITE; void main() char *colorname=“Black”,“Yellow”,“Blue”,“Green”,“White”; enum color c1=GREEN,c2=BLUE; printf(“%s”,colornamec1-c2); 这是一个枚举类型,枚举类型的每一个枚举常量可以为用户定义,若不指定,默认从0开始编号,即BLACK=0,YELLOW=1,BLUE=3,GREEN=4,WHITE=5,并且这些数字可以参与运算,那么c1-c2=4-3=1,而colorname的指针指向的是字符串型数组的首地址,同时也是Black存储空间的首地址,colorname指向地址偏移一个存储单位,将指向第二个字符串(联想数组的性质),也就是Yellow,故输出为Yellow。7. 下列程序运行时,输出到屏幕的结果是_(7)_10_ #include void main() int a=0,b=1,d=10; if(a) if(b) d=20; else d=30; printf(”%dn”,d);首先,if条件判断语句先判断括号内表达式是否为零,不为零则进入if语句执行,否则跳过if语句,执行后面语句;第二,if语句的配对原则是else和最近未配对的if进行配对,故本题后面的if-else均为第一个if的内容,同时,a=0,说明第一个if将不被执行,直接执行printf语句,故输出结果为10*8. 下列程序运行时,输出到屏幕的结果中第一行是_(8)_1_,第二行是_(9)_2_。 #include void fun(int a,int *b) a+; /a+ 是先运算在+,而+a是先+再运算 (*b)+; /指针b指向的数加上1 void main() int a 2=1,1; fun(a0,&a1); printf(”%dn%d”,a0,a1); /必须通过地址调用才能返回变量值 函数调用时形参与实参的结合原则:只有共用地址才能返回变量值。a0无法返回;而a1采用实参&a1、形参*b,达到共用地址,调用结束返回运算结果。调用a0后并没有改变数组a里面的内容。9. 以下程序运行时,输出到屏幕的结果中第一行是_(10)_0 2 3_,第二行是_(11)_2 3 5_,第三行是_(12)_7 11 13_。 #include #include void main() int a100=0,i,j,k; for(i=1;i100;i+) /i是从1开始的 ai=i+1; printf(”%4d%4d %4d n”,a0,a1,a2); for(j=1;j100;j+) if(aj!=0) for(k=j+1;k100;k+) if(ak%aj=0) ak=0; /求素数 for(k=1,i=0;k100;k+) if(ak!=0) printf(”%4d”,ak); i+; if(i%3=0)printf(”n”); /每行输出三个数 数组a的赋初值,首元素为0和其余为2到100,所以第一行为0 2 3,第一个大的for循环实际上是艾拉托斯特尼筛法求素数的算法程序,具体思想见书126页;第二个大的for循环就是输出所有的素数,并且每行三个元素;由此可知道,第二行为2,3,5;第三行为7,11,13;10. 以下程序运行时,输出到屏幕的结果中第一行是_(13)_3_,第二行是_(14)_1_. #include #include int fun(int a,int b) int n;while(a!=b) n=abs(a-b); /abs()求一个数的绝对值 a=(ab)?b:a; /取a和b两个数中的最小值 b=nreturn a;void main() printf(”%dn%dn”,fun(9,15),fun(9,5); 最好办法用列表法一步一步写下来函数fun第一次调用,为获得a=b,经历了3次才满足a=b,即n、a、b均为3时返回;第二次调用函数fun,经历了5次才满足a=b,即n、a、b均为1时返回,实际上,这就是一种gcd(最大公约数)算法,由此可以直接写出结果。11. 以下程序运行时,输出到屏幕的结果的第一行是_(15)_6_,第二行是_(16)_6_. #include int fun1(int p,int n) int i,s=0; for(i=0;in;i+) s+=pi; /s+=pi即s=s+pi return s; int fun2(int *s,int n) if(n=1) return *s; else return (*s)+fun2(s+1,n-1); void main() int a=1,2,3,4,5; Printf(”%dn%d”,fun1(a,3).fun2(a,3); 此题函数fun1调用比较简单;函数fun2是较复杂的递归调用。函数递归调用时要记住每一步调用时的实参值,返回时逐步脱出,用表达式运算获得。但是,可以看出,这实际上就是:若n开始为1,直接输出s指向的内容,但是若n大于1,将s指向的地址不断向后偏移,直到n=1为止,然后将指向内容与自身相加;由此可见,当n初值为3,s初始指向a0的地址时,运算后s将指向a2,12. 以下程序运行时,输出到屏幕的结果的第一行是_(17)_3_,第二行是_(18)_Itis_. #include #include int fun(char str) int i,j,len; len=srlen(str); for(i=0,j=0;stri;i+) if(stri=A&stri=a&stri=z) strj+=stri; /判断字符是不是大写小写字母,如果是则重新赋给str,也就是实现输出字母的功能 strj=0; return len-j; 函数功能是:判断字符串中所有字母的个数并记录字母,当循环结束,注意“strj=0;”的位置;记录非字母元素的个数 void main() char ss 80=”It23is!”; Int n; n=fun(ss); printf(“%dn%sn”,n,ss); 13. 以下程序中judge函数的功能是判断x指向的int类型数组(长度为n)中各元素之间的逻辑关系。若n个元素的值均相等则输出“all elements are same”;若n个元素的值无序则输出“no order”;若n个元素的值按升序排列则输出“ascend”;若n个元素按降序排列则输出“descend”。 #include void judge(_int x_),int n) /这样的题就找主函数是怎样调用的以及题目的要求 int f,i=0; while(in-1&xi=xi+1) i+; if(i=_n-1_) /判断该while函数是否执行到n-1,如果是则表示所有的xi=xi+1均成立,即各元素都相等 printf(“n all elements are same”) return; if(xixi+1)f=1; else f=0 for(;ixi+1 !f&_xi,=,=优先级为6; =,!=优先级为7;&优先级为11高于优先级为12的|;!的优先级是2 printf(“n no order”); return; if(_f=1_)printf(“n ascend”); else printf(“n descend”); void main() int a5=1,2,3,4,5,b5=5,4,3,2,1,c5=2,2,2,2,2,d5=2,2,2,2,2; judge(a,5); judge(b,5); judge(c,5); judge(d,5); 此题程序长,但比较简单此题难填的是(20)和(22)(21)要理解全部元素都相等判断后,最后出循环时的i值。(22)只要看条件判断if(xixi+1) f=1;语句知道f=1是升序。14. 下列程序的功能是判断一个n阶对称方阵是否双对称矩阵。4阶对称矩阵是指aij =aji 1-12-3-1032230-1-32-11 (1i4,1j4)。4阶双对称矩阵是指一个4阶对称矩阵的第1列与第4列对换,第2列与第3列对换后仍然是对称矩阵。函数issym(int mN,int n)的功能是判断二维数组m中存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论