已知平行四边形abcd ad a以a={2,1'-1}b={1'-2'1}为两边,求它对角线的夹角

C语言程序设计习题试题集2(含答案)_甜梦文库
C语言程序设计习题试题集2(含答案)
一、单项选择题【1.1】以下不正确的 C 语言标识符是____。 A) int B) a_1_2 C) ab1exe D) _x 【1.2】以下是正确的 C 语言标识符是____。 A) #define B) _123 C) %d D) \n 【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是 。 ??? A) print B) i\am C) Pxq D) str_l ??? _3d one_half My-&book Cpp ??? oodb start$it line# pow ??? aBc 3pai His.age while 【1.4】下面各选项组中,均是 C 语言关键字的组是 。 A) auto,enum,include B) switch,typedef,continue C) signed,union,scanf D) if,struct,type 【1.5】下列不属于 C 语言关键字的是 。 A) default B) register C) enum D) external 【1.6】C 语言程序从 main()函数开始执行,所以这个函数要写在____。 A) 程序文件的开始 B) 程序文件的最后 C) 它所调用的函数的前面 D) 程序文件的任何位置 【1.7】下列关于 C 语言的叙述错误的是____ A) 大写字母和小写字母的意义相同 B) 不同类型的变量可以在一个表达式中 C) 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D) 同一个运算符号在不同的场合可以有不同的含义 【1.8】在 C 语言中,错误的 int 类型的常数是 。 A) 32768 B) 0 C) 037 D) 0xAF 【1.9】执行语句 printf(&%x&,-1);屏幕显示____。 A) -1 B) 1 C) -ffff D) ffff 【1.10】已知 long i=32768;执行语句 printf(&%d&,i);屏幕显示____。 A) -1 B) -32768 C) 1 D) 32768 【1.11】已知 long i=65539;执行语句 printf(&%d&,i);屏幕显示____。 A) 65539 B) -3 C) 3 D) 程序不能执行 【1.12】在C语言中,整数-8 在内存中的存储形式是 。 A) 11 1000 B) 00 10001 C) 00 1000 D) 11 0111 【1.13】C语言中字符型(char)数据在内存中的存储形式是____。 A) 原码 B) 补码 C) 反码 D) ASCII 码 【1.14】将字符 g 赋给字符变量 c,正确的表达式是 。 A) c=\147 B) c=&\147& C) c='\147' D) c='0147' 【1.15】下列转义字符中错误的一个是____。 A) '\000' B) '\0014' C) '\x111' D) '\2' 【1.16】将空格符赋给字符变量 c,正确的赋值语句是____。 A) c='\0' B) c=NULL C) c=0 D) c=32 【1.17】已知:char a='\70';则变量 a 中 。 A) 包含 1 个字符 B) 包含 2 个字符 C) 包含 3 个字符 D) 说明非法 【1.18】字符串&\&EOF\n=-\61\&&的长度是____。 A) 8 B) 9 C) 14 D) 非法字符串 【1.19】字符串&&的长度是____。 A) 0 B) 1 C) 2 D) 非法字符串 【1.20】已知:char a;int b;float c;double d;执行语句&c=a+b+c+d;&后,变量 c 的数据类型 是 。 A) int B) char C) float D) double 【1.21】温度华氏和摄氏的关系是: C=-(F-32)。已知:float C,F;由华氏求摄氏的正确的赋值表达 式是____。 A) C=5/9(F-32) B) C=5*(F-32)/9 C) C=5/9*(F-32) D) 三个表达式都正确 【1.22】逗号表达式&(a=3*5,a*4),a+15&的值是____。 A) 15 B) 60 C) 30 D) 不确定 【1.23】如果 int a=1,b=2,c=3,d=4;则条件表达式&a&b?a:c&d?c:d&的值是____。 A) 1 B) 2 C) 3 D) 4 【1.24】为求出 s=10!的值,则变量 s 的类型应当为 。 A) int B) unsiged C) long D) 以上三种类型均可 【1.25】已知 int i=10;表达式&20-0&=i&=9&的值是____。 A) 0 B) 1 C) 19 D) 202 【1.26】已知 int x=1,y;执行下述语句后变量 x 的值是____。 y=++x&5&&++x&10;A) 1 B) 2 C) 3 D) 4【1.27】为判断字符变量 c 的值不是数字也不是字母时,应采用下述表达式____。 A) c&=48||c&=57&&c&=65||c&=90&&c&=97||c&=122 B) !(c&=48||c&=57&&c&=65||c&=90&&c&=97||c&=122) C) c&=48&&c&=57||c&=65&&c&=90||c&=97&&c&=122 D) !(c&=48&&c&=57||c&=65&&c&=90||c&=97&&c&=122) 【1.28】已知 int a[3][2]={3,2,1};则表达式&a[0][0]/a[0][1]/a[0][2]&的值是____。 A) 0.166667 B) 1 C) 0 D) 错误的表达式 【1.29】已知 int x=1,y=1,z=1;表达式&x+++y+++z++&的值是____。 A) 3 B) 4 C) 5 D) 表达式错误 【1.30】用十进制表示表达式&12|012&的值是____。 A) 1 B) 0 C) 12 D) 14 【1.31】已知以下程序段: int a=3,b=4; a=a^b; b=b^a; a=a^b; 则执行以上语句后 a 和 b 的值分别是____。 A) a=3,b=4 B) a=4,b=3 C) a=4,b=4 D) a=3,b=3 【1.32】在位运算中,操作数每右移一位,其结果相当于____。 A) 操作数乘以 2 B) 操作数除以 2 C) 操作数除以 16 D) 操作数乘以 16 【1.33】已知 char a=222;执行语句 a=a&052;后,变量 a 的值是____。 A) 222 B) 10 C) 244 D) 254 【1.34】已知二进制数 a 是 ,如果想通过整型变量 b 与 a 做异或运算,使变量 a 的高 4 位取反,低 4 位不变,则二进制数 b 的值应是____。 A)
【1.35】已知 int a=15,执行语句 a=a&&2 以后,变量 a 的值是____。 A) 20 B) 40 C) 60 D) 80 【1.36】已知 int x=5,y=5,z=5;执行语句 x%=y+z;后,x 的值是____。 A) 0 B) 1 C) 5 D) 6 【1.37】使用语句 scanf(&x=%f,y=%f&,&x,&y);输入变量 x、y 的值(□代表空格) ,正确的输入 是____。A) 1.25,2.4 B) 1.25□2.4 C) x=1.25,y=2.4 D) x=1.25□y=2.43 【1.38】下列循环语句中有语法错误的是____。 A) while(x=y) 5; B) while(0) ; C) do 2;while(x==b); D) do x++ while(x==10); 【1.39】已知 int x=(1,2,3,4);变量 x 的值是____。A) 1 B) 2 C) 3 D) 4 【1.40】表达式 sizeof(double)是 。 A) 函数调用 B) double 型表达式 C) int 型表达式 D) 非法表达式 【1.41】执行语句 printf(&2:%d,&,printf(&1:%d,&,scanf(&%d&,&x)));以后的输出结果是____。 A) 2:1,1:1, B) 1:1,2:1, C) 2:4,1:1 D) 1:1,2:4, 【1.42】已知:int x,y;double z;则以下语句中错误的函数调用是 。 A) scanf (&%d,%lx,%le&,&x,&y,&z); B) scanf (&%2d*%d%lf&,&x,&y,&z); C) scanf (&%x%*d%o&,&x,&y); D) scanf (&%x%o%6.2f&,&x,&y,&z); 【1.43】与条件表达式&(n)?(c++):(c--)&中的表达式(n)等价的表达式是____。 A) (n==0) B) (n==1) C) (n!=0) D) (n!=1) 【1.44】已知 int i=1,j=0;执行下面语句后 j 的值是____。 while(i) switch(i) { case 1: i+=1;j++;break; case 2: i+=2;j++;break; case 3: i+=3;j++;break; default: i--;j++;break; } A) 1 B) 2 C) 3 D) 死循环 【1.45】求取满足式 12+22+32+ …… +n2 ?1000 的 n,正确的语句是____。 A) for(i=1,s=0;(s=s+i*i)&=1000;n=i++) ; B) for(i=1,s=0;(s=s+i*i)&=1000;n=++i) ; C) for(i=1,s=0;(s=s+i*++i)&=1000;n=i) ; D) for(i=1,s=0;(s=s+i*i++)&=1000;n=i) ; 【1.46】下面的 for 语句 。 for(x=0,y=10;(y&0)&&(x&4);x++,y-- ) ; A) 是无限循环 B) 循环次数不定 C) 循环执行 4 次 D) 循环执行 3 次 【1.47】已知 int i=1; 执行语句 while (i++&4) ;后,变量 i 的值为____。 A) 3 B) 4 C) 5 D) 6 【1.48】已知 int x=12,y=3;执行下述程序后,变量 x 的值是____。 do { x/=y--;4 }while(x&y); A) 1 B) 2 C) 3 D) 程序运行有错误 【1.49】已知 char a[][20]={&Beijing&,&shanghai&,&tianjin&,&chongqing&};语句 printf(&%c&,a[30]); 的输出是____。 A) &空格& B) n C) 不定 D) 数组定义有误 【1.50】若用数组名作为函数调用时的实参,则实际上传递给形参的是 。 A) 数组首地址 B) 数组的第一个元素值 C) 数组中全部元素的值 D) 数组元素的个数 【1.51】对二维数组的正确说明是____。 A) int a[][]={1,2,3,4,5,6}; B) int a[2][]={1,2,3,4,5,6}; C) int a[][3]={1,2,3,4,5,6}; D) int a[2,3]={1,2,3,4,5,6}; 【1.52】对字符数组 s 赋值,不合法的一个是____。 A) char s[]=&Beijing&; B) char s[20]={&beijing&}; C) char s[20];s=&Beijing&; D) char s[20]={'B','e','i','j','i','n','g'}; 【1.53】对字符数组 str 赋初值,str 不能作为字符串使用的一个是____。 A) char str[]=&shanghai&; B) char str[]={&shanghai&}; C) char str[9]={'s','h','a','n','g','h','a','i'}; D) char str[8]={ 's','h','a','n','g','h','a','i'}; 【1.54】对函数形参的说明有错误的是____。 A) int a(float x[],int n) B) int a(float *x,int n) C) int a(float x[10],int n) D) int a(float x,int n) 【1.55】如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变 量的存储类型应该被说明为____。 A) 静态变量 B) 动态变量 C) 外部变量 D) 内部变量 【1.56】在一个 C 源程序文件中,?若要定义一个只允许在该源文件中所有函数使用的变量,则该 变量需要使用的存储类别是 。 A) extern B) register C) auto D) static 【1.57】在 C 语言中,函数的数据类型是指____。 A) 函数返回值的数据类型 B) 函数形参的数据类型 C) 调用该函数时的实参的数据类型 D) 任意指定的数据类型 【1.58】已知如下定义的函数: fun1(a) { printf(&\n%d&,a);5 } 则该函数的数据类型是____。 A) 与参数 a 的类型相同 B) void 型 C) 没有返回值 D) 无法确定 【1.59】定义一个函数实现交换 x 和 y 的值,并将结果正确返回。能够实现此功能的是____。 A) swapa(int x,int y) B) swapb(int *x,int *y) { int temp; { int temp; temp=x;x=y;y=temp; temp=x;x=y;y=temp; }} C) swapc(int *x,int *y) D) swapd(int *x,int *y) { int temp; { int *temp; temp=*x;*x=*y;*y=temp; temp=x;x=y;y=temp; }} 【1.60】求一个角的正弦函数值的平方。能够实现此功能的函数是____。 A) sqofsina(x) float x; { return(sin(x)*sin(x)); } B) double sqofsinb(x) float x; { return(sin((double)x)*sin((double)x)); } C) double sqofsinc(x) { return(((sin(x)*sin(x)); } D) sqofsind(x) float x; { return(double(sin(x)*sin(x))); 【1.61】一个函数内有数据类型说明语句如下: double x,y,z(10); 关于此语句的解释,下面说法正确的是____。 A) z 是一个数组,它有 10 个元素。 B) z 是一个函数,小括号内的 10 是它的实参的值。 C) z 是一个变量,小括号内的 10 是它的初值。 D) 语句中有错误。 【1.62】已知函数定义如下: float fun1(int x,int y) { float z; z=(float)x/y; return(z); }6 主调函数中有 int a=1,b=0;可以正确调用此函数的语句是____。 A) printf(&%f&,fun1(a,b)); B) printf(&%f&,fun1(&a,&b)); C) printf(&%f&,fun1(*a,*b)); D) 调用时发生错误【1.63】下面函数的功能是____。 a(s1,s2) char s1[],s2[]; { while(s2++=s1++) ; } A) 字符串比较 B) 字符串复制 C) 字符串连接 D) 字符串反向 【1.64】在下列结论中,只有一个是错误的,它是 。 A) C语言允许函数的递归调用 B) C语言中的 continue 语句,可以通过改变程序的结构而省略 C) 有些递归程序是不能用非递归算法实现的 D) C 语言中不允许在函数中再定义函数 【1.65】已知:int a, *y=&a;则下列函数调用中错误的是 。 A) scanf(&%d&, &a); B) scanf(&%d&, y); C) printf(&%d&, a); D) printf(&%d&, y); 【1.66】说明语句&int (*p)( );&的含义是 。 A) p 是一个指向一维数组的指针变量 B) p 是指针变量,指向一个整型数据 C) p 是一个指向函数的指针,该函数的返回值是一个整型 D) 以上都不对 【1.67】设有说明 int (*p)[4];其中的标识符 p 是 。 A) 4 个指向整型变量的指针变量 B) 指向 4 个整型变量的函数指针 C) 一个指向具有 4 个整型元素的一维数组的指针 D) 具有 4 个指向整型变量的指针元素的一维指针数组 【1.68】已知:char s[10], *p=s,则在下列语句中,错误的语句是 。 A) p=s+5; B) s=p+s; C) s[2]=p[4]; D) *p=s[0]; 【1.69】已知:char s[100];int i;则引用数组元素的错误的形式是 。 A) s[i+10] B) *(s+i) C) *(i+s) D) *((s++)+i) 【1.70】已知:char s[6], *ps=s;则正确的赋值语句是 。 A) s=&12345&; B) *s=&12345&; C) ps=&12345&; D) *ps=&12345&; 【1.71】已知:char a[3][10]={&BeiJing&,&ShangHai&,&TianJin&}, *pa=a ;不能正确显示字符串 &ShangHai&的语句是 。 A) printf(&%s&,a+1); B) printf(&%s&,*(a+1));7 C) printf(&%s&,*a+1); D) printf(&%s&,&a[1][0]); 【1.72】已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*ptr)[3]=a,*p=a[0]; 则以下能够正确表示数组元素 a[1][2]的表达式是 。 A) *(*(a+1)+2) B) *(*(p+5)) C) (*ptr+1)+2 D) *((ptr+1)[2]) 【1.73】已知:int a[ ]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a;则值为 3 的表达式是 。 A) p+=2,*(p++) B) p+=2,*++p C) p+=2,*p++ D) p+=2,++*p 【1.74】已知:int a[]={1,2,3,4}, y, *p=a;则执行语句 y = (*++p)--;之后, 数组 a 各元素的值变为 ______。 A) 0,1,3,4 B) 1,1,3,4 C) 1,2,2,4 D) 1,2,3,3 变量 y 的值是____。 A) 1 B) 2 C) 3 D) 4 【1.75】已知:int a[ ]={1,3,5,7}, y *p= a;为使变量 y 的值为 3,下列语句正确的是____。 A) y=++*p++; B) y=++(*p++); C) y=(++*p)++; D) y=(*++p)++; 【1.76】已知:int x[ ]={ 1,3,5,7,9,11 },*ptr=x;则能够正确引用数组元素的语句是 。 A) x B) *(ptr--) C) x[6] D) *(--ptr) 【1.77】函数的功能是交换变量 x 和 y 中的值,且通过正确调用返回交换的结果。能正确执行此 功能的函数是 。 A) funa (int *x, int *y) B) funb (int x, int y) { int *p; { int t; p=x;*x=*y;*y=*p; t=x;x=y;y=t; }} C) func (int *x, int *y) D) func (int *x, int *y) { *x=*y;*y=*x; { *x=*x+*y;*y=*x-*y;*x=*x-*y; }} 【1.78】有定义如下: struct sk { int a; float b; }data ,*p; 如果 p=&data;则对于结构变量 data 的成员 a 的正确引用是____。 A)(*).data.a B) (*p).a C) p-&data.a D) p.data.a 【1.79】已知: struct st { int n; struct st *next; };8 static struct st a[3]={1,&a[1],3,&a[2],5,&a[0]},*p; 如果下述语句的显示是 2,则对 p 的赋值是____。 printf(&%d&,++(p-&next-&n)); A) p=&a[0]; B) p=&a[1]; C) p=&a[2]; D) p=&a[3]; 【1.80】已知: struct person { char name[10]; int age; }class[10]={&LiMing&,29,&ZhangHong&,21,&WangFang&,22}; 下述表达式中,值为 72 的一个是____。 A) class[0]-&age + class[1]-&age+ class[2]-&age B) class[1].name[5] C) person[1].name[5] D) clase-&name[5] 【1.81】已知: struct { int i; char c; float a; }test; 则 sizeof(test)的值是 。 A) 4 B) 5 C) 6 D) 7 【1.82】已知: union { int i; char c; float a; }test; 则 sizeof(test)的值是 。 A) 4 B) 5 C) 6 D) 7 【1.83】已知: union u_type { int i; char ch; float a; }temp; 现在执行&temp.i=266;printf(&%d&,temp.ch)&的结果是 。 A) 266 B) 256 C) 10 D) 1 【1.84】若有以下程序段: struct dent9 { int n; int *m; }; int a=1,b=2,c=3; struct dent s[3] = { {101,&a},{102,&b},{103,&c} }; struct dent *p=s; 则以下表达式中值为 2 的是 。 A) (p++)-&m B) *(p++)-&m C) (*p).m D) *(++p)-&m 【1.85】若有以下说明语句,则对结构变量 pup 中 sex 域的正确引用是 。 struct pupil { char name[20]; int sex; }pup,*p; p=&pup; A) p.pup.sex B) p-&pup.sex C) (*p).pup.sex D) (*p).sex 【1.86】以下对结构变量 stul 中成员 age 的非法引用是 。 struct student { int age; int num; }stu1,*p; p=&stu1; A) stu1.age B) student.age C) p-&age D) (*p).age 【1.87】若有以下定义和语句: union data { int i; char c; float f; }a; int n; 则以下语句正确的是 。A) a=5; B) a={2,'a',1.2}; C) printf(&%d\n&,a); D) n=a; 【1.88】已知: struct sk { int a; int age; }date,*p; 如果要使指针 p 指向 data 中的成员 a,正确的赋值语句是____。 A) p = (struct sk *)&data.a; B) p = (struct sk *)data.a; C) p = &data.a; D) *p = data.a; 【1.89】已知 enum week {sun,mon,tue,wed,thu,fri,sat}day;则正确的赋值语句是____。 A) sun=0; C) san=day; D) sun=mon; D) day=sun;10 【1.90】已知 enum color {red,yellow=2,blue,white,black}ren;执行下述语句的输出结果是____。 printf(&%d&,ren=white); A) 0 B) 1 C) 3 D) 4【1.91】已知 enum name{zhao=1,qian,sun,li}man;执行下述程序段后的输出是____。 man=0; switch(man) { case 0: printf(&People\n&); case 1: printf(&Man\n&); case 2: printf(&Woman\n&); default: printf(&Error\n&); } A) People B) Man C) Woman D)Error【1.92】下述关于枚举类型名的定义中,正确的是____。 A) enem a={ one,two,three }; B) enem a { one=9,two=-1,three }; C) enem a={&one&,&two&,&three&}; D) enem a {&one&,&two&,&three&};【1.93】C语言中标准输入文件 stdin 是指 。 A) 键盘 B) 显示器 C) 鼠标 D) 硬盘【1.94】要打开一个已存在的非空文件&file&用于修改,选择正确的语句____。 A) fp=fopen(&file&, &r&); B) fp=fopen(&file&, &a+&); C) fp=fopen(&file&, &w&); D) fp=fopen('file&, &r+&);【1.95】当顺利执行了文件关闭操作时,fclose 函数的返回值是 。 A) -1 B) TRUE C) 0 D) 1【1.96】fscanf 函数的正确调用形式是 。 A) fscanf (文件指针, 格式字符串, 输出列表); B) fscanf (格式字符串, 输出列表, 文件指针); C) fscanf (格式字符串, 文件指针, 输出列表); D) fscanf (文件指针, 格式字符串, 输入列表);【1.97】使用 fgetc 函数,则打开文件的方式必须是 。 A) 只写 B) 追加 C) 读或读/写 D) 参考答案 B 和 C 都正确11 【1.98】已知宏定义 #define N 3 #define Y(n) ((N+1)*n) 执行语句 z=2*(N+Y(5+1));后,变量 z 的值是____。 A) 42 B) 48 C) 52 D) 出错【1.99】已知宏定义 #define SQ(x) x*x,执行语句 printf(&%d&,10/SQ(3));后的输出结果是____。 A) 1 B) 3 C) 9 D) 10【1.100】已知宏定义如下: #define PR printf #define NL &\n& #define D &%d& #define D1 DNL 若程序中的语句是 PR(D1,a);经预处理后展开为____。 A) printf(%d\n,a); B) printf(&%d\n&,a); C) printf(&%d&&\n&,a); D) 原语句错误【单项选择题参考答案】 【1.1】答案: A 注释:int 是 C 语言的关键字 【1.2】答案: B 【1.3】答案:A 【1.4】答案:B 注释:include 是预处理命令;scanf 是函数名;type 不是 C 语言的关键字。 【1.5】答案:D 【1.6】答案:D 【1.7】答案:A 【1.8】答案:A 注释:int 型表示整数的范围是-3。 【1.9】答案:D 注释:整型常量-1 在计算机中表示为补码 11 1111,用十六进制显示这个数时,最左 边的 1 不会被解释为符号位,而是与右边其它位共同转换为十六进制数。 【1.10】答案:B 注释:长整型数 32768 在计算机内的表示是 00 0000,以一般整型进行输出时,此数 恰是-32768 的补码。 【1.11】答案:C 注释:长整型数 65539 在计算机内的表示是 00 ,以一般整型进行输出时, 仅将右侧 16 位二进制数转换为十进制数。 【1.12】答案:A12 注释:C 语言中,int 型的负数是采用补码表示的。 【1.13】答案:D 【1.14】答案:C 注释:变量 c 是字符型,可用字符常量为它赋值。字符常量必须用单引号括起来,所以 B 是错 误的;在单引号或双引号内的反斜线'\'用于表示转义字符,A 选项在无引号时使用反斜线是错误 的;C 选项单引号内出现反斜线表示它与后面的数字组成一个转义字符;单引号只允许括起一个 字符,D 选项在单引号内出现 4 个字符,是错误的。 【1.15】答案:C 【1.16】答案:D 注释:空字符和空格符是不同的两个字符,空格符的 ASCII 码值是 32,空字符的 ASCII 值是 0。 【1.17】答案:A 【1.18】答案:B 【1.19】答案:A 【1.20】答案:C 【1.21】答案:B 注释:单纯从 C 语言语法来说,选项 B、C 都是正确的,但是选项 C 中第一个运算的两个对象 都是整型常数,其结果也是整型数 0,最后的运算结果也就是 0 了。 【1.22】答案:C 【1.23】答案:A 注释:将条件表达式增加一个括号,此式变为 a&b?a:(c&d?c:d),它的运算顺序就清楚了。由于条 件运算符的结合性是从右向左,所以括号可以省略。它的运算顺序是先算出右边的条件表达式 &c&d?c:d&的值,然后求条件表达式 a&b?a:3 的值。 【1.24】答案:C 【1.25】答案:B 【1.26】答案:B 注释:当通过一个运算对象即可决定逻辑运算&&的结果时,则对另一个运算对象不做处理。 【1.27】答案:D 【1.28】答案:B 注释:数组元素在内存中按行排列,此数组的前 3 个元素的值分别是 3、2、1,表达式中虽然数 组下标的写法似乎每行有 3 个元素,和定义时的 3 行 2 列不一致,但是 C 语言引用数组元素时 是根据数组的首地址和给出的下标进行运算决定元素的地址。题中表达式引用了数组前 3 个元 素。 【1.29】答案: A 【1.30】答案:D 【1.31】答案:B 【1.32】答案:B 【1.33】答案:B 【1.34】答案:A 【1.35】答案:C 【1.36】答案:C 【1.37】答案:C 【1.38】答案:D 【1.39】答案:D 【1.40】答案:C 1.41】答案:D13 注释:scanf 函数返回值是输入数据的个数,printf 函数的返回值是输出的字符个数。 【1.42】答案:D 【1.43】答案:C 注释:在 C 语言中, 经常用一个变量来作为逻辑表达式,其含义就是:当变量的值不为 0 时关 系成立。 【1.44】答案:D 注释:break 语句仅可跳出 switch 语句,不会跳出 while 循环,这是一个死循环。 【1.45】答案:A 【1.46】答案:C 【1.47】答案:C 【1.48】答案:D 注释:当除数 y 为 0 时,程序发生溢出错误。 【1.49】答案:C 【1.50】答案:A 【1.51】答案:C 【1.52】答案:C 注释:答案 C 的赋值号左侧是数组 s 的首地址,是一个常量,赋值号右侧是一个字符串常量,不 可能将一个字符串常量赋给一个地址常量。 【1.53】答案:D 注释:D 选项缺少字符串结束标志。 【1.54】答案:C 注释:此处函数形参是一个指针变量,接受实参的地址,而不是一个数组。 【1.55】答案:A 【1.56】答案:D 注释:这里首先要明确一些基本概念。在 C 语言中,程序与文件是不同的概念,一个程序可以 由一个文件组成,也可以由多个文件组成;一个文件中又可以包含多个函数;函数是构成 C 程 序的基本单位。 变量的作用域因变量的存储类型不同而不同。auto 和 register 类型的变量的作用域是说明变量的 当前函数;外部变量的作用域是整个程序,即外部变量的作用域可以跨越多个文件;内部静态变 量(定义在一个函数内部的 static 型的变量)的作用域是当前函数,外部静态变量(定义在函数 外面的 static 型的变量)的作用域是当前文件,即可以跨越同一文件中的不同函数。 【1.57】答案:A 【1.58】答案:A 注释:它和参数 a 一样,数据类型说明被省略,按照 C 语言的规定,在这种情况下,表示它们 是 int 型。 【1.59】答案:C 注释:函数 swapa 是值传递,函数的执行结果不能返回;函数 swapb 中变量 temp 不是指针变量, 所以它不能接受地址量,用指针变量 x 为它赋值是不对的;函数 swap 中虽然指针变量交换了地 址,即它们的指向的目标变量进行了交换,但是目标变量并没有行值的交换。 【1.60】答案:B 【1.61】答案:D 【1.62】答案:D 注释:主调函数中 b=0,在执行 fun1 函数里的除法时发生溢出错误。 【1.63】答案:B 【1.64】答案:C14 【1.65】答案:D 注释:在答案 D 中,正确的函数调用应当是:printf(&%d&, *y)。 【1.66】答案:C 注释:要注意与说明语句&int (*p)[ ];&的区别。说明语句&int (*p)[ ];&说明的是一个指向数组的 指针。 【1.67】答案:C 注释:题干中由于*和 p 被小括号括起,所以 p 应被解释为一个指针,而后的下标运算符[]说明 所指向的对象是一个有 4 个 int 型元素的一维数组;如果是 int (*p)(),则是指向函数的指针。对于 int *p[4],则根据运算符的优先级,先考虑 p 和[]运算符的关系,所以它就是一个指针数组了。 【1.68】答案:B 注释:选项 B 有两处错误,一是数组名是常量,不能出现的赋值好的左侧,二是指针变量只能 和整数做加,不能和作为地址常量的数组名相加。 【1.69】答案:D 注释:s 作为数组名是地址常量,而 s++是 s=s+1,C 语言不允许对常量进行赋值。 【1.70】答案:C 【1.71】答案:C 注释:a 是二维数组名,a+1 中的 1 不是 1 个字节,而是数组的&一行&,即 10 个字节,所以 a+1 是第二个字符串的首地址,A 选项正确。在 C 编译系统中对二维数组名可这样理解(注意,这里 仅是理解):a 指向一个一维数组,故(a+1)是指向 a[1]的,*(a+1)就是取 a[1]的值,它保存第二个 字符串&ShangHai&的首地址,所以选项 B 也正确。*a 是第一个字符串的首地址,加 1 是第一个 字符串中第二个字符的地址,选项 C 的输出是&beiJing&。选项 D 中的&a[1][0]是对第二个字符串 的第一个字符做取地址运算,得到该地址就是字符串&ShangHai&的首地址。注意,对于二维数组 来说,做一次*或[]运算的结果仍是地址量,做两次才是取数值。 【1.72】答案:A 注释:p 是一个一级指针,选项 B 中对它进行了两次*运算是错误的。ptr 是一个指向一维数组的 指针,它所指向的数组有三个元素,对于这样一个指针,对它进行两次**运算才能取出地址单元 中所存的数据,C 选项中*ptr 表示数组第一行的首地址,该地址是一维数组的地址,+3 表示加 上三个它所指向的数据类型的长度,所以(*ptr+1)+2 是数组中数值 4 的地址。根据以上分析,选 项 D 对 ptr 进行了两次地址操作(*和[]) ,所以结果应是数据,但是它加 1 后指向数组第二行, 根据后面[]中 2 它的地址增加两个一维数组的长度,就指向数组的最后一行,再做*运算就是数 10,即 a[3][0]。 【1.73】答案:A 【1.74】答案:B B 【1.75】答案:D 【1.76】答案:B 【1.77】答案:D 注释:答案 D 是另一种交换两个变量值的算法。 【1.78】答案:B 【1.79】答案:C 注释:使用 C 对 p 进行赋值,则 p-&next 是 a[0]的地址,引用其成员 n 再做前增 1 运算,结果就 是 2。 【1.80】答案:B 【1.81】答案:D 【1.82】答案:A 【1.83】答案:C15 注释:联合变量 temp 的成员是占用同一存储单元,它的长度是 4 个字节。266 的二进制表示是 ,存放在存储单元的低端两个字节,如下图: 高字节
低字节 0 0 0 0 1 0 1 0 引用 temp.ch 进行输出,只取最低的第一个字节。 【1.84】答案:D 注释:由于结构指针指向了结构数组的 0 号元素,所以表达式(p++)-&m 的含义是先取出 m(变 量 a 的地址) ,然后指针 p 加 1。表达式*(p++)-&m 的含义是先取出 m 的内容(变量 a 的值) ,然 后指针 p 再加 1。表达式(*p).m 的含义是取出 m(变量 a 的地址) 。表达式*(++p)-&m 的含义是先 将指针 p 加 1,然后再取 m 的内容(变量 b 的值) 。 【1.85】答案:D 【1.86】答案:B 【1.87】答案:C 【1.88】答案:A 【1.89】答案:D 【1.90】答案:D 【1.91】答案:A 【1.92】答案:B 【1.93】答案:A 【1.94】答案:D 注释:函数 fopen 中的第二参数是打开模式,&r&模式是只读方式,不能写文件;&a+&模式是读/ 追加方式,允许从文件中读出数据,但所有写入的数据均自动加在文件的末尾;&w&模式是写方 式, 允许按照用户的要求将数据写入文件的指定位置, 但打开文件后, 首先要将文件的内容清空。 &r+&模式是读/写方式,不但允许读文件,而且允许按照用户的要求将数据写入文件的指定位置, 且在打开文件后,不会将文件的内容清空。本题的要求是&修改&文件的内容,因此只能选择答案 D。 【1.95】答案:C 【1.96】答案:D 【1.97】答案:C 【1.98】答案:B 注释:语句 z=2*(N+Y(5+1)引用了两个宏定义。C 语言是区分字母大小的,第二个宏定义中的 N 直接用 3 替换,用 5+1 替换 n,则有 z=2*(3+(3+1)*5+1);结果是 48。注意对于带参数的宏亦是 直接的文本替换,此例中 n 用 5+1 去替换,结果是(N+1)*5+1,而不是(N+1)*(5+1)。 【1.99】答案:C 注释:宏替换后的结果是 printf(&%d&,10/3*3)。 【1.100】答案:C二、 阅读程序题导读:学会阅读程序对于初学者来说很重要,一方面可以巩固所学的语法知识,另一方面通过阅 读别人写好的程序来打开自己的思路,就所谓见多识广。读者通过阅读理解程序,从给出的四个 备选参考答案中,选择程序的正确输出。如果选择有误,就要认真分析原因,是概念方面的错误 还是对程序逻辑理解不对,从而加深对语法规则的理解,提高程序设计能力。程序设计语言是开16 发程序的一个工具, 学习语言的目的是为了编写程序来解决实际问题, 所以特别提倡通过实际上 机来检验备选答案,增强动手能力。习题基本上是按照教材的章节来安排的,读者可以根据学习 的进度选择部分习题。 【2.1】以下程序的输出结果是 。 main( ) { float a; a=1/; printf(&%g&,a); } A) 0.00000e+00 B) 0.0 C) 1.00000e-07 D) 0【2.2】下面程序的输出结果是____。 #include &stdio.h& main( ) { int x=10; { int x=20; printf (&%d,&, x); } printf(&%d\n&, x); } A) 10,20 B) 20,10 C) 10,10 D) 20,20【2.3】以下程序的输出结果是____。 main() { unsigned int n; int i=-521; n=i; printf(&n=%u\n&,n); } A) n=-521 B) n=521 C) n=65015 D) n=【2.4】以下程序的输出结果是 。 main( ) { int x=10, y=10; printf(&%d %d\n&, xDD, DDy); } A) 10 10 B) 9 9 C) 9 10 D) 10 9【2.5】以下程序的输出结果是____。 main() { int n=1; printf(&%d %d %d\n&,n,n++,n--); }17 A) 1 1 1 B) 1 0 1 C) 1 1 0 D) 1 2 1【2.6】以下程序的输出结果是____。 main() { int x=0x02ff,y=0x0ff00; printf(&%d\n&,(x&y)&&4|0x005f); } A) 127 B) 255 C) 128 D) 1【2.7】以下程序的输出结果是____。 main() { int a=1; char c='a'; float f=2.0; printf(&%d\n&,(!(a==0),f!=0&&c=='A')); } A) 0 B) 1【2.8】下面程序的输出结果是____。 main() { int a=1,i=a+1; do { a++ ; }while( !~i++ & 3); printf(&%d\n&,a); } A) 1 B) 2 C) 3 D) 4【2.9】下面程序的输出结果是____。 main() { int a=111; a=a^00; printf(&%d,%o\n&,a,a); } A) 111,157 B) 0,0 C) 20,24 D) 7,7【2.10】下面程序的输出结果是____。 main() { char s[12]= &a book&; printf(&%.4s&,s);18 } A) a book! B) a book!&四个空格》 C) a bo D) 格式描述错误,输出不确定【2.11】下面程序的输出结果是____。 main() { int a,b; scanf(&%2d%3d&,&a,&b); printf(&a=%d b=%d\n&,a,b); } A) a=12 b=34 B) a=123 b=45 C) a=12 b=345 D) 语句右错误【2.12】以下程序段的输出结果是 。 int a=10,b=50,c=30; if(a&b) a=b; b=c; c=a; printf(&a=%d b=%d c=%d\n&,a,b,c); A) a=10 b=50 c=10 B) a=10 b=30 c=10 C) a=50 b=30 c=10 D) a=50 b=30 c=50【2.13】以下程序的输出结果是 。 main() { int a=0,b=1,c=0,d=20; if(a) d=d-10; else if(!b) if(!c) d=15; else d=25; printf(&d=%d\n&,d); } A) d=10 B) d=15 C) d=20 D) d=25【2.14】下面程序的输出结果为 。 main() { int a=1,b=0; switch(a) { case 1: switch (b) { case 0: printf(&**0**&); break; case 1: printf(&**1**&); break; } case 2: printf(&**2**&); break; }19 } A) **0** B) **0****2** C) **0****1****2** D) 有语法错误【2.15】以下程序的输出结果是 。 main() { char *s=&&; int v1=0,v2=0,v3=0,v4=0,k; for(k=0;s[k];k++) switch(s[k]) { case '1': v1++; case '3': v3++; case '2': v2++; default: v4++; } printf(&v1=%d, v2=%d, v3=%d, v4=%d\n&,v1,v2,v3,v4); } A) v1=4,v2=2,v3=1,v4=1 B) v1=4,v2=9,v3=3,v4=1 C) v1=5,v2=8,v3=6,v4=1 D) v1=4,v2=7,v3=5,v4=8【2.16】下面程序的输出是 。 main() { int x=1,y=0,a=0,b=0; switch(x) { case 1: switch(y) { case 0: a++;break; case 1: b++;break; } case 2: a++;b++;break; } printf(&a=%d,b=%d\n&,a,b); } A) a=2,b=1 B) a=1,b=1 C) a=1,b=0 D) a=2,b=2【2.17】下面程序的输出是____。 main() { int num=0; while(num&=2) { num++; printf(&%d\n&,num); } } A) 1 B) 1 C) 1 D) 1 22220 33 4【2.18】下面程序的输出结果是____。 main() { int a=1,b=0; do { switch(a) { case 1: b=1;break; case 2: b=2;break; default : b=0; } b=a+b; }while(!b); printf(&a=%d,b=%d&,a,b); } A) 1,2 B) 2,1 C) 1,1 D) 2,2【2.19】从键盘上输入&446755&时,下面程序的输出是____。 #include &stdio.h& main() { int c; while((c=getchar())!='\n') switch(c -'2') { case 0: case 1: putchar(c+4); case 2: putchar(c+4);break; case 3: putchar(c+3); default: putchar(c+2);break; } printf(&\n&); } A) 888988 B) 668966 C)
D) 【2.20】下面程序的输出结果是____。 main() { int k=0; char c='A'; do { switch(c++) { case 'A': k++;break; case 'B': k--;21 case 'C': k+=2;break; case 'D': k=k%2;contiue; case 'E': k=k+10;break; default: k=k/3; } k++; }while(c&'C') ; printf(&k=%d\n&,k); } A) k=1 B) k=2 C) k=3 D) k=4 【2.21】下面程序的输出结果是____。 main() { int x,i; for(i=1;i&=100;i++) { x=i; if(++x%2==0) if(++x%3==0) if(++x%7==0) printf(&%d &,x); } } A) 39 81 B) 42 84 C) 26 68 D) 28 70【2.22】下面程序的输出结果是____。 #include &stdio.h& main( ) { int i,k,a[10],p[3]; k=5; for(i=0;i&10;i++) a[i]=i; for(i=0;i&3;i++) p[i]=a[i*(i+1)]; for(i=0;i&3;i++) k+=p[i]*2; printf(&%d\n&,k); } A) 20 B) 21 C) 22 D) 23【2.23】假定从键盘上输入&3.6,2.4&回车&&,下面程序的输出是____。 #include &math.h& main() { float x,y,z;22 scanf(&%f,%f&,&x,&y); z=x/y; while(1) { if(fabs(z)&1.0) { x=y; y=z; z=x/y; } else break; } printf(&%f\n&,y); } A) 1.500000 B) 1.600000 C) 2.000000 D) 2.400000【2.24】下面程序的输出结果是____。 main() { int i,j,x=0; for(i=0;i&2;i++) { x++; for(j=0;j&-3;j++) { if(j%2) continue; x++; } x++; } printf(&x=%d\n&,x); } A) x=4 B) x=8 C) x=6 D) x=12【2.25】下面程序的输出结果是____。 main() { int i,j,k=10; for(i=0;i&2;i++) { k++; { int k=0; for(j=0;j&=3;j++) { if(j%2) continue; k++; } } k++; }23 printf(&k=%d\n&,k); } A) k=4 B) k=8 C) k=14 D) k=18【2.26】下面程序的输出结果是____。 #include &stdio.h& main( ) { int n[3][3], i, j; for(i=0;i&3;i++ ) for(j=0;j&3;j++ ) n[i][j]=i+j; for(i=0;i&2;i++ ) for(j=0;j&2;j++ ) n[i+1][j+1]+=n[i][j]; printf(&%d\n&, n[i][j]); } A) 14 B) 0 C) 6 D) 不确定【2.27】下面程序的输出结果是____。 #include &stdio.h& main( ) { int a[4][5]={1,2,4,-4,5,-9,3,6,-3,2,7,8,4}; int i,j,n; n=9; i=n/5; j=n-i*5-1; printf(&a[%d][%d]=%d\n&, i,j,a[i][j]); } A) 6 B) -3 C) 2 D) 不确定【2.28】下面程序的输出结果是____。 int m[3][3]={ {1}, {2}, {3} }; int n[3][3]={ 1, 2, 3 }; main( ) { printf(&%d\n&, m[1][0]+n[0][0] ); /* ① */ printf(&%d\n&, m[0][1]+n[1][0] ); /* ② */ } ① A) 0 B) 1 C) 2 D) 3 ② A) 0 B) 1 C) 2 D) 3【2.29】下面程序的输出结果是____。24 #include &stdio.h& main( ) { char s1[50]={&some string *&},s2[]={&test&}; printf(&%s\n&, strcat(s1,s2)); } A) some string * B) test C) some stritest D) some string *test【2.30】下面程序的输出结果是____。 #include &stdio.h& f(char *s) { char *p=s; while(*p!='\0') p++; return(p-s); } main() { printf(&%d\n&,f(&ABCDEF&)); } A) 3 B) 6 C) 8 D) 0【2.31】下面程序的输出结果是____。 #include &stdio.h& #include &string.h& main( ) { char str[100] =&How do you do&; strcpy( str + strlen(str)/2, &es she&); printf(&%s\n&, str); } A) How do you do B) es she C) How are you D) How does she【2.32】下面程序的输出结果是____。 #include &stdio.h& func(int a,int b) { int c; c=a+b; return(c); } main() { int x=6,y=7,z=8,r; r=func((x--,y++,x+y),z--); printf(&%d\n&,r);25 } A) 11 B) 20 C) 21 D) 31【2.33】下面程序的输出结果是____。 #include &stdio.h& void fun(int *s) { static int j=0; do { s[j]+=s[j+1]; }while(++j&2); } main() { int k,a[10]={1,2,3,4,5}; for(k=1;k&3;k++) fun(a); for(k=0;k&5;k++) printf(&%d&,a[k]); } A) 35756 B) 23445 C) 35745 D) 12345【2.34】下面程序的输出结果是____。 #include &stdio.h& int k=1; main( ) { int i=4; fun(i); printf (&\n%d,%d&,i,k); /* ① */ } fun(int m) { m+=k;k+=m; { char k='B'; printf(&\n%d&,k-'A'); /* ② */ } printf(&\n%d,%d&,m,k); /* ③ */ } ① A) 4,1 B) 5,6 C) 4,6 D) A,B,C 参考答案都不对 ② A) 1 B) -59 C) -64 D) A,B,C 参考答案都不对 ③ A) 5,66 B) 1,66 C) 5,6 D) A,B,C 参考答案都不对【2.35】下面程序的输出结果是____。 #include &stdio.h& fun(int n, int *s)26 { int f1, f2; if(n==1||n==2) *s=1; else { fun(n-1, &f1); fun(n-2, &f2); *s=f1+f2; } } main() { int x; fun(6, &x); printf(&%d\n&, x); } A) 6 B) 7 C) 8 D) 9【2.36】下面程序的输出结果是____。 int w=3; main() { int w=10; printf(&%d\n&,fun(5)*w); } fun(int k) { if(k==0) return(w); return(fun(k-1)*k); } A) 360 B) 3600 C) 1080 D) 1200【2.37】下面程序的输出结果是____。 #include &stdio.h& funa(int a) { int b=0; static int c=3; a=c++,b++; return(a); } main() { int a=2,i,k; for(i=0;i&2;i++) k=funa(a++); printf(&%d\n&,k); } A) 3 B) 0 C) 5 D) 427 【2.38】下面程序的输出结果是____。 #include &stdio.h& void num() { extern int x,y; int a=15,b=10; x=a-b; y=a+b; } int x,y; main() { int a=7,b=5; x=a-b; y=a+b; num(); printf(&%d,%d\n&,x,y); } A) 12,2 B) 5,25 C) 1,12 D) 输出不确定【2.39】下面程序的输出结果是____。 main() { int a=2,i; for(i=0;i&3;i++) printf(&%4d&,f(a)); } f(int a) { int b=0; static int c=3; b++; c++; return(a+b+c); } A) 7 7 7 B) 7 10 13 C) 7 9 11 D) 7 8 9【2.40】下面程序的输出结果是____。 #include &stdio.h& try( ) { static int x=3; x++; return(x); } main( )28 { int i, x; for(i=0; i&=2; i++ ) x=try( ); printf(&%d\n&, x); } A) 3 B) 4 C) 5 D) 6 【2.41】下面程序的输出结果是____。 #include &stdio.h& main( ) { int x=1; void f1( ), f2( ); f1( ); f2(x); printf(&%d\n&, x); } void f1(void) { int x=3; printf(&%d &, x); } void f2( x ) int x; { printf(&%d &, ++x); } A) 1 1 1 B) 2 2 2 C) 3 3 3 D) 3 2 1【2.42】下面程序的输出结果是____。 #include &stdio.h& #define SUB(X,Y) (X)*Y main() { int a=3,b=4; printf(&%d\n&,SUB(a++,b++)); } A) 12 B) 15 C) 16 D) 20【2.43】下面程序的输出结果是____。 main() { int a[]={1,2,3,4,5,6}; int *p; p=a; printf(&%d &,*p); printf(&%d &,*(++p)); printf(&%d &,*++p); printf(&%d &,*(p--));29 p+=3; printf(&%d %d &,*p,*(a+3)); } A) 1 2 3 3 5 4 B) 1 2 3 4 5 6 C) 1 2 2 3 4 5 D) 1 2 3 4 4 5【2.44】下面程序的输出结果是____。 main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p=a; p+=6; printf(&%d &,*p); /* ① */ printf(&%d &,*(*(a+6))); /* ② */ printf(&%d &,*(a[1]+=2)); /* ③ */ printf(&%d&,*(&a[0][0]+6));/* ④ */ } A) 7 7 7 7 B) ②句语法错误 C) ③句语法错误 D) ④句语法错误【2.45】下面程序的输出结果是____。 #define FMT &%X\n& #include &stdio.h& main( ) { static int a[ ][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; printf( FMT, a[2][2]); /* ① */ printf( FMT, *(*(a+1)+1) ); /* ② */ } ① A) 9 B) 11 C) A D) B ② A) 6 B) 7 C) 8 D) 前面三个参考答案均是错误的【2.46】下面程序的输出结果是____。 #include &stdio.h& main ( ) { int a[]={1, 2, 3, 4, 5} ; int x, y, *p; p=&a[0]; x=*(p+2); y=*(p+4); printf(&%d,%d,%d\n&, *p, x, y); } A) 1,3,5 B) 1,2,3 C) 1,2,4 D) 1,4,5【2.47】下面程序的输出结果是____。30 void ive(x,n) int x[],n; { int t,*p; p=x+n-1; while(x&p) { t=*x; *x++=*p; *p--=t; } return; } main() { int i,a[]={1,2,3,4,5,6,7,8,9,0}; ive(a,10); for(i=0;i&10;i++) printf(&%d &,a[i]); printf(&\n&); } A) 1 2 3 4 5 6 7 8 9 0 B) 0 9 8 7 6 5 4 3 2 1 C) 1 3 5 7 9 2 4 6 8 0 D) 0 8 6 4 2 9 7 5 3 1【2.48】下面程序的输出结果是____。 #include &string.h& fun(char *w,int n) { char t,*s1,*s2; s1=w;s2=w+n-1; while(s1&s2) { t=*s1++; *s1=*s2--; *s2=t; } } main() { static char *p=&1234567&; fun(p,strlen(p)); printf(&%s&,p); } A) 7654321 B) 1717171 C) 7171717 D) 1711717【2.49】下面程序的输出结果是____。 #include &stdio.h& char *p = &abcdefghijklmnopq& ; main( )31 { int i=0; while( *p++!='e' ); printf(&%c\n&, *p); } A) c B) d C) e D) f【2.50】下面程序的输出结果是____。 #include &stdio.h& f(int x, int y) { return (y-x); } main( ) { int a=5, b=6, c; int f(), (*g)()=f; printf(&%d\n&, (*g)(a,b) ); } A) 1 B) 2 C) 3 D) 前面三个参考答案均是错误的【2.51】下面程序的输出结果是____。 #include &stdio.h& main( ) { int a=1,*p,**pp; pp=&p; p=&a; a++; printf (&%d,%d,%d\n&, a,*p, **pp); } A) 2,1,1 B) 2,1,2 C) 2,2,2 D) 程序有错误【2.52】下面程序的输出结果是____。 main() { char *alpha[7]={&ABCD&,&EFGH&,&IJKL&,&MNOP&,&QRST&,&UVWX&,&YZ&}; char **p; int i; p=alpha; for(i=0;i&4;i++) printf(&%c&,*(p[i])); printf(&\n&); } A) AEIM B) BFJN C) ABCD D) DHLP32 【2.53】下面程序的输出结果是____。 #include &stdio.h& char *pp[2][3]={ &abc&, &defgh&, &ijkl&, &mnopqr&, &stuvw&, &xyz&}; main ( ) { printf(&%c\n&,***(pp+1)); /* ① */ printf(&%c\n&,**pp[0]); /* ② */ printf(&%c\n&,(*(*(pp+1)+1))[4]); /* ③ */ printf(&%c\n&,*(pp[1][2]+2)); /* ④ */ printf(&%s\n&,**(pp+1)); /* ⑤ */ } ① A) a B) d C) i D) m ② A) a B) d C) i D) m ③ A) h B) l C) q D) w ④ A) k B) o C) u D) z ⑤ A) ijkl B) mnopqr C) stuvw D) xyz【2.54】下面程序的输出结果是____。 #include &stdio.h& struct str1 { char c[5]; char *s; }; main( ) { struct str1 s1[2]={ {&ABCD&&EFGH&},{&IJK&,&LMN&} }; struct str2 { struct str1 sr; int d; }s2={&OPQ&,&RST&,32767}; struct str1 *p[2]; p[0]=&s1[0]; p[1]=&s1[1]; printf(&%s&,++p[1]-&s); /* ① */ printf(&%c&,s2.sr.c[2]); /* ② */ } ① A) LMN B) MN C) N D) IJK ② A) O B) P C) Q D) R【2.55】以下程序的输出结果是____。 struct st { int x,*y; }*p; int s[]={10,20,30,40}; struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};33 main() { p=a; printf(&%d\n&,++(*(++p)-&y)); } A) 10 B) 11 C) 20 D) 21【2.56】以下程序的输出结果是____。 #include &stdio.h& main() { union EXAMPLE { struct { int x,y; }in; int a,b; }e; e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf(&%d,%d\n&,e.in.x,e.in.y); } A) 2,3 B) 4,4 C) 4,8 D) 8,8【2.57】下面程序的输出结果是____。 #include &stdio.h& main() { union { int i[2]; long k; char c[4]; }r,*s=&r; s-&i[0]=0x39; s-&i[1]=0x38; printf(&%c\n&,s-&c[0]); } A) 39 B) 9 C) 38 D) 8【2.58】下面程序的输出是 。 main ( ) { printf(&%d\n&, EOF); } A) -1 B) 0 C) 1 D) 程序是错误的34 【阅读程序题参考答案】 【2.1】参考答案:D 注释:程序中除法运算的两个操作数均是整型,运算结果也是整型。 【2.2】参考答案:B 注释:C 语言允许在程序块(分程序)中说明变量。 【2.3】参考答案:C 注释:变量 i 中的负号传送给变量 n 后,因 n 是无符号数,已不作为负号处理。 【2.4】参考答案:D 注释:对变量 x 的DD操作是后缀形式,变量 x 的减 1 操作要在执行完 printf 函数之后才进行, 所以变量 x 的值在输出的时候仍然保持原值 10。 【2.5】参考答案:B 注释:C 语言在执行 printf()时,对函数中的表达式表列的处理顺序是从后向前,即先处理 n- -, 再处理 n++,最后处理 n,而且每一个表达式作为一个处理单元,也就是说在不同的表达式中自 增自减运算是单独考虑的。 【2.6】参考答案:A 注释:变量 x 和变量 y 做按位与,结果为 0x0200,右移 4 位为 0x0020,再与 0x005f 做按位或, 最后结果为 0x007f。 【2.7】参考答案:A 注释:逗号表达式的结果是用逗号分开的最后一个表达式的值,此题由于 c=='A'的值是 0,所以 逗号表达式的值为 0。 【2.8】参考答案: B 【2.9】参考答案: A 【2.10】参考答案: C 注释:在输出格式描述&%m.ns&中,m 是输出总长度,n 是实际字符的个数,这里 m 没有给出, 则输出总长度就是实际输出字符的个数。 【2.11】参考答案: C 【2.12】参考答案:B 【2.13】参考答案:C 【2.14】参考答案:B 【2.15】参考答案:D 【2.16】参考答案:A 【2.17】参考答案: C 【2.18】参考答案:A 【2.19】参考答案: C 注释:在 switch 语句中,case 本身仅起到语句标号的作用,不会改变语句的流程,执行 break 语 句才能退出当前的 switch 语句。 【2.20】参考答案: D 注释: siwtch 语句的表达式中, 变量 c 是后缀的增一运算, 第一次执行 do-while 循环时, 执行 case 'A'后面的语句。【2.21】参考答案: D 【2.22】参考答案: B 【2.23】参考答案: B 注释:fabs()是浮点数绝对值函数。35 【2.24】参考答案: A 【2.25】参考答案: C 注释:C 语言允许在程序块(分程序)内说明变量,如果在程序块内说明的变量和程序块外的变 量同名,在块外说明的变量在块内是不可见的。可将此题和【2.11】进行比较,加深理解。 【2.26】参考答案: C 【2.27】参考答案: B 【2.28】参考答案: ① D ② A 【2.29】参考答案:D 【2.30】参考答案: B 注释:输出结果为字符串长度。 【2.31】参考答案: D 注释:字符串拷贝函数 strcpy()要求的两个参数都是字符串首地址。本题中第二个参数是字符串 常量,接受这个字符串的第一个参量不是直接给出字符数组名,而是进行了地址运算后的结果。 由于 str 字符串的长度是 13, 2 取整后是 6, 除 第一个参数给出的地址是字符数组 str 的首地址加 6, 也就是原来字符串中第二个空格的位置, 把&es she&从该处放入, 字符串 str 变为&How does she&。 【2.32】参考答案: C 注释:main 函数调用 func 函数时,第一个实参使用的是逗号表达式的值,也就是 x+y 的结果。 由于对变量 x、y、z 进行的是后缀运算,所以函数 func 的参数值是 13 和 8。 【2.33】参考答案: C 【2.34】参考答案: ① C ② A ③ C 【2.35】参考答案: C 【2.36】参考答案: B 注释:函数 fun 进行了递归调用,实际进行的运算是 5×4×3×2×1×3×10。主函数内说明的 局部变量 w 屏蔽了外部变量 w,所以在主函数中外部变量 w 是不可见的,在调用 printf 函数时 表达式&fun(5)*w&中 w 的值是 10。 【2.37】参考答案: D 注释:main 函数三次调用了函数 funa,在 funa 函数中的静态变量 c 仅在第一次调用时进行了初 始化,再次调用时不再对静态变量赋初值。 【2.38】参考答案: B 注释:main 函数和 num 函数中都说明了变量 a 和 b,由于它们是内部变量,所以它们分别在说 明它们的函数内有效。 外部变量 x 和 y 在函数 num 之后被说明, 而在 num 函数中又要引用它们, 所以在 num 函数中用关键字&extern&说明变量 x 和 y 是一个外部变量,也就是通知计算机这两个 变量在 fun 函数以外被说明,此处不是定义两个 int 型变量。 【2.39】参考答案: D 注释:函数 f 中的变量 c 是静态变量,仅在第一次调用函数 f 时它被初始化为 3,第二次调用函数 f 时 c 的值是 4,第三次调用函数 f 时 c 的值是 5。 【2.40】参考答案: D 【2.41】参考答案: D 注释:程序中有三个&x&分别在三个不同的函数中,这三个&x&都是自动变量,所以三个&x&分别局 部于三不同的函数,在三个函数中对&x&的操作互不影响。 【2.42】参考答案: A 【2.43】参考答案: A 注释:*(++p)和*++p 都是指针变量值前加 1,第一次指向 a[1],第二次指向 a[2];a+3 是 a[3]的 地址。36 【2.44】参考答案: C 注释:②句没有语法错误,但是 a+6 指向数组之外,因为 a 是 a[0]的地址,a+1 是 a[1]的地址, a+2 是 a[2]的地址,显然数组 a 没有 a[6]分量。③句错误,因为 a[1]是地址常量,它是 a[1][0]的 地址,对于地址常量是不可以进行赋值运算的。 【2.45】参考答案: ① D ② A 注释:如果 FMT 定义为&%x\n&,则输出的 16 进制数据用小写字母表示。 【2.46】参考答案: A 注释:语句&p=&a[0]&表示将数组 a 中元素 a[0]的地址赋给指针变量 p,则 p 就是指向数组首元素 a[0]的指针变量,&&a[0]&是取数组首元素的地址。对于指向数组首址的指针,p+i(或 a+i)是数 组元素 a[i]的地址,*(p+i)(或*(a+i))就是 a[i]的值。 【2.47】参考答案: B 【2.48】参考答案: D 【2.49】参考答案: D 【2.50】参考答案: A 注释:变量 g 是指向函数的指针,(*g)(a,b)是调用指针 g 所指向的函数。 【2.51】参考答案: C 注释:p 是指针,pp 是指向指针的指针。 【2.52】参考答案: A 注释:对于指向数组的指针变量可以做下标运算,p[i]和 alpha[i]都是指向字符串的首地址,*p[i] 取出字符串的第一个字符。 【2.53】参考答案: ① D ② A ③ D ④ D ⑤ B 注释: 是一个二维指针数组, pp pp+1 指向数组的第二维, *(pp+1)是第二维的起始地址, **(pp+1) 是第二维第一个元素的地址,***(pp+1)是第二维第一个元素的内容,所以,①的参考答案应选 D。*(pp+1)+1 是第二维第二个元素的地址,*(*(pp+1)+1)是第二维第二个元素,(*(*(pp+1)+1))[4] 则是第二维第二个元素所指字符串下标为 4 的元素,即是字符 w,故③应当选 D。 【2.54】参考答案: ① B ② C 【2.55】参考答案:D 【2.56】参考答案:C 注释:联合体成员的取值是最后一次给成员赋的值。 【2.57】参考答案: B 注释:整型数组 i 和字符数组 c 共用存储空间,给 i 赋值也等于给 c 赋值,所以 s-&c[0]=0x39, 所以输出 9。 【2.58】参考答案:A 注释:基本概念。EOF 是由 C 语言在头文件 stdio.h 中定义的,用户可以直接使用。三、程序填空题导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内 容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。37 本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这 样就可以逐步提高自己的编程能力。 在程序设计语言学习的中期, 读者对程序设计已经有了初步 的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习 的效率。 【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。 #include &stdio.h& main() { int a,b; scanf(&%d%d&,&a,&b); printf(&a=%d,b=%d\n&,a,b); a= ① ; b= ② ; a= ③ ; printf(&a=%d,b=%d\n&,a,b); }【3.2】下面程序的功能是根据近似公式:π 2/6≈ 1/12+1/22+1/32+ …… +1/n2,求π 值。 #include &math.h& double pi(long n) { double s=0.0; long i; for(i=1;i&=n;i++) s=s+ ① ; return( ② ); }【3.3】下面的程序的功能是求一维数组中的最小元素。 findmin(int *s,int t,int *k) { int p; for(p=0,*k=p;p&t;p++) if(s[p]&s[*k]) ① ; } main() { int a[10],i,*k=&i; for(i=0;i&10;i++) scanf(&%d&,&a[i]); findmin(a,10,k); printf(&%d,%d\n&,*k,a[*k]); }38 【3.4】下面程序的功能是计算 1-3+5-7+ …… -99+101 的值。 main() { int i,t=1,s=0; for(i=1;i&=101;i+=2) { ① ; s=s+t; ② ; } printf(&%d\n&,s); }【3.5】有以下程序段: s=1.0; for(k=1;k&=n;k++) s=s+1.0/(k*(k+1)); printf(&%f\n&,s); 填空完成下述程序,使之与上述程序的功能完全相同。 s=0.0; ① ; k=0; do { s=s+d; ② ; d=1.0/(k*(k+1)); }while( ③ ); printf(&%f\n&,s);【3.6】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩, 当输入为负数时结束输入。 main() { float x,amax,amin; scanf(&%f&,&x); amax=x; amin=x; while( ① ) { if(x&amax) amax=x; if( ② ) amin=x; scanf(&%f&,&x); } printf(&\namax=%f\namin=%f\n&,amax,amin); }39 【3.7】下面程序的功能是将形参 x 的值转换为二进制数,所得的二进制数放在一个一维数组中 返回,二进制数的最低位放在下标为 0 的元素中。 fun(int x,int b[]) { int k=0,r; do { r=x% ① ; b[k++]=r; x/= ② ; }while(x); }【3.8】下面程序的功能是输出 1 到 100 之间每位数的乘积大于每位数的和的数。例如数字 26, 数位上数字的乘积 12 大于数字之和 8。 main() { int n,k=1,s=0,m; for(n=1;n&=100;n++) { k=1; s=0; ① ; while( ② ) { k*=m%10; s+=m%10; ③ ; } if(k&s) printf(&%d&,n); } }【3.9】下面程序的功能是统计用 0 至 9 之间的不同的数字组成的三位数的个数。 main() { int i,j,k,count=0; for(i=1;i&=9;i++) for(j=0;j&=9;j++) if( ① ) continue; else for(k=0;k&=9;k++) if( ② ) count++; printf(&%d&,count); }【3.10】下面程序的功能是输出 100 以内的个位数为 6、且能被 3 整除的所有数。 main()40 { int i,j; for(i=0; ① ;i++) { j=i*10+6; if( ② ) countinue; printf(&%d&,j); } }【3.11】下面程序的功能是用辗转相除法求两个正整数 m 和 n 的最大公约数。 hcf(int m,int n) { int r; if(m&n) { r=m; ① ; n=r; } r=m%n; while( ② ) { m=n; n=r; r=m%n; } ③ ; }【3.12】下面程序的功能是使用冒泡法对输入的 10 个浮点数从小到大进行排序。排好序的 10 个 数分两行输出。程序如下: #include &stdio.h& main() { ① ; int i,j; printf(&Input 10 numbers please\n&); for(i=0; ② ;i++ ) scanf(&%f&, &a[i]); printf(&\n&); for(i=2; ③ ;i++ ) for(j=0; ④ ;j++ ) if( ⑤ ) { x=a[j]; ⑥ ; a[j+1]=x; } printf(&The sorted 10 numbers;\n&);41 for(i=0; ⑦ ;i++ ) { if( ⑧ ) printf(&\n&); printf(&%f\t&,a[i]); } printf(&\n&); }【3.13】下面程序的功能是读入 20 个整数,统计非负数个数,并计算非负数之和。 #include &stdio.h& main() { int i,a[20],s,count; s=count=0; for(i=0;i&20;i++ ) scanf(&%d&, ① ); for(i=0;i&20;i++) { if(a[i]&0) ② ; s+=a[i]; count++; } printf(&s=%d\t count=%d\n&,s,count); }【3.14】下面程序的功能是删除字符串 s 中的空格。 #include &stdio.h& main() { char *s=&Beijing ligong daxue&; int i,j; for(i=j=0;s[i]!='\0';i++) if(s[i]!= ' ') ① ; else ② ; s[j]= '\0'; printf(&%s&,s); }【3.15】下面程序的功能是将字符串 s 中所有的字符'c'删除。请选择填空。 #include&stdio.h& main( ) { char s[80]; int i,j; gets(s);42 for(i=j=0;s[i]!= '\0';i++ ) if(s[i]!= 'c') ① ; s[j]= '\0'; puts(s); } 【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。 #include &stdio.h& char x[]=&programming&; char y[]=&Fortran&; main() { int i=0; while(x[i]!= '\0' && y[i]!= '\0') if(x[i]==y[i]) printf(&%c&, ① ); else i++; }【3.17】下面程序的功能是将字符串 s 中的每个字符按升序的规则插到数组 a 中, 字符串 a 已排 好序。 #include &string.h& main() { char a[20]=&cehiknqtw&; char s[]=&fbla&; int i,k,j; for(k=0;s[k]!= '\0';k++ ) { j=0; while(s[k]&=a[j] && a[j]!= '\0' ) j++; for( ① ) ② ; a[j]=s[k]; } puts(a); }【3.18】下面程序的功能是对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不 相同字符的 ASCII 码之差。例如:输入的两个字符串分别为&abcdefg&和&abceef&,则输出为-1。 #include &stdio.h& main() { char str1[100],str2[100],c; int i,s;43 printf(&Enter string 1: &); gets(str1); printf(&Enter string 2: &); gets(str2); i=0; while((str1[i] == str2[i] && str1[i]!= ① )) i++; s= ② ; printf(&%d\n&, s); }【3.19】下面的函数 expand 在将字符串 s 复制到字符串 t 时, 将其中的换行符和制表符转换为 可见的转义字符表示,即用'\n'表示换行符,用'\t'表示制表符。 expand(char s[],char t[]) { int i,j; for(i=j=0;s[i]!= '\0';i++ ) switch (s[i]) { case '\n': t[ ① ] = ② ; t[j++] = 'n'; break; case '\t': t[ ③ ] = ④ ; t[j++] = 't'; break; default: t[ ⑤ ] = s[i]; break; } t[j] = ⑥ ; }【3.20】下面的函数 index(char s[], char t[])检查字符串 s 中是否包含字符串 t,若包含,则返回 t 在 s 中的开始位置(下标值) ,否则送回-1。 index(char s[], char t[]) { int i,j,k; for(i=0;s[i]!= '\0';i++ ) { for(j=i,k=0; ① && s[j]==t[k];j++,k++) ; if( ② ) return (i); } return(-1); } n【3.21】下面程序的功能是计算 S= k! 。 k=044 long fun(int n) { int i; long s; for(i=1;i ① ;i++) s*=i; return( ② ); } main() { int k,n; long s; scanf(&%d&,&n); s= ③ ; for(k=0;k&=n;k++) s+= ④ ; printf(&%ld\n&,s); }【3.22】下面程序的功能是显示具有 n 个元素的数组 s 中的最大元素。 #define N 20 main() { int i,a[N]; for(i=0;i&N;i++) scanf(&%d&,&a[i]); printf(&%d\n&, ① ); } fmax(int s[],int n) { int k,p; for(p=0,k=p;p&n;p++) if(s[p]&s[k]) ② ; return(k); }【3.23】下面程序的功能是由键盘输入 n,求满足下述条件的 x、y: nx 和 ny 的末 3 位数字相同,且 x≠y,x、y、n 均为自然数,并使 x+y 为最小。 #include &stdio.h& pow3(int n,int x) { int i, last; for(last=1,i=1;i&=x;i++ ) last= ① ; return(last); } main() { int x,n,min,flag=1;45 scanf(&%d&, &n); for(min=2;flag;min++) for(x=1;x&min && flag;x++ ) if( ② && pow3(n,x)==pow3(n,min-x)) { printf(&x=%d,y=%d\n&, x, min-x ); ③ ; } }【3.24】下面的程序是用递归算法求 a 的平方根。求平方根的迭代公式如下: #include &math.h& double mysqrt( double a, double x0 ) { double x1, y; x1 = ① ; if( fabs(x1-x0)&0.00001 ) y = mysqrt( ② ); else y = x1; return( y ); } main() { double x; printf(&Enter x: &); scanf(&%lf&, &x); printf(&The sqrt of %lf=%lf\n&, x, mysqrt( x, 1.0) ); }【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为 10 岁,其余学生的年龄一 个比一个大 2 岁,求第 5 个学生的年龄。 #include &stdio.h& age( int n ) { int c; if( n==1 ) c=10; else c= ① ; return(c); } main() { int n=5; printf(&age:%d\n&, ② ); }【3.26】下面的函数 sum(int n)完成计算 1~n 的累加和。46 sum(int n) { if(n&=0) printf(&data error\n&); if(n==1) ① ; else ② ; }【3.27】下面的函数是一个求阶乘的递归调用函数。 facto(int n) { if( n == 1 ) ① ; else return( ② ); }【3.28】组合问题,由组合的基本性质可知: (1) C(m,n)=C(n-m,n) (2) C(m,n+1)=C(m,n)+C(m-1,n) 公式(2)是一个递归公式,一直到满足 C(1,n)=n 为止。当 n&2*m 时,可先用公式(1) 进行简化, 填写程序中的空白,使程序可以正确运行。 #include&stdio.h& main() { int m,n; printf(&Input m,n=&); scanf(&%d%d&, &m, &n); printf(&The combination numbeers is %d\n&, combin(m,n)); } combin( int m, int n) { int com; if( n&2*m ) m=n-m; if( m==0 ) com=1; else if(m==1) ① ; else ② ; return(com); }【3.29】下列函数是求一个字符串 str 的长度。 ?????? int strlen( char *str ) ??????{ if( ① ) return (0); ?? ???? else return ( ② ); }【3.30】用递归实现将输入小于 32768 的整数按逆序输出。如输入 12345,则输出 54321。47 #include&stdio.h& main() { int n; printf(&Input n : &); scanf(&%d&, ① ); r(n); printf(&\n&); } r( int m ) { printf(&%d&, ② ); m= ③ ; if( ④ ) ⑤ ; }【3.31】输入 n 值,输出高度为 n 的等边三角形。例如当 n=4 时的图形如下: * *** ***** ******* #include &stdio.h& void prt( char c, int n ) { if( n&0 ) { printf( &%c&, c ); ① ; } } main() { int i, n; scanf(&%d&, &n); for( i=1; i&=n; i++ ) { ② ; ③ ; printf(&\n&); } }【3.32】下面的函数实现 N 层嵌套平方根的计算。 double y(double x, int n) { if( n==0 ) return(0); else return ( sqrt(x+( ① )) );48 }【3.33】函数 revstr(s)将字符串 s 置逆,如输入的实参 s 为字符串&abcde&, 则返回时 s 为字符 串&edcba&。递归程序如下: revstr( char *s ) { char *p=s, c; while(*p) p++; ① ; if(s&p) { c=*s; *s=*p; ② ; revstr(s+1); ③ ; } } 如下是由非递归实现的 revstr(s)函数: revstr (s) char *s; { char *p=s, c; while( *p ) p++; ④ ; while( s&p ) { c=*s; ⑤ = *p; *p-- = c; } }【3.34】下面函数用递归调用的方法,将 str 中存放的长度为 n 的字符串反转过来,例如原来是 &ABCDE&,反序为&EDCBA&。 void invent(char *str,int n) { char t; t=*str; *str=*(str+n-1); *(str+n-1)=t; if( n&2 ) invent ( ① ,n-2); else ② ; }【3.35】从键盘上输入 10 个整数,程序按降序完成从大到小的排序。 #include &stdio.h& int array[10]; sort( int *p, int *q ) { int *max, *s;49 if( ① ) return; max=p; for( s=p+1; s&=q; s++) if( *s & *max ) ② ; swap( ③ ); sort( ④ ); } swap( int *x, int *y ) { int temp; temp=*x; *x=*y; *y=temp; } main() { int i; printf(&Enter data :\n&); for( i=0; i&10; i++) scanf(&%d&, &array[i]); sort( ⑤ ); printf(&Output:&); for( i=0; i&10; i++) printf(&%d &, array[i]); }【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483 存放 成&384&。 #include &stdio.h& void convert(char *a, int n) { int i; if((i=n/10) !=0 ) convert( ① , i ); *a = ② ; } char str[10]= & &; main() { int number; scanf(&%d&, &number); convert( str, number ); puts(str); }【3.37】下面程序的功能是实现数组元素中值的逆转。 #include &string.h& main() { int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10}; invert(a,n-1); for(i=0;i&10;i++) printf(&%4d&,a[i]);50 printf(&\n&); } invert(int *s,int num) { int *t,k; t=s+num; while( ① ) { k=*s; *s=*t; *t=k; ② ; ③ ; } }【3.38】下面程序通过指向整型的指针将数组 a[3][4] 的内容按3行×4列的格式输出,请给 printf( )填入适当的参数,使之通过指针 p 将数组元素按要求输出。 #include &stdio.h& int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, *p=a; main() { int i,j; for(i=0;i&3;i++ ) { for(j=0;j&4;j++ ) printf(&%4d &, ① ); } }【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。 #include &stdio.h& main ( ) { char str[81], *sptr; int i; for(i=0;i&80;i++ ) { str[i]=getchar( ); if(str[i]== '\n') break; } str[i]= ① ; sptr=str; while( *sptr ) putchar( *sptr ② ); }【3.40】下面函数的功能是将字符变量的值插入已经按 ASCII 码值从小到大排好序的字符串中。51 void fun(char *w,char x,int *n) { int i,p=0; while(x&w[p]) ① ; for(i=*n;i&=p;i--) ② ; w[p]=x; ++*n; }【3.41】 下面程序的功能是从键盘上输入两个字符串, 对两个字符串分别排序; 然后将它们合并, 合并后的字符串按 ASCII 码值从小到大排序,并删去相同的字符。 #include &stdio.h& strmerge(a,b,c) /* 将已排好序的字符串 a、b 合并到 c */ char *a,*b,*c; { char t,*w; w=c; while( *a!= '\0' ① *b!='\0' ) { t= ② ?*a++:*b&*a ? *b++ : ( ③ ); /* 将*a、*b 的小者存入 t */ if( *w ④ '\0' ) *w=t; else if( t ⑤ *w) *++w=t; /* 将与*w 不相同的 t 存入 w */ } while( *a != '\0' ) /* 以下将 a 或 b 中剩下的字符存入 w */ if( *a != *w ) *++w=*a++; else a++; while( *b != '\0') if( *b != *w ) *++w=*b++; else b++; *++w = ⑥ ; } strsort( char *s ) /* 将字符串 s 中的字符排序 */ { int i,j,n; char t,*w; ⑦ ; for( n=0;*w != '\0'; ⑧ ) w++; for( i=0;i&n-1;i++ ) for( j=i+1;j&n;j++ ) if( s[i]&s[j] ) { ⑨ } } main( ) { char s1[100],s2[100],s3[200]; printf(&\nPlease Input First String:&); scanf(&%s&,s1); printf(&\nPlease Input Second String:&);52 scanf(&%s&,s2); strsort(s1); strsort(s2); ⑩ = '\0'; strmerge(s1,s2,s3); printf(&\nResult:%s&,s3); }【3.42】已知某数列前两项为 2 和 3,其后继项根据前面最后两项的乘积,按下列规则生成: ① 若乘积为一位数,则该乘积即为数列的后继项; ② 若乘积为二位数,则该乘积的十位上的数字和个位上的数字依次作为数列的两个后继项。 下面的程序输出该数列的前N项及它们的和,其中,函数 sum(n,pa) 返回数列的前 N 项和,并将 生成的前 N 项存入首指针为 pa 的数组中,程序中规定输入的 N 值必须大于 2,且不超过给定的 常数值 MAXNUM。 例如:若输入N的值为 10,则程序输出如下内容: sum(10)=44
#include &stdio.h& #define MAXNUM 100 int sum(n, pa) int n, *pa; { int count, total, temp; *pa = 2; ① =3; total=5; count=2; while( count++&n ) { temp = *(pa-1) * *pa; if( temp&10 ) { total += temp; *(++pa) = temp; } else { ② = temp/10; total += *pa; if( count&n ) { count ++; pa++; ③ = temp%10; total += *pa; } } } ④ ; }53 main() { int n, *p, *q, num[MAXNUM]; do { printf(&Input N=? (2&N&%d):&, MAXNUM+1); scanf(&%d&, &n); }while( ⑤ ); printf(&\nsum(%d)=%d\n&, n, sum(n, num)); for( p=num, q = ⑥ ; p&q; p++ ) printf(&%4d&, *p); printf(&\n&); }【3.43】下面程序的功能是输入学生的姓名和成绩,然后输出。 #include &stdio.h& struct stuinf { char name[20]; /* 学生姓名 */ int score; /* 学生成绩 */ } stu, *p; main ( ) { p=&stu; printf(&Enter name:&); gets( ① ); printf(&Enter score: &); scanf(&%d&, ② ); printf(&Output: %s, %d\n&, ③ , ④ ); }【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到 输入 0 时才结束。 ?? #include &stdio.h& #include &string.h& #define NUM 4 ? struct student ? { int rank; char *name; float score; ????????}; ???????? ① stu[ ]={ 3,&liming&,89.3, ???????? 4,&zhanghua&,78.2, ???????? 1,&anli&,95.1, ???????? 2,&wangqi&,90.6 }; ????????main()54 ????????{ char str[10]; ???????? int i; ???????? do { printf(&Enter a name&); ???????? scanf(&%s&,str); ???????? for( i=0;i#i++ ) ???????? if( ② ) ???????? { printf(&Name :%8s\n&,stu[i].name); ???????? printf(&Rank :%3d\n&,stu[i].rank); ???????? printf(&Average :%5.1f\n&,stu[i].score); ???????? ③ ; ???????? } ???????? if( i&=NUM ) printf(&Not found\n&); ???????? }while( strcmp(str,&0&)!=0 ); ????????}【3.45】下面程序的功能是从终端上输入5个人的年龄、性别和姓名,然后输出。 #include &stdio.h& struct man { char name[20]; unsigned age; char sex[7]; }; main ( ) { struct man person[5]; data_in(person,5); data_out(person,5); } data_in(struct man *p, int n ) { struct man *q = ① ; for( ;p&q;p++ ) { printf( &age:sex:name& ); scanf(&%u%s&, &p-&age, p-&sex); ② ; } } data_out( struct man *p, int n ) { struct man *q = __③__; for( ;p&q;p++ ) printf(&%s;%u;%s\n&, p-&name, p-&age, p-&sex); } 【3.46】 输入 N 个整数, 储存输入的数及对应的序号, 并将输入的数按从小到大的顺序进行排列。 要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第 3 个整数为55 5,第 7 个整数也为 5,则将先输入的整数 5 排在后输入的整数 5 的前面。程序如下: #include &stdio.h& #define N 10 struct { int no; int num; } array[N]; main( ) { int i,j,num; for( i=0;i&N;i++ ) { printf(&enter No. %d:&,i); scanf(&%d&,&num); for( ① ;j&=0&&array[j].num ② num; ③ ) array[j+1]=array[j]; array[ ④ ].num=num; array[ ⑤ ].no=i; } for( i=0;i&N;i++ ) printf(&%d=%d,%d\n&,i,array[i].num,array[i].no); }【3.47】以下程序的功能是:读入一行字符(如:a、...y、z),按输入时的逆序建立一个链接式的 结点序列,即先输入的位于链表尾(如下图) ,然后再按输入的相反顺序输出,并释放全部结点。#include &stdio.h& main( ) { struct node { char info; struct node *link; } *top,*p; char c; top=NULL; while((c= getchar( )) ① ) { p=(struct node *)malloc(sizeof(struct node)); p-&info=c; p-&link=top; top=p; } while( top ) { ② ;56 top=top-&link; putchar(p-&info); free(p); } }【3.48】下面函数将指针 p2 所指向的线性链表,串接到 p1 所指向的链表的末端。假定 p1 所指 向的链表非空。 #define NULL 0 struct link { float a; struct link *next; }; concatenate ( p1,p2 ) struct list *p1,*p2; { if( p1-&next==NULL ) p1-&next=p2; else concatenate( ① ,p2); }【3.49】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。 #include &stdio.h& struct node { char data; struct node *link; }*head; main() { char ch; struct node *p; head = NULL; while(( ch=getchar())!='\n' ) { p = (struct node *)malloc(sizeof(struct node)); p-&data = ch; p-&link = ① ; head = ② ; } ③ ; while( p!=NULL ) { printf(&%c &, p-&data); p = p-&link; } }57 【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于 0 时才停止输入。然后 反序输出这些整数。 #include &stdio.h& struct data { int x; struct data *link; }*p; input() { int num; struct data *q; printf(&Enter data:&); scanf(&%d&, &num); if( num&0 ) ① ; q= ② ; q-&x = num; q-&link = p; p=q; ③ ; } main() { printf(&Enter data until data&0:\n&); p=NULL; input(); printf(&Output:&); while( ④ ) { printf(&%d\n&, p-&x); ⑤ ; } }【3.51】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储 存学生的学号和成绩。新产生的结点总是位于链表的尾部。 struct student { long num; int score; struct student *next; }; struct student *creat() { struct student *head=NULL,*tail; long num; int a; tail= ① malloc(LEN);58 do { scanf(&%ld,%d&,&num,&a); if(num!=0) { if(head==NULL) head=tail; else ② ; tail-&num=num; tail-&score=a; tail-&next=(struct student *)malloc(LEN); } else tail-&next=NULL; }while(num!=0); return( ③ ); }【3.52】下面 create 函数的功能是建立一个带头结点的单向链表,新产生的结点总是插入在链表 的末尾。单向链表的头指针作为函数值返回。 #include &stdio.h& #define LEN sizeof(struct student) struct student { long num; int score; struct student *next; }; struct student *creat() { struct student *head=NULL,*tail; long num; int a; tail=( ① )malloc(LEN); do { scanf(&%ld,%d&,&num,&a); if(num!=0) { if(head==NULL) head=tail; else tail=tail-&next; tail-&num=num; tail-&score=a; tail-&next=( ② )malloc(LEN); } else tail-&next=NULL; }while(num!=0); ③ ; }【3.53】下面程序的功能是统计文件中的字符的个数。 #include &stdio.h&59 main() { long num=0; ① *fp; if((fp=fopen(&fname.dat&, &r&))==NULL) { printf(&Can't open the file! &); exit(0); } while( ② ) { fgetc(fp); num++; } printf(&num=%d\n&,num); fclose(fp); }【3.54】下面程序的功能是把从键盘输入的文件(用 @ 作为文件结束标志)复制到一个名为 second.txt 的新文件中。 #include &stdio.h& FILE *fp; main() { char ch; if((fp=fopen( ① ))==NULL) exit(0); while((ch=getchar())!='@') fputc(ch,fp); ② ; }【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给 出(假定给定的文件名无误) 。 #include &stdio.h& main(int argc,char *argv[]) { FILE &f1,*f2; if(argc& ① ) { printf(&The command line error! &); exit(0); } f1=fopen(argv[1], &r&); f2=fopen(arhv[2], &w&); while( ② ) fputs(fgetc(f1), ③ ); ④ ; ⑤ ;60 }【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执 行文件的文件名是 sm,则执行该程序时输入:&sm + 10&,可以实现 10 的累加;输入:&sm - 10&, 可以实现求 10 的阶乘。 #include &stdio.h& #include &stdlib.h& main (int argc,char *argv[]) { int n; void sum(),mult(); void (*funcp)(); n=atoi(argv[2]); if(argc!=3 || n&=0) dispform( ); switch ( ① ) { case '+': funcp=sum; break; case '-': funcp=mult; break; default: dispform( ); } ② ; } void sum(int m) { int i,s=0; for(i=1;i&m;i++ ) ③ ; printf(&sum=%d\n&,s); } void mult(int m) { long int i, s=1; for(i=1;i&=m;i++ ) s *= i; printf(&mult= %ld\n&;s); } dispform( ) { printf (&usage:sm n(+/!) (n&0)\n&); exit (0); }【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母, 输出到文件 test.txt 中,然后从该文件读出字符串并显示出来。 #include &stdio.h&61 main() { char str[100]; int i=0; FILE *fp; if((fp=fopen(&test.txt&, ① ))==NULL) { printf(&Can't open the file.\n&); exit(0); } printf(&Input a string:\n&); gets(str); while(str[i]) { if(str[i]&= 'a'&&str[i]&= 'z') str[i]= ② ; fputc(str[i],fp); i++; } fclose(fp); fp=fopen(&test.txt&, ③ ); fgets(str,strlen(str)+1,fp); printf(&%s\n&,str); fclose(fp); }【3.58】下面程序的功能是将从终端上读入的 10 个整数以二进制方式写入名为&bi.dat&的新文件 中。 #include &stdio.h& FILE *fp; main() { int i, j; if(( fp=fopen( ① , &wb& )) == NULL ) exit (0); for( i=0;i&10;i++ ) { scanf(&%d&, &j ); fwrite( ② , sizeof(int), 1, ③ ); } fclose( fp); }【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、 输出每 种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或'\t'、 '\n'结束的字符串。 #include &stdio.h& #include &string.h& FILE *cp;62 char fname[20], buf[100]; int num; struct key { char word[10]; int count; }keyword[]={ &if&, 0, &char&, 0, &int&, 0, &else&, 0, &while&, 0, &return&, 0}; char *getword (FILE *fp) { int i=0; char c; while((c=getc(fp)) != EOF && (c==' '||c=='\t'||c=='\n')) ; if( c==EOF ) return (NULL) ; else buf[i++]=c; while((c = ① && c!= ' ' && c!= '\t' && c!= '\n' ) buf[i++] = c; buf[i]= '\0'; return(buf); } lookup(char *p) { int i; char *q, *s; for(i=0;i#i++) {q= ② ; s=p; while( *s && (*s==*q) ) { ③ } if( ④ ) { keyword[i].count++; break; } } return; } main() { int i; char *word; printf(&Input file name:&); scanf(&%s&, fname); if((cp=fopen(fname, &r&)) ==NULL ) { printf(&File open error: %s\n&, fname); exit(0); } num = sizeof(keyword) / sizeof(struct key); while( ⑤ )63 lookup(word); fclose(cp); for(i=0;i#i++) printf(&keyword:%-20scount=%d\n&,keyword[i].word,keyword[i].count); }【3.60】下面程序的功能是从键盘接受姓名(例如:输入&ZHANG SAN&) ,在文件&try.dat&中查 找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该 姓名存入文件。 要求: ?若磁盘文件&try.dat&, 已存在, 则要保留文件中原来的信息; 若文件&try.dat& 不存在,则在磁盘上建立一个新文件;?当输入的姓名为空时(长度为 0) ,结束程序。 #include &stdio.h& main() { FILE *fp; int flag; char name[30], data[30]; if((fp=fopen(&try.dat&, ① ))==NULL ) { printf(&Open file error\n&); exit(0); } do { printf(&Enter name:&); gets(name); if( strlen(name)==0 ) break; strcat(name, &\n&); ② ; flag=1; while( flag && (fgets(data, 30, fp) ③ ) ) if( strcmp(data, name) == 0 ) ④ ; if( flag ) fputs(name, fp); else printf(&\tData enter error !\n&); } while( ⑤ ); fclose(fp); } 【程序填空题参考答案】 【3.1】答案: ① a+b ② a-b ③ a-b 【3.2】答案:① 1.0/(float)(i*i) ② sqrt(6*s) 【3.3】答案:① *k=p 【3.4】答案:① t=t*i ② t=t&0?-1:1 【3.5】答案:① d=1 ② k++ ③ k&=n64 【3.6】答案: ① x&=0 ② x&amin 【3.7】答案: ① 2 ② 2 【3.8】答案:① m=n ② m&0 ③ m=m/10 【3.9】答案:① i==j ② k!=i&&k!=j 【3.10】答案:① i&=9 ② j%3!=0 【3.11】答案:① m=n ② r!=0 ③ return(n) 【3.12】答案:① float a[10],x ② i&=9 ③ i&=8 ④ j&=9-i ⑤ a[j]&a[j+1] ⑥ a[j]=a[j+1] ⑦ i&=9 ⑧i%5==0 【3.13】答案:① &a[i] ② continue 注释:①是基本概念,使用 scanf 函数输入数组元素的值。当输入的元素值小于 0 时,应当跳过 后面的语句,取下一个数,所以②要填入 continue。 【3.14】答案:① s[j++]=s[i] ② s[j]=s[i] 【3.15】答案:① s[j++]=s[i] 【3.16】答案:① x[i++] 【3.17】答案:① i=strlen(a);i&=j;i-- ② a[i+1]=a[i] 【3.18】答案:① '\0' ② str1[i]-str2[i] 【3.19】答案:① j++ ② '\\' ③ j++ ④ '\\' ⑤ j++ ⑥ '\0' 【3.20】答案:① t[k]!= '\0' ② t[k]== '\0' 【3.21】答案:① &=n ② s ③ 0 ④ fun(k) 【3.22】答案:① a[fmax(a,N)] ② k=p 【3.23】答案:① last*n%1000 ② x!=min-x ③ flag=0 【3.24】答案:① (x0+a/x0)/2 ② a,x1 注}

我要回帖

更多关于 平行四边形的面积公式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信