资源描述
导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路, 再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是 要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序 在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的 编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解, 而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而 提高学习的效率。【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+ +l/n2,求 n 值。#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.h main() 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 删除。请选择填空。#include main( ) 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, );elsei+;【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,则输出为T。#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=0long 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 20main() 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位数字相同,且x#y, 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.hmain() 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(re turn (0); else retTn);(【3.30】用递归实现将输入小于32768 的整数按逆序输 出。如输入 12345,则输出 54321。#includestdio.hmain() int n;printf(Input n : );scanf(%d, ) ;r(n) ;printf(n) ;r( int m ) printf(%d, ) ;m =;if( );【3.31】输入n值,输出高度为n的等边三角形。例如当 n=4 时的图形如下:*i* *i* *i* *i* *i* *i* *i*#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()inti; printf(Enterdata: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 的内容按3行x 4列的格式输出,请给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;/*将与*可不相同的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;int n, *pa;【3.43】下面程序的功能是输入学生的姓名和成绩,然for( n=0;*w != 0; ) int count, total, temp;后输出。w+;*pa = 2;#include for( i=0;in-1;i+ ) =3 ;struct stuinffor( j=i+1;jsj )count=2;int score; /* 学生成绩 */ while( count+n ) stu, *p; temp = *(pa-1) * *pa;main ( )main( )if( temp10 ) p=&stu; char s1100, s2100, s3200; total += temp;printf(Enter name:) ;printf(nPlease Input First String:);*(+pa) = temp;gets( );scanf(%s,s1);printf(Enter score: );printf(nPlease Input Second String:);elsescanf(%d, ) ;scanf(%s,s2); = temp/10;printf(Output: %s, %dn, , ) ;strsort(s1);total += *pa;strsort(s2);if( countn )【3.44】下面程序的功能是按学生的姓名查询其成绩排 = 0; count +; pa+;名和平均成绩。查询时可连续进行,直到输入0时才结strmerge(s1,s2,s3); = temp%10;束。printf(nResult:%s,s3);total += *pa; #include #include 【3.42】已知某数列前两项为2 和 3,其后继项根据前面#define NUM 4最后两项的乘积,按下列规则生成: struct student 若乘积为一位数,则该乘积即为数列的后继项; int ran;k 若乘积为二位数,则该乘积的十位上的数字和个位上char *name;的数字依次作为数列的两个后继项。main()float score;下面的程序输出该数列的前N项及它们的和,其中,函 int n, *p, *q, numMAXNUM; 数sum(n,pa)返回数列的前N项和,并将生成的前N项do stu = 3, liming, 89.3,存入首指针为pa的数组中,程序中规定输入的N值必须 printf(Input N=? (2N%d):, MAXNUM+1);,zhanghua, 78.2,大于2,且不超过给定的常数值MAXNUM。scanf(%d, &n) ;,anli,95.1,例如:若输入N的值为10,则程序输出如下内容:while( ) ;,wangqi, 90.6sum(10)=44printf(nsum(%d)=%dn, n, sum(n, num);2 3 6 1 8 8 6 4 2 4for( p=num, q = ; pq; p+ )main()#include stdio.hprintf(%4d, *p) ; char; tr10#define MAXNUM 100printf(n) ;int iint sum(n, pa) doif( i=NUM ) printf(Not foundn)并将输入的数按从小到大的顺序进行排列。要求:当两 printf(Enter a name); sc,ansft(r)%;s ;foir(NUiM=;0 i+ )if( printf(Name , :%tsii.name); printf(Rank,:s%t3udin.rank); printf (Average :%5.1fn, stui.score); ;, iiiiiiii while( st,rcm0p()s!t=r0 ) iiiiiiii【3.45】下面程序的功能是从终 端上输入5个人的年龄、性别和 姓名,然后输出。#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(structman *p, int n ) struct man *q = ; for( ; pq; p+ ) printf( age:sex:name ); scanf(%u%s, &p-age, p-sex) ; data_out(structman*p,intn) ,struct,man,*q,=,_; for( ; pname, p-age,p-sex);【3.46】输入N个整数,储存输入的数及对应的序号 个整数相等时,整数的排列顺序由输入的先后次序决定。 例如:输入的第3 个整数为5,第7 个整数也为5,则将 先输入的整数5排在后输入的整数5的前面。程序如下: #include stdio.h#define N 10struct int no; int num; arrayN ; main( ) int i , j, num;for( i=0; iN; i+ ) printf(enter No. %d:, i); scanf(%d, &num);for( ; j=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 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 ) ;top=top-link; putchar(p-info); free(p) ;【3.48】下面函数将指针p2所指向的线性链表,串接到 pl所指向的链表的末端。假定pl所指向的链表非空。 #define NULL 0 struct link float a;struct link *next;整数。int score;concatenate ( p1,p2 )#include struct student *next;struct list *p1,*p2;struct data; if( p1-next=NULL ) int x ;struct student *creat()p1-next=p2;struct data *link; struct student *head=NULL,*tail;else*p;long num; int a;concatenate( ,p2);input()tail= malloc(LEN); int num;dostruct data *q; scanf(%ld,%d,&num,&a);【3.49】下面程序的功能是从键盘输入一个字符串,然printf(Enter data:);if(num!=0)后反序输出输入的字符串。scanf(%d, &num); if(head=NULL) head=tail;#include if( numnum=num; tail-score=a; char data;q =;tail-next=(struct student *)malloc(LEN);struct node *link;q-x = num;*head;q-link = p;else tail-next=NULL;main()p=q;while(num!=0); char ch;return( );struct node *p;head = NULL;main()while( ch=getchar()!=n ) printf(Enter data until datadata = ch;input();链表的头指针作为函数值返回。p-link = ;printf(Output:);#include head = ;while( )#define LEN sizeof(struct student) printf(%dn, p-x);struct student; long num;while( p!=NULL )int score; printf(%c , p-data);struct student *next;p = p-link;【3.51】下面函数的功能是创建一个带有头结点的链表,struct student *creat()将头结点返回给主调函数。链表用于储存学生的学号和 struct student *head=NULL,*tail;成绩。新产生的结点总是位于链表的尾部。long num;【3.50】下面程序的功能是从键盘上顺序输入整数,直struct studentint a;到输入的整数小于0 时才停止输入。然后反序输出这些 long num;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 - 1 0 ,可以实现求1 0的阶乘。 #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.da t的新文件中。#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】以字符流形式读入一个文件,从文件中检索出 六种C语言的关键字,并统计、输出每种关键字在文件 中出现的次数。本程序中规定:单词是一个以空格或 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; imain() 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=l;while( flag & (fgets(data, 30, fp) )if ( strcmp (data, name) = 0 ) ;if( flag )fputs(name, fp);elseprintf(tData enter error !n); while ();fclose (fp);
展开阅读全文