C语言程序
教程(第2版) 杨路明 著 课后习题
C语言程序设计教程(第2版) 杨路明 著 课后习题答案
第一章 C语言程序设计概述
,习题答案
1
算法的描述有哪些基本方法,
答
1、自然语言
2、专用工具
2
C语言程序的基本结构是怎样的,举一个例子说明。
答
1、C语言程序由函数构成;
2、“/*”与“*/”之间的内容构成C语言程序的注释部分;
3、用预处理命令#include、#define可以包含有关文件或预定义信息;
4、大小写字母在C语言中是有区别的;
5、除main()函数和
库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。
3
C语言有什么特点,
答
1、具有结构语言的特点,程序之间很容易实现段的共享;
2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;
3、运算符丰富,包含的范围很广;
4、数据类型丰富;
5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;
6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;
7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。
4
?指出合法与不合法的标识符命名。
答
AB12--?
leed_3-- a*b2--× 8stu--× D.K.Jon--× EF3_3--? PAS--? if--× XYZ43K2--?
AVE#XY--× _762--? #_DT5--× C.D--×
5
说明下列Turbo C热键的功能。
答
F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序) Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。
6
说明下列Turbo C方式下输入并运行下列程序,
下运行结果。
?main()
{printf("********************\n");
printf(" welcome you \n");
printf(" very good \n);
printf("********************\n");
}
?main()
{ int a,b,c,t;
printf("please input three numbers;");
scanf("%d,%d,%d",&a,&b,&c); /*教材S是错误的*/
t=max(max(a,b),c);
printf("max number is:%d\n",t);
}
int max(int x, int y)
{ int z;
if(x>y)z=x;
else z=y;
return(z);
}
答
运行结果:
********************
welcome you
very good
********************
运行结果:
please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/
max number is:4
7
一个C程序是由若干个函数构成的,其中有且只能有一个,,,函数。
答
main()
8
在Turbo C环境下进行程序调试时,可以使用Run下拉菜单的,,,命令或按,,,键转
到用户屏幕查看程序运行结果。
答
1、User screen
2、Alt+F5
9
?C语言对标识符与关键字有些什么
,
答
1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须
用字母或下划线开头。
2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,
用户只能根据系统的规定使用它们。
10
C源程序输入后是如何进行保存的,
答
是以C为扩展名保存的纯文
第二章 C语言程序的基本数据类型与表达式
,习题答案
1
?指出下列常数中哪些是符合C语法规定的。
答
„\?--× „101?--× "\"--× e3--× 019--? 0x1e--?
"ab\n"--? 1.e5--× (2+3)e(4-2)--× 5.2e2.5--×
2
请找出下列程序中的错误,改正后写出程序运行结果。
?void main()
{int x,y=z=5,aver;
x=7
AVER=(x+y+z)/3
printf("AVER=%d\n",aver);
}
?void main()
{ char c1=„a?;c2=„b?;c3=„c?;
int a=3.5,b=„A?
printf("a=%db=\?\"end\n",a,b);
printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);
}
答
main()
{int x,y=5,z=5,aver;
x=7;
aver=(x+y+z)/3;
printf("AVER=%d\n",aver);
}
运行结果:AVER=5
?main()
{ char c1=„a?, c2=„b?, c3=„c?;
int a=3,b=„A?;
printf("a=%d,b=\?%c\?\"end\"\n",a,b);
printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);
}
运行结果:a=3,b=„A?"end"
aabcc abc
3
写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。
int
99
-1
char „h?
unsigned int 66
float 55.78
long int 68
答
int 99 104 66 55 68
-1
char
„c?
„h?
„B?
„7?
„D?
unsigned int 99
104
66
55
68
65535
float
99.00
104.00
66.00
55.78
68.00
-1.00
long int
99
104
66
55
68
-1
4
?写出程序运行结果。
?void main() {int i,j;
i=8,j=10;
printf("%d,%d,%d,%d\n",i,j,++i,j++);
}
?main()
{ int a=1,b=2,c=30;;
printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c)); }
注意:a=b=c,a=b==c之间应为逗号,教材有误
答
运行结果:
9,11,9,10
运行结果:
30,1,0,0
?void main()
{int a=10,b=20,c=30,d;
d=++a<=10||b-->=20||c++;
printf("%d,%d,%d,%d\n",a,b,c,d);
}
答
运行结果:
11,19,30,1
5
?写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。 ?a%=(b%=3)
?n++,a+=a-=a*=a
?(float)(a+c)/2+(int)x%(int)y
?a*=b+c
?++a-c+b++
?++a-c+++b
?a<b?x:?A?
?b++==c
?a+b,18+(b=4)*3,(a/b,a%b)
?x+a%3*(int)(x+y)%2/4+sizeof(int)
?a<b?a:c<d?c:d
?b++==c
?a*=b=c=2
?a=b==c
答
?0 ?0 ?9.500000 ?90 ?10 ?10 ??A? ?2 ?4.5 ?1 ?0 ?20 ?0
6
下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量),
?m=(a=4,4*5)与m=a=4,4*5
?(float)(a/b)与(float)a/b
?(int)a+b与(int)(a+b)
?m%=2+a*3与m=m%2+a*3
?m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b
答
?前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;
?前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。
?因为a、b均为整数,其前后两个表达式的计算结果是一致的。
?前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。
?前后表达式的计算结果应该是一致的:a=2, b=3, m=6
7
条件表达式x>0?x:-x的功能是什么,
答
如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。
8
用一个条件表达式描述从a、b、c中找出最大都赋给max.
答
max=a>(b>c?b:c)?a:(b>c?b:c);
9
?若x为int型变量,则执行以下语句后x的值为( )。
x=6;
x+=x-=x*x;
A. 36 B. -60 C. 60 D. -24
答
B.
10
?若有以下类型说明语句:
char w; int x; float y; double z;
则表达式w*x+z-y的结果为( )类型。
A. float B. char C. int D. double
答
D.
第三章 顺序结构程序设计
,习题答案
1
变量k为float类型,调用函数scanf("%d",&k),不能使变量k得到正确数值的原因是,,,。
答
格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。
2
?a=1234,b=12,c=34,则执行“printf("|%3d%3d%-3d|\n",a,b,c);”后的输出是,,,。
答
|1234 1234 |
分析如下:
?%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。
?%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。
3
?设有”int a=255,b=8;”,则“printf("%x,%o\n",a,b);”输出是,,,。 答
ff,10
?如果“printf("%X,%o\n",a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。
?如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改
“printf("%#x,%o\n",a,b);”为或“printf("%#X,%o\n",a,b);”。本条解释不必须掌握。
4
?以下程序输出的结果是,,,。
main()
{
int a1=1,a2=0,a3=2;
printf("%d,%d,%d\n",a1,a1+a2+a3,a3-a1);
}
答
1,3,1
5
printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按,,,输出;如果字符串长度小于5,则按,,,输出。
答
?实际 ?左端补空格
6
?已定义变量如下:
int a1,a2;
char c1,c2;
若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是,,,。
答
scanf("%d,%d,%c,%c",&a1,&a2,&c1,&c2);
7
输入两个整型变量a、b的值,输出下列算式以及运算结果,,,。 a+b、a-b、a*b、a/b、
(float)a/b、a%b
每个算式占一行。如a=10,b=5,a+b输出为:10+5=15
答
设int a=10,b=5;以下为输出语句及结果:
?printf("%d+%d=%d\n",a,b,a+b); 10+5=15
?printf("%d-%d=%d\n",a,b,a-b); 10-5=5
?printf("%d*%d=%d\n",a,b,a*b); 10*5=50
?printf("%d/%d=%d\n",a,b,a/b); 10/5=2
?printf("%(float)d/%d=%f\n",a,b,(float)a/b); (float)10/5=2.000000
?printf("%d%%%d=%d\n",a,b,a%b); 10%5=0
8
?输入一个非负数,计算以这个数为半径的圆周长和面积。
答
#define PI 3.1415926
main()
{
float r,l,area;
printf("Input a positive:");
scanf("%f",&r);
l=2*PI*r;
area=PI*r*r;
printf("l=%f\tarea=%f\n",l,area);
}
9
输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。
答
main()
{
int x,y;
printf("Input a number(100-999):");
scanf("%d",&x);
y=100*(x%10)+10*(x/10%10)+x/100; /*注意分析此处算法*/
printf("%d--->%d\n",x,y);
}
10
?输入任意大小的3个整数,判断其中是否有两个奇数一个偶数。若是则输出YES,不是则输 出NOT(要求用条件表达式进行判断,不使用if语句)。
答
main()
{
int x,y,z,oddcount=0; /*奇数数计数变量*/
printf("Input x,y,z:");
scanf("%d,%d,%d",&x,&y,&z);
x%2==1?oddcount++:0;
y%2==1?oddcount++:0;
z%2==1?oddcount++:0;
oddcount==2?printf("YES"):printf("NOT");
}
11
求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,按从大到小的顺序输出这3个字符及其对应的ASCII码值。
答
本题考查同学们对字符类型数据的认识,如果在ASCII范围 +1,c+1);
getch(); /*为便于调试程序,运行至此程序停顿,此时可以看到运行结果,按任意键程序真难得结束并返回到编辑环境*/
}
12
?输入三角形的边长,求三角形面积(面积,
sqrt(s(s-a)(s-b)(s-c)),s=(a+b+c)/2)。
答
#include"math.h" /*由于程序中使用了开平方函数sqrt(),所以需要包含数学头文件*/
main()
{
float a,b,c,s,area;
int ok=0;
printf("Input a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
a+b>c?ok++:0; /*以下3条语句为判断是否输入的数据是否构成封闭三角形*/
a+c>b?ok++:0;
b+c>a?ok++:0;
ok==3?(s=(a+b+c)/2,area=sqrt(s*(s-a)*(s-b)*(s-c)),printf("area=%f",area)):printf(&
quot;error");
getch();
}
第四章 选择结构程序设计
,习题答案
1
?设x、t均为int型变量,则执行语句“x=10;t=x&&x>10;”后,t的值为,,,。
答
2
?假定所有变量均已正确定义,则程序段:
int a=0, y=10;
if(a=0)y- -; else if(a>0)y++;
else y+=y;
运行后 y 的值是,,,;
答
20
3
?能表述 20<x<30 或 x<-100 的C 语言表达式是,,,。
答
x>20&&x<30||+x<-100
4
?若有定义语句“int a=25,b=14,c=19;”,则以下语句执行结果是,,,。 if(a<=25 && b<=2 && c)
printf("***a+b=%d, a-b=%d***\n", a+b, a-b);
else printf("***a=%d, b=%d, c=%d***\n",a, b, c);
答
***a=25, b=14, c=19***
5
?假定 i 和 j 为 int 型变量,则执行以下语句后 i 的值是,,,。 int i=1;
switch(i)
{
case 1: { for(j=0; j<9; j++) i+=j; break;}
case 2: { for(j=1; j<10; j++) i+=j; break;}
case 3: i++;
}
答
37
分析:执行了case 1: 和case 3: 中的代码。同时case 1:语句中的, ,是可以取消的。
6
?以下两条 if 语句可合并成一条 if 语句,即,,,。
if(a<=b) x=1;
else y=2;
if(a>b)printf("***y=%d\n", y);
else printf("***x=%d\n",x);
答
if(a<=b) printf("***x=%d\n",x=1);
else printf("***y=%d\n", y=2);
7
?输入两个字符,若这两个字符的序号(ASCII码)之差为偶数,则输出它们的后继字符,否则输出它们的前驱字符。
答
main()
{
char a,b;
printf("Input two chatacter a,b:");
scanf("%c,%c",&a,&b);
if((a-b)/2==0)
printf("%c,%c",a+1,b+1);
else printf("%c,%c",a-1,b-1);
}
8
?输入整数 a 和 b ,如果 a 能被 b 整除,就输出算式和商,否则输出算式、整数商和余数。
答
main()
{
int a,b;
printf("Input two integer numbers a,b:");
scanf("%d,%d",&a,&b);
if(b!=0&&a%b==0)
printf("%d/%d=%d",a,b,a/b);
else
printf("%d/%d=%d......%d",a,b,a/b,a%b);
}
9
输入某个点 A 的平面坐标 (x,y),判断(输出)A点是在圆内、圆外还是在圆周上,其中圆心坐标为 (2,2),半径为 1。
答
include"math.h"
main()
{
float x,y,d;
printf("Input x,y:");
scanf("%f,%f",&x,&y);
d=sqrt((x-2)*(x-2)+(y-2)*(y-2));
if(d>1)printf("outside");
else if(d<1)printf("inside");
else printf("inside");
}
10
?输入年号和月份,输出这一年该月的天数(一个年份,先判断是否闰年)。
答
main()
{
int y,m,d,f;
printf("Input year and month y-m:");
scanf("%d-%d",&y,&m);
f=(y%4==0&&y/100!=0||y/400==0);
if(m==2)
d=28+f; /*依据是否闰年决定2月份的实际天数,若是闰年,则f=1,d即为29天*/
else
d=31-(m==4)+(m==6)+(m==9)+(m==11);/*m==4时其值为1,则本月为30天,典型算法,重要啊*/
printf("%d-%d is %d days.\n",y,m,d);
}
11
?请将以下语句改写成 switch 语句(a>0)。
if(a<30) m=1;
else if(a<40) m=2;
else if(a<50) m=3;
else if(a<60) m=4;
else m=5
答
switch(a/10)
{
case 1:
case 2:
case 3:m=1;break;
case 4:m=2;break;
case 5:m=3;break;
case 6:m=4;break;
default:m=5;
}
12
有一函数
x-1 -5<x<0
y= x x=0
x+1 0<x<8
编写一程序,要求输入 x 的值,输出 y 的值。分别用不嵌套的 if 语句,嵌套的 if 语句,
switch语句编写。
答
使用不嵌套的 if 语句程序如下:
main()
{
float x,y;
printf("Input x:");
scanf("%f",&x);
if(x>-5&&x<0)y=x-1;
if(x==0)y=0;
if(x>0&&x<8)y=x+1;
printf("y=%f\n",y);
}
使用嵌套的 if 语句程序如下: main()
{
float x,y;
scanf("%f",&x);
if(x>-5&&x<8)
if(x<0)y=x-1;
else if(x==0)y=0: else y=x+1; printf("y=%f\n",y); }
main()
float x,y;
scanf("%f",&x);
if(x<8)
if(x>0)y=x+1;
else if(x==0)y=0;
else if(x>-5)y=x-1; printf("y=%f\n",y); }
使用多分支语句程序如下: main()
{
float x,y;
int m;
printf("Input x:"); scanf("%f",&x);
if(x>-5&&x<8)
if(x<0)m=-1;
else if(x==0)m=0: else m=1;
switch(m)
{
case -1:y=x-1;break; case 0:y=0;break; case 1:y=x+1;break; }
printf("y=%f\n",y); }
以下为假设对int类型的变量进行处理,但毕竟不算完美 main()
{
int x,y;
printf("Input x:");
scanf("%d",&x);
switch(x)
{
case -4:
case -3:
case -2:
case -1: y=x-1; break;
case 0: y=0; break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7: y=x+1; break;
}
printf("y=%d\n",y);
}
第五章 循环结构程序设计
,习题答案
1
?输入 n 个整数,求这 n 个数之中的偶数平均值,并输出。
答
main()
{
int n,i,x,sum=0,count=0;
printf("Input n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Input [%d]:",i+1);
scanf("%d",&x);
if(x%2==0){sum+=x;count++;}
}
printf("Average is:%f\n",(float)sum/count);
getch();
}
2
?输入一串字符,直到输入一个星号(,)为止,统计(输出)其中的字母个数和数字字
符个数。
答
#include"stdio.h"
main()
{
char ch;
int charcnt=0,numcnt=0;
while((ch=getchar())!=„*?)
{
if(ch>=„a?&&ch<=„z?||ch>=„A?&&ch<=„Z?)charcnt++;
if(ch>=„0?&&ch<=„9?)numcnt++;
}
printf("Characters number:%d\nDigits number:%d\n",charcnt,numcnt); getch();
}
3
?从键盘输入一个正整数 n,计算该数的各位数字之和并输出。例如,输入数是5246,则
计算5+2+4+6,17并输出。
答
#include"stdio.h"
main()
{
int n,i,sum=0,count=0;
printf("Input n:");
scanf("%d",&n);
while((n/10)!=0)
{
count++;
sum+=n%10;
printf("%d+",n%10);
n/=10;
}
printf("=%d",sum+n);
getch();
}
4
?输入一个字符串,将其中的大写字母改为小写字母,小写字母改为大写字母,然后输出。
答
#include"stdio.h"
main()
{
char ch;
printf("Input string:");
while((ch=getchar())!=„\n?)
{
if(ch>=„a?&&ch<=„z?)printf("%c",ch-32);
if(ch>=„A?&&ch<=„Z?)printf("%c",ch+32);
}
getch();
}
5
设某县2000年工业总产值为200亿元,如果该县预计平均年工业总产值增长率为4.5%,
那么多少年后该县年工业总产值将超500亿元。
答
main()
{
float x=200;
int n=0;
do
{
x*=(1+0.045);
n++;
}while(x<500);
printf("n=%d",n);
getch();
}
6
?输出1,999中能被3整除,而且至少有一位数字是5的所有数字。
答
main()
{
int x,y,flag;
for(x=1;x<1000;x++)
{
flag=0;
y=x;
if(y%3==0) /*余数为0说明该数能够被3整除*/
{
while(y%10!=0)
{
if(y%10==5)flag=1; /*依个位、十位、百位顺序判断是否余数为5*/
y/=10;
}
if(flag==1)printf("%d\t",x);
}
}
getch();
}
7
求爱因斯坦数学题。有一条长阶,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后
剩2阶,若每步跨5阶,则最后剩4阶每步跨6阶,则最后剩5阶每步跨7阶,最后正好1
阶。
答
main()
{
int x=0,flag=0;
while(1)
{
x++;
if(x%2==1)
if(x%3==2)
if(x%5==4)
if(x%6==5)
if(x%7==0)
{
printf("%d",x);
break;
}
}
getch();
}
8
输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位
数字的立方和等于这个3位数本身。例如,153,1*1*1+5*5*5+3*3*3
答
main()
{
int x,a,b,c;
printf("Input number:");
scanf("%d",&x);
a=x/100; /*变量a中记录x的百位数字*/
b=x/10%10; /*变量b中记录x的十位数字*/
c=x%10; /*变量c中记录x的个位数字*/
if(a*a*a+b*b*b+c*c*c==x)
{
printf("%d=%d*%d*%d+%d*%d*%d+%d*%d*%d\n",x,a,a,a,b,b,b,c,c,c);
printf("YES");
}
else
printf("NOT");
getch();
}
9
?计算斐波那契分数序列前n项之和(n是某个常数,波那契分数序列为2/1,3/2,5/3,
8/5,...)。
答
main()
{
int i,n=10;
float f1=1,f2=2,f,sum=0;
for(i=0;i<n;i++)
{
sum+=f2/f1;
f=f1+f2;
f1=f2;
f2=f;
}
printf("total=%d\nsum=%f",n,sum);
getch();
}
10
输入一个正整数,各输出n行的正(倒)三角形宝塔图案。
答
main()
{
int n,i,j;
printf("Input n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)printf(" ");
for(j=0;j<2*i+1;j++)printf("*");
printf("\n");
}
for(i=0;i<n-1;i++)
{
for(j=0;j<i+1;j++)printf(" ");
for(j=2*i-1;j<n+1;j++)printf("*");
printf("\n");
}
getch();
}
11
?输出九九乘法表。
答
main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%-3d",j,i,i*j);
printf("\n");
}
getch();
}
12
输入一串字符,直到输入一个星号为止,统计(输出)其中的正整数和负整数个数以及所
有正整数的平均值和所有负整数的平均值。
答
#include"stdio.h"
#include"math.h"
main()
{
char ch;
int x=0,y=1,f=0,pcnt=0,ncnt=0; float psum=0,nsum=0;
while((ch=getchar())!=„*?) {
if(ch==„-?)
{
if(x!=0)
{
if(f==1)
{
x=-x; nsum+=x;
ncnt++; }
else
{
psum+=x; pcnt++; }
printf("%d\n",x); }
f=1;x=0;y=1;
continue;
}
else if(ch>=„0?&&ch<=„9?) {
x=10*x+ch-?0?; y=10*y;
if(x!=0&&10*x<y)f=0; continue;
}
else
{
if(x!=0)
{
if(f==1)
{
x=-x; nsum+=x; ncnt++;
}
else
{
psum+=x;
pcnt++;
}
printf("%d\n",x);
}
f=0;x=0;y=1;
continue;
}
}
if(x!=0)
{
if(f==1)
{
x=-x;
nsum+=x;
ncnt++;
}
else
{
psum+=x;
pcnt++;
}
printf("%d\n",x);
}
printf("\n---------\n");
printf("Plus:\n");
printf("Count=%d\n",pcnt);
printf("Average=%f\n",psum/pcnt);
printf("-------\n");
printf("Negative:\n");
printf("Count=%d\n",pcnt);
printf("Average=%f\n",nsum/ncnt);
getch();
}
13
一个整数等于该数所有因子之和,则称该数是一个完数。例如,6和28都是完数。因为6,1+2+3,28,1+2+4+7+14。输出3位数中所有的完数。
答
main()
{
int k1, k2, k3, k4, k5, k6, k7, k8, k9, k10;
int i,a,n,s;
for (a = 100; a <= 999; a++)
{
n = 0; /* n累计因子的个数 */
s = a; /* s存放未求出的因子之和,初值为被测数本身 */ for (i = 1; i < a; i++)
if (a % i == 0) /* 由i到a循环检测i是否为a的因子 */ {
n++; /* 找到一个因子 */
s = s - i; /* 减去已找到的因子 */
switch (n) /* 将找到的因子赋绐k1, k2, ... */
{
case 1 : k1 = i; break;
case 2 : k2 = i; break;
case 3 : k3 = i; break;
case 4 : k4 = i; break;
case 5 : k5 = i; break;
case 6 : k6 = i; break;
case 7 : k7 = i; break;
case 8 : k8 = i; break;
case 9 : k9 = i; break;
case 10 : k10 = i; break;
}
}
if (s == 0) /* 已经找到全部因子 */
{
printf("%d Its factors are ", a);
if (n > 1) printf("%d,%d", k1, k2); /* n>1表示a至少有2个因子 */
if (n > 2) printf(",%d", k3); /* 注意以下if的用法,追加的方法 */
if (n > 3) printf(",%d", k4);
if (n > 4) printf(",%d", k5);
if (n > 5) printf(",%d", k6);
if (n > 6) printf(",%d", k7);
if (n > 7) printf(",%d", k8);
if (n > 8) printf(",%d", k9);
if (n > 9) printf(",%d", k10);
printf("\n");
}
}
getch();
}
14
?编写程序按下列公式计算e的值(精度为1e-6)。
e=1+1/1!+1/2!+1/3!...+1/n!
答
main()
{
int i;
double e=0,t=1;
for(i=1;t>0.000001;i++)
{
for(j=1;j<=i;j++)t*=j;
t=1/t;
e+=t;
}
printf("e=%f\n",e);
getch();
}
15
用二分法求方程2x3-4x2+3x=0在(-10,10)附近的根(二分法:先找到a、b,使f(a)、f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b>0,a<b,如果f[(a+b)2]=0,该点就是零点,如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,按上述方法再求该区间中点的函数值,通过每次把f(x)的零点所有小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,该值即是方程的根)。
答
#include"math.h"
main()
{
double x,fx,fa,fb,a=-10,b=10,z=0.0001;
fa=2*a*a*a-4*a*a+3*a;
fb=2*b*b*b-4*b*b+3*b;
if(fa*fb<0)
{
do
{
x=(a+b)/2;
fx=2*x*x*x-4*x*x+3*x;
if(fx<0)
{
a=x;
fa=2*a*a*a-4*a*a+3*a;
}
else
{
b=x;
fb=2*b*b*b-4*b*b+3*b;
}
}while(fabs(fa-fb)>z);
printf("The root is:%lf\n",x);
}
getch();
}
第六章 函数与编译预处理
,习题答案
1
?写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,
并输出结果。两个整数由键盘输入。
答
main()
{
unsigned int m,n,p,q;
for(;;)
{
printf("m,n=");scanf("%d,%d",&m,&n);
if(m<0||n<0){printf("The end.\n");break;}
p=funp(m,n);
q=funq(m,n);
printf("p(%d,%d)=%d\nq(%d,%d)=%d\n",m,n,p,m,n,q);
}
}
int funp(int m,int n)
{
int i;
if(m>n){i=m;m=n;n=i;}
for(i=m;i>0;i--)if(m%i==0&&n%i==0)return(i);
}
int funq(int m,int n)
{
int i;
if(m<n){i=m;m=n;n=i;}
for(i=m;i<=m*n;i+=m)if(i%n==0)return(i);
}
2
?编写一个函数,由参数传入一个字符串,统计此字串中字母、数字和其他字符的个数,在主函数中输入字符串并显示统计结果。
答
未制作函数,主要利用了选择语句结构:
#include"stdio.h"
main()
{
int i,c,zm=0,sz=0,kg=0,qt=0;
printf("Input a string:");
while((c=getchar())!=„\n?)
if(c==„ „)kg++;
else if(c>47&&c<58)sz++;
else if(c>=„A?&&c<=„Z?||c>=„a?&&c<=„z?)zm++;
else qt++;
printf("am=%d,sz=%d,kg=%d,qt=%d\n",zm,sz,kg,qt);
}
制作函数,利用函数调用:
#include"stdio.h"
int analys(char ch);
main( )
{
int i,zm=0,sz=0,qt=0,c;
printf("Input a string:");
while((c=getchar())!=„\n?)
{
i=analys(c);
switch(i)
{
case 1: zm++; break;
case 2: sz++; break;
case 3: qt++;
}
}
printf("zm=%d,sz=%d,qt=%d\n",zm,sz,qt);
}
int analys(char ch)
{
if(ch>=„A?&&ch<=„Z?||ch>=„a?&&ch<=„z?)return 1;
if(ch>47&&ch<58)return 2;
return 3;
}
3
?按照第5章第8题的要求编写判断水仙花数的函数,从主函数输入正整数n,在主函数中调用判断水仙花数的函数,找出n以内所有的水仙花数。
【输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位数字的立方和等于这个3位数本身。例如,153,1*1*1+5*5*5+3*3*3】
答
main()
{
int x,i,f;
printf("Input number:");
scanf("%d",&x);
for(i=0;i<=x;i++)
{
f=0;
f=fun(i);
if(f==1)printf("%d\t",i);
}
getch();
}
int fun(int x)
{
int a,b,c;
a=x/100;
b=x/10%10;
c=x%10;
if(a*a*a+b*b*b+c*c*c==x)return 1;
else return 0;
}
4
?定义一个宏,实现将两个数互换,并写出程序,输入两个数作为使用参数,并显示结果。
答
#define f(a,b) (a=a+b,b=a-b,a=a-b)
main()
{
int x,y;
printf("Input x,y:");
scanf("%d,%d",&x,&y);
printf("%d,%d",x,y);
f(x,y);
printf("<-->%d,%d\n",x,y);
getch();
}
5
已知二阶Fibonacci数列:
0 若n=0
Fib(n)= 1 若n=1
Fib(n-1)+Fib(n-2) 其它情况
定义递归函数求Fib(n)。
答
main()
{
int i,n;
printf("Input n:");
scanf("%d",&n);
for(i=0;i<=n;i++)
printf("%d\t",fib(i));
getch();
}
int fib(int n)
{
if(n==0)return 0;
else if(n==1)return 1;
else return (fib(n-1)+fib(n-2));
}
6
定义函数求F=(n+m)!+n!,m、n均为任意正整数。要求使用递归调用。
答
long int f(int x);
main()
{
int i,m,n;
long int sum;
printf("Input m,n:");
scanf("%d,%d",&m,&n);
sum=f(n+m)+f(n);
printf("%ld",sum);
getch();
}
long int f(int x)
{
int i,j;
if(x==0||x==1)return 1;
else return(x*f(x-1));
}
7
?定义一个函数完成第5章第11题的功能。
【输出九九乘法表。】
答
main()
{
fun();
getch();
}
fun()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%-3d",j,i,i*j);
printf("\n");
}
}
8
如果有两个数,每一个数的所有约数(除了它本身以外)的和正好等于对方,则称这两个
数为互满数,求出30000以内所有的互满数,并显示输出,求一个数它的所有约数(除了它
本身以处)的和,用函数实现。
答
main()
{
int x,y;
for(x=1;x<30000;x++)
{
for(y=1;y<x;y++)
{
if(facsum(x)==y&&facsum(y)==x){printf("(%d,%d)\t",x,y);} }
}
getch();
}
facsum(int n)
{
int i,sum=0;
for(i=1;i<n;i++)
{
if(n%i==0)sum+=i;
}
return sum;
}
9
编写以下函数:?输入职工的姓名和职工号;?按职工号由小到大排序,姓名顺序也随之
调整;?输入一个职工号,找出该职工的姓名。在主函数中调用这些函数。
答
10
?设计程序完成下列计算。
已经:y=f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3))
其中:f(x,n)=1-x2/2!+x4/4-...+(-1)n?x2n/(2n)! (n?0)
当: x=5.6, n=7时,求:y
要求通过嵌套调用完成计算。
答
#include <stdio.h>
float f(float x,int n);
float f1(float x,int m);
float f2(int m);
main()
{
float x=5.6,y;
int n=7,i;
y=1+f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3)); printf("y=%f\n\n",y);
}
float f(float x,int n)
{
float sum=0.0;
int i;
for(i=1;i<=n;i++)
{
sum+=f1(-1,i)*f1(x,2*i)/f2(2*i); }
return sum;
}
float f1(float x,int m)
{
int i;
float y=1.0;
for (i=1;i<=m;i++)
{
y*=x;
}
return y;
}
float f2(int m)
{
int i;
float y=1;
for (i=1;i<=m;i++)
{
y*=i;
}
return y;
}
第七章 数 组
,习题答案
1
?以下各题中,选择一个正确的答案。
1、能正确对一维数组 a 中所有元素进行初始化的是( )。
A. int a[5]={ } B. int a[ ]={0}
C. int a[5]=0,0,0,0,0 D. int a[5]={0}
2、有说明 int k=3,a[10]; 则下列可以正确引用数组元素的表达式是( )。
A. a[k] B. a[10] C. a[1,3] D.
a[3*5]
3、有定义 int d[ ][3]={1,2,3,4,5,6}; 执行语句printf("%c",d[1][0]+?A?); 结果是
( )。
A. A B. B C.
D D. E
4、有定义 char c=„A?,ch[20]={„a?,?b?,?c?,?\0?,?d?,?\0?}; 若执行printf("%s",ch); 结
果是( )。
A. „abc? B. abc C. abcd
D.abc\0d
5、对数组进行初始化 char
carr[ ]={„s?,?t?,?u?,?d?,?e?,?n?,?t?},barr[ ]="student"; 则正确的是
( )。
A. carr 与 barr 长度相同 B. carr 比 barr 长
C. carr 与 barr 相同 D. carr 比 barr 短
答
1、BD 2、A 3、D 4、B 5、D
2
?阅读下列程序,写出程序的执行结果。
1、#include <stdio.h>
#include <string.h>
void main( )
{
int i,j,temp,d[4][4]={{1,2,3,4},{5,6,7,8},{4,3,2,1},{1,2,3,4}}; for(i=0;i<4;i++)
for(j=0;j<i;j++)
if(d[i][j]>d[j][i])d[j][i]=d[i][j];
for(i=0;i<4;i++)
{
printf("\n");
for(j=0;j<4;j++)
if(j>=i)printf("%6d",d[i][j]);
else printf("%c", „ „ );
}
}
2、若输入十进制数3291时,下列程序输出为:
#include <stdio.h>
void main( )
{
int i,d,m,n;
char s[8];
scanf("%d",&n);
i=0; /*i是用来存放转换后的数组元素下标*/
do{
m=n/8; d=n%8; s[i]=„0?+d; i++; n=m;
}while(n!=0);
for(i- -;i>=0;i- -)
putchar(s[i]); /*反向输出字符*/
}
答
1、
1 5 4 4
6 7 8
2 3
4
2、6333
3
?程序填空。在,,,处填写合适的语句,完善下列程序:
1、从键盘输入一个数,将其插入到一个升序数组中,保持数组仍然按升序排列。 #include
<stdio.h>
void main( )
{
int data,temp,k;
static int a[9]={-10,2,4,8,10,15,25,50};
printf("\nEnter a data:");
scanf("%d",&data);
______?_____;
for(k=8;____?____;k- -)
if(a[k]<a[k-1])
{
______?______;
a[k]=a[k-1];
a[k-1]=temp;
}
else ______?______;
for(k=0;__?__;k++)
printf("%7d",a[k]);
}
2、从键盘输入一串英文字符(不含空格与其他字符),统计每个字符的个数,并输出字母
及相应的个数。
#include <string.h>
#include <stdio.h> /*本行代码教材中应该加上,因为程序中有 putchar() */
void main( )
{
int i=0,c[52]={0},m=0;
char str[80];
printf("Input a string:");
scanf(___?___,str);
while(str[i])
{
if(str[i]>=„A? && ____?___)c[str[i]-?A?]++;
if(str[i]>=„a? && str[i]<=„z?)_____?____;
i++;
}
for(i=0;i<26;i++)
if(c[i]
{
if(m%8==0)putchar(„\n?);
m++;
printf("%c:%-d",i+?A?,c[i]);
}
for(i=0;i<26;i++)
if(c[i+26])
{
if(m%8==0)putchar(„\n?);
m++;
printf("%c:%-d",____?___,c[i+26]);
}
}
答
1、? a[8]=data ? k>=1 ? temp=a[k] ? break ? k<=8
2、? "%s" ? str[i]<=„Z? ? c[str[i]-?a?+26]++ ? i+?A?
4
?求一组成绩的平均分数以及高于平均分的成绩,设给定的成绩为 90,85,92,77,80,62。
答
main()
{
int score[6]={90,85,92,77,80,62};
int i,sum=0;
float aver;
for(i=0;i<6;i++)sum+=score[i];
aver=sum/6.0;
printf("\nAverage:%f\n",aver);
printf("High score:");
for(i=0;i<6;i++)
if(score[i]>aver)printf("%d\t",score[i]);
}
5
?编写程序,输入一组整数,将它们排序后由小到大输出。
【提示】假设为具有 10 个元素的正整数数组;外层循环从数组的第一个元素开始选取;/*提示并为数组元素赋值*/
{
printf("\nInput a[%d]:",i);
scanf("%d",&a[i]);
}
for(i=0;i<N;i++) /*外层选定待比较元素位置*/
{
for(j=i+1;j<N;j++) /*选定后续需要比较之元素位置*/
{
if(a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}
}
printf("%d\t",a[i]); /*输出已更新为较小值之外层选定元素*/ }
}
6
从键盘输入一个4×4整数矩阵,以主对角线(\)为对称轴,将左下角元素中较大元素代替右上角对应元素,将右上角(含对角线元素)输出。
【提示】a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[3][0] a[3][1] a[3][2] a[3][3]
答
#define M 4
main()
{
int a
;
int i,j,k,t;
printf("Input integer number:\n");
for(i=0;i<M;i++) /*用两层循环为二维数组元素赋值*/
for(j=0;j<M;j++)
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i<M;i++) /*用两层循环将数组以矩阵形式在屏幕输出*/
{
for(j=0;j<M;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
printf("-----------\n"); /*分隔线*/
for(i=0;i<M;i++) /*选定矩阵待处理的当前行*/
{
for(j=0;j<M;j++)/*将左下角元素中较大元素代替右上角对应元素
*/
{
if(a[j][i]>a[i][j])
{
t=a[j][i];a[j][i]=a[i][j];a[i][j]=t;
}
}
for(j=i;j<M;j++) /*将函对角线的右上角元素输出*/
/*本循环为将第 i 行第 i 列开始的右侧元素输出*/
{
printf("%d\t",a[i][j]);
}
printf("\n");
for(k=0;k<i+1;k++)printf("\t");/*保证显示数据正确位置*/
}
getch();
}
【运行结果】
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[0][3]=4
a[1][0]=5
a[1][1]=6
a[1][2]=7
a[1][3]=8
a[2][0]=9
a[2][1]=10
a[2][2]=11
a[2][3]=12
a[3][0]=13
a[3][1]=14
a[3][2]=15
a[3][3]=16
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
-----------
1 5 9 13
6 10 14
11 15
16
7
通过键盘给 3×4 的二维数组输入数据,然后分别按行和按列输出数组元素。
答
#define M 3
#define N 4
main()
{
int a
[N],i,j;
printf("Input integer number:\n");
for(i=0;i<M;i++) /*外层选定数组元素左维*/
for(j=0;j<N;j++) /*/*提示输出元素位置*/
scanf("%d",&a[i][j]); /*为指定元素赋值*/
}
printf("\nOut by row:\n"); /*按行输出数组元素值*/
for(i=0;i<M;i++)
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\nOut by collum:\n"); /*按列输出数组元素值*/
for(i=0;i<N;i++)
for(j=0;j<M;j++)
printf("%d ",a[j][i]);
getch();
}
【运行结果】
Input integer number:
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[0][3]=4
a[1][0]=5
a[1][1]=6
a[1][2]=7
a[1][3]=8
a[2][0]=9
a[2][1]=10
a[2][2]=11
a[2][3]=12
Out by row:
1 2 3 4 5 6 7 8 9 10 11 12
Out by collum:
1 5 9 2 6 10 3 7 11 4 8 12
8
编写程序,将两个字符串连接起来,不要使用 strcat 函数。
答
#include"string.h"
main()
{
char str1[80],str2[80];
int i=0,l1;
printf("Input str1:");
gets(str1); /*若换成scanf("%s",str1);后面应该增加
fflush(stdin);函数语句*/
printf("Input str2:");
gets(str2);
l1=strlen(str1); /*计算字符串 1 的长度*/
while(str2[i])
{
str1[l1+i]=str2[i];
i++;
}
str1[l1+i]=„\0?; /*字符串连接后,不能忘记追加一个字符串结束符*/ puts(str1);
/*可换成语句:printf("%s",str1);*/
getch();
}
9
输入一行字符串,统计该字符串中字符对 ab 的个数。
答
#include"string.h"
main()
{
char str[80];
int i=0,count=0;
printf("Input string:");
gets(str);
while(str[i])
{
if(str[i]==„a? && str[i+1]==„b?)
{
count++;
i+=2; /*如果在当前 i 的位置找到一对,则 i 越过 b 个字母*/
}
else i++; /*如果在当前 i 的位置未找到,则 i 指向下一个字母
*/
}
printf("%d",count);
getch();
}
10
从键盘输入 10 个字符串,找出一个最长的字符串。
答
#include"string.h"
main()
{
char str[10][80]; /*设置二维字符数组,每一维可以记录最大79个字符的字符串*/
int i,len,k[10],n=0,max=0;
printf("Input 10 strings:\n");
for(i=0;i<10;i++) /*向 str 数组输入 10 个字符串*/
{
printf("String %d=",i+1);
gets(str[i]);
len=strlen(str[i]); /*计算输入之字符串之长度*/
if(len>max){max=len;n=0;k[n]=i;} /*记录最长字符串的长度、个数、在数组位置(行)*/
else if(len==max)k[++n]=i; /*与已记录最大长度相同时,记录其在数组中位置(行)*/
}
if(n==0) /*此时说明只有一个最大长度字符串,是 str[k[0] */ {
printf("The longest string is String %d:",k[0]+1); /*输出其序号*/
puts(str[k[0]]);
}
else /*此时说明有不止一个最大长度字符串时需要处理的复合语句*/ {
printf("Not only one!\n");
for(i=0;i<=n;i++) /*分别输出各序号、字符串*/
{
printf("These are String %d:",k[i]+1);
puts(str[k[i]]);
}
}
getch();
}
11
已知数组 a 中有 m 个按升序排列的元素,数组 b 中有 n 个按降序排列的元素,编程将 a 与 b 中的所有元素按降序存入数组 c 中。
【提示】将 a 中的元素最大值与 b 中元素最大值相比,将最大值存入 c 数组中,然后调整 c 、a 或 b 元素指针(地址),依次重复前序工作,即可。
答
#define M 3
#define N 7
main()
{
int
i=0,j=0,n=0,c[M+N],a[3]={10,27,543},b[7]={300,210,173,96,55,34,13}; int maxa,maxb;
do
{
maxa=a[M-i-1];maxb=b[j];
if(maxa>maxb)
{
c[n++]=maxa; /*将 a 中最大元素赋值给 c 数组当前元素,并调整 c 新元素位置*/
i++; /*调整 a 中元素位置*/
}
else
{
c[n++]=maxb; /*将 a 中最大元素赋值给 c 数组当前元素,并调整 c 新元素位置*/
j++; /*调整 b 中元素位置*/
}
printf("%d ",c[n-1]); /*打印输出 c 中新赋值元素数据*/
}while(n<M+N); /*未为数组 c 赋值结束时继续以上步骤,,执行循环体*/
getch();
}
第八章 指 针
,习题答案
1
?选择题。
1、若函数 f 定义如下:
void f(char *d,char *s);
{while(*d++=*s++);}
函数 f 的功能是( )。
A. 串比较 B. 串复制 C. 求串长 D. 串反向
2、有定义 int arr[10]={0,1,2,3,4,5,6,7,8,9}, *p, i=2; 若执行语句: p=arr;
pritnf("%d",*(p+i));
输出结果为( )。
A. 0 B. 2 C. 3
D. 1
?3、有定义 int td[ ][3]={1,2,3,4,5,6}; 以下几种方法中,不能正确表示 i 行 j 列元素的是( )。
A. td[i][j] B. *(td[i]+j) C. *(*(td+i)+j) D. *(td+i-j) 本题不要求掌握
答
1、B 2、B 3、D
2
?写出下列程序的运行结果。
1、void main( )
{
int a,*p1,*p2;
a=10;
p1=&a;
p2=p1;
printf("The Value is %d||%d||%d\n",a,*p1,*p2);
*p1=11;
printf("The Value is %d||%d||%d\n",a,*p1,*p2);
}
2、若输入字符串 program 时,写出下列程序输出结果:
#include <stdio.h>
void main( )
{
char str[80];
void prochar(char *st,char ch);
scanf("%s",str);
prochar(str,?r?);
puts(str);
}
void prochar(char *str,char ch)
{
char *p;
for(p=str;*p!=„\0?;p++)
if(*p==ch){*str=*p;(*str)++;str++;}
*str=„\0?;
}
答
1、
The Value is 10||10||10
The Value is 11||11||11
2、ss
3
?填空题
1、下面程序完成从键盘输入两个字符串 a 和 b ,再将 a 和 b 的对应位置字符中的较
大者存放在数组 c 中,填空完善该程序。
#include <stdio.h>
#include <string.h>
void main( )
{
int k=0;
char a[80],b[80],c[80]={„\0?},*p,*q;
p=a; q=b;
gets(a); gets(b);
while(_____?_____)
{
if(____?____)c[k]=*p;
else c[k]=*q;
p++; ______?______; k++;
} /*本题教材有误,少了此处的右大括号*/
if(*p!=0)strcat(c,p);
else strcat(c,q);
puts(c);
}
2、以下程序从键盘输入10个不相同的数到数组 a 中,再输入一个数到 x 中,在 a 中
查找与 x 值相同的元素所在的位置,填空完善该程序。。
#include <stdio.h>
void main( )
{
int a[11],x,i;
printf("Input 10 integers:\n");
for(i=1;___?___;i++)
scanf("%d",____?___);
printf("Input x:");
scanf("%d",&x);
*a=x; i=10;
while(x!=*(a+i))
_____?_____
if(_____?_____)printf("%6d?s position is:%3d\n",x,i);
else printf("%6d Not be found!\n",x); /*bee应为be,教材有误,小case*/
}
答
1、? *p!=„\0?&&*q!=„\0? ? *p>*q ? q++
2、? i<11 ? &a[i] ? i- -; ? i>0
4
编写函数 fun,函数的功能是,从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。例如,程序执行时输入字符串为 turbo c and borland c++,从键盘输入字符 n,则输出后变为 turbo c ad borlad c++。如果输入的字符在字符串中不存在,则字符串照原样输出。
【提示】
答
#include"string.h"
main( )
{
char s[80],*pstr=s,chdel;
printf("Input source string:");
gets(pstr);
printf("Character you want delete:");
scanf("%c",&chdel);
fun(pstr,chdel);
printf("After deleted:");
puts(pstr);
getch();
}
int fun(char *s,char ch)
{
int i,j;
for(i=0,j=0;s[i];i++)
if(s[i]!=ch)
s[j++]=s[i];
s[j]=0;
}
5
编程将从键盘输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔
开,用“.”结束输入。
【提示】。
答
【解法一】
#include"stdio.h"
int fun(char *p);
main( )
{
int i=0;
char ch,str[80];
printf("Input string end by.: \n") ;
while((ch=getchar())!=„.?)
str[i++]=ch;
str[i++]=„.?; str[i]=„\0?;
fun(str);
puts(str);
getch();
}
int fun(char *p)
{
int flag=1;
while(*p!=„\0?)
{
if(*p==„ „)flag=1;
if(*p>=„a?&&*p<=„z?&&flag==1){*p-=32;flag=0;}
p++;
}
}
【解法二】
#include"stdio.h"
main( )
{
int flag=1;
char ch;
printf("Input string end by.: \n") ;
do
{
ch=getchar( );
flag=fun(&ch, flag);
putchar(ch);
}while(ch!=„.?);
printf("\n");
}
fun(char *c,int f)
{
if (*c==„ „) return 1;
else
{
if(f&&*c<=„z?&&*c>=„a?)*c-=32;
return 0;
}
}
6
从键盘输入 8 个数,用选择法按由大到小的顺序排列并输出,要求用指针实现。
【提示】
答
#include"stdio.h"
#include"string.h"
main( )
{
int data[80],i,*p1,*p2,temp;
p1=data;
printf("Input 8 numbers:");
for(i=0;i<8;i++)scanf("%d",p1++);
for(p1=data;p1<data+8-1;p1++)
for(p2=p1+1;p2<data+8;p2++)
if(*p1<*p2){temp=*p1;*p1=*p2;*p2=temp;}
for(i=0,p1=data;i<8;i++,p1++)printf("%6d",*p1);
getch();
}
7
从键盘输入一个字符串,编写一个函数,将此字符串中从第 m 个字符开始的 n 个字符复制成另一个字符串。
答
#include"string.h"
#include"stdio.h"
main( )
{
char str1[80],str2[80];
int m,n,len;
printf("Input string:");
len=strlen(gets(str1));
printf("Input m,n:");
scanf("%d,%d",&m,&n);
if(m>len||n>len-m){printf("m,n error!");exit(0);}
else fun(str1,str2,m,n);
puts(str2);
getch();
}
fun(char *s,char *p,int x,int y)
{
int i;
for(i=0;i<y;i++)p[i]=*(s+x+i-1);
}
8
输入 8 个整数,将其中最大的数与第一个数对换,最小的数与最后一个数对换。
答
main( )
{
int a[8],i,*p,max,min,t;
max=min=0;
p=a;
printf("Input 8 numbers:");
for(i=0;i<8;i++)scanf("%d",&a[i]);
for(i=1;i<8; i++)
if(*(p+i)<*(p+min))min=i;
if(min!=7)
{ t=*(p+7);
*(p+7)=*(p+min);
*(p+min)=t;
}
for(i=1;i<8; i++)
if(*(p+i)>*(p+max))max=i;
if(max!=0)
{ t=*(p+0);
*(p+0)=*(p+max);
*(p+max)=t;
}
for(p=a;p<a+8;p++)printf("%d\t",*p);
getch();
}
9
输入 n 个整数排序并输出。要求将排序单独写成一个函数,n 个整数在主函数中输入,
排序结果在主函数中输出,用指针实现。【仍有问题】
答
#include"stdio.h"
sort(int **p, int n)
{
int *t,i,j;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if (**(p+i)>**(p+j))
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
}
}
}
main( )
{
int i=0,n,**p;
printf("Please input count of numbers:\n");
scanf("%d",&n);
for (i=0;i<n;i++)
{
printf("The %d number:",i+1);
scanf("%d",*(p+i));
}
printf("\nThe result is :\n");
sort(p,n);
for (i=0;i<n;i++)
{
printf("%d ",**(p+i));
}
getch();
}
10
输入一个字符串,/*设置二维字符数组,每一维可以记录最大79个字符的字符串*/
int i,len,k[10],n=0,max=0;
printf("Input 10 strings:\n");
for(i=0;i<10;i++) /*向 str 数组输入 10 个字符串*/
{
printf("String %d=",i+1);
gets(str[i]);
len=strlen(str[i]); /*计算输入之字符串之长度*/
if(len>max){max=len;n=0;k[n]=i;} /*记录最长字符串的长度、个数、在数组位置(行)*/
else if(len==max)k[++n]=i; /*与已记录最大长度相同时,记录其在数组中位置(行)*/
}
if(n==0) /*此时说明只有一个最大长度字符串,是 str[k[0] */ {
printf("The longest string is String %d:",k[0]+1); /*输出其序号*/
puts(str[k[0]]);
}
else /*此时说明有不止一个最大长度字符串时需要处理的复合语句*/ {
printf("Not only one!\n");
for(i=0;i<=n;i++) /*分别输出各序号、字符串*/
{
printf("These are String %d:",k[i]+1);
puts(str[k[i]]);
}
}
getch();
}
<OVER>
最后愿大家都能轻松通过考试 呵呵