1、C填空题集填空题集: 一)基础知识1在C语言中,当关系表达式中的关系成立时,则该关系表达式的值为_。2设有说明“int j;float x;”,则执行语句“x=j=4.8;”后,x的值为_。3在C语言中,任一语句必定以字符_结束。4在C语言中,主要有三种控件结构,分别是顺序结构、_结构、_结构。5break语句不能用于_语句和_语句之外的任何其他语句中。6C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是_。7char型常量在内存中存放的是_码值。872在内存中占_个字节,”72”在内存中占_个字节。9所有的C语言程序是由 (9) 构成的。10在C程序设计中,可以将被调用函数中
2、的值带回调用函数的三种方法分别是 (10) , (11) 和 (12) . 二)程序填空:1写出下面程序的运行结果:main() int a,b,c,t; a=1;b=2;c=2; while(abc) t=a; a=b; b=t; c-; printf(%d %d %dn,a,b,c);请写出程序运行结果:_。答案:1 2 0分析:1)abc关系表达式运算过程为:先进行ab比较,结果为0或1;然后0或1再与c进行比较。2)while是循环语句,只有当abc为0(假)时,才结束循环。本题循环两次。2当a,b,c的值分别为1,2,3时,以下程序段执行后a,b,c的值为_、_、_。if(ac) a
3、=c;else a=b;c=b;b=a;分析:c=b;b=a;语句不属于分支结构组成部分。答案:3,3,2。3若想通过输入语句使字符数组a中存放字符串“1234”,字符变量b中存放字符5 , 则输入数据的语句形式应该是scanf( (1) );答案:scanf(“%s %c”,a,&b);对应的键入内容应该为:12345分析:注意在%s与%c之间一定要加空格,此空格的作用为:因为在键盘键入数据时,字符串输入的结束是以空格为标志的。此处加一个(或多个)空格用来对应键入数据时字符串的结束标志。如此处不加空格,则字符串的结束标志即空格符将会被字符变量b所接收,使得空格符后的内容将不会送入字符变量b中
4、,从而不能达成预期的目的。即在%s与%c之间加空格的目的1)对应字符串输入结束标志,2)避免字符变量b接收空格。本程序段完整代码应该为:char a10,b;scanf(“%s %c”,a,&b);printf(“%sn”,a);printf(“%cn”,b);4设x和y均为int型变量,且x=1,y=2,则表达式1.0+x/y的值为 (3) 。答案:1.0(1.000000)必须有小数部分。分析:1.0+x/y表达式的类型为double型。请参见教材p54。float型在运算时一律先转换成double型,以提高运算精度。而int型与double 型混合运算时,int型先转换为double型,
5、然后在两个double型数据间进行运算。所以本题1.0先变为double型,x/y也要由int型转换成double型,则整个表达式为double型。注意:如果用printf(“%d”,1.0+x/y);则结果为0。因为double型数据占用8个字节空间,而int型数据占用2个字节空间。double型1.0的后两个字节内容应该为0。5以下程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串,请填空。 #include main() char str81,*sptr; (13) ;/* int i; */ for(i=0;i80; (14) ) /* i+ */ stri=ge
6、tchar(); if(stri=n) break; stri= (15) ; /* 0 */ sptr=str ; while(*sptr) putchar( (16) ); /* *sptr+ */分析:1)putchar函数属标准输入输出函数,所以应该使用#include 语句。2)putchar函数中的参数应该使用字符型变量或字符常量。所以本题在putchar函数中使用的参数是*sptr(输出字符指针变量sptr所指向单元中的字符常量)。6下面程序的输出结果是 (2) 。 char b =ABCD; main() char *chp ; for (chp =b;*chp ;chp +=
7、2) printf(%s,chp); printf(n); 7设i,j,k均为int型变量,则执行完下面的for循环后,k的值为 (4) . for(i=0,j=10 ; i=j ; i+, j-) k=i+j;8设有以下定义的语句: int a32=10,20,30,40,50,60, (*p)2; p=a; 则 *(*(p+2)+1)值为 (5) 。9在C程序设计中,可以将被调用函数中的值代回调用函数的三种方法分别是 (10) , (11) 和 (12) 。10以下程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串,请填空。 #include stdio.h main
8、() char str81,*sptr; (13) ; for(i=0;i80; (14) ) stri=getchar(); if(stri=n) break; stri= (15) ; sptr=str ; while(*sptr) putchar( (16) ); 11 以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差.例如:输入的两个字符串分别为abcdef和abceef,则输出为-1。请填空。 #include main() char str100 , str2100 , c; int i , s; printf(n input
9、string 1:n); gets (str1); printf(n input string 2:n); (17) /* gets(str2); */ i=0; while(strli= =str2i) & (str1i!= (18) ) /* 0 */ i+; s= (19) ; /* str1i-str2i */ printf(%dn,s);注意:gets也属于标准输入输出函数,用于输入字符串(串中可以含空格)。 12以下程序打印所有符合下列条件的3位正整数:是某一个数的平方数,其中有两位数字相同。如100,121等。main() int a,b,c,n,k; for(k=0;k+) n
10、= (20) ; /* k*k */ if(n999) break ; a=n/100; b=_(21)_; /* n/10%10 */ c=n%10; if(!(a-b)*(b-c)*(c-a) & n=100 ) printf(“n%d,%d”,n,k); 13以下程序可以把从键盘上输入的十进制数(long型)以二到十六进制形式输出,请填空。 #include main() char b16=0,1,2,3,4,5,6,7,8,9,A,B,C ,D,E,F; int c64,d,i=0,base; long n; printf(enter a number:n); scanf(%ld,&n
11、); printf(enter new base:n); scanf(%d,&base); do ci= (22) ; /* n%base */ i+; n=n/base; while(n!=0); printf(transmite new base:n); for(-i ; i=0 ; -i ) d=ci; printf(%c , b (23) ); /* d */ 14下述程序用于统计文件中的字符个数,请填空。#include void main()FILE *fp; long num=0; if(fp=fopen(TEST,r)= =NULL) printf(Cant open file
12、.); return; while(_(24)_) /* fgetc(fp)!=EOF */ num+; _(25)_; /* fclose(fp) */ printf(num=%ld,num);分析:1) EOF是一个文件结束标志,其值为1。EOF不是可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现1,因此EOF定义为1是合适的。当读入的字符值等于1(即EOF)时,表示读入的已不是正常的字符而是文件结束符。但EOF只适用于文本文件。一情况下为了通用于文本文件和二进制文件,使用feof()函数来判断文件是否已经结束。注意:feof()函数为真时,位置指针指向EOF之后的位置。
13、而使用常量EOF(-1)来判断文本文件是否结束时,则位置指针到EOF为止。2) fopen中的”r”是只读文本文件方式,它等效于”rt”,而不是”rb”。三)1998秋等级考试1下面的程序打印杨辉三角形,其格式为: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1程序如下:#define N 11/*1998年秋 填空题9*/main() int i,j,aN+1N+1; for(i
14、=1;i=N;i+) aii=1; ai1=1; for( ;iN;i+)/* i=3 */ for(j=2;j+) /* ji */ aij=; /* ai-1j-1+ai-1j */ for(i=1;i0) printf( );j-; /* 决定每一行输出的起始位置 */ for(j=1;j=i;j+) printf(%6d,aij); printf(n); printf(n);2下面程序首先建立一个链表,函数fmax()的功能是:求出链表所有结点中数据域值最大的结点的位置,并由参数s返回给主函数。该函数的第一个参数是链表的首指针。#include #include struct node
15、 int data; struct node *next; ; void fmax(struct node *head,struct node ) struct node *p; p=head;*s=p; if(p=NULL) return; while(p) if(p-data ) *s=p; p= ; void print(struct node *p) while(p) printf(%5d,p-data); p=p-next; /*h为头结点指针,p为指向新开辟结点的指针,p1为指向链表尾结点的指针*/ main() struct node *h=0,*p,*p1; int a; pr
16、intf(Input data:); scanf(%d,&a); while(a!=-1) p=(struct node *)malloc(sizeof(struct node); p-data=a; if(h=0) h=p;p1=p; else p1-next=p;p1=p; printf(Input data:); scanf(%d,&a); p-next=0; print(h); printf(n); fmax(h,&p); if(p) printf(Max data is:%dn,p-data); 四)1999春等级考试题:下列程序首先建立一个链表,并输出链表上的数据值。函数fun()
17、的参数是链表的首指针,它完成的功能是:将链表中各结点分量data的数值为偶数的结点依次调到链表的前面。方法是:根据结点的值,分为奇偶数两个链表,然后将两个链表拼接在一起。 #include #include struct node int data; struct node *next; ;/*p指向当前结点,p1指向奇数子链表尾结点,odd指向奇数子链表首结点,p2指向偶数子链表尾结点,even指向偶数子链表首结点,*/struct node *fun(struct node *head) struct node *p=head,*even=0,*odd=0,*p1=0,*p2=0; if(
18、head=NULL) return head; while(p) if(p-data%2) if(odd=0)odd=p;p1=p; else;p1=p; else if(even=0)even=p;p2=p; else;p2=p; p=p-next; if(odd) p-next=0; /*将奇数子链表放在后面*/ if(even) head=even; /*如果有偶数子链表,将偶数子链表放在前面*/ else head=odd; /*如果没有偶数子链表,则仅有奇数子链表,使head指向奇数子链表*/ return head; void print(struct node *p) while
19、(p) printf(%5d,p-data); p=p-next; /*h为头结点指针,p为指向新开辟结点的指针,p1为指向链表尾结点的指针*/main() struct node *h=0,*p,*p1; int a; printf(Input data:); scanf(%d,&a); while(a!=-1) p=(struct node *)malloc(sizeof(struct node); p-data=a; if(h=0) h=p;p1=p; else p1-next=p;p1=p; printf(Input data:); scanf(%d,&a); p-next=0; pr
20、int(h); printf(n); h=fun(h); print(h); 五)2000春等级考试题:1说明“int j=5,m2,k7,n;”,执行语句“n+=m*=n=j*k;”后,n和m的值分别为_和_。/* 2000春填空题1 */2下列程序输出的两个数分别是_和_。/* 2000春填空题2 */main() static int x33=1,2,5,6,7,8,9,(*p)3; p=x; printf(“%dt%dn”,(*(p+1)1,p00);3#include /*00春_填空6*/main() int a=1,b=2,x1,x2,x3; x1=add(a,b); x2=ad
21、d(add(a,b),b); x3=add(a,b); printf(%dn%dn%dn,x1,x2,x3);int add(int x,int y) static int z=1; z=x+y+z; return(z);程序输出的第一行是_,第二行是_,第三行是_。答案:4 16 19分析:关键在于理解静态局部变量z的生存期,z始终存在,直至main程序运行结束。另外,x1,x2,x3的值与变量z的三次变化是一致的。4 #include /*00春_填空7*/void f(int *p1, int *p2) int *t; t=p1;p1=p2;p2=t; main() int a=10,b
22、=20; printf(%d,%dn,a,b); f(&a,&b); printf(%d,%dn,a,b);程序输出的第一行是_,第二行是_。答案:10 2010 20分析:在fun函数中改变了指针变量p1,p2中保存的值(即指针),使其指向发生了变化,但变量a,b中的值并未发生变化。5 #include /*00春_填空8*/void fun(int *a,int b,int *c) *a=+b;b=*c;*c=*a; main() int a=10,b=20,c=30; int a=4; c=a+b; printf(%dn,a+b+c); int c=b; /* 此处定义的变量c与最外层定
23、义*/ fun(&a,b,&c); /* 的变量c为两个不同的变量 */ printf(%dn,a+b+c); printf(%dn,a+b+c); 程序输出的第一行是_,第二行是_,第三行是_。答案:48 62 65分析:本题主要考察变量的作用域。main函数中有两层复合语句嵌套,在复合语句中定义的变量,其作用域仅限于本复合语句范围内。1) 最先定义的变量a=10一直未使用,而变量b=20的值一直有效。2) 变量c在最内层复合语句中重新进行了定义c=b; ,而经过fun函数的调用后a,c中的值又发生了变化。3) 最内层复合语句执行结束后,在本层定义的c被释放,进入其相邻外层,此时使用的c为c
24、=a+b; 中所得到的c变量值24。4) 在不同复合语句中定义的同名变量c为不同的变量。6 #include /*00春_填空9*/void f(int *p,int n) int i,j; for(i=0;in;i+) for(j=i+1;jn;j+) if(pi&pj&(pj%pi=0) pj=0;main() int a28,i,j=0; for(i=0;i28;i+) ai=i+2; f(a,28); for(i=0;i28;i+) if(ai) printf(%dt,ai); if(+j%5=0) printf(n); 程序输出的第一行是_,第二行是_。答案: 2 3 5 7 111
25、3 17 19 23 29分析:本题f函数的功能是用筛选法求质数。main生成28个(229)数字,然后用f函数求229之间的质数。最后把未筛掉的数字(质数)进行输出,且每行输出5个数字。注意:在f函数中, if(pi&pj&(pj%pi= =0) 条件含义是pi0且pj0且pj能被pi整除。六)2000秋等级考试题1char *fun(char *s)/*00秋_填空6*/ int i,j; for(i=j=0;si!=0;i+) if(si!=c) sj+=si; sj=0; return s;main() printf(%s,fun(chance); 程序输出结果是_。答案:hane分析
26、:本程序实现删除字符串中的某个字符(c)的作用。其中函数fun是指针型函数,返回的指针s指向一个字符串,即hane。2int *swap(int *a,int *b) /*00秋_填空7*/ int *p; p=a;a=b;b=p; return a;main() int x=3,y=4,z=5; swap(swap(&x,&y),&z); printf(%d,%d,%d,x,y,z);程序输出的结果是:_。答案:3,4,5分析:swap的功能是交换指针变量中的地址值,而不是交换x,y,z变量中的值。3main()/*00秋_填空9*/ int i,p33=1,2,3,4,5,6,7,8,9,*p13,(*p2)3; for(i=0;i3;i+) p1i=pi; p2=p; for(i=1;i3;i+) printf(n%d,%d,*(*(p1+i)+1)+1,*(*+p2+1)+1);程序运行时输出的第一行是_,第二行是_。答案:6,69,9分析:注意区别*p13,(*p2)3含意。*p13是指针数组,(*p2)3是指向数组的指针,即行指针。p2自身是一个指针变量,用于指向包含3个元素的一维数组。并且对