1、【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;iamax) amax=x;if( ) amin=x;scanf(“%f“,&x);printf(“namax
2、=%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之间的不同的数字组成的三位数的个数。m
3、ain() int i,j,k,count=0;for(i=1;i=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=
4、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(
5、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);
6、s= ;for(k=0;ksk) ;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;i0.00001 )y = mysqrt( );else y = x1;return( y );main() double x;printf(“Enter x: “);scanf(“%lf“, &x);printf(“The sqrt of %lf=%lfn“, x, mys
7、qrt( 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(n0 ) printf( “%c“, c ); ;main() int i, n;scanf(“%d“, &n);for( i=1; i2 ) invent
8、 ( ,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; iwp) ;for(i=*n;i=p ;i-) ;wp=x;+*
9、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+:*bsj ) main( ) char s1100,s2100,s3200 ;printf(“nPlease Input First String:“);scanf(“%s“,s1);printf(“nPlease I
10、nput 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 值
11、必须大于2,且不超过给定的常数值 MAXNUM。例如:若输入的值为10,则程序输出如下内容:sum(10)=442 3 6 1 8 8 6 4 2 4#include “stdio.h“#define MAXNUM 100int sum(n, pa)int n, *pa; int count, total, temp;*pa = 2; =3;total=5;count=2;while( count+ temp = *(pa-1) * *pa;if( temp0?-1:1【3.5】答案: d=1 k+ k=0 x【3.7】答案: 2 2【3.8】答案: m=n m0 m=m/10【3.9】答案:
12、 i=j k!=i&k!=j【3.10】答案: iaj+1 aj=aj+1 i=j;i- ai+1=ai【3.18】答案: 0 str1i-str2i【3.19】答案: j+ j+ j+ 0【3.20】答案: tk!= 0 tk= 0【3.21】答案: 0.00001)“时,则要继续迭代,因此 处应当填写“a,x1“。程序中调用了求绝对值的库函数 fabs( )。【3.25】答案: 2+age(n-1) age(5)注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式:age(n) = 10 (n=1)age(n) = 2+age(n-1) (n1)对
13、照程序和递归公式可以看出:n 的含义是第 n 位学生。很显然,要求第5位学生的年龄,处应当是调用函数 age,实参的值应当是5。在处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。【3.26】答案: return(1) return (sum(n-1)+n)注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。将问题“求 n 的累加和“的公式写成递归定义,可以是如下形式;sum(n)=1 当 n=1时sum
14、(n)=sun(n-1)+n 当 n1时根据此递归定义,可以很容易完成程序。【3.27】答案: return(1) n*facto(n-1)注释:我们熟悉的求 n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求 n!的递归公式;n!=1 当 n=1时n!=n*(n-1) 当 n1时根据此递归定义,可以很容易完成程序。【3.28】答案: com=n com=combin(n-1,m-1) + combin(n-1,m)注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句“if (n0 r(m)【3
15、.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) 当 n0时【3.33】答案: p- *p=0 *p=c p- *s+注释:在递归算法中,指针 s 指向字符串首部要反向的字符,即要将指针 s 所指向的字符与指针 p 所指向的字符串尾的字符(0)进行交换,在交换过程中,将尚
16、没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行“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 &array0, &array9注释:本程序中的排序部分采用的是递归算法。函数 sort 的两个形参的含义是:对指针 p
17、和指针 q 之间的数据进行排序。由语句“for( s=p+1; s=q“、处应填“&array0,&array9“。由于变量 max 是指向当前最大值的指针,则当找到新的最大值时,max 中保存的应该是新的最大值的指针,因此处应填“max=s“。当调用函数 swap 交换两个变量值的时候,要求实参是变量的地址,因此,处应填“p,max“将最大值存入指针 p 所指的单元。由于问题的要求是“从大到小 “排序,通过执行一次函数 sort 使最大值已经放到了指针 p 所指的单元中,因此,下一遍排序的时候,只要对指针 p 之后的元素进行即可,所以处应填“p+1,q“。【3.36】答案: a+1 n+0【
18、3.37】答案: s【3.38】答案; *(p+4*i+j)注释:p 是一个一级指针,赋值后保存二维数组 a 的首地址,做加法运算加1 时,实际地址增加一个它所指向的数据类型的长度。在 C 语言中,多维数组在计算机中是按行存储的,所以在本题中要通过指针访问二维数组中的数据,必须将二维下标转换为一维下标。【3.39】答案: 0 或 0 +注释:在 C 语言中,进行字符串处理时,必须注意串结束标记0,它是在进行串处理时的最基本的要求,所以中要填入0。为了使用 putchar 输出一个字符串,则必须有改变指针的运算,这里只能使用+运算。【3.40】答案: p+ wi+1=wi【3.41】答案: &
19、*a=MAXNUM+1 num+n【3.43】答案: stu.name &stu.score p-name p-score注释:这是结构中的最基本概念。【3.44】答案: struct student strcmp(stui.name,str)=0 break注释:程序的主体是一个二重循环,内层 for 循环完成查找学生的工作。处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。处为 if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写:strcmp(stui.name,str)=0。 处应当将控制退出内层的 for 循环,只
20、能选择 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,则将数组中的
21、元素 j 向后移动一个位置;否则,就应将 num 插入到当前位置作为元素 j。因此,程序的基本设计思想就是插入排序。程序中内层的 for 循环完成查找插入位置的工作,因此答案、 和有密切的关系,要统一考虑。同样,程序中的答案和 也有密切的关系,要统一考虑。【3.47】答案: != n p=top【3.48】答案: p1-next【3.49】答案: head p p=head注释:程序在从键盘接受字符的同时就在建立起链表,所建立的链表本身就已经是反序排列的,因此在反序输出字符串的时候实际只需沿着链表的第一个结点开始,顺序操作即可。【3.50】答案: return (struct data *)
22、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 lis
23、t *) 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 。字符串指针 argv0指向可运行程序名、字符串指针 argv1指向输入文件名、字符串指针
24、 argv2指向输出文件名,由上所述处给出循环条件是输入文件是否结束,处需要填出输出文件名。最后两处是关闭两个文件,原则上关闭文件没有顺序要求,但习惯上是后打开的文件先关闭。【3.56】答案: *argv1 (*funcp)(n) s+=i注释:程序执行时输入的命令及参数的个数(操作系统规定用空格表示字符串的分隔)由系统赋给主函数的形数 argc,输入的命令和参数以字符串的格式保存,字符串的首地址分别赋给指针数组 argv 的各个元素,其中 argv1是+或-,分别表示累加或阶乘。程序根据argv1所指向的字符串的内容给指向函数的指针变量 funcp 赋值。处要求的语句是根据指向函数的指针变量
25、的内容对相应的函数实现调用,所以选择 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 &keywordi.word0 s+; q+; *s=*q (word=getword(cp)!=NULL【3.60】答案: “a+“ rewind(fp) !=NULL flag=0 ferror(fp)=0