C语言程序设计填空题及答案复习用431.pdf
_ _ 导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习的效率。【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。#include main()int a,b;scanf(%d%d,&a,&b);printf(a=%d,b=%dn,a,b);a=;b=;a=;printf(a=%d,b=%dn,a,b);【3.2】下面程序的功能是根据近似公式:2/6 1/12+1/22+1/32+1/n2,求 值。#include 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;pt;p+)if(sps*k);main()int a10,i,*k=&i;for(i=0;i10;i+)scanf(%d,&ai);findmin(a,10,k);printf(%d,%dn,*k,a*k);【3.4】下面程序的功能是计算 1-3+5-7+-99+101 的值。main()int i,t=1,s=0;for(i=1;i0?t=-1:1;printf(%dn,s);【3.5】有以下程序段:s=1.0;for(k=1;kamax)amax=x;if()amin=x;scanf(%f,&x);printf(namax=%fnamin=%fn,amax,amin);【3.7】下面程序的功能是将形参 x 的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为 0 的元素中。fun(int x,int b)int k=0,r;do r=x%;bk+=r;x/=;while(x);【3.8】下面程序的功能是输出 1到 100 之间每位数的乘积大于每位数的和的数。例如数字 26,数位上数字的乘积 12 大于数字之和 8。main()int n,k=1,s=0,m;for(n=1;ns)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()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(mn)r=m;n=r;r=m%n;while()m=n;n=r;r=m%n;【3.12】下面程序的功能是使用冒泡法对输入的 10 个浮点数从小到大进行排序。排好序的 10 个数分两行输出。程序如下:#include main();int i,j;printf(Input 10 numbers pleasen);for(i=0;i+)scanf(%f,&ai);printf(n);for(i=2;i+)for(j=0;j+)if()x=aj;aj+1=x;printf(The sorted 10 numbers;n);for(i=0;i+)if()printf(n);printf(%ft,ai);printf(n);【3.13】下面程序的功能是读入 20 个整数,统计非负数个数,并计算非负数之和。#include stdio.hmain()int i,a20,s,count;s=count=0;for(i=0;i20;i+)scanf(%d,);for(i=0;i20;i+)if(ai0);s+=ai;count+;printf(s=%dt count=%dn,s,count);【3.14】下面程序的功能是删除字符串 s 中的空格。#include main()char*s=Beijing ligong daxue;int i,j;for(i=j=0;si!=0;i+)if(si!=);else;sj=0;printf(%s,s);【3.15】下面程序的功能是将字符串 s 中所有的字符c删除。请选择填空。#includemain()char s80;int i,j;gets(s);for(i=j=0;si!=0;i+)if(si!=c);sj=0;puts(s);【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。#include char x=programming;char y=Fortran;main()int i=0;while(xi!=0&yi!=0)if(xi=yi)printf(%c,);else i+;_ _ 【3.17】下面程序的功能是将字符串 s 中的每个字符按升序的规则插到数组 a 中,字符串 a 已排好序。#include main()char a20=cehiknqtw;char s=fbla;int i,k,j;for(k=0;sk!=0;k+)j=0;while(sk=aj&aj!=0)j+;for();aj=sk;puts(a);【3.18】下面程序的功能是对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII 码之差。例如:输入的两个字符串分别为abcdefg和abceef,则输出为-1。#include main()char str1100,str2100,c;int i,s;printf(Enter string 1:);gets(str1);printf(Enter string 2:);gets(str2);i=0;while(str1i=str2i&str1i!=)i+;s=;printf(%dn,s);【3.19】下面的函数 expand 在将字符串 s 复制到字符串 t 时,将其中的换行符和制表符转换为可见的转义字符表示,即用n表示换行符,用t表示制表符。expand(char s,char t)int i,j;for(i=j=0;si!=0;i+)switch(si)case n:t =;tj+=n;break;case t:t =;tj+=t;break;default:t =si;break;tj=;【3.20】下面的函数 index(char s,char t)检查字符串 s 中是否包含字符串 t,若包含,则返回 t 在 s 中的开始位置(下标值),否则送回-1。index(char s,char t)int i,j,k;for(i=0;si!=0;i+)for(j=i,k=0;&sj=tk;j+,k+);if()return(i);return(-1);n【3.21】下面程序的功能是计算 S=k!。k=0 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(%ldn,s);【3.22】下面程序的功能是显示具有 n 个元素的数组 s中的最大元素。#define N 20 main()int i,aN;for(i=0;iN;i+)scanf(%d,&ai);_ _ printf(%dn,);fmax(int s,int n)int k,p;for(p=0,k=p;psk);return(k);【3.23】下面程序的功能是由键盘输入 n,求满足下述条件的 x、y:nx 和 ny 的末 3 位数字相同,且 xy,x、y、n 均为自然数,并使 x+y 为最小。#include 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;scanf(%d,&n);for(min=2;flag;min+)for(x=1;xmin&flag;x+)if(&pow3(n,x)=pow3(n,min-x)printf(x=%d,y=%dn,x,min-x);【3.24】下面的程序是用递归算法求 a 的平方根。求平方根的迭代公式如下:#include 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=%lfn,x,mysqrt(x,1.0);【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为 10 岁,其余学生的年龄一个比一个大 2岁,求第 5 个学生的年龄。#include age(int n)int c;if(n=1)c=10;else c=;return(c);main()int n=5;printf(age:%dn,);【3.26】下面的函数 sum(int n)完成计算 1n 的累加和。sum(int n)if(n=0)printf(data errorn);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 为止。当 n2*m 时,可先用公式(1)进行简化,填写程序中的空白,使程序可以正确运行。#includestdio.h main()int m,n;printf(Input m,n=);scanf(%d%d,&m,&n);printf(The combination numbeers is%dn,combin(m,n);_ _ combin(int m,int n)int com;if(n2*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。#includestdio.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 void prt(char c,int n)if(n0)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+();【3.33】函数 revstr(s)将字符串 s 置逆,如输入的实参s 为字符串abcde,则返回时 s 为字符串edcba。递归程序如下:revstr(char*s)char*p=s,c;while(*p)p+;if(sp)c=*s;*s=*p;revstr(s+1);如下是由非递归实现的 revstr(s)函数:revstr(s)char*s;char*p=s,c;while(*p)p+;while(s2)invent(,n-2);else;【3.35】从键盘上输入 10 个整数,程序按降序完成从大到小的排序。#include int array10;sort(int*p,int*q)int*max,*s;if()return;max=p;for(s=p+1;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;i10;i+)scanf(%d,&arrayi);sort();printf(Output:);for(i=0;i10;i+)printf(%d,arrayi);【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483 存放成384。#include void convert(char*a,int n)int i;if(i=n/10)!=0)convert(,i);*a=;char str10=;main()int number;scanf(%d,&number);convert(str,number);puts(str);【3.37】下面程序的功能是实现数组元素中值的逆转。#include main()int i,n=10,a10=1,2,3,4,5,6,7,8,9,10;invert(a,n-1);for(i=0;i10;i+)printf(%4d,ai);printf(n);invert(int*s,int num)int*t,k;t=s+num;while()k=*s;*s=*t;*t=k;【3.38】下面程序通过指向整型的指针将数组 a34 的内容按行列的格式输出,请给 printf()填入适当的参数,使之通过指针 p 将数组元素按要求输出。#include int a34=1,2,3,4,5,6,7,8,9,10,11,12,*p=a;main()int i,j;for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,);【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。#include main()char str81,*sptr;int i;for(i=0;iwp);for(i=*n;i=p;i-);wp=x;+*n;【3.41】下面程序的功能是从键盘上输入两个字符串,对两个字符串分别排序;然后将它们合并,合并后的字符串按 ASCII 码值从小到大排序,并删去相同的字符。#include 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;in-1;i+)for(j=i+1;jsj)main()char s1100,s2100,s3200;printf(nPlease Input First String:);scanf(%s,s1);printf(nPlease Input Second String:);scanf(%s,s2);strsort(s1);strsort(s2);=0;strmerge(s1,s2,s3);printf(nResult:%s,s3);【3.42】已知某数列前两项为 2 和 3,其后继项根据前面最后两项的乘积,按下列规则生成:若乘积为一位数,则该乘积即为数列的后继项;若乘积为二位数,则该乘积的十位上的数字和个位上的数字依次作为数列的两个后继项。下面的程序输出该数列的前项及它们的和,其中,函数 sum(n,pa)返回数列的前 N 项和,并将生成的前 N项存入首指针为 pa 的数组中,程序中规定输入的 N 值必须大于 2,且不超过给定的常数值 MAXNUM。例如:若输入的值为 10,则程序输出如下内容:sum(10)=44 2 3 6 1 8 8 6 4 2 4#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(temp10)total+=temp;*(+pa)=temp;else =temp/10;total+=*pa;if(countn)_ _ count+;pa+;=temp%10;total+=*pa;main()int n,*p,*q,numMAXNUM;do printf(Input N=?(2N%d):,MAXNUM+1);scanf(%d,&n);while();printf(nsum(%d)=%dn,n,sum(n,num);for(p=num,q=;pq;p+)printf(%4d,*p);printf(n);【3.43】下面程序的功能是输入学生的姓名和成绩,然后输出。#include struct stuinf char name20;/*学生姓名*/int score;/*学生成绩*/stu,*p;main()p=&stu;printf(Enter name:);gets();printf(Enter score:);scanf(%d,);printf(Output:%s,%dn,);【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入 0 时才结束。#include#include#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()char str10;int i;do printf(Enter a name);scanf(%s,str);for(i=0;i=NUM)printf(Not foundn);while(strcmp(str,0)!=0);【3.45】下面程序的功能是从终端上输入个人的年龄、性别和姓名,然后输出。#include stdio.h struct man char name20;unsigned age;char sex7;main()struct man person5;data_in(person,5);data_out(person,5);data_in(struct man*p,int n)struct man*q=;for(;page,p-sex);_ _ data_out(struct man*p,int n)struct man*q=_;for(;pname,p-age,p-sex);【3.46】输入 N 个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第 3 个整数为 5,第 7 个整数也为 5,则将先输入的整数 5 排在后输入的整数 5 的前面。程序如下:#include stdio.h#define N 10 struct int no;int num;arrayN;main()int i,j,num;for(i=0;i=0&arrayj.num num;)arrayj+1=arrayj;array .num=num;array .no=i;for(i=0;iN;i+)printf(%d=%d,%dn,i,arrayi.num,arrayi.no);【3.47】以下程序的功能是:读入一行字符(如:a、.y、z),按输入时的逆序建立一个链接式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。#include 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);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 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;【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于 0 时才停止输入。然后反序输出这些整数。#include struct data int x;struct data*link;*p;input()int num;struct data*q;printf(Enter data:);scanf(%d,&num);if(numx=num;q-link=p;p=q;main()printf(Enter data until datax);【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);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#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 main()long num=0;*fp;if(fp=fopen(fname.dat,r)=NULL)printf(Cant open the file!);exit(0);while()fgetc(fp);num+;printf(num=%dn,num);fclose(fp);【3.54】下面程序的功能是把从键盘输入的文件(用 作为文件结束标志)复制到一个名为 second.txt 的新文件中。#include FILE*fp;main()char ch;if(fp=fopen()=NULL)exit(0);while(ch=getchar()!=)fputc(ch,fp);【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。#include main(int argc,char*argv)FILE&f1,*f2;if(argc )printf(The command line error!);exit(0);f1=fopen(argv1,r);f2=fopen(arhv2,w);while()fputs(fgetc(f1),);【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是 sm,则执行该程序时输入:sm+10,可以实现10 的累加;输入:sm-10,可以实现求 10 的阶乘。#include#include main(int argc,char*argv)int n;void sum(),mult();void(*funcp)();n=atoi(argv2);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;im;i+);printf(sum=%dn,s);void mult(int m)long int i,s=1;for(i=1;i0)n);exit(0);【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt 中,然后从该文件读出字符串并显示出来。#include main()char str100;int i=0;FILE*fp;if(fp=fopen(test.txt,)=NULL)printf(Cant open the file.n);exit(0);printf(Input a string:n);gets(str);while(stri)if(stri=a&stri=z)stri=;fputc(stri,fp);i+;fclose(fp);fp=fopen(test.txt,);fgets(str,strlen(str)+1,fp);printf(%sn,str);fclose(fp);【3.58】下面程序的功能是将从终端上读入的 10 个整数以二进制方式写入名为bi.dat的新文件中。#include FILE*fp;main()int i,j;if(fp=fopen(,wb)=NULL)exit(0);for(i=0;i10;i+)scanf(%d,&j);fwrite(,sizeof(int),1,);fclose(fp);【3.59】以字符流形式读入一个文件,从文件中检索出六种语言的关键字,并统计、输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或t、n结束的字符串。#include#include FILE*cp;char fname20,buf100;int num;struct key char word10;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 bufi+=c;while(c=&c!=&c!=t&c!=n)bufi+=c;bufi=0;return(buf);lookup(char*p)int i;char*q,*s;for(i=0;inum;i+)q=;s=p;while(*s&(*s=*q)if()keywordi.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:%sn,fname);exit(0);num=sizeof(keyword)/sizeof(struct key);while()lookup(word);fclose(cp);for(i=0;inum;i+)printf(keyword:%-20scount=%dn,keywordi.word,keywordi.count);【3.60】下面程序的功能是从键盘接受姓名(例如:输入ZHANG SAN),在文件try.dat中查找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:若磁盘文件try.dat,已存在,则要保留文件中原来的信息;若文件try.dat不存在,则在磁盘上建立一个新文件;当输入的姓名为空时(长度为 0),结束程序。#include main()FILE*fp;int flag;char name30,data30;if(fp=fopen(try.dat,)=NULL)printf(Open file errorn);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);