admin 管理员组

文章数量: 1086019


2024年4月27日发(作者:电脑下载oracle)

C语言程序设计(第三版)习题答案

习题一

一、名词解释

(1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)高级语言P2

(5)汇编程序P3 (6)编译程序P4 (7)算法P5 (8)结构化程序设计方法P10

二、简答题

1. 设计程序时应遵循哪些基本原则?P4

答:正确性、可靠性、简明性、有效性、可维护性、可移植性。

2. 算法具有哪些特点?

答:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。

3. 算法的表示形式有哪几种?

答:自然语言、伪代码、传统流程图、N-S流程图、计算机语言。

4. 结构化程序设计方法的三种基本结构是什么?

答:顺序结构、选择结构和循环结构。

5. 传统流程图与N-S流程图最大的区别是什么?

答:N-S流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。

三、用传统流程图或N-S流程图表示求解以下问题的算法。

1. 从键盘输入10个整数,求出其中的最小数并输出。

输入一个数给x

min=x; n=1;

当n<10时

输入下一个数给x

如果x

Yes No

2. 求1+2+3+…+100的值。

s=0; i=1;

当i≤100时

s=s+i; i=i+1;

输出s的值

3. 求10~50的所有素数之和。

min=x;

n=n+1;

输出min的值

i=10; s=0;

当i≤50时

n=2; flag=1;

当n

i能否被n整除?

yes no

flag=0;

n=n+1;

flag=1?

yes no

s=s+i;

i=i+1;

输出s的值

4. 求下列分段函数的值。

4X-1 (X≤1)

