1、
导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习的效率。
【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。
#include
2、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
3、in(int *s,int t,int *k)
{ int p;
for(p=0,*k=p;p 4、
s=s+t;
② ;t>0?t=-1:1;
}
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】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束 5、输入。
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);
}
【3.7】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。
fun(int x,int b[])
{ int k=0,r;
do
{ r=x% 6、① ;
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 7、 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】下面程序的功能是用辗转相除法求两个正 8、整数m和n的最大公约数。
hcf(int m,int n)
{ int r;
if(m 9、 &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");
for(i=0; ⑦ ;i++ )
{ if( ⑧ )
printf("\n");
printf("%f\t",a[i]);
}
printf("\n");
}
【3.13】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。
#include "stdio.h"
main()
10、{ 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 11、)
if(s[i]!= ' ') ① ;
else ② ;
s[j]= '\0';
printf("%s",s);
}
【3.15】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。
#include 12、
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 13、 '\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 14、 "); 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++ )
sw 15、itch (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]!= 16、 '\0';i++ )
{ for(j=i,k=0; ① && s[j]==t[k];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( 17、"%ld\n",s);
}
【3.22】下面程序的功能是显示具有n个元素的数组s中的最大元素。
#define N 20
main()
{ int i,a[N];
for(i=0;i 18、自然数,并使x+y为最小。
#include 19、
③ ;
}
}
【3.24】下面的程序是用递归算法求a的平方根。求平方根的迭代公式如下:
#include 20、f\n", x, mysqrt( x, 1.0) );
}
【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。
#include 21、rintf("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"
22、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 *s 23、tr )
{ if( ① ) return (0);
else return ( ② );
}
【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。
#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的等 24、边三角形。例如当n=4时的图形如下:
*
***
*****
*******
#include 25、
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(s 26、
while( *p ) p++;
④ ;
while( s 2 ) invent ( ① ,n-2);
else ② ;
}
【3.35】从键盘上输入10个整数,程序按降序完成从大到小的排序。
#inc 27、lude 28、
scanf("%d", &array[i]); sort( ⑤ );
printf("Output:");
for( i=0; i<10; i++)
printf("%d ", array[i]);
}
【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483存放成"384"。
#include 29、)
{ int number;
scanf("%d", &number);
convert( str, number );
puts(str);
}
【3.37】下面程序的功能是实现数组元素中值的逆转。
#include 30、
while( ① )
{ k=*s;
*s=*t;
*t=k;
② ;
③ ;
}
}
【3.38】下面程序通过指向整型的指针将数组a[3][4] 的内容按3行×4列的格式输出,请给printf( )填入适当的参数,使之通过指针p将数组元素按要求输出。
#include 31、
【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。
#include 32、un(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 33、'\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( cha 34、r *s ) /* 将字符串s中的字符排序 */
{ int i,j,n;
char t,*w;
⑦ ;
for( n=0;*w != '\0'; ⑧ )
w++;
for( i=0;i 35、
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值必 36、须大于2,且不超过给定的常数值MAXNUM。
例如:若输入N的值为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++ 37、pa) = temp;
}
else
{ ② = temp/10;
total += *pa;
if( count 38、p=num, q = ⑥ ; p 39、ntf("Output: %s, %d\n", ③ , ④ );
}
【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入0时才结束。
#include 40、"anli",95.1,
2,"wangqi",90.6
};
main()
{ char str[10];
int i;
do
{ printf("Enter a name");
scanf("%s",str);
for( i=0;i 41、].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[ 42、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 43、p 44、 45、如下图),然后再按输入的相反顺序输出,并释放全部结点。
#include 46、>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】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。
# 47、include 48、
p = p->link;
}
}
【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于0时才停止输入。然后反序输出这些整数。
#include 49、in()
{ 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()
50、{ 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】下
struct stuinf
{ char name[20]; /* 学生姓名 */
int score; /* 学生成绩 */
} stu, *p;
main ( )
{ p=&stu;
printf("Enter name:");
gets( ① );
printf("Enter score: ");
scanf("%d", ② );
pri
age, p->sex);
② ;
}
}
data_out( struct man *p, int n )
{ struct man *q = __③__;
for( ;
name, p->age, p->sex);
}
【3.46】输入N个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第3个整数为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






