C程序设计(第四版)课后习题答案_第1页
C程序设计(第四版)课后习题答案_第2页
C程序设计(第四版)课后习题答案_第3页
C程序设计(第四版)课后习题答案_第4页
C程序设计(第四版)课后习题答案_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章

1.什么是程序?什么是程序设计?

程序:一组计算机能识别和执行的指令。

程序设计:是指从确定任务到得到结果、写出文档的全过程(一般包

括以下6个阶段:1.问题分析2.设计算法3.编写程序4.对源程序进

行编辑、编译和连接5.运行程序,分析结果)

2.为什么需要计算机语言?高级语言的特点?

(1)因为人和计算机需要交流,就得创造一种计算机和人都能识别

的语言,就是计算机语言

(2)高级语言具有识别容易,记忆容易,可移植性好的优点,具有

执行效率低的缺点

5.请参照本章例题,编写一个C程序,输出以下信息:

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

Verygood!

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

#include<stdio.h>

intmain(){

printf(〃**********************\n〃)•

printf(z/Verygood!\n〃);

printf(〃*********************

return0;

)

6.编写一个C程序,输入a,b,c三个值,输出其中的最大者

#include<stdio.h>

intmain(){

inta,b,c,max;

printf("请输入a,b,c的值:");

scanf(zz%d%d%d〃,&a,&b,&c);

max=a;

if(max<b)max=b;

if(max<c)max=c;

printf("%d”,max);

return0;}

第二章

4.(1)有两个瓶子A和B,分别盛放醋和酱油。要求将它们互换(即

A瓶原来盛醋,现改盛酱油,B瓶相反)

inta,b,c;

t=a;

a=b;

b=t;

(2)依次将10个数输入,要求输出其中最大的数

#include<stdio.h>

intmain(){

inta[10],i,max;

printf(“请输入10个数:〃);

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

scanf(〃%cT,&a[i]);

max=a[0];

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

if(a[i]>max)

max=a[i];

)

printf("%d〃,max);

return0;}

⑶有3个数a,b,c,要求按大小顺序把它们输出

#include<stdio.h>

intmain(){

inta,b,c,t;

printf("请输入a,b,c三个数的值:〃);

scanf(z/%d%d%d〃,&a,&b,&c);

if(a<b){t=a;a=b;b=t;}

if(a<c){t=a;a=c;c=t;}

if(b<c){t=a;b=c;c=t;}

printf(z/%d%d%d〃,a,b,c);

return0;}

⑷求1+2+3+...+100

#include<stdio.h>

intmain(){

inti,sum=0;

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

sum+=i;

//,/

printf(sum=%d\n/sum);

return0;}

⑸判断一个数n能否同时被3和5整除

#include<stdio.h>

intmain(){

intn;

printf(〃pleaseinputn:");

scanf("%d",&n);

if((n%3==0)&&(n%5==0))

printf(zz%d能同时被3和5整除”,n);

else

printf("%d不能同时被3和5整除〃,n);

return0;}

⑹将100~200之间的素数输出

#include<stdio.h>

#include<math.h>

intmain(){

intij;

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

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

if(i%j==0)

break;

if(i==j)

printf(z/%d是素数\n〃,i);

return0;}

⑺求两个数m和n的最大公约数

#include<stdio.h>

intmain(){

intm,n,r=O;

printf(“输入要求最大公约数的两个数:");

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

r=m%n;

while(r!=0)

{m=n;

n=r;

r=m%n;}

printf("最大公约数是:%d\n“,n);

return0;}

⑻求方程式ax2+bx+c=0的根。分别考虑:

①有两个不等的实根;

②有两个相等的实根

#include<stdio.h>

#include<math.h>

intmain(){

inta,b,c,d,f,xl,x2;

printf("请输入a,b,c的值:");

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

d=b*b-4*a*c;

f=sqrt(d);

if(d>0){

xl=(-b+f)/2*a;

x2=(-b-f)/2*a;

printf(“方程有两个不相等的根,分别是%d,%d“,xl,x2);}

elseif(d==O){

xl=x2=(-l)*b/(2*a);

printf("方程有两个相等的根,是xl=x2=%d",xl);}

else

printf("方程有没有根)

return0;}

8.(1)输出1900~2000年中是闰年的年份,符合下面两个条件之一的年

份是闰年

①能被4整除但不能被100整除

②能被100整除且能被400整除

#include<stdio.h>

intmain(){

intn;

for(n=1900;n<=2000;n++){

if((n%4==0&&n%100!=0)11(n%100==0&&n%400==0))

printf("%d是闰年〃,n);}

return0;}

第三章

1.假如我国国民生产总值的年增长率为9%,计算10年后我国国民生

产总值与现在相比增长多少百分比。计算公式为

p=(l+r)n,r为年增长率,n为年数,p为与现在相比的倍数

#include<stdio.h>

#include<math.h>

intmain(){

floatp/n=10,r=0.09;

p=pow(l+i;n);

printf(〃增长的百分比为%f\n〃,p);

return0;}

6.请编程序将"China“译成密码,密码规律是:用原来的字母后面第4

个字母代替原来的字母。例如:字母“A”后面第4个字母时“E”,用

“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值

的方法使cl,c2,c3,c4,c5这5个变量的值分别为'C','Y,W,

W,匕',经过运算,使cl,c2,c3,c4,c5分别为‘G',T,'m',

分别用putchar函数和printf函数输出这个5个字符。

#include<stdio.h>

intmain(){

,,''

charcl='C'/c2='h,c3='i'zc4=n',c5=a;

cl=cl+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;

printf("%c%c%c%c%c",cl/c2/c3,c4,c5);

return0;}

7.设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、

圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求

有文字说明,取小数点后2位数字。请编程

#include<stdio.h>

#definePI3.14

intmain(){

floatr,h,15mMsv;

printf(〃请输入半径和圆柱:〃);

scanf(,&r,&h);

l=2*PI*r;

s=PI*r*r;

m=4*PI*r*r;

v=4/3*PI*r*r*r;

sv=PI*r*r*h;

printf(〃圆周长是%.2f、圆面积是%.21圆球表面积是%.2f、圆球体积

是%.2大圆柱体积是%.2f〃,lsm,v,sv);

return0;}

第四章

3.写出下面各逻辑表达式的值,设a=3,b=4,c=5.

⑴a+b>c&&b==c0

(2)a||b+c&&b-c1

(3)!(a>b)&&!c||11

(4)!(x=a)&&(y=b)&&00

(5)!(a+b)+c-l&&b+c/21

5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方

根不是整数,则输出其整数部分)。要求在输入数据后对其进行检查

是否位小于1000的正数。若不是,则要求重新输入。

#include<stdio.h>

#include<math.h>

intmain(){

intn,s;

printf(“请输入一个小于1000的数:”);

scanf("%d",&n);

if((n<0)||(n>1000)){

printf("数据错误,请重新输入\n“);

scanf("%d"z&n);}

s=(int)sqrt(n);

printf("%d的平方根为%d,n,s);

return0;}

6.写程序,输入x的值,输出y相应的值

#include<stdio.h>

intmain(){

intx,y;

printf("请输入x的值:〃);

scanf(〃%d〃,&x);

if(x<l)

Y=x;

elseif((x>=l)&&(x<10))

y=2*x-l;

else

y=3*x-ll;

printf(/zy=%d\n,,,y);

return0;}

8.给出一百分制成绩,要求输出成绩等级7V,BVCTD1E.9O分以上

为次,80~90分为E,70~79分为,C060分以下为F。

#include<stdio.h>

intmain(){

floatscore;

printf(〃请输入分数:〃);

scanf(〃%f",&score);

while(score<0||score>100){

printf("数据有误,请重新输入\n〃);

scanf("%f”,&score);

if((score>90)&&(score<100))

printf("成绩等级为A〃);

elseif((score>=80)&&(score<90))

printf("成绩等级为B〃);

elseif((score>=70)&&(score<80))

printf(〃成绩等级为C〃);

elseif((score>=60)&&(score<70))

printf("成绩等级为D〃);

else

printf("成绩等级为E〃);

return0;}

9.给出一个不多于5位的正整数,要求:

①求出它是几位数

②分别输出每一位数字

③按逆序输出各位数字,例如原数为321,应输出123

#include<stdio.h>

intmain(){

intn,x[10]J=0J=0;

printf(〃请输入一个不多于5位的正整数;

scanf(〃%d〃,&n);

while(n!=O){

x[i]=n%10;

n=n/10;

i++;}

intz=i;

printf("该数字为%d位数\n〃,z);

printf("逆序为:\n〃);

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

printfC%d;xO]);

return0;}

第五章

3.输入两个正整数m和6求其最大公约数和最小公倍数

#include<stdio.h>

intmain(){

intm,n,Gq,t;

printf("请输入m和n的值:\n〃);

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

if(m<n){

t=m;

m=n;

n=t;}

r=m%n;

q=m*n;

while(r!=O){

m=n;

n=r;

r=m%n;}

printf(〃最大公约数为%d,最小公倍数为%d"p/n);

return0;}

4.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符

的个数。

#include<stdio.h>

#include<string.h>

intmain(){

chara[80];

inti/n,letter=0/space=0,digital=0/other=0;

printf("请输入字符串:");

gets(a);

n=strlen(a);

for(i=0;i<n;i++){

|^(9[|]>='^&&3[1]<=7')11(a[i]>=,a'&&a[i]<='z,))

letter++;

elseif(a[i]=='')

space++;

elseif(a[i]>='0'&&a[i]<=,9,)

digital++;

else

other++;}

printf("英文字母的个数%d,空格的个数%d,数字的个数%d淇他字符个

数%€1”,letter,space,digital,other);

return0;}

5.求Sn=a+aa+aaa+...+aa...a之值,其中a是一个数字,n表示a的位数,

例如:2+22+222+2222+22222(此时n=5),n由键盘输入

#include<stdio.h>

intmain(){

intn/aJ=l/sn=O/tn=O;

printf(〃请输入a,n的值:〃);

scanf("%d%d”,&a,&n);

while(i<=n){

tn=tn+a;

sn=sn+tn;

a=a*10;

i++;}

printf(//a+aa+aaa+...=%d\n,?,sn);

return0;}

6.求2%1九!(即求l!+2!+3!+4!+...+20!)

#include<stdio.h>

intmain(){

intij;

doublesum=0zs;

for(i=l;i<=20;i++){

s=l;

for(j=l;j<=i;j++)

s=s*i;

sum+=s;}

printf("sum=%f\n",sum);

return0;}

7.求求"+E落求J

#include<stdio.h>

intmain(){

intk;

floatsum=0.0/suml=0.0/sum2=0.0,sum3=0.0;

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

suml+=k;

for(k=l;k<50;k++)

sum2+=k*k;

for(k=l;k<10;k++)

sum3+=l/k;

sum=suml+sum2+sum3;

printf(//sum=%f\n,;sum);

return0;}

8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其

各位数字立方和等于该数本身。例如,153是一水仙花数,因为

153=13+53+33.

#include<stdio.h>

intmain(){

intn,i,j,k;

for(n=100;n<1000;n++){

i=n%10;

j=n/10%10;

k=n/100;

if(n==i*i*i+j*j*j+k*k*k)

printf(〃%d〃,n);}

return0;}

9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,

6的因子为1,2,3,而6=1+2+3,因此6是完数。编程找出1000之

内的所有完数,并按下面格式输出其因子:6itsfactorsare1,2,3

#include<stdio.h>

intmain(){

intm,s,i;

for(m=2;m<=1000;m++){

s=0;

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

if((m%i)==0)s=s+i;

if(s==m){

printf("%d,itsfactorsare”,m);

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

if((m%i)==0)printf(〃%d〃,i);

printf(〃\n〃);}}

return0;}

,有一个分数序列…,求出这个数列的前项之和

10123581320

#include<stdio.h>

intmain(){

inta=2,b=l/tj;

floatsum=0;

for(i=l;i<=20;i++){

sum=sum+a/b;

t=a;

a=a+b;

b=t;}

////

printf(sum=%f/sum);

return0;}

11.一个球从100m高度自由落下,每次落地后反跳回原高度的一半,

再落下,再反弹。求它在第10次落地时,共经过多少米,第10次反

弹多高

#include<stdio.h>

intmain(){

intn;

floatsn=100,hn=sn/2;

for(n=2;n<=10;n++){

sn=sn+2*hn;

hn=hn/2;}

printf(〃第10次落地时共经过%£米\n〃,sn);

printf(〃第10次反弹%f米\n”,hn);

return0;}

12.猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还

不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多

吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10

天早上想再吃时,就只剩下一个桃子。求第1天共摘多少个桃子

#include<stdio.h>

intmain(){

intday,xl,x2;

day=9;

x2=l;

while(day>0){

xl=(x2+l)*2;

x2=xl;

day-;}

printf(//total=%d\n,,,xl);

return0;}

13.用迭代法求x=亚求平方根的迭代公式为%九+i=X%+9,要

求前后两次求出的x的差的绝对值小于IO三

#include<stdio.h>

#include<math.h>

intmain(){

floata,xO,xl;

printf(〃请输入一个正数:〃);

scanf(〃%f〃,&a);

x0=a/2;

xl=(x0+a/x0)/2;

do{

xO=xl;

xl=(x0+a/x0)/2;}while(fabs(x0-xl)>=le-5);

printf(〃[%f]的平方根为[%f]\n〃,a,xl);

return0;}

16.输出以下图案:

#include<stdio.h>

intmain(){

inti,j,k;

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

for(j=0;j<=2-i;j++)

printf("〃);

for(k=0;k<=2*i;k++)

printf(〃*〃);

printf(〃\n〃);}

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

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

printf("");

for(k=0;k<=4-2*i;k++)

printf(〃*〃);

printf(〃\n〃);}

return0;}

第Aft八、•章立

1.用筛选法求100之内的素数

筛选法:在一张纸上写上全部数,然后逐个判断是否满足条件,不满

足的就挖掉,最后剩下的就是满足条件的数

#include<stdio.h>

intmain(){

inta[100]JJ;

for(j=l;j<100;j++)

for(i=2;i<100/2;i++)

for(j=2;j<100;j++){

if(j%i==0&&a[j]!=0&&j!=i)

a[j]=0;}

printf(〃100以内的素数为:\n〃);

for(j=2;j<=100;j++)

if(aU]!=0)

printf("%d:a[j]);

return0;}

2.用选择法对10个整数排序

选择法:按照升序的排序,设有10个元素,从第一个开始和其余各个进行比较,最小的放

在第一个数,再将第二个数和余下8个进行比较,再将最小的放在第二位,一直到排序结

#include<stdio.h>

intmain(){

inta[10]JJ,n;

printf(〃请输入10个数:〃);

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

scanf("%d”,&a「]);

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

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

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

{n=a[i];a[i]=a[j];a[j]=n;}}

printf(〃该十个数升序为:〃);

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

return0;}

3.求一个3*3的整型矩阵对角线元素之和

#include<stdio.h>

intmain(){

inta[3][3],i,j,sum=0;

printf(〃请输入矩阵元素的值:\n〃);

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

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

scanf(〃%d〃,&a[i][j]);

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

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

if(i==j11i+j==2)

sum+=a[i][j];

////

printf(sum=%d/sum);

return0;}

4.有一个已排好序的数组,要求输入一个数之后,按原来排序的规律

将它插入数组中。

#include<stdio.h>

intmain(){

inta[100],x,n,i,j;

printf("请输入待排序数值的个数:\n");

H

scanf("%dz&n);

printf("请输入待排序的每个数值:\n");

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

scanf("%d〃,&a[i]);

printf(”请输入需要待排序的数值:\n“);

scanf(”%d”,&x);

for(i=0;i<n;i++){

if(a[i]>x){

for(j=n;j>i;j-)

aU]=a[j-l];

a[i]=x;

break;}}

printf("排序后:\n");

for(i=0;i<n+l;i++)

printf(“%5d”,a[i]);

return0;}

5.将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,

1,要求改为1,4,5,6,8

#include<stdio.h>

intmain(){

inta[20],i,t,n;

printf(〃请输入数组元素的个数:〃);

scanf("%d〃,&n);

printf(〃请输入数组元素的值:〃);

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

scanf("%d〃,&a[i]);

for(i=0;i<n/2;i++){

t=a[i];a[i]=a[n-i-l];a[n-i-l]=t;}

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

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

return0;}

6.输出以下的杨辉三角形(要求输出10行)

1

11

121

1331

14641

15101051

#include<stdio.h>

intmain(){

inti,j,a[10][10];

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

a[i][i]=l;

a[i][0]=l;}

for(i=2;i<10;i++){

for(j=l;j<=i-l;j++){

a[i]D]=a[i-l]O-l]+a[i-l]U];}}

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

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

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

printf("\n〃);}

return0;}

7.输出“魔方阵所谓魔方阵是指这样的方阵,它的每一行、每一

列和对角线之和均相等。例如,三阶魔方阵为

816

357

492

要求输出的自然数构成的魔法阵

8,找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在

该列上最小。也可能没有鞍点

#include<stdio.h>

#defineN4

#defineM5

intmain(){

inta[N][M],i,j,k,max,maxj,flag;

printf("请输入数组元素的值:");

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

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

scanf(/%d”,&a[i皿);

for(i=0;i<N;i++){

max=a[i][O];

maxj=O;

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

if(a[i][j]>max){

max=a[i][j];

maxj=j;}

flag=l;

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

if(max>a[k][max]){

flag=O;

continue;}

if(flag){

printf("a[%d][%d]=%d\n"/maxj/max);

break;}}

if(!flag)

printf("ltisnotexist!\n");

return0;}

9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求

用折半查找法找出该数是数组中第几个元素的值,如果该数不在数组

中,则输出“无此数”

#include<stdio.h>

#defineN15

intmain(){

inti,number,top,bott/midJoca,a[N],flag=l/sign;

charc;

printf("enterdata:");

scanf(“%d”,&a[0]);

i=l;

while(i<N){

scanf("%d",&a[i]);

if(a[i]>=a[i-l])

i++;

else

printf("enterthisdataagain:\n");}

printf("\n");

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

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

printf("\n");

while(flag){

printf("inputnumbertolookfor:");

scanf("%d",&number);

sign=0;

top=0;

bott=N-l;

if((number<a[O])11(number>a[N-l]))

loca=-l;

while((!sign)&&(top<=bott))

{mid=(bott+top)/2;

if(number==a[mid]){

loca=mid;

printf("Hasfound%d,itspositionis%d\n"/number;loca+l);

sign=l;}

elseif(number<a[mid])

bott=mid-l;

else

top=mid+1;}

if(!sign||loca==-l)

printf("cannotfind%d\n”,number);

printf("continueornot(Y/N)?");

scanf("%c",&c);

if(c=='N'||c=='n')

flag=0;}

return0;}

10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出

其中英文大写字母、小写字母、数字、空格以及其他字符的个数

#include<stdio.h>

intmain(){

inti=0,j=0zDletter=0zSletter=0zdigit=0,space=0zother=0;

chara[3][80];

printf(“请输入三行文字:");

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

gets(a[i]);

for(j=0;j<80&&a[i][j]!='\0';j++){

if(a[i]U]>='A'&&a[i][j]<='Z')

Dletter++;

elseif(a[i][j]>='a'&&a[i][j]<=,z')

Sletter++;

elseif(a[i][j]>='0,&&a[i][j]<='91)

digit++;

elseif(a[i][j]=='')

space++;

else

other++;

})

printf("Dletter=%d/Sletter=%d,digit=%d,space=%d/other=%d"/

DletteGSIetteGdigit,space,other);

return0;}

11.输出以下图案

#include<stdio.h>

intmain(){

char

inti,j,k;

charspace='z;

for(i=0;i<5;i++){

printf(〃\n〃);

printf(/z");

for(j=l;j<=i;j++)

printf(〃%c”,space);

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

printf(〃%c〃,a[k]);}

printf(〃\n〃);

return0;}

12.有一行电文,已按下面规律译成密码:

A->Za—z

BfYb—y

CfXcfx.....

即第1个字母变成第26个字母,第i个字母变成第(26-i+l)个字母,

非字母字符不变。要求编程序将密码译回原文,并输出密码和原文

#include<stdio.h>

#include<string.h>

intmain(){

chara[80]zb[80];

inti,n;

printf("请输入密码:\n");

gets(a);

n=strlen(a);

for(i=0;i<n;i++){

if(a[i]>=7V&&a[i]<=Z)

b[i]=155-a[i];

elseif(a[i]>='a"&&a[i]<='z')

b[i]=219-a[i];

else

b[i]=a[i];}

for(i=0;i<n;i++){

//printf("%cn,a[i]);

printf("%c",b[i]);}

return0;}

13.编一程序,将两个字符连接起来,不要用strcat函数

#include<stdio.h>

intmain(){

chara[100],b[20];

inti=0,j=0;

printf(〃请输入两个字符串:\n〃);

gets(a);

gets(b);

while(a[i]!='\0')

i++;

while(a[j]!=/\O,)

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

puts(a);

return0;}

14.编一程序,将两个字符串si和s2比较,若sl>s2输出一个正数;

若sl=s2,输出0;若sl<s2,输出一个负数。不要用strcpy函数。两个

字符串用gets函数读入。输出的正数或负数的绝对值应该是相比较

的两个字符串相应字符的ASCII码的差值。例如,“A”与“C”相比,

由于"A”<“C",应输出负数,同时由于肾与9的ASCII码差值为2,

因此应输出“・2二同理:“And”和“Aid”比较,根据第2个字符比

较结果,“n”比“i”大5,因此应输出“5”

#include<stdio.h>

intmain(){

chara[20],b[20];

inti=0,n;

printf("请输入两个字符串:");

gets(a);

gets(b);

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

i++;

if(a[i]==,\0,&&b[i]=='\0')

n=0;

else

n=a[i]-b[i];

printf("%d"zn);

return0;}

15.编写一个程序,将字符数组S2的全部字符复制到字符数组si中。

不用strcpy函数,复制时,、(T也要复制过去,'(X后面的字符不复制

#include<stdio.h>

#include<string.h>

intmain(){

charsl[80],s2[80];

inti;

printf("请输入字符串的内容:”);

scanf("%s",s2);

for(i=0;i<strlen(s2);i++)

sl[i]=s2[i];

printf(“sl:%s\n“,sl);

return0;}

第七章

1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函

数调用这两个函数,并输出结果。两个整数由键盘输入

#include<stdio.h>

intmain(){

inta,b,m,n;

printf(“请输入两个数:”);

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

intGongyueshu(inta,intb){

intt;

if(a<b){

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

)

intr;

r=a%b;

while(r!=0)

{a=b;

b=r;

r=a%b;}

returnb;}

intGongbeishu(intajntb){

intq,p;

q=Gongyueshu(a,b);

p=a*b/q;

returnp;

)

m=Gongyueshu(a,b);

n=Gongbeishu(a,b);

printf("最大公约数为:%d\n,:m);

printf(〃最大公倍数为:%d\n,:n);

return0;}

2.求方程ax2+bx+c=0的根。用3个函数分别求当b2-4ac大于0、等

于0和小于0时的根并输出结果。从主函数输入a,b,c的值

#include<stdio.h>

#include<math.h>

floatxl,x2,disc,p,q;

floatDvalue(floata,floatb){

xl=(-b+sqrt(disc))/2*a;

xl=(-b-sqrt(disc))/2*a;}

floatvalue(floata,floatb){

xl=x2=-b/2*a;}

floatSvalue(floata,floatb){

p=-b/(2*a);

q=sqrt(-disc)/(2*a);}

intmain(){

floata,b,c;

printf("请输入a,b,c的值:〃);

scanf(〃%f%f%f”,&a,&b,&c);

disc=b*b-4*a*c;

if(disc>0){

Dvalue(a,b);

printf("xl=%f,x2=%r,xl,x2);}

elseif(disc==0){

value(azb);

///:

printf(xl=%f/x2=%fxl/x2);}

else{

Svalue(a,b);

//,,

printf(xl=%f+%fi,x2=%f-%fi,p,q,p,q);}

return0;}

3.写一个判素数的函数,在主函数输入一个整数,输出是否为素数的

信息

#include<stdio.h>

#include<math.h>

intmain(){

voidlsprim(intn);

intn;

printf("请输入一个整数:");

scanf("%d",&n);

Isprim(n);

return0;}

voidlsprim(intn){

inti;

for(i=2;i<=sqrt(n);i++)

if(n%i==O)

break;

if(i==n)

printf("%d是素数“,n);

else

printf("%d不是素数”,n);}

4.写一个函数,使给定的一个3*3的二维整型数组转置,即行列互换

#include<stdio.h>

intmain(){

inta[3][3]JJ;

voidconveser(inta[][3]);

printf("请输入数组的值:\n");

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

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

scanf("%d",&a[i]Ul);

printf(“数组为:\n");

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

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

printf(“%3d”,a[i][j]);

if(j==2)

printf("\n");}

printf("行列互换后的数组为:\n");

conveser(a);

return0;}

voidconveser(inta[][3]){

intij,b[3][3];

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

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

bU][i]=a[i]U];

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

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

{printf(“%3d”,b[i皿);

if(j==2)

printf("\n");}}

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和

输出字符串

#include<stdio.h>

#include<string.h>

intmain(){

voidconverse(charstr[80]);

charstr[80];

printf(“请输入一个字符串:\n");

gets(str);

converse(str);

print"'反序后的字符串:\n");

puts(str);

return0;}

voidconverse(charstr[80]){

inti,n;

charc;

n=strlen(str);

for(i=0;i<n/2;i++){

c=str[i];

str[i]=str[n-i-l];

str[n-i-l]=c;

})

6.写一个函数,将两个字符串连接

#include<stdio.h>

intmain(){

voidstrcat(chara[100],charb[20]);

chara[100],b[20];

printf("请输入两个字符串的值:\n");

gets(a);

gets(b);

strcat(a,b);

printf(“连接后的字符串值为:\n“);

puts(a);

return0;}

voidstrcat(chara[100],charb[20]){

inti=0,j=0;

while(a[i]!='\0')

i++;

while(b[j]!=W)

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

a[i]='\0';}

7.写一个函数,将一个字符串中的元音字母复制到另一字符串,然后

输出。

#include<stdio.h>

intmain(){

voidVowelcopy(chara[80],charb[20]);

chara[80],b[20];

printf("请输入字符串的值:\n");

gets(a);

Vowelcopy(a,b);

printf(”%s”,b);

return0;}

voidVowelcopy(chara[80],charb[20]){

inti=0,j=0;

while(a[i]!='\0'){

if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u'||a[i]=='A'||

a[i]=='E'||a[i]==T||a[i]=='O'||a[i]=='U')

{bU]=a[i];

j++;)

i++;}

bU]='\O';}

8,写一个函数,输入一个4位数字,要求输出这4个数字字符,但每

两个数字间空一个空格。如输入1900,应输出“1990”

#include<stdio.h>

intmain(){

voidfenli(intn);

inta[4],n,i;

printf("请输入一个四位数:");

scanf(“%d”,&n);

fenli(n);

return0;}

voidfenli(intn){

inta[4],i;

for(i=0;(i<4)&&(n!=0);i++){

a[i]=n%10;

n=n/10;}

for(i=3;i>=0;i-)

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

9.编写一个函数,有实参传来一个字符串,统计此字符串中字母、数

字、空格和其他字符的个数,在主函数中输入字符串以及上述的结果

#include<stdio.h>

intmain(){

voidcount(chara[100]);

chara[100];

printf("请输入字符串的值:\n“);

gets(a);

count(a);

return0;}

voidcount(chara[100]){

inti=0,letter=0/num=0,space=0/other=0;

while(a[i]!='\0'){

if((a[i]>='a'&&a[i]<=,z')||(a[i]>='A'&&a[i]<='Z'))

letter++;

elseif(a[i]>='0'&&a[i]<=,9,)

num++;

elseif(a[i]=='')

space++;

else

other++;

i++;}

printf("字母的个数为%d,数字的个数为%d,空格的个数为%d,其他字符

的个数为%(1",letter,num,space,other);}

10.写一个函数,输入一行字符,将此字符串中最长的单词输出(程序

逻辑还有问题)

#include<stdio.h>

#include<string.h>

intmain(){

voidLongestWord(chara[],charword[]);

chara[100]={0},word[100]={0};

printf("请输入一行字符:\n");

gets(a);

LongestWord(azword);

printf("Thelongestwordis:%s\n",word);

return0;}

voidLongestWord(chara[]zcharword[]){

intmax」en=0,len=0,i=0;

while(a[i]!='\0'){

if(a[i]==''){

a[i]='\0';

len=strlen(a);

if(len>max_len){

max_len=len;

strcpy(word,a);

a=a+len+l;}}

i++;}}

11.写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排

#include<stdio.h>

intmain(){

inta[10]J;

printf(”请输入十个待排序的数值:\n");

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

scanf("%d",&a[i]);

printf("排序后的结果为:\n");

sort(a);

return0;}

intsort(inta[10]){

inti,j,t;

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

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

if(aU]>aU+l]){

t=aU];a[j]=a[j+l];a[j+l]=t;}

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

printf(-%5d”,a[i]);}

12.用牛顿迭代法求根。方程为ax3+bx2+cx+d=0,系数a,b,c,d的值依次

为1,2,3,4由主函数输入。求x在工附近的一个实根。求出根后

由主函数输出

#include<stdio.h>

#include<math.h>

floatsolut(inta,intb,intc,intd)

{floatx=1,xO,f,fl;

do{

xO=x;

f=((a*x0+b)*xO+c)*x0+d;

fl=(3*a*xO+2*b)*xO+c;

x=xO-f/f1;

}while(fabs(x-xO)>=le-3);

return(x);}

intmain()

{inta,b,c,d;

printf("inputa,b,c,d:");

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

printf("x=%10.7f\n",solut(a,b,c,d));

return0;}

13.用递归方法求n阶勒让德多项式的值,递归公式为:

1(n=0)

x(n=1)

PnM=几一・一(九一

(21)%—pni1)•Pn24)

。之1)

n

#include<stdio.h>

intmain(){

doublepolya(intnjntx);

intn,x;

printf("请输入n和x的值:");

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

printf("%.2f\n"zpolya(n,x));

return0;}

doublepolya(intnjntx){

doubleresult;

if(n==0)

result=l;

elseif(n==l)

result=x;

else

result=((2*n-l)*x-polya(n-l/x)-(n-l)*polya(n-2/x))/n;

returnresult;}

14.输入10个学生5门课的成绩,分别用函数实现下列功能:

(1)计算每个学生的平均分

(2)计算每门课的平均分

(3)找出所有50个分数中最高的分数所对应的学生和课程

(4)计算平均分方差:

其中X1为某一学生的平均分

#include<stdio.h>

intmain(){

floatscore[10][5]JJ;

printf(〃请输入10个学生的5门成绩:\n〃);

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

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

scanf("%f”,&a[i][j]);

printf(〃每个学生的成绩分别为:\n〃);

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

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

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

if(j==4)

printf(〃\n〃);}

return0;}

⑴计算每个学生的平均分:

doubleStu_avg(inta[10][5]){

floatavg=0,sum;

intij;

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

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

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

Stu_avg=sum/5.0;

printf("avg=%lf",Stu_avg);}}

(2)计算每门课的平均分

doubleCou_avg(inta[10][5]){

floatCou_avg=Ozsum;

intij;

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

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

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

Cou_avg=sum/10.0;

printf("avg=%lf",Cou_avg);}}

(3)找出所有50个分数中最高的分数所对应的学生和课程

inthighest(inta[10]⑸){

intmaxJJ;

max=a[0][0];

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

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

if(a[i][j]>max)

max=a[i][j];

printf(“最高分数的学生是第%d个,课程是第%(1个)卜1);}

(4)计算平均分方差:

voidvari(inta[10][5]){

intl,j,k,m;

floattemp[10],var,xl,x2;

for(i=0,m=0;i<10;i++,m++){

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

k+=a[i][j];

temp[m]=k/5;}

for(i=m=xl=x2=0;i<10;i++){

xl+=pow(temp[i],2);

x2+=temp[i];}

var=xl/10-pow(x2/10,2);

printf(/z%f",var);}

15.写几个函数:

(1)输入10个职工的姓名和职工号

(2)按职工号从小到大顺序排序,姓名顺序也随之调整

(3)要求输入一个职工号,用折半查找法找出该职工的姓名,从主

函数输入要查找的职工号,输出该职工姓名

#include<stdio.h>

#defineN3

#defineLEN20

〃定义一个结构体类型

structstudent{

charname[LEN];

intnum;};

intmain(){

intno;

voidoutput(structstudentstu[]);

voidinput(structstudentstu[]);

voidsortByNum(structstudentstu[]);

voidbinSearch(intno,structstudentstu[]);

structstudentstu[N];

input(stu);

output(stu);

sortByNum(stu);

output(stu);

printf("请输入要查找的职工号no.:\n");

scanf("%d",&no);

binSearch(no,stu);

return0;}

〃输入N名职工的姓名和编号

voidinput(structstudentstu[]){

inti;

printf("请输入%d职工的姓名和编号:\n”,N);

for(i=0;i<N;i++){

scanf("%s%d",stu[i].name,&stu[i].num);}}

〃输出职工的姓名编号

voidoutput(structstudentstu[]){

inti;

for(i=0;i<N;i++){

printf("name:%20s/no.:%5d\n”,stu[i].name,stu[i].num);}}

〃按职工号从小到大排序,姓名也随之排序

〃选择排序

voidsortByNum(structstudentstu[]){

intminJJ;

structstudentt;

for(i=0;i<N;i++){

min=i;

for(j=i+l;j<N;j++){

if(stu[j].num<stu[min].num){min=j;}}

if(min!=i){

t=stu[min];

stu[min]=stu[i];

stu[i]=t;}}

printf("按职工号从小到大排序完毕.\n“);}

〃二分查找职工编号

voidbinSearch(intno,structstudentstu[]){

〃赋初始值

intlow=0,high=N-l/mid;

while(low<=high){

mid=(low+high)/2;

if(no>stu[mid].num){low=mid+l;}

elseif(no<stu[mid].num){high=mid-l;}

elseif(no==stu[mid].num)

{printf("name:%s\n,stu[mid].name);

break;}}

if(low>high)printf("can'tfindtheno.%dworker.",no);}

16.写一个函数,输入一个十六进制数,输出相应的十进制

#include<stdio.h>

#include<string.h>

#include<math.h>

intmain(){

voidconvert(chara[10]);

chara[10];

printf(“请输入0~9,A到F或者a到f的数:\n〃);

gets(a);

convert(a);

return0;}

voidconvert(chara[10]){

inti,n,num=0;

n=strlen(a);

for(i=n-l;i>=0;i-){

if(a[i]>=,0/&&a[i]<=,9,)

num+=(a[i]-/0,)*pow(16,n-l-i);

elseif(a[i]>=jA/&&a[i]<=,F/)

/,

num+=(10+(a[i]-0))*pow(16/n-l-i);

elseif(a[i]>=,a/&&a[i]<=T)

num+=(10+(a[i]-/0,))*pow(16,n-l-i);}

printf(〃转换为十进制为:〃);

printf("%d〃,num);}

17.用递归法将一个整数n转换成字符串。例如,输入483,应输

出字符串“483”。n的位数不确定,可以是任意位数的整数

#include<stdio.h>

intmain(){

voidfun(intn);

intn;

printf(/zinput:n\n");

scanf(〃%d〃,&n);

printf(〃该数字对应的字符串为:\n〃);

fun(n);

return0;}

voidfun(intn){

inti;

if(n<0){

putcharC-');

n=-n;}

if((i=n/10)!=0)fun(i);

putchar(n%10+,0/);}

18.给出年、月、日,计算该日是该年的第几天

#include<stdio.h>

intflag(intyear){

ints=0;

if(year%4==0&&year%400!=011year%100==0&&year%400==0)

s=l;

returns;}

intdate(intmonjntday){

ints=OJ;

inta[12]={31,28,31,30,31,30,3130,31,30,31,30);

for(i=0;i<mon-l;i++)

s=s+a[i];

s=s+day;

returns;}

intmain(){

intyear;mon,day,sum,p;

printf("请输入一个日期:〃);

scanf(〃%d%d%d,,,&year,&mon,&day);

sum=date(mon,day);

p=flag(year);

if(mon>=3&&p==l)

sum++;

printf(/z%d年%€1月%(1日是这一年的第%(1\|1〃,year,mon,day,sum);

return0;}

第八章

1.输入3个整数,按由小到大的顺序输出

#include<stdio.h>

intmain(){

voidswap(int*pl,int*p2);

intnl,n2,n3;

int*pl,*p2/p3;

printf(〃请输入nl,n2,n3的值:\n〃);

scanf("%d%d%d〃,&nl,&n2,&n3);

pl=&nl;

p2=&n2;

p3=&n3;

if(nl>n2)swap(pl,p2);

if(nl>n3)swap(pl,p3);

if(n2>n3)swap(p2,p3);

printf(zzNowtheorderis:%d%d%d”,nl,n2,n3);

return0;}

voidswap(int*pl,int*p2){

intp;

p=*pl;

*pl=*p2;

*p2=p;}

2,输入3个字符串,按由小到大的顺序输出

#include<stdio.h>

#include<string.h>

intmain(){

voidswap(char*,char*);

charstrl[2O],str2[3O],str3[2O];

printf(〃请输入三个字符串:\n〃);

gets(strl);

gets(str2);

gets(str3);

if(strcmp(strl,str2)>0)swap(strl,str2);

if(strcmp(strl,str3)>0)swap(strl,str3);

if(strcmp(str2,str3)>0)swap(str2,str3);

printfC'Nowtheorderis:\n");

z/,,

printf(%s\n%s\n%s\n/strl/str2,str3);

return0;}

voidswap(char*pl,char*p2){

charp[20];

strcpy(p,pl);strcpy(pl,p2);strcpy(p2,p);}

3.输入10个整数,将其中最小的数与第一个数对换,把最大的

数与最后一个数对换。写3个函数:①输入10个数;②进行处理③

输出10个数

#include<stdio.h>

intmain(){

voidinput(int*);

voidmax_min_value(int*);

voidoutput(int*);

intnumber[10];

input(number);

max_min_value(number);

output(number);

return0;}

voidinput(int*number){

inti;

printf('Input10number:");

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

scanf("%cT,&number[i]);}

voidmax_min_value(int*number){

int*max/*min,*p,temp;

max=min=number;

for(p=number+l;p<number+10;p++)

if(*p>*max)max=p;

elseif(*p<*min)min=p;

temp=number[O];number[O]=*min;*min=temp;

if(max==number)max=min;

temp=number[9];number[9]=*max;*max=temp;}

voidoutput(int*number){

int*p;

printf(Now,theyare:");

for(p=number;p<number+10;p++)

printf("%4d〃,*p);

printf(〃\n〃);}

4.有n个整数,使前面各数顺序向后移m个位置,最后m个数

变成最前面m个数。写一函数实现以上功能,在主函数中输入n个

整数和输出调整后的n个数

#include<stdio.h>

voidmove(inta[20],intnjntm){

int*p,end;

end=*(a+n-l);

for(p=a+n-l;p>a;p-)

*p=*(p-l);

*a=end;

m--;

if(m>0)move(azn,m);}

intmain(){

inta[20],m/n/i;

printf("共有多少个数:\n");

scanf("%cT,&n);

printf("请输入n个整数:\n");

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

scanf("%d",&a[i]);

prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论