【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。 #include main() { int a,b;
scanf(\"%d%d\; printf(\"a=%d,b=%d\\n\; a= ① ; b= ② ; a= ③ ;
printf(\"a=%d,b=%d\\n\; }
【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;p printf(\"%d,%d\\n\; } 【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\; } 【3.5】有以下程序段: s=1.0; for(k=1;k<=n;k++) s=s+1.0/(k*(k+1)); printf(\"%f\\n\; 填空完成下述程序,使之与上述程序的功能完全相同。 s=0.0; ① ; k=0; do { s=s+d; ② ; d=1.0/(k*(k+1)); }while( ③ ); printf(\"%f\\n\; 【3.6】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束输入。 main() { float x,amax,amin; scanf(\"%f\; amax=x; amin=x; while( ① ) { if(x>amax) amax=x; if( ② ) amin=x; scanf(\"%f\; } printf(\"\\namax=%f\\namin=%f\\n\; } 【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; s+=m; ③ ; } if(k>s) printf(\"%d\; } } 【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\; } 【3.10】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。 main() { int i,j; for(i=0; ① ;i++) { j=i*10+6; if( ② ) countinue; printf(\"%d\; } } 【3.11】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。 hcf(int m,int n) { int r; if(m 【3.12】下面程序的功能是使用冒泡法对输入的10个浮点数从小到大进行排序。排好序的10个数分两行输出。程序如下: #include main() { ① ; int i,j; printf(\"Input 10 numbers please\\n\"); for(i=0; ② ;i++ ) scanf(\"%f\; 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\\; } 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\ count=%d\\n\; } 【3.14】下面程序的功能是删除字符串s中的空格。 #include 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\; } 【3.15】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。 #include main( ) { char s[80]; int i,j; gets(s); for(i=j=0;s[i]!= '\\0';i++ ) if(s[i]!= 'c') ① ; s[j]= '\\0'; puts(s); } 【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。 #include 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 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 main() { char str1[100],str2[100],c; int i,s; 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\; } 【3.19】下面的函数expand在将字符串s复制到字符串t时, 将其中的换行符和制表符转换为可见的转义字符表示,即用'\\n'表示换行符,用'\'表示制表符。 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[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=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\; s= ③ ; for(k=0;k<=n;k++) s+= ④ ; printf(\"%ld\\n\; } 【3.22】下面程序的功能是显示具有n个元素的数组s中的最大元素。 #define N 20 main() { int i,a[N]; for(i=0;i { int k,p; for(p=0,k=p;p 【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\; for(min=2;flag;min++) for(x=1;x if( ② && pow3(n,x)==pow3(n,min-x)) { printf(\"x=%d,y=%d\\n\; ③ ; } } 【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\; printf(\"The sqrt of %lf=%lf\\n\; } 【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:%d\\n\② ); } 【3.26】下面的函数sum(int n)完成计算1~n的累加和。 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\; printf(\"The combination numbeers is %d\\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。 #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 void prt( char c, int n ) { if( n>0 ) { printf( \"%c\; ① ; } } main() { int i, n; scanf(\"%d\; 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(s { c=*s; *s=*p; ② ; revstr(s+1); ③ ; } } 如下是由非递归实现的revstr(s)函数: revstr (s) char *s; { char *p=s, c; while( *p ) p++; ④ ; while( s { 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 int array[10]; sort( int *p, int *q ) { int *max, *s; 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\; sort( ⑤ ); printf(\"Output:\"); for( i=0; i<10; i++) printf(\"%d \; } 【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483存放成\"384\"。 #include void convert(char *a, int n) { int i; if((i=n/10) !=0 ) convert( ① , i ); *a = ② ; } char str[10]= \" \"; main() { int number; scanf(\"%d\; convert( str, number ); puts(str); } 【3.37】下面程序的功能是实现数组元素中值的逆转。 #include 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(\"M\; 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 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(\"M \① ); } } 【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。 #include 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码值从小到大排好序的字符串中。 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 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 for( j=i+1;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:\"); 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 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++ { temp = *(pa-1) * *pa; if( temp<10 ) { total += temp; *(++pa) = temp; } else { ② = temp/10; total += *pa; if( count { count ++; pa++; ③ = temp; total += *pa; } } } ④ ; } main() { int n, *p, *q, num[MAXNUM]; do { printf(\"Input N=? (2【程序填空题参考答案】 【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<=n 【3.6】答案: ① x>=0 ② x 【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*n00 ② x!=min-x ③ flag=0 【3.24】答案:① (x0+a/x0)/2 ② a,x1 注释:根据迭代公式,①处应当是计算迭代值x1=(x0+a/x0)/2。按照求平方根的要求,当迭代的精度不能满足\"(fabs(x1-x0)>0.00001)\"时,则要继续迭代,因此②处应当填写\"a,x1\"。程序中调用了求绝对值的库函数fabs( )。 【3.25】答案:① 2+age(n-1) ② age(5) 注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式: age(n) = 10 (n=1) age(n) = 2+age(n-1) (n>1) 对照程序和递归公式可以看出:n的含义是第n位学生。很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。在①处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。 【3.26】答案:① return(1) ② return (sum(n-1)+n) 注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。 将问题\"求1~n的累加和\"的公式写成递归定义,可以是如下形式; sum(n)=1 当n=1时 sum(n)=sun(n-1)+n 当n>1时 根据此递归定义,可以很容易完成程序。 【3.27】答案:① return(1) ② n*facto(n-1) 注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式; n!=1 当n=1时 n!=n*(n-1) 当n>1时 根据此递归定义,可以很容易完成程序。 【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m) 注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句\"if (n<2*m) m=n-m;\"完成了题目中叙述的\"用公式(1)进行简化\"的工作。 【3.29】答案:① *str=='\\0' ② 1+strlen(str+1) 注释:求串长算法的关键是确定串结束标记'\\0'的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符 如果 当前字符(*str)== 串结束标记'\\0' 则 串长=0 否则 串长 = 1+除第一个字符之外的剩余字符串的串长 因此,在①的位置上应当填写\"*str=='\\0'\",以判断当前字符(*str)是否是串结束标记'\\0'。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写\"1+strlen(str+1)\"。 【3.30】答案:① &n ② m ③ m/10 ④ m>0 ⑤ r(m) 【3.31】答案:① prt(c, n-1) ② prt(' ' , n-i) ③ prt('*', i) 注释:函数prt的功能是输出n个字符c。 【3.32】答案:① y(x, n-1) 注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。 y(x,n)=x 当n=0时 y(x,n)=sqrt(x+y(x,n-1)) 当n>0时 【3.33】答案:① p-- ② *p='\\0' ③ *p=c ④ p-- ⑤ *s++ 注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p 所指向的字符串尾的字符('\\0')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行\"c=*s\",将首字符存入临时变量;然后执行\"*s=*p\",将尾字符存入串首;执行\"revstr(s+1)\"是递归处理串的中间部分,这时,在②处应当填入\"*p='\\0'\",即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写\"*p=c\"。 【3.34】答案:① str+1 ② return ①改为 n-2 【3.35】答案:① p>=q ② max=s ③ p,max ④ p+1,q ⑤ &array[0], &array[9] 注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句\"for( s=p+1; s<=q; s++)\"中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填\"p>=q\"、⑤处应填\"&array[0],&array[9]\"。 由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填\"max=s\"。 当调用函数swap交换两个变量值的时候,要求实参是变量的地址,因此,③处应填\"p,max\"将最大值存入指针p所指的单元。 由于问题的要求是\"从大到小\"排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填\"p+1,q\"。 【3.36】答案:① a+1 ② n+'0' 【3.37】答案:① s 【3.38】答案;①*(p+4*i+j) 注释:p是一个一级指针,赋值后保存二维数组a的首地址,做加法运算加1时,实际地址增加一个它所指向的数据类型的长度。在C语言中,多维数组在计算机中是按行存储的,所以在本题中要通过指针访问二维数组中的数据,必须将二维下标转换为一维下标。 【3.39】答案:① '\\0' 或 0 ② ++ 注释:在C语言中,进行字符串处理时,必须注意串结束标记'\\0',它是在进行串处理时的最基本的要求,所以①中要填入'\\0'。为了使用putchar输出一个字符串,则必须有改变指针的运算,这里只能使用++运算。 【3.40】答案:① p++ ② w[i+1]=w[i] 【3.41】答案:① && ② *a<*b ③ *a++, *b++ ④ == ⑤ != ⑥ '\\0' ⑦ w=s ⑧ n++ ⑨ t=s[i];s[i]=s[j];s[j]=t; ⑩ s3[0] 【3.42】答案:① *++pa ② *++pa ③ *pa ④ return(total) ⑤ n<=2 || n>=MAXNUM+1 ⑥ num+n 【3.43】答案:① stu.name ② &stu.score ③ p->name ④ p->score 注释:这是结构中的最基本概念。 【3.44】答案:① struct student ② strcmp(stu[i].name,str)==0 ③ break 注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。②处为if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写:strcmp(stu[i].name,str)==0。③处应当将控制退出内层的for循环,只能选择break语句。 【3.45】答案:① p+n ② gets(p->name) ③ p+n 注释:本程序是通过函数完成对于结构数组的输入和输出操作。函数data_in和data_out十分相似,都是通过结构指针p和结构指针q来操作结构数组的元素。由于指针q在两个函数中的作用相同,所以①和③填写的内容也应该是相同的;由for语句中的循环终止条件\"pname)。 【3.46】答案:① j=i-1 ② > ③ j-- ④ j+1 ⑤ j+1 注释:程序的基本思想是:对于输入的第i个整数num,从数组array中已有的元素中倒序开始查找。若数组array中的第j个元素的值大于num,则将数组中的元素j向后移动一个位置;否则,就应将num插入到当前位置作为元素j。因此,程序的基本设计思想就是插入排序。 程序中内层的for循环完成查找插入位置的工作,因此答案①、②和③有密切的关系,要统一考虑。同样,程序中的答案④和⑤也有密切的关系,要统一考虑。 【3.47】答案:① != '\\n' ② p=top 【3.48】答案:① p1->next 【3.49】答案:① head ② p ③ p=head 注释:程序在从键盘接受字符的同时就在建立起链表,所建立的链表本身就已经是反序排列的,因此在反序输出字符串的时候实际只需沿着链表的第一个结点开始,顺序操作即可。 【3.50】答案:① return ② (struct data *) malloc(sizeof(struct data)) ③ input( ) ④ p!=NULL ⑤ p=p->next 【3.51】答案:① (struct student *) ② tail=tail->next ③ head 注释:①malloc函数的作用是在内存开辟指定字节数的存储空间,并将此存储空间的地址返回赋给尾指针tail,但是此地址为void型,应将其强制转换为所要求的结构指针类型。 ②新开辟的结点的内存地址存于tail所指向的已建立的链表的尾结点的结构成员next,新结点连入链表以后,尾指针tail应指向新的结点。 【3.52】答案:① (struct student *) ② (struct list *) ③ return(head) 【3.53】答案:① FILE ② !feof(fp) 注释:FILE 是文件结构类型名。feof()是测试文件结束标志的函数。 【3.54】答案:① \"second.txt\" ② fclose(fp) 【3.55】答案:① 3 ② !feof(f1)或feof(f1)==0 ③ f2 ④ fclose(f2) ⑤ fclose(f1) 注释:程序中使用了带参数的main函数,其中整型参数argc为命令行中字符串的个数,此程序运行时输入的字符串有可运行程序名、文件1和文件2,故argc不应小于3。字符串指针argv[0]指向可运行程序名、字符串指针argv[1]指向输入文件名、字符串指针argv[2]指向输出文件名,由上所述②处给出循环条件是输入文件是否结束,③处需要填出输出文件名。最后两处是关闭两个文件,原则上关闭文件没有顺序要求,但习惯上是后打开的文件先关闭。 【3.56】答案:① *argv[1] ② (*funcp)(n) ③ s+=i 注释:程序执行时输入的命令及参数的个数(操作系统规定用空格表示字符串的分隔)由系统赋给主函数的形数argc,输入的命令和参数以字符串 的格式保存,字符串的首地址分别赋给指针数组argv的各个元素,其中argv[1]是'+'或'-',分别表示累加或阶乘。程序根据argv[1]所指向的字符串的内容给指向函数的指针变量funcp赋值。②处要求的语句是根据指向函数的指针变量的内容对相应的函数实现调用,所以选择A或B是错误的;据funcp是被调函数的地址,*funcp实现了对函数的调用,根运算符的结合性,(*funcp)表示取funcp的目标,而*funcp(n)则funcp先和(n)结合,funcp就被解释为函数名,显然是错误的。 【3.57】答案:① \"w\" ② -32 ③ \"r\" 【3.58】答案:① \"bi.dat\" ② &j ③ fp 【3.59】答案:① fgetc(fp))!=EOF ② &keyword[i].word[0] ③ s++; q++; ④ *s==*q ⑤ (word=getword(cp))!=NULL 【3.60】答案:① \"a+\" ② rewind(fp) ③ !=NULL ④ flag=0 ⑤ ferror(fp)==0 因篇幅问题不能全部显示,请点此查看更多更全内容