5(X-1)+6 (1

Y=

6-3X (X≥5)

输入一个数给x

x≤1

Yes no

x<5

yes no

y=4x-1 y=5x+1 y=6-3x

输出s的值

四、请参照本章例题,编写一个简单的C程序,输出以下三行信息。

**************************

Yangtze University

**************************

#include

void main()

{

printf("**************************n");

printf(" Yangtze Universityn");

printf("**************************n");

}

习题二

一、选择题

1~10: B C D C D D B C A A

11~20: D A C D B D B A C D

二、填空题

1.字母 L 或字母 l

2. %c(或字符) 、 %d(或整数)

3. 在程序运行过程中,其值可以在一定的范围内变化的量

4. '0'

5. 小数形式 、 指数形式

6. 关键字 、 预定义标识符 、 用户标识符

7. 字母 、 数字 、 下划线 、 数字

8. 18

9. 2 、 1 、 30

10. 双精度实数或double

11. 赋值 、 逗号 、 20 、 20 、 20 、 4

12. 4 、 4

习题三

一、选择题

1~10: B C C B C C C D C C

注:第4题答案D为: 10 22↙

33↙

二、填空题

1. printf 、 scanf

2. h

3. "%5d"

4. '0'

5. e 、 E

6. 6

7. s 、 c

8. *

9. - 、 +

10. i

三、编程题

1. 编写程序,从键盘输入一个以秒为单位的时间数,将其换算成几小时几分几秒,然后进

行输出。例如输入的时间为4258秒,则输出结果为:1小时10分58秒。

#include

void main()

{

int x,h,m,s;

scanf("%d",&x);

h=x/3600; m=x%3600/60; s=x%60;

printf("%ds=%d:%d:%d!n",x,h,m,s);

}

2. 编写程序,读入三个整数给变量a、b、c,然后交换它们中的数,把a中原来的值给b,

把b中原来的值给c,把c中原来的值给a。

#include

void main()

{

int a,b,c,t;

printf("input a b c:");

scanf("%d%d%d",&a,&b,&c);

printf("a=%d,b=%d,c=%dn",a,b,c);

t=a;a=c;c=b;b=t;

printf("a=%d,b=%d,c=%dn",a,b,c);

}

习题四

一、填空题

1. 1 、 0

2. ! % + <= != && || =

3. x==0

4. 0 、 2

5. 20 、 0 、 0

二、选择题

1~7:D D C A D D C

三、程序阅读题

1. 595959

2. 0.500000

3. 1

4. 2

5. 6

6. a=2,b=1

7. pass

warn

8. 1

四、编程题

1. 设a为整型变量且其值大于零,请将以下if语句改写成switch语句。

if(a<60) m=1;

else if(a<70) m=2;

else if(a<80) m=3;

else if(a<90) m=4;

else m=5;

方法1

#include

void main()

{

int a,m;

scanf("%d",&a);

switch(a/10)

{

case 0:case 1:case 2:case 3:

case 4:case 5:m=1;break;

case 6:m=2;break;

case 7:m=3;break;

case 8:m=4;break;

default:m=5;break;

}

printf("m=%dn",m);

}

方法2

#include

void main()

{

int a,m;

scanf("%d",&a);

m=0;

switch(a/10)

{

default:m++;

case 8:m++;

case 7:m++;

case 6:m++;

case 5:case 4:case 3:case 2:

case 1:case 0:m++;

}

printf("m=%dn",m);

}

2. 编写程序,从键盘输入一个整数,打印出它是奇数还是偶数。

#include

void main()

{

int a;

scanf("%d",&a);

if(a%2==1)

printf("%d is a odd number!n",a);

else

printf("%d is a even number!n",a);

}

3. 编写程序,从键盘输入一个字符,判别它是否是小写字母,如果是,将它转换为大写字母;如果不

是,不转换。然后输出最后得到的字符。

#include

void main()

{

char ch;

scanf("%c",&ch);

if(ch>='a' && ch<='z')

ch=ch-32;

printf("%cn",ch);

}

4. 编写程序,从键盘输入一个不多于4位的正整数,打印出它是几位数。

#include

void main()

{

int x,n;

scanf("%d",&x);

if(x>1000) n=4;

else if(x>100) n=3;

else if(x>10) n=2;

else n=1;

printf("%dn",n);

}

5. 当一个人的月收入在3500元以下时免税;月收入在3500元到5000元之间时,超过3500的部分纳

税3%;月收入在5000元以上时,3500至5000之间的部分纳税3%,超过5000的部分纳税10%。编写

程序从键盘输入月收入income,计算并输出应交税款tax。

#include

void main()

{

int income;

float tax;

scanf("%d",&income);

if(income<=3500) tax=0;

else if(income<=5000) tax=0.03*(income-3500);

else tax=0.03*(5000-3500)+0.10*(income-5000);

printf("tax=%fn",tax);

}

6. 回文是指正读和反读都一样的数或字符串。例如:12321、55455、35553等都是回文。请编写一个程

序,从键盘上读取一个包含五位数字的长整数,并判断它是否是回文。(提示:用除法运算和求余运

算把一个数的个位、十位、百位、千位等分别分离出来。)

#include

void main()

{

long x;

int a,b,d,e;

scanf("%ld",&x);

a=x/10000;

b=x%10000/1000;

d=x%100/10;

e=x%10;

if(a==e && b==d)

printf("%ld is huiwen!n",x);

else

printf("%ld is not huiwen!n",x);

}

习题五

一、阅读题

1. 8

2. 4321

3. X

4. -1

5. 23

6. 52

7. 5

8. 3

二、填空题

1. 18

2. 2

3. b=i+1

4. 17

5. i<=9 、 j%3!=0

6. d=1.0 、 k=k+1 、 k<=10

三、选择题

1~8:A D D A B D D A

四、编程题

1. 编写程序,打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方之

333

和等于该数本身。例如,407是一个“水仙花数”,因为407=4+0+7。(注:若将题意改为打印出最大的

或最小的“水仙花数”,则应将循环语句作如何调整?)。

#include

void main()

{

int a,b,c,k;

for(k=100;k<=999;k++)

//求最大的“水仙花数”改用:for(k=999;k>=100;k--)

{

a=k/100;b=k/10%10;c=k%10;

if(k==a*a*a+b*b*b+c*c*c)

{

printf("%5d",k);

//求最大或最小”水仙花数”时增加一个语句:break;

}

}

printf("n");

}

2. 编写程序,输出1980~2880年所有闰年的年号。每输出5个年号换一行。

#include

void main()

{

int k,flag,n=0;

for(k=1980;k<=2880;k++)

{

flag=(k%4==0)&&(k%100!=0)||(k%400==0);

if(flag)

{

printf("%5d",k);

n++;

if(n%10==0)

printf("n");

}

}

printf("n");

}

3. 编写程序,求1-3+5-7+…-99+101的值。

#include

void main()

{

int n,t=1,s=1;

for(n=3;n<=101;n+=2)

{ t=-t; s=s+t*n; }

printf("s=%dn",s);

}

4. 编写程序,计算并输出下列级数的前n项之和S

n

。n的值从键盘输入。

S

n

23581321

...

1235813

void main()

{

int fz,fm,n,i;

#include

float s,t;

fz=2;fm=1;s=0;

scanf("%d",&n);

for(i=1;i<=n;i++)

{

t=(1.0*fz)/fm;

s=s+t;

fz=fz+fm;

fm=fz-fm;

}

printf("s=%fn",s);

}

5.编写程序,求e的值e=1+1/1!+1/2!+1/3!+1/4!+…+1/n!

#include

void main()

{

int n,i;

float t,fm=1,e=1;

scanf("%d",&n);

for(i=1;i<=n;i++)

{ fm=fm*i; t=1.0/fm; e=e+t; }

printf("n=%d,e=%fn",n,e);

}

6. 已知某球从80米高度自由落下,落地后反复弹起,每次弹起的高度都是上次高度的一半。求此球8

次落地所经过的总路程。

#include

void main()

{

int n;

float s=80,h=s/2;

for(n=2;n<=8;n++)

{

s=s+2*h;

h=h/2;

}

printf("s=%fn",s);

}

7. 用牛顿迭代法求高次方程f(x)=2x-4x+5x-18=0的根(约为2.466)。

注:牛顿迭代公式为:x

2

=x

1

-f(x

1

)/f’(x

1

),其中f’(x

1

)为导函数在点x

1

的值。

#include

#include

void main()

{

float x,f,f1;

x=8; // x的初值可为任意值

32

do

{ f=2*x*x*x-4*x*x+5*x-18; f1=6*x*x-8*x+5; x=x-f/f1;

}while(fabs(f)>0.00001);

printf("x=%f,f=%fn",x,f);

}

8. 有这样一些真分数:其分子和分母都是两位正整数,且分子的个位数与分母的十位数相同,如果把

该分数的分子的个位数与分母的十位数同时去掉,所得到的新的分数正好与原分数的值相等,如

26/65=2/5。试编程求出所有满足上述条件的真分数。

#include

void main()

{

int a,b,c; // 设这个分数为ab/bc

for(a=1;a<=9;a++)

for(b=1;b<=9;b++)

for(c=1;c<=9;c++)

if((a

printf("%d/%d=%d%d/%d%d=%fn",a,c,a,b,b,c,1.0*a/c);

}

9. 编写程序,求数列:1,(1+1/2),(1+1/2+1/3),(1+1/2+1/3+1/4),(1+1/2+1/3+1/4+1/5),…

的前10项之和。

#include

void main()

{

float s,t;

int i;

s=0,t=0;

for(i=1;i<=10;i++)

{ t=t+1.0/i; s=s+t; }

printf("s=%fn",s);

}

10. 编写程序,求3到100之间的所有素数之和。

#include

void main()

{

int s,i,k,flag;

s=0;

for(i=3;i<=100;i++)

{

flag=1;

for(k=2;k

if(i%k==0)

{ flag=0; break; }

if(flag)

{ s=s+i; printf("%4d",i); }

}

printf("nsum=%dn",s);

}

11. 编写程序,求Fibonacci数列中大于800的最小的一个数(结果为987)。

#include

void main()

{

int f1=1,f2=1,f3;

while(f3<=800)

{

f3=f1+f2;

f1=f2;

f2=f3;

}

printf("Fibonacci数列中大于800的最小数是%5dn",f3);

}

习题六

一、选择题

1~10:D D C B A B C D C D

11~20:A B B C C D C A B B

21~30:B B D D D D C D C A

注:第16题答案C为:字符串"SHORT"与"SHORT "相等

第19题题目为:已知:char str1[10],str2[10]={"books"};则在程序中能够将字符串

"books"赋给数组str1的正确语句是 。

第21题题目为:设有:char str1[20]="abcde",str2[20]="xyz";则执行语句:

printf("%d",strlen(strcpy(str1,str2)); 的结果是 。

第28题答案D为: aaaa

bbbb

cccc dddd

二、填空题

1. 9 、 0

2. 先行后列

3. 字符数组

4. QuickC

5. (c=getchar( )) 、 'A'+i或65+i

6. '0' 、 str1[i]-str2[i]

7. CDABC

8. 6

9. 1 0 0 0 0

0 1 0 0 0

0 0 1 0 0

0 0 0 1 0

0 0 0 0 1

10. 600

11. AzyD

12. 4 some string *test

三、编程题

1. 定义一个有20个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。

#include

#include

void main()

{

int i,s0=0,s1=0,a[20];

for(i=0;i<20;i++)

a[i]=rand()%100;

for(i=0;i<20;i+=2)

{ printf("%3d",a[i]);

s0=s0+a[i]; }

printf(" sum is:%d ave=%fn",s0,s0/10.0);

for(i=1;i<20;i+=2)

{ printf("%3d",a[i]);

s1=s1+a[i]; }

printf(" sum is:%d ave=%fn",s1,s1/10.0);

}

2. 设有一个整型数组,另输入一个整数,编程查找这个整数是否在数组中出现过,若出现,则输出第

一次出现的位置,否则,输出no found。

#include

#include

void main()

{

int i,s,a[20];

for(i=0;i<20;i++)

a[i]=rand()%100;

scanf("%d",&s);

for(i=0;i<20;i++)

if(a[i]==s)

{ printf("found:a[%d]=%dn",i,a[i]);

break; }

if(i==20)

printf("no foundn");

for(i=0;i<20;i++)

printf("%3d",a[i]);

printf("n");

}

3. 设有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入到数组中。

#include

#define N 10

void main()

{

int i,j,s;

//int a[N]={1,3,5,7,9,11,13,15,17};

int a[N]={17,15,13,11,9,7,5,3,1};

scanf("%d",&s);

i=0;

if(a[0]

while(s>a[i]) i++;

else

while(s

for(j=N-1;j>i;j--)

a[j]=a[j-1];

a[j]=s;

for(i=0;i

printf("%3d",a[i]);

printf("n");

}

4. 编一程序,从一个已排好序的数组中删去某个位置上的元素。

#include

#define N 10

void main()

{

int i,j;

int a[N]={1,3,5,7,9,11,13,15,17,19};

for(i=0;i

printf("%3d",a[i]);

printf("n");

scanf("%d",&i);

for(j=i;j

a[j]=a[j+1];

for(i=0;i

printf("%3d",a[i]);

printf("n");

}

5. 将一个二维数组的行、列互换后存到另一个二维数组中并输出结果。

#include

void main()

{

int i,j;

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},b[4][3];

for(i=0;i<4;i++)

for(j=0;j<3;j++)

b[i][j]=a[j][i];

printf("array a:n");

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

printf("%5d",a[i][j]);

printf("n");

}

printf("array b:n");

for(i=0;i<4;i++)

{

for(j=0;j<3;j++)

printf("%5d",b[i][j]);

printf("n");

}

}

6. 编一程序,在一个二维数组中,查找第一次出现的负数,并输出该数及其所在的行、列号。

#include

void main()

{

int i,j,flag;

int a[3][4]={1,3,5,7,9,11,13,-15,17,19,-21,23};

flag=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(a[i][j]<0)

{

flag=1;

printf("found:a[%d][%d]=%dn",i,j,a[i][j]);

i=j=100; //可使双重循环提前结束

}

if(flag==0)

printf("no found!");

printf("array a:n");

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

printf("%5d",a[i][j]);

printf("n");

}

}

7. 编程将一个字符数组中的字母,按由大到小的顺序进行排序。

#include

#include

void main()

{

char t,s[]="ABCDIVBHFBVCNLKFDB";

int i,j,n;

puts(s);

n=strlen(s);

for(i=0;i

for(j=i+1;j

if(s[i]

{ t=s[i];s[i]=s[j];s[j]=t; }

puts(s);

}

8. 输入一行字符,统计其中有多少个英语单词,单词之间用空格隔开。

#include

#include

void main()

{

char s[81];

int w,i,n;

gets(s);

i=0;n=0;w=0;

while(s[i]!='0')

{

if(s[i]==' ')

w=0; /*end of a word*/

else

if(w==0)

{w=1;n++;} /*begin of a word*/

i++;

}

printf("number of word:%dn",n);

}

9. 编程将两个一维数组中的对应元素的值相减后进行输出。

#include

#include

void main()

{

int i,a[10],b[10];

for(i=0;i<10;i++)

{ a[i]=rand()%100; printf("%4d",a[i]); }

printf("n");

for(i=0;i<10;i++)

{ b[i]=rand()%100; printf("%4d",b[i]); }

printf("n");

for(i=0;i<10;i++)

printf("%4d",a[i]-b[i]);

printf("n");

}

10. 有n个无序的数放在数组a中,请将相同的那些数删得只剩得一个,输出经过删除后的数据。

#include

void main()

{

int i,j,k,a[10]={90,20,40,30,50,50,50,50,20,80};

for(i=0;i<10;i++)

printf("%4d",a[i]);

printf("n");

for(i=0;i<9;i++)

for(j=i+1;j<10;j++)

if(a[j]==a[i])

{ a[j]=-888; }

k=0;

for(i=0;i<10;i++)

if(a[i]!=-888)

{

printf("%4d",a[i]);

a[k++]=a[i];

} //不相同的有效元素只有K个了

printf("n");

}

11. 求二维数组中这样一个元素的位置:它在行上最小,在列上也最小。如果没有这样的元素则输出相

应的信息。

#include

#include

void main()

{

int j,i,k,flag,fz=0,a[4][5];

for(i=0;i<4;i++)

{

for(j=0;j<5;j++)

{

a[i][j]=rand()%100;

printf("%4d",a[i][j]);

}

printf("n");

}

for(i=0;i<4;i++)

{

for(j=0;j<5;j++)

{

flag=1;

for(k=0;k<5;k++)

if(a[i][k]

{ flag=0;break; }

for(k=0;k<4&&flag;k++)

if(a[k][j]

{ flag=0;break; }

if(flag)

{ fz++; printf("min a[%d][%d]=%dn",i,j,a[i][j]); }

}

}

if(fz==0)

printf("no found!");

}

12. 在一个二维数组中形成并输出如下矩阵:

1 1 1 1 1

2 1 1 1 1

A= 3 2 1 1 1

4 3 2 1 1

5 4 3 2 1

#include

#define N 5

void main()

{

int j,i,a[N][N];

for(i=0;i

for(j=0;j

{

if(i<=j)

a[i][j]=1;

else if(j==0)

a[i][j]=i+1;

else

a[i][j]=a[i-1][j-1];

}

for(i=0;i

{

for(j=0;j

printf("%4d",a[i][j]);

printf("n");

}

}

13. 已知A是一个3╳4的矩阵,B是一个4╳5的矩阵,编程求A╳B得到的新矩阵C,并输出C矩阵。

#include

void main()

{

int j,i,k,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int b[4][5]={3,2,1,5,4,4,3,2,5,1,2,3,5,4,1,7,8,5,6,9},c[3][5];

printf("array A(3*4):n");

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

printf("%4d",a[i][j]);

printf("n");

}

printf("array B(4*5):n");

for(i=0;i<4;i++)

{

for(j=0;j<5;j++)

printf("%4d",b[i][j]);

printf("n");

}

for(i=0;i<3;i++)

for(j=0;j<5;j++)

{

c[i][j]=0;

for(k=0;k<4;k++)

c[i][j]+=a[i][k]*b[k][j];

}

printf("array C(3*5)=A * B:n");

for(i=0;i<3;i++)

{

for(j=0;j<5;j++)

printf("%4d",c[i][j]);

printf("n");

}

}

14. 编程输出两个字符串中对应位置上相同的字符。

#include

void main()

{

int i;

char a[81]="acbsbdvhfejbvewvkbewljbv";

char b[81]="anbdxwdbviuerkjvbfidbvuie bik";

printf("string1: %sn",a);

printf("string2: %sn",b);

printf("string3: ");

i=0;

while(a[i]!='0' && b[i]!='0')

{

if(a[i]==b[i])

printf("%c",a[i]);

i++;

}

printf("n");

}

15. 设有一字符串已按升序排列在字符数组a中,请将另一字符串b中的字符按升序的规律插到数组a

中。

#include

#include "string.h"

void main()

{

int i,j,k;

char a[81]="acdfhjklmopxz";

char b[81]="anbdx";

printf("string1: %sn",a);

printf("string2: %sn",b);

i=0;

while(b[i]!='0')

{

j=0;

while(a[j]

j++;

k=strlen(a);

while(k>=j)

{ a[k+1]=a[k];k--; }

a[j]=b[i];

i++;

}

printf("string3: %sn",a);

}

16. 将已按升序排列的两个字符串a和b中的字符按升序归并到字符数组c中。

#include

#include "string.h"

void main()

{

int i,j,k;

char a[81]="acdfhjklmopxz";

char b[81]="abdnx";

char c[81];

printf("string1: %sn",a);

printf("string2: %sn",b);

i=0;j=0;k=0;

while(a[i]!='0'&&b[j]!='0')

{

if(a[i]

c[k++]=a[i++];

else

c[k++]=b[j++];

}

while(a[i])

c[k++]=a[i++];

while(b[j])

c[k++]=b[j++];

c[k]='0';

printf("string3: %sn",c);

}

习题七

一、选择题

1~10:D C D B D B C A A B

11~19:B B A B A D A B A

二、填空题

1. 声明

2. 自动将其转换为函数定义时的类型

3. 10

4. i<=n 、 s 、 0 、 f(k)

5. Itis

6. 2721

7. 0246

8. k 、 -1

9. 2 、 2

10. p=j 、 x[i][p] 、 LineMax(x)

11. 5

12. 24

13. age(n-1)+2 、 age(n)

14. m%10 、 m/10 、 m或m!=0 、 r(m)

三、编程题

1. 编一函数,判断某年是否为闰年,若是返回1,否则返回0。

#include

int fun(int m)

{ return (m%4==0)&&(m%100!=0)||(m%400==0); }

void main()

{

int n;

scanf("%d",&n);

if(fun(n))

printf("year:%d is a leap!n",n);

}

2. 编写计算三角形面积的程序,将计算面积定义成函数。三角形面积公式为:

A=

s(sa)(sb)(sc)

式中s=(a+b+c)/2

其中A为三角形面积,a、b、c为三角形的三条边的长度。

#include

#include

float fun(float a,float b,float c)

{

float f,s;

s=(a+b+c)/2;

if((s<=a)||(s<=b)||(s<=c)) //或(a+b)>c&&(a+c)>b&&(b+c)>a

f=0;

else

f=sqrt(s*(s-a)*(s-b)*(s-c));

return f;

}

void main()

{

float a,b,c;

scanf("%f%f%f",&a,&b,&c);

printf("area is:%fn",fun(a,b,c));

}

3. 编写两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出

结果,两个整数由键盘输入。

#include

#include

int fmax(int m,int n)

{

int r;

r=m%n;

while(r!=0)

{ m=n;n=r;r=m%n; }

return n;

}

int fmin(int m,int n)

{ return m*n/fmax(m,n); }

void main()

{

int a,b;

scanf("%d%d",&a,&b);

printf("fmax is:%dn",fmax(a,b));

printf("fmin is:%dn",fmin(a,b));

}

4. 编写函数,根据整型形参m的值,计算公式

t=1-

11

1

--…-的值。例如,若m=5,则应输出0.536389。

2*2

3*3

m*m

#include

float fun(int m)

{

float t=1.0;

int i;

for(i=2;i<=m;i++)

t=t-1.0/i/i;

return t;

}

void main()

{

int m;

scanf("%d",&m);

printf("t(%d)=%fn",m,fun(m));

}

5. 计算s=1+

1

1

1

++…+。n由终端输入,将计算n!定义成函数。

2!

3!

n!

#include

float fun(int m)

{

int i;

float s=0.0,t=1.0;

for(i=1;i<=m;i++)

{ t=t/i; s=s+t; }

return s;

}

void main()

{

int n;

scanf("%d",&n);

printf("s(%d)=%fn",n,fun(n));

}

6. 编写函数,利用公式:

1121231234

1

23353573579

-5

计算π的近似值,当某一项的值小于10时,认为达到精度要求。

#include

double fun()

{

int n;

double pi=1,t=1;

n=1;

do

{

t=t*n/(2*n+1);

pi=pi+t;

n++;

}while(t>1e-5);

return 2*pi;

}

void main()

{ printf("pi=%fn",fun()); }

7. 编一函数,判断某一整数是否为回文数,若是返回1,否则返回0。所谓回文数就是该数正读与反读

是一样的。例如12321就是一个回文数。

#include

#include

int huiwen(int m)

{

int t,n=0;

t=m;

while(t)

{ n++; t=t/10; } //求出M是几位的数

t=m;

while(t)

{

if(t/(int)pow(10,n-1)!=t%10) //比较其最高位和最低位

return 0;

else

{

t=t%(int)pow(10,n-1); //去掉其最高位

t=t/10; //去掉其最低位

n=n-2; //位数去掉了两位

}

}

return 1;

}

void main()

{

int x;

scanf("%d",&x);

if(huiwen(x))

printf("%d is a huiwen!n",x);

else

printf("%d is not a huiwen!n",x);

}

8. 编写一个求水仙花数的函数,然后通过主函数调用该函数求100到999之间的全部水仙花数。所谓

水仙花数是指一个三位数,其各位数字的立方和等于该数本身。

例如:153就是一个水仙花数:153=1*1*1+5*5*5+3*3*3

#include

#include

int fun8(int m)

{

int a,b,c;

a=m/100; b=m/10%10; c=m%10;

if(m==a*a*a+b*b*b+c*c*c)

return 1;

else

return 0;

}

void main()

{

int i;

for(i=100;i<=999;i++)

if(fun8(i))

printf("%5d",i);

printf("n");

}

9. 编一函数primedec(m),求整数m的所有因子并输出。例如:120的因子为:2,2,2,3,5。

#include

#include

void primedec(int m)

{

int n=2;

while(m>1)

{

while(m%n==0)

{ printf("%d ",n);m=m/n; }

n++;

}

printf("n");

}

void main()

{ int x;

scanf("%d",&x);

primedec(x);

}

10. 求100~200之间的所有素数,按每行6个输出。

#include

#include

int prime(int m)

{

int n,f=1;

for(n=2;n

if(m%n==0)

{ f=0;break; }

return f;

}

void main()

{

int x,n=0;

for(x=100;x<=200;x++)

if(prime(x))

{

n++;

printf("%5d",x);

if(n%6==0)

printf("n");

}

printf("n");

}

11. 编一函数,求末尾数非0的正整数的逆序数,如:reverse(3407)=7043。

#include

#include

int reverse(int m)

{

int x=0;

while(m)

{

x=x*10+m%10;

m=m/10;

}

return x;

}

void main()

{

int w;

scanf("%d",&w);

printf("%d==>%dn",w,reverse(w));

}

编一函数,将一个字符数组中的数字字符存于另一个字符数组中。

#include

#include

void fun12(char a[],char b[])

{

int i=0,j;

for(j=0;j

if(b[j]>='0'&&b[j]<='9')

a[i++]=b[j];

a[i]='0';

}

void main()

{

char s1[81],s2[81];

gets(s2);

fun12(s1,s2);

puts(s2);puts(s1);

}

编一函数,统计一个字符串中字母、数字、空格和其它字符的个数。

#include

#include

void fun13(char s[])

{

int i,num=0,ch=0,sp=0,oh=0;

char c;

for(i=0;(c=s[i])!='0';i++)

if(c==' ') sp++;

else if(c>='0'&&c<='9') num++;

else if(toupper(c)>='A' && toupper(c)<='Z') ch++;

else oh++;

12.

13.

printf("char:%d,number:%d,space:%d,other:%dn",ch,num,sp,oh);

}

void main()

{

char s1[81];

gets(s1);

fun13(s1);

}

14. 用递归的方法实现求1+2+3+…+n。

#include

#include

int fun14(int m)

{

int w;

if(m==1)

w=1;

else

w=fun14(m-1)+m;

return w;

}

void main()

{

int x,i;

scanf("%d",&x);

printf("1+2+...+%d=%dn",x,fun14(x));

}

15. 用递归的方法将一个整数转换成字符串。例如:输入345,应输出字符串“345”。

#include

#include

void fun15(int m)

{

if(m!=0)

{

fun15(m/10);

printf("%c ",'0'+m%10);

}

}

void main()

{

int x;

scanf("%d",&x);

printf("%d==>",x);

fun15(x);

printf("n");

}

16. 采用递归的方法计算x的n次方。

#include

#include

float p(float x,int n)

{

float f;

if(n==0)

f=1;

else

f=p(x,n-1)*x;

return f;

}

void main()

{

float x;

int n;

scanf("%f%d",&x,&n);

printf("p(%f,%d)=%f",x,n,p(x,n));

}

习题八

一、选择题

1~10: A D B C C A B D B A

11~14: B C C D

二、填空题

1. 从定义点到函数体(或复合语句)结束

2. auto

3. ① 局部 、 ② 全局

4. ① 外部 、 ② 内部

5. 2,5,1,2,3,-2

6. a=5

a*a=25

a*a*a=8

7. add:y=25;sub:y=5;main:x=25;main:y=10

习题九

一、选择题

1~8: D C B C A B B B

二、填空题

1. 1000 10

2. 11

3. 0 1 1

三、 编程题

1. 定义一个带参的宏,求两个整数的余数。通过宏调用,输出求得的结果。

#define R(m,n) (m)%(n)

#include

void main()

{

int m,n;

printf("enter two integers:n");

scanf("%d%d",&m,&n);

printf("remainder=%dn",R(m,n));

}

2. 分别用函数和带参的宏,从3个数中找出最大者。

#include

#define MAX(a,b) ((a)>(b)?(a):(b)) // implementation by MACRO

int max3(int a,int b,int c) //implementation by function

{

int m;

m=a>b?a:b;

m=m>c?m:c;

return m;

}

void main()

{

int m,n,k;

printf("enter 3 integer:n");

scanf("%d%d%d",&m,&n,&k);

printf("1. MACRO max=%dn",MAX(MAX(m,n),k));

printf("2. function max=%dn",max3(m,n,k));

}

3. 输入一个整数m,判断它能否被3整除。要求利用带参的宏实现。

#include

#define DIVIDEDBY3(m) (m)%3==0

void main()

{

int m;

printf("enter a integer:n");

scanf("%d",&m);

if(DIVIDEDBY3(m))

printf("%d is divided by 3n",m);

else

}

printf("%d is not divided by 3n",m);

习题十

一、填空题

1. 首地址

2. 0

3.

1) int *p=&k;

2) *p=6;

3) int **pp;

4) pp=&p;

5) (**pp)*=2;

4. 整型数组名 、 指向整型数据的指针值

5. *(++p)

二、选择题

1~10: B C A D C A A A B B

11~15: C B C D C

16: ① B ② B ③ C

17: ① B ② D

18: ① B ② A ③ C

19~21: B A C

三、编程题

1. 编写函数,对传递进来的两个整型量计算它们的和与积之后,通过参数返回。

#include

void compute(int m,int n,int *sum,int *p)

{ *sum=m+n;

*p=m*n;

}

void main()

{

int x,y,sum,product;

printf("enter 2 integers:n");

scanf("%d%d",&x,&y);

compute(x,y,&sum,&product);

printf("x=%d y=%d sum=%d product=%dn",x,y,sum,product);

}

2. 编写一个程序,将用户输入的字符串中的所有数字提取出来。

#include

#include

void main()

{

char string[81],digit[81];

char *ps;

int i=0;

printf("enter a string:n");

gets(string);

ps=string;

while(*ps!='0')

{

if(*ps>='0' && *ps<='9')

{

digit[i]=*ps;

i++;

}

ps++;

}

digit[i]='0';

printf("string=%s digit=%sn",string,digit);

}

3. 编写函数实现,计算字符串的串长。

#include

#include

int StringLength(char *s)

{

int k;

for(k=0;*s++;k++);

return k;

}

void main()

{

char string[81];

printf("enter a string:n");

gets(string);

printf("length of the string=%dn",StringLength(string));

}

4. 编写函数实现,将一个字符串中的字母全部转换为大写。

#include

#include

char *Upper(char *s)

{

char *ps;

ps=s;

while(*ps)

{

if(*ps>='a' && *ps<='z')

*ps=*ps-32;

ps++;

}

return s;

}

void main()

{

char string[81];

printf("enter a string:n");

gets(string);

printf("before convert: string=%sn",string);

printf(" after convert: string=%sn",Upper(string));

}

5. 编写函数实现,计算一个字符在一个字符串中出现的次数。

#include

#include

int Occur(char *s, char c)

{

int k=0;

while(*s)

{

if(*s==c)

k++;

s++;

}

return k;

}

void main()

{

char string[81],c;

printf("enter a string:n");

gets(string);

printf("enter a character:n");

c=getchar();

printf("character %c occurs %d times in string %sn",

c,Occur(string,c),string);

}

6. 编写函数实现,判断一个子字符串是否在某个给定的字符串中出现。

#include

#include

int IsSubstring(char *str,char *substr)

{

int i,j,k,num=0;

for(i=0;str[i]!='0' && num==0;i++)

{

for(j=i,k=0;substr[k]==str[j];k++,j++)

if(substr[k+1]=='0')

{ num=1; break; }

}

return num;

}

void main()

{

char string[81],sub[81];

printf("enter first string:n");

gets(string);

printf("enter second string:n");

gets(sub);

printf("string '%s' is ",sub);

if(!IsSubstring(string,sub))

printf("not ");

printf("substring of '%s'n",string);

}

7. 有n个人围成一圈,顺序排号。由用户从键盘输入报数的起始位置,从该人开始报数(计数从0开

始),凡报数为3的倍数出圈。问最后剩下的是几号?

见导学例10.25

8. 由一个整型二维数组,大小为m×n,要求找出其中最大值所在的行和列,以及该最大值。请编一个

函数max,数组元素在main函数中输入,结果在函数max中输出。

见导学例10.26

9. 由n个学生,每个学生考m门课程,要求编一函数,能检查n个学生有无不及格的课程,如果由某

一学生有一门或一门以上课程不及格,就输出该学生的号码(学号从0开始)和其全部课程成绩。

见导学例10.27

习题十一

一、选择题

1~10: A A B D D B D D D C

11~20: C B B C C

二、填空题

1.___2___、___3_ _

2. struct node *next

3. struct link *head 、 p->data 、 p->next

4.__ A _

三、编程题

1.编写程序,进行两个复数的相减。

#include

struct Complex

{

double m_r,m_i;

};

struct Complex sub(struct Complex c1,struct Complex c2)

{

}

void main()

{

struct Complex c1 ={1.2,2.3},c2={0.2,0.3};

struct Complex c;

c=sub(c1,c2);

printf(“c=%g+i%gn”,c.m_r,c.m_i);

}

2.定义一个包括年、月、日的结构体。输入一个日期,计算该日在本年中是第几天?注意闰年问题。

#include

struct ymd

{

int day;

int month;

int year;

};

int dayof[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int days(struct ymd *p)

{

int i,d;

if(p->year%4==0&&p->year%100!=0||p->year%400==0)

dayof[2]=29;

d=p->day;

for(i=1;imonth;i++)

d=d+dayof[i];

return (d);

}

void main()

{

struct ymd date;

int d;

for(;;)

{

printf("date(yyyy/mm/dd)=? (yyyy=0--Exit)nn");

scanf("%d/%d/%d",&,&,&);

if(==0)

break;

d=days(&date);

printf("nThe day of the year is %d !nn",d);

}

}

3.有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。从键盘输入10个学生的数据,要

struct Complex c;

c.m_r=c1.m_r-c2.m_r;

c.m_i=c1.m_i-c2.m_i;

return c;

求输出3门课程的总平均成绩,以及最高分的学生的学号、姓名、3门课程成绩、平均分数。

#include

#define N 10

struct student

{

char num[6];

char name[8];

float score[3];

float avr;

}stu[N];

void main()

{

int i,j,maxi;

float sum,max,average;

for(i=0;i

{

printf("input scores of student%d:n",i+1);

printf("No.:");

scanf("%s",stu[i].num);

printf("name:");

scanf("%s",stu[i].name);

for(j=0;j<3;j++)

{

printf("score %d:",j+1);

scanf("%f",&stu[i].score[j]);

}

}

average=0;

max=0;

maxi=0;

for(i=0;i

{

sum=0;

for(j=0;j<3;j++)

sum+=stu[i].score[j];

stu[i].avr=sum/3.0;

average+=stu[i].avr;

if(sum>max)

{

max=sum;

maxi=i;

}

}

average/=N;

printf(" No. name scorel score2 score3 averagen");

for(i=0;i

{

printf("%5s%10s",stu[i].num,stu[i].name);

for(j=0;j<3;j++)

printf("%9.2f",stu[i].score[j]);

printf(" %8.2fn",stu[i].avr);

}

printf("average=%5.2fn",average);

printf("The highest score is: student %s,%s.n",

stu[maxi].num,stu[maxi].name);

printf("His scores are: %6.2f,%6.2f,%6.2f,average:%5.2.n",

stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],

stu[maxi].avr);

}

4.设单向链表head1和head2已建立。编写将单向链表head2连接到单向链表head1之后的函数,以

head1返回,如图11.10所示。

/* 结点结构 Node */

struct Node

{

int data;

struct Node *next;

};

head1

连接前

1

head1

连接后

1 2

5

图11.10 链表的连接

head2

2

5 0

7

9 0

7

9 0

提示:函数原型为:struct Node *link(struct Node *head1, struct Node *head2);

struct Node *link(struct Node *head1,struct Node *head2)

{

struct Node *p,*head0;

p=head1;

head0=head1;

while(p->next!=NULL)

p=p->next;

p->next=head2;

return head0;

}

5.有两个链表a 和 b。设结点中包括学号、姓名。从a链表中删除去与b链表中有相同学号的那些结

点。

#include

#include

#define LA 4

#define LB 5

struct student

{

int num;

char name[8];

struct student *next;

}a[LA],b[LB];

void main()

{

struct student a[LA]={{101,"Wang"},{102,"Li"},

{105,"Zhang"},{106,"Wei"}};

struct student b[LB]={{103,"Zhang"},{104,"Ma"},{105,"Chen"},

{107,"Guo"},{108,"lui"}};

int i;

struct student *p,*p1,*p2,*head1,*head2;

head1=a; head2=b;

printf("list A: n");

for(p1=head1,i=1;i<=LA;i++)

{

if(inext=a+i;

else p1->next=NULL;

printf("%4d%8sn",p1->num,p1->name);

if(inext;

}

printf("nlist B:n");

for(p2=head2,i=1;i<=LB;i++)

{

if(inext=b+i;

else p2->next=NULL;

printf("%4d%8sn",p2->num,p2->name);

if(inext;

}

p1=head1;

while(p1!=NULL)

{

p2=head2;

while((p1->num!=p2->num)&&(p2->next!=NULL))

p2=p2->next;

if(p1->num==p2->num)

if(p1==head1)

head1=p1->next;

else

{ p->next=p1->next;p1=p1->next; }

else

{ p=p1;p1=p1->next; }

}

printf("nresult:n");

p1=head1;

while(p1!=NULL)

{

printf("%4d %7s n",p1->num,p1->name);

p1=p1->next;

}

}

习题十二

一、选择题

1~8: C B D B C A A B

二、填空题

1. 32

2.__ a&0__

3. _ x|0xFF00_

4. 64

三、编程题

1.取一个整数a从右端开始的4~7位。

#include

void main()

{

int num,mask;

printf("Input a integer number:");

scanf("%d",&num);

printf("the number:0x%xn",num);

num >>= 4; /* 右移4位,将4~7位移到低4位上 */

mask=~(~0<<4); /* 间接构造1个低4位为1、其余各位为0的整数 */

printf("4~7:0x%xn",num & mask);

}

2.编一个将十六进制数转换成二进制形式显示的程序。

#include

void main()

{

int num,mask,i;

printf("Input a hexadecimal number:");

scanf("%x",&num);

mask=1<<15; /* 构造1个最高位为1、其余各位为0的整数(屏蔽字) */

printf("%d=",num);

for(i=1;i<=16;i++)

{

putchar(num&mask?'1':'0'); /* 输出最高位的值(1/0) */

num<<=1; /* 将次高位移到最高位上 */

if(i%4==0)putchar(','); /* 四位一组,用逗号分开 */

}

printf("bBn");

}

习题十三

一、选择题

1~7: B D A B B B C

二、填空题

1. 2 、 !feof(f1) 、 f2

2. fopen(filename, "w") 、 ch

3. 0 、 "r" 、 !feof(fp)

4. BBBBCCCCDDDD

5. "w+" 、 str[i]-32 、 rewind(fp)

6. "" 、 fp

7. fopen 、 ftell

三、编程题

1. 调用fputs函数,把10个字符串输出到文件中;再从此文件中读入这10个字符串放在一个数组中;

最后把字符串数组中的字符串输出到终端屏幕,以检查所有操作的正确性。

#include

void main()

{

int i;

FILE *fp=fopen("","w");

char *str[10]={"One","two","three","four","five","six",

"seven","eight","nine","ten"};

char str2[10][20];

if(fp==NULL)

{

printf("Can not open write filen");

return;

}

for(i=0;i<10;i++)

{

fputs(str[i],fp);

fputs("n",fp);

}

fclose(fp);

fp=fopen("","r");

if(fp==NULL)

{

printf("Can not open read filen");

return;

}

i=0;

while(i<10&&!feof(fp))

{

printf("%s",fgets(str2[i],20,fp));

i++;

}

}

2. 从键盘读入10个浮点数,以二进制形式存入文件中。再从文件中读出数据显示在屏幕上。修改文件

中第四个数据。再从文件中读出数据显示在屏幕上,以验证修改的正确性。

#include

void ctfb(FILE *fp)

{

int i;

float x;

for(i=0;i<10;i++)

{

scanf("%f",&x);

fwrite(&x,sizeof(float),1,fp);

}

}

void fbtc(FILE *fp)

{

float x;

rewind (fp);

fread(&x,sizeof(float),1,fp);

while(!feof(fp))

{

printf("%f ",x);

fread(&x,sizeof(float),1,fp);

}

}

void updata(FILE *fp,int n,float x)

{

fseek(fp,(long)(n-1)*sizeof(float),0);

fwrite(&x,sizeof(float),1,fp);

}

void main()

{

FILE *fp;

int n=4;

float x;

if((fp=fopen("e:","wb+"))==NULL)

{

printf("can't open this filen");

exit(0);

}

ctfb(fp); fbtc(fp);

scanf("%f",&x);

updata(fp,n,x);

fbtc(fp);

fclose(fp);

}


本文标签: 函数 输出 字符串 数组 字符