C语言程序设计 - 谭浩强 - 第三版 - 课后习题答案

更新时间:2023-03-08 07:15:20 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.5请参照本章例题,编写一个C程序,输出以下信息: ************************** Very Good!

************************** 解: mian()

{printf(“**************************”); printf(“\\n”);

printf(“Very Good!\\n”); printf(“\\n”);

printf(“**************************”); }

1.6 编写一个程序,输入a、b、c三个值,输出其中最大值。 解: mian()

{int a,b,c,max;

printf(“请输入三个数a,b,c:\\n”); scanf(“%d,%d,%d”,&a,&b,&c); max=a; if(max

printf(“最大数为:“%d”,max); }

第三章

3.6写出以下程序运行的结果。 main()

{char c1=’a’,c2=’b’,c3=’c’,c4=’\\101’,c5=’\\116’; printf(“a?%c\\tc%c\\tabc\\n”,c1,c2,c3); printf(“\\t\\b%c %c”,c4,c5); } 解:

aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabc AㄩN

3.7 要将\译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母\后面第4个字母是\.\代替\。因此,\应译为\。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。 解:

#include main()

{ char c1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;

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

printf(\密码是%c%c%c%c%c\\n\}

运行结果: 密码是Glmre

3.9求下面算术表达式的值。 (1)x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7

(2)(float)(a+b)/2+(int)x%(int)y 设a=2,b=3,x=3.5,y=2.5 (1)2.5 (2)3.5

3.10写出程序运行的结果。 main() {int i,j,m,n; i=8; j=10; m=++i; n=j++;

printf(“%d,%d,%d,%d”,i,j,m,n); } 解:

9,11,9,10

3.12 写出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。

(1)a+=a (2) a-=2 (3) a*=2+3 (4)a/=a+a (5) a%=(n%=2),n的值等于5 (6)a+=a-=a*=a 解:

(1) 24 (2) 10 (3) 60 (4) 0 (5) 0 (6) 0 第四章 4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 a=_3_ _b=_4_ _c=_5

x=1.200000,y=2.400000,z=-3.600000 x+y=_3.600_ _y+z=-1.20_ _z+x=-2.40 c1=ˊaˊ_or_97(ASCII) c2=ˊbˊ_or_98(ASCII) main()

{int a=3,b=4,c=5;

long int u=51274,n=128765; float x=1.2,y=2.4,z=3.6; char c1=’a’,c2=’b’;

printf(\printf(\

printf(\printf(\

printf(\n\ printf(\n\ }

4.7用scanf下面的函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入? main() {

int a,b;float x,y;char c1c2; scanf(\,&a,&b); scanf(\,&y);

scanf(\,&c1,&c2); }

a=3_b=7

_x=8.5_y=71.82 _c1=A_c2=a

4.8设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 main()

{float r,h,C1,Sa,Sb,Va,Vb; scanf(\C1=2*3.14*r; Sa=3.14*r*r; Sb=4*Sa;

Va=4*3.14*r*r*r/3; Vb=Sa*h;

printf(\

printf(\}

4.9输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9

输出要求有文字说明,取位2小数。 main() {float F,c;

scanf(\c=5*(F-32)/9; printf(\

}

4.10编程序,用getchar函数读入两个字符给c1、c2,然后分别用函数和函数输出这两个字符。并思考以下问题:(1)变量c1、c2应定义为字符型或整形?抑二者皆可?(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3)整形变量与字符变量是否在任何情况下都可以互相代替?如: char c1,c2; 与

int c1,c2;

是否无条件的等价? #include\main()

{char c1,c2;

c1=getchar();c2=getchar();

putchar(c1);putchar(’\\n’);putchar(c2);putchar(’\\n’); }

#include\main()

{char c1,c2;

c1=getchar();c2=getchar();

printf(\printf(\}

第五章

5.1 什么是算术运算?什么是关系运算?什么是逻辑运算? 解:略。

5.2 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

解:设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示。但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”。例如3&&5的值为“真”,系统给出3&&5的值为1。

5.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5。 (1) a+b>c&&b==c (2) a||b+c&&b-c (3) !(a>b)&&!c||1 (4) !(x=a)&&(y=b)&&0 (5) !(a+b)+c-1&&b+c/2 解: (1) 0 (2) 1 (3) 1 (4) 0

(5) 1

5.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。 解: 方法一

#include main() { int a,b,c;

printf(\请输入3个整数:\scanf(\if(a

if(b

else if(a

方法二:使用条件表达式,可以使程序更加简明、清晰。 程序如下: #include main()

{ int a,b,c,temp,max;

printf(\请输入3个整数:\scanf(\temp=(a>b)?a:b; max=(temp>c)?temp:c;

printf(\个整数的最大数是%d\\n”,max); }

5.5 有一函数:

写一程序,输入x值,输出y值。 解:

#include main() {int x,y;

printf(\输入x:\scanf(\

if(x<1) { y=x;

printf(\

}

else if (x<10) { y=2*x-1;

printf(\}

else { y=3*x-11;

printf(\} }

5.6 给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~90分为’B’,70~79分为’C’,60分以下为’D’。 解:

程序如下:

#include main()

{ float score; char grade; case 2:

printf(\请输入学生成绩:\scanf(\

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

{ printf(\输入有误,请重新输入:\scanf(\}

switch((int)(score/10)) { case 10:

case 9: grade=’A’;break; case 8: grade=’B’;break; case 7: grade=’C’;break; case 6: grade=’D’;break; case 5: case 4: case 3: case 1:

case 0: grade=’E’; }

printf(\成绩是%5.1f,相应的等级是%c。\\n\}

说明:对输入的数据进行检查,如小于0或大于100,要求重新输入。(int)(score/10)的作用是将 (score/10) 的值进行强制类型转换,得到一个整型值。

5.7 给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。

解:

#include main()

{ long int num;

int indiv,ten,hundred,thousand,ten_thousand,place;

printf(\请输入一个整数(0~99999):\scanf(\if (num>9999) place=5; else if(num>999) place=4; else if(num>99) place=3; else if(num>9) place=2; else place=1;

printf(\ten_thousand=num/10000; thousand=num/1000; hundred=num/100; ten=num0/10; indiv=num; switch(place)

{ case 5: printf(\ printf(\反序数字为;\

printf(\ break;

case 4: printf(\ printf(\反序数字为:\

printf(\ break;

case 3: printf(\ printf(\反序数字为:\

printf(\ break;

case 2: printf(\ printf(\反序数字为:\ printf(\ break;

case 1: printf(\

printf(\反序数字为:\ printf(\ break; } }

5.8 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提成

10% ;利润高于10万元,低于20万元(1000001000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。要求:(1)用if语句编程序;(2)用switch语句编程序。 解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按7.5%提成。 (1) 用if语句编程序。

#include main() { long i;

float bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(\请输入利润i:\scanf(\if(i<=100000)

bonus=i*0.1; else if(i<=200000)

bonus=bon1+(i-100000)*0.075; else if(i<=400000)

bonus=bon2+(i-200000)*0.05; else if(i<=600000)

bonus=bon4+(i-400000)*0.03; else if(i<=1000000)

bonus=bon6+(i-600000)*0.015; else

bonus=bon10+(i-1000000)*0.01; printf(”奖金是.2f\\n\}

此题的关键在于正确写出每一区间的奖金计算公式。例如利润在10万元至20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即100000ⅹ0.1;②10万元以上部分应得的奖金。即(num-100000)ⅹ0.075。同理,20万~40万这个区间的奖金也应由两部分组成:①利润为20万元时应得的奖金,即100000ⅹ0.1ⅹ10万ⅹ0.075;②20万元以上部分应得的奖金,即(num-200000)ⅹ0.05。程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon1、bon2、bon4、bon6、hon10;然后再加上各区间附加部分的奖金。

(2) 用switch语句编程序。

输入利润i,确定相应的提成等级branch 根据branch确定奖金值 0 奖金=i*0.1

1 奖金=bon1+(i-105)*0.075 2 奖金=bon2+(i-2*105)*0.05 3

4 奖金=bon4+(i-4*105)*0.03 5

6 奖金=bon6+(i-6*105)*0.015 7 8 9

10 奖金=bon10+(i-106)*0.01 输出奖金

#include main() { long i;

float bonus, bon1, bon2, bon4, bon6, bon10; int c;

bon1=100000*0.1;

bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(\请输入利润i:\scanf(\c=i/100000; if(c>10) c=10; switch(c)

{ case 0: bonus=1*0.1;break;

case 1: bonus=bon1+(i-100000)*0.075;break; case 2 :

case 3: bonus=bon2+(i-200000)*0.05; break; case 4:

case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8:

case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; }

printf(\奖金是.2f\

}

5.9 输入4个整数,要求按由大到小的顺序输出。

解:此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以有更多的排序方法。 #include main()

{ int t,a,b,c,d;

printf(\请输入4个整数:\

scanf(\

printf(\if(a>b) {t=a; a=b; b=t;} if(a>c) {t=a; a=c; c=t;} if(a>d) {t=a; a=d; d=t;} if(b>c) {t=a; b=c; c=t;} if(b>d) {t=b; b=d; d=t;} if(c>d) {t=c; c=d; d=t;}

printf(\排序结果如下:\\n\

printf(\}

5.10 有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

程序如下:

#include main() { int h=10;

float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,d1,d2,d3,d4; printf(\请输入一个点(x,y):\scanf(\

d1=(x-x1)*(x-x1)+(y-y1)*(y-y1); d2=(x-x2)*(x-x2)+(y+y2)*(y+y2); d3=(x+x3)*(x+x3)+(y-y3)*(y-y3); d4=(x+x4)*(x-x4)*(y+y4)*(y+y4);

if(d1>1&&d2>1&&d3>1&&d4>1) h=0; printf(\该点高度为%d\\n\

} 第六章

第六章 循环控制

6.1输入两个正整数m和n,求其最大公约数和最小公倍数。 main()

{long m,n,i=1,j,s;

scanf(\for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0) s=i;} if(m>=n) j=m; else j=n;

for(;!(j%m==0&&j%n==0);j++); printf(\}

6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 #include\main()

{char c;int i=0,j=0,k=0,l=0; while((c=getchar())!=’\\n’)

{if(c>=65&&c<=90||c>=97&&c<=122) i++; else if(c>=48&&c<=57) j++; else if(c==32) k++; else l++;}

printf(\}

6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。 #include\main()

{int n,sum=0,i=1,s=2; scanf(\while(i<=n)

{sum=sum+s;s=s+2*pow(10,i); i++;}

printf(\}

6.4 求 ,(即求1!+2!+3!+4!+5!+…+20!) main()

{int n,i=1;long sum=0,s=1; scanf(\

while(i<=n) {s=s*i;sum=sum+s;i++;} printf(\

}

6.5 求 main()

{double i=1,j=1,k=1,s1=0,s2=0,s3=0,sum; for(;i<=100;i++) s1=s1+i; for(;j<=50;j++) s2=s2+j*j; for(;k<=10;k++) s3=s3+1/k; sum=s1+s2+s3;

printf(\}

6.6打印出所有\水仙花数\,所谓\水仙花数\是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 #include\main()

{int x=100,a,b,c;

while(x>=100&&x<1000) {a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b; if(x==(pow(a,3)+pow(b,3)+pow(c,3))) printf(\}

6.7一个数如果恰好等于它的因子之和,这个数就称为\完数\。例如,6的因子为1、2、3,而6=1+2+3,因此6是\完数\。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1、2、3 main() {int m,i,j,s;

for(m=6;m<10000;m++) {s=1;

for(i=2;i

{printf(\printf(\} } 或 main() {int m,i,j,s;

for(m=6;m<1000;m++) {s=m-1;

for(i=2;i

{printf(\printf(\}

}

6.8有一分数序列:

求出这个数列的前20项之和。 main()

{int i=1,n;double t,x=1,y=2,s,sum=0; scanf(\

while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;} printf(\ }

6.9一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高? main()

{int i,n;double h=100,s=100; scanf(\for(i=1;i<=n;i++)

{h*=0.5;if(i==1) continue;s=2*h+s;} printf(\}

6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。 main()

{int i=1,sum=0;

for(;i<=10;sum=2*sum+1,i++); printf(\}

6.11用迭代法求 。求平方根的迭代公式为:

要求前后两次求出的得差的绝对值少于0.00001。 #include\main()

{float x0,x1,a; scanf(\x1=a/2; do

{x0=x1;x1=(x0+a/x0)/2;}

while(fabs(x0-x1)>=0.00001); printf(\}

6.12 用牛顿迭代法求方程在1.5附近的根。 main()

{double x,y;x=1.5;

do{y=2*x*x*x-4*x*x+3*x-6; x=x-y/(6*x*x-8*x+3);} while(y!=0);

printf(\}

6.13用二分法求方程在(-10,10)之间的根 main()

{double x1,x2,y1,y2;x1=-10;x2=10; do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6; x1=x1-y1/(6*x1*x1-8*x1+3);} while(y1!=0); do

{y2=2*x2*x2*x2-4*x2*x2+3*x2-6; x2=x2-y2/(6*x2*x2-8*x2+3);} while(y2!=0);

printf(\}

6.14打印以下图案 *

* * *

* * * * *

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

#include\main() {int i,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(\ }

for(i=0;i<=2;i++) {for(j=0;j<=i;j++) printf(\

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

printf(\ } }

第七章

第七章 数组

7.1 用筛法求之内的素数。 main()

{ int i,j,a[100]; for(i=2;i<100;i++) { a[i]=i;

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

if(a[i]%j==0) break; if(a[i]-j==0)

printf(\} }

printf(\} 或

#include\main()

{static int i,j,k,a[98]; for(i=2;i<100;i++) {a[i]=i;k=sqrt(i); for(j=2;j<=a[i];j++) if(j

if(j>=k+1)

printf(\}

printf(\}

7.2用选择法对10个整数从小到大排序。 main()

{ int i,j,a[10],t; for(i=0;i<10;i++) scanf(\for(j=1;j<10;j++) for(i=0;i<=9-j;i++) if(a[i]>a[i+1])

{t=a[i+1];a[i+1]=a[i];a[i]=t;}

for(i=0;i<10;i++) printf(\} 或 main()

{static int a[10],i,j,k,t; for(i=1;i<11;i++) scanf(\for(j=1;j<10;j++) for(i=1;i<=10-j;j++) if (a[i]>a[i+1])

{t=a[i+1];a[i+1]=a[i];a[i]=t;} for(i=1;i<11;i++) printf(\printf(\}

7.3求一个3×3矩阵对角线元素之和。 main()

{int i=0,j=0,a[3][3],s1,s2; for(i=0;i<3;i++) for(j=0;j<3;j++)

scanf(\

s1=a[0][0]+a[1][1]+a[2][2]; s2=a[0][2]+a[1][1]+a[2][0]; printf(\} 或 main() {

static int i,j,s1,s2,a[3][3]; for(i=1;i<=3;i++) for(j=1;j<=3;j++) scanf(\

s1=a[1][1]+a[2][2]+a[3][3]; s2=a[1][3]+a[2][2]+a[3][1]; printf(\}

7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。 main()

{ static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t; scanf(\for(i=9;i>0;i--) if(a[i]

{t=a[i-1];a[i-1]=a[i];a[i]=t;} for(i=0;i<10;i++)

printf(\} 或 main() {

static int a[5]={1,4,5,6,7}; int i,t,b;

scanf(\for(i=0;i<5;i++) {if(b<=a[i])

{t=a[i];a[i]=b;b=t;} printf(\printf(\}

7.5将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 main()

{ int i,b[10]; for(i=0;i<10;i++) scanf(\for(i=9;i>-1;i--) printf(\printf(\

7.6打印出以下杨辉三角形(要求打印出10行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ∶ ∶ main() {

static int m,n,k,b[15][15]; b[0][1]=1;

for(m=1;m<15;m++) {

for(n=1;n<=m;n++) {

b[m][n]=b[m-1][n-1]+b[m-1][n]; printf(\

}

printf(\} } } 或 main()

{ int i,j,n,k,a[10][10];

static a[][1]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}}; a[1][1]=1;

for(k=2,k<11;k++) for(i=2;i<=k;i++) for(j=2;j<=i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(k=1;k<11;k++) for(i=1;i<=k;i++) for(j=1;j<=i;j++) printf(\}

7.7 打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为 8 1 6 3 5 7 4 9 2

要求打印出由1~n2的自然数构成的魔方阵。 解:

#include main()

{ int a[16][16],i,i,k,p,m,n; p=1;

while(p==1) { printf(\~15):\ scanf(\

if((n!=0)&&(n<=15)&&(n%2!=0)) p=0; }

for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0 7-8

#include void main() {

int a[4][4],i,j,max,min,k1,k2,flag;

printf(\输入一个4*4的数组\\n\\n\ for(i=0;i<4;i++) {

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

scanf(\ } }

printf(\鞍点为:\\n\\n\ for(i=0;i<4;i++) {

max=a[i][0]; for(j=0;j<4;j++) {

if(max<=a[i][j]) {

max=a[i][j]; k1=j; } }

min=a[0][k1]; for(j=0;j<4;j++) {

if(min>=a[j][k1]) {

min=a[j][k1]; k2=j; } }

if((max!=min)) flag=0; else {

flag=1;

printf(\ break; } }

if(flag==0) printf(\不存在\\n\\n\} 7-9

#include void main()

{

float a[15]={100,98,65,55,34,23,23,12,11,9,7,6,4,3,2},n; int i,low,high,mid;

printf(\原数组为:\\n\\n\ for(i=0;i<15;i++) {

printf(\ }

printf(\输入一个数n\\n\\n\ scanf(\ low=0; high=14; i=0;

while(low<=high) {

mid=(low+high)/2; if(a[mid]==n) {

printf(\该数是数组中第%d个元素\\n\\n\ i++; break; }

else if(a[mid]

if(i==0) printf(\无此数!!\\n\\n\} 7-10

#include void main() {

char a[3][80];

int i,j,upon=0,low=0,num=0,spa=0,oth=0; for(i=0;i<3;i++) {

printf(\输入第%d行文字\\n\\n\ gets(a[i]);

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

if(a[i][j]>='A'&&a[i][j]<='Z') upon+=1; else if(a[i][j]>='a'&&a[i][j]<='z') low+=1; else if(a[i][j]>=48&&a[i][j]<=57) num+=1;

else if(a[i][j]==' ') spa+=1; else oth+=1; } }

printf(\英文大写字母:%d个\\n\\n\ printf(\英文小写字母:%d个\\n\\n\ printf(\数字: %d个\\n\\n\ printf(\空格: %d个\\n\\n\ printf(\其他字符: %d个\\n\\n\} 7-11

#include void main() {

int i,j;

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

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

printf(\\ }

for(j=i;j

printf(\ }

printf(\ } } 7-12

#include void main() {

char a[80],b[80]; int i,j;

printf(\输入密码\\n\\n\ gets(a);

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

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

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

else if((a[i]>='a')&&(a[i]<='z')) {

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

else b[i]=a[i]; }

b[i]='\\0';

printf(\密文为:\\n\\n\ puts(a);

printf(\原文为:\\n\\n\ puts(b); } 7-13

#include void main() {

char a[80],b[80]; int i,j,k;

printf(\输入第1个字符串\\n\\n\ gets(a);

printf(\输入第2个字符串\\n\\n\ gets(b);

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

if(a[i]=='\\0') { k=i;

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

a[k]=b[j]; k++; }

a[k]='\\0'; break; } }

printf(\连接后字符串为:\\n\\n\ puts(a); }

7-14

#include void main() {

char a[80],b[80]; int i,j,k;

printf(\输入第1个字符串\\n\\n\ gets(a);

printf(\输入第2个字符串\\n\\n\ gets(b);

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

k=a[i]-b[i]; if(k>0) {

printf(\字符串a大于字符串b:M\\n\\n\ break; }

else if(k<0) {

printf(\字符串a小于字符串b:M\\n\\n\ break; }

else k=0; }

if(k==0) printf(\字符串a等于字符串b:M\\n\\n\} 7-15

#include void main() {

char s1[80],s2[80]; int i,j;

printf(\输入数组s1\\n\\n\ gets(s1);

printf(\输入数组s2\\n\\n\ gets(s2);

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

s1[i]=s2[i]; }

s1[i]='\\0';

printf(\复制后的数组为:\\n\\n\ puts(s1); }

第八章 8-1

#include void main() {

int max_div(int,int); int min_mul(int,int); int m,n;

printf(\输入两个整数\\n\\n\ scanf(\

if(max_div(m,n)==0) printf(\无最大公约数为\\n\\n\ else printf(\最大公倍数为:%d\\n\\n\ printf(\最大公倍数为:%d\\n\\n\}

int max_div(int k1,int k2) {

int min(int,int); int i,k,flag; k=min(k1,k2); for(i=k;i>1;i--) {

if((k1%i==0)&&(k2%i==0)) {

return(i); flag=1; break; }

else flag=0; }

if(flag==0) return(0); }

int min_mul(int k1,int k2) {

int max(int,int); int i,k;

k=max(k1,k2); for(i=k;;i++) {

if((i%k1==0)&&(i%k2==0))

{

return(i); break; } } }

int min(int k1,int k2) {

int min; min=k1;

if(k1>k2) min=k2; return(min); }

int max(int k1,int k2) {

int max; max=k1;

if(k1

#include #include void main() {

void root1(float,float,float); void root2(float,float,float); void root3(float,float,float); float a,b,c,k;

printf(\输入a,b,c的值\\n\\n\ scanf(\ k=b*b-4*a*c;

if(k>0) root1(a,b,c);

else if(k==0) root2(a,b,c); else root3(a,b,c); }

void root1(float a,float b,float c) {

float p,q; p=-b/(2*a);

q=sqrt(b*b-4*a*c)/(2*a);

printf(\方程的两个根为:x1=%6.2f,x2=%6.2f\\n\\n\}

void root2(float a,float b,float c) {

float p; p=-b/(2*a);

printf(\方程的两个根为:x1=x2=%6.2f\\n\\n\}

void root3(float a,float b,float c) {

float p,q; p=-b/(2*a);

q=sqrt(-b*b+4*a*c)/(2*a);

printf(\方程的两个根为:x1=%6.2f+%6.2fi,x2=%6.2f-%6.2fi\\n\\n\} 8-3

#include void main() {

int prime(int); int x;

printf(\输入一个正整数\\n\\n\ scanf(\

if(prime(x)==0) printf(\此数为素数\\n\\n\ else printf(\此数不是素数\\n\\n\}

int prime(int x) {

int i,flag;

for(i=2;i

if(x%i==0) {

flag=1; break; }

else flag=0; }

return(flag); } 8-4

#include void main() {

void exchange(int a[3][3]); int a[3][3],i,j;

printf(\输入一个3*3的矩阵\\n\\n\ for(i=0;i<3;i++) {

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

scanf(\ } }

exchange(a);

printf(\转置后的矩阵为:\\n\\n\ for(i=0;i<3;i++) {

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

printf(\ }

printf(\ } } 8-5

#include void main() {

void exchange(char str[]); char str[80];

printf(\输入一个字符串\\n\\n\ gets(str);

exchange(str);

printf(\反序字符串为:\\n\\n\ puts(str); }

void exchange(char str[]) {

int i,j,k; char temp; for(i=0;;i++) {

if(str[i]=='\\0') break; } k=i/2;

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

{

temp=str[j]; str[j]=str[i-1-j]; str[i-1-j]=temp; }

str[i]='\\0'; } 8-6

#include void main() {

void strcat(char str1[],char str2[]); char str1[80],str2[80]; printf(\输入str1\\n\\n\ gets(str1);

printf(\输入str2\\n\\n\ gets(str2);

strcat(str1,str2);

printf(\连接后的字符串为:\\n\\n\ puts(str1); }

void strcat(char str1[],char str2[]) {

int i,j;

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

if(str1[i]=='\\0') {

for(j=0;str2[j]!='\\0';j++) {

str1[i]=str2[j]; i+=1; }

break; } }

str1[i]='\\0'; } 8-7

#include void main() {

void strcpy(char str1[],char str2[]); char str1[80],str2[80]; printf(\输入str2\\n\\n\ gets(str2);

strcpy(str1,str2);

printf(\复制后的字符串为:\\n\\n\ puts(str1); }

void strcpy(char str1[],char str2[]) {

int i,j=0;

for(i=0;str2[i]!='\\0';i++) {

if((str2[i]=='a')||(str2[i]=='e')||(str2[i]=='i')||(str2[i]=='o')||(str2[i]=='u')) {

str1[j]=str2[i]; j++; } }

str1[j]='\\0'; } 8-8

#include void main() {

void stradd(char str[]); char str[80];

printf(\输入一串数字\\n\\n\ gets(str); stradd(str);

printf(\加空格后的字符串\\n\\n\ puts(str); }

void stradd(char str[]) {

char a[80]; int i=0,j;

for(j=0;str[j]!='\\0';j++) {

a[i]=str[j]; a[i+1]=' '; i+=2; }

a[i]='\\0';

for(i=0;a[i]!='\\0';i++) {

str[i]=a[i]; }

str[i]='\\0'; } 8-9

#include void main() {

void num(char str[],int a[]); char str[80]; int a[4]={0};

printf(\输入一个字符串\\n\\n\ gets(str); num(str,a);

printf(\字母个数为: %d\\n\ printf(\数字个数为: %d\\n\ printf(\空格个数为: %d\\n\ printf(\其它字符个数为:%d\\n\}

void num(char str[],int a[]) {

int i,word=0,num=0,span=0,oth=0; for(i=0;str[i]!='\\0';i++) {

if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')) word+=1; else if(str[i]>=48&&str[i]<=57) num+=1; else if(str[i]==' ') span+=1; else oth+=1; }

a[0]=word; a[1]=num; a[2]=span; a[3]=oth; } 8-10

#include void main() {

int word(char c);

int longest(char str[]); int i;

char str[80];

printf(\输入一行字符串\\n\\n\ gets(str);

printf(\最长的单词为:\\n\\n\ for(i=longest(str);word(str[i]);i++) printf(\ printf(\}

int word(char c) {

if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) return 1; else return 0; }

int longest(char str[]) {

int i,flag=1,len=0,point,max_len=0,max_point; for(i=0;i<=strlen(str);i++) {

if(word(str[i])) {

if(flag==1) {

point=i; flag=0; }

else len++; } else {

flag=1;

if(len>max_len) {

max_len=len; max_point=point; }

len=0; } }

return (max_point); }

8-11

#include void main() {

char str[80];

void sort(char str[]);

printf(\输入一个字符串\\n\\n\ gets(str); sort(str);

printf(\字符由小到大排序为:\\n\\n\ puts(str); }

void sort(char str[]) {

int i,j;

char temp;

for(i=0;i

for(j=0;j

if(str[j]>str[j+1]) {

temp=str[j]; str[j]=str[j+1]; str[j+1]=temp; } } } } 8-12

#include #include void main() {

int a,b,c,d;

float root(int a,int b,int c,int d); printf(\输入a,b,c,d\\n\\n\

scanf(\

printf(\在1附近的根为:%f\\n\\n\}

float root(int a,int b,int c,int d) {

float x=1,x1,f,f1; do {

x1=x;

f=((a*x1+b)*x1+c)*x1+d; f1=(a*x1+b)*x1+c; x=x1-f/f1;

}while(fabs(x-x1)>=1e-5); return(x); } 8-13

#include void main() {

float p(int,float); int n; float x;

printf(\输入n和x\\n\\n\ scanf(\

printf(\阶勒德让多项式的值为:%f\\n\\n\}

float p(int n,float x) {

if(n==0) return 1; else if(n==1) return x;

else return ((2*n-1)*x-p(n-1,x)-(n-1)*p(n-2,x))/n; } 8-14

#include #define n1 2 #define n2 5

float a_stu[n1],a_cou[n2]; void main() {

void input(float a[][n2]); void stu_aver(float a[][n2]); void cou_aver(float a[][n2]);

int hightest(int *s,int *c,float a[][n2]); float d(float a[][n2]); int i,j,s=0,c=0;

float score[n1][n2],h;

input(score); stu_aver(score); cou_aver(score);

printf(\序号 课程 1 2 3 4 5 平均成绩\\n\\n\ for(i=0;i

printf(\NO.%d \ for(j=0;j

printf(\ }

printf(\ }

printf(\课程平均\ for(i=0;i

printf(\ }

h=hightest(&s,&c,score);

printf(\最高成绩为:%f 是第%d号学生,第%d门课的成绩\\n\\n\ printf(\平均方差为:%f\\n\\n\}

void input(float a[][n2]) {

int i,j;

for(i=0;i

printf(\输入%d个学生的5个成绩\\n\\n\ for(j=0;j

scanf(\ } } }

void stu_aver(float a[][n2]) {

int i,j; float s;

for(i=0;i

for(j=0;j

s+=a[i][j];

}

a_stu[i]=s/n2; } }

void cou_aver(float a[][n2]) {

int i,j; float s;

for(i=0;i

for(j=0;j

s+=a[j][i]; }

a_cou[i]=s/n1; } }

int hightest(int *s,int *c,float a[][n2]) {

float hightest=0; int i,j;

for(i=0;i

for(j=0;j

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

hightest=a[i][j]; *s=i+1; *c=j+1; } } }

return(hightest); }

float d(float a[][n2]) { int i;

float x=0,y=0; for(i=0;i

x+=a_stu[i]*a_stu[i]; y+=a_stu[i];

}

return(x/n1-(y/n1)*(y/n1)); } 8-15

#include #define N 3 void main() {

void input(int num[],char name[N][8]); void sort(int num[],char name[N][8]);

void search(int num[],char name[N][8],int n); int flag,n,num[N]; char c,name[N][8]; input(num,name); sort(num,name);

for(flag=1;flag;) {

printf(\输入要查找的职工号\\n\\n\ scanf(\

search(num,name,n);

printf(\是否继续查找?Y/N ?\\n\\n\ c=getchar();

if(c=='N'||c=='n') flag=0; } }

void input(int num[],char name[N][8]) { int i;

for(i=0;i

printf(\输入职工号\\n\\n\ scanf(\

printf(\输入职工姓名\\n\\n\ getchar(); gets(name[i]); } }

void sort(int num[],char name[N][8]) {

int i,j,min,temp1; char temp2[8]; for(i=0;i

{

min=i;

for(j=i;j

if(num[min]>num[j]) min=j; }

temp1=num[i];

strcpy(temp2,name[i]); num[i]=num[min];

strcpy(name[i],name[min]); num[min]=temp1;

strcpy(name[min],temp2); }

printf(\排序结果如下:\\n\\n\ for(i=0;i

printf(\职工号:m 姓名:s\\n\\n\ } }

void search(int num[],char name[N][8],int n) {

int low,high,mid,flag; flag=0; low=0; high=N-1;

if((nnum[high])) flag=-1; while((low<=high)&&(flag==0)) {

mid=(low+high)/2; if(n==num[mid]) {

flag=mid+1;

printf(\第M号职工的名字为:%8s\\n\\n\ break; }

else if(n

if(flag==0||flag==-1) printf(\不存在该职工\\n\\n\} 8-16

#include

#define N1 1000 void main() {

int exchange(char a[]); int i=0,flag=0,flag1=1; char c,a[N1];

printf(\输入一个十六进制数\\n\\n\

while(((c=getchar())!='\\0')&&(i

if(((c>='0')&&(c<='9'))||((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) {

a[i++]=c; flag=1; }

else if(flag==1) {

a[i]='\\0';

printf(\对应的十进制数为:%d\\n\\n\ printf(\是否继续?Y/N ?\\n\\n\ c=getchar();

if(c=='N'||c=='n') flag1=0; else {

flag=0; i=0;

printf(\输入一个十六进制数\\n\\n\ } } } }

int exchange(char a[]) {

int i,n=0;

for(i=0;a[i]!='\\0';i++) {

if((a[i]>='0')&&(a[i]<='9')) n=n*16+a[i]-'0'; if((a[i]>='a')&&(a[i]<='f')) n=n*16+a[i]-'a'+10; if((a[i]>='A')&&(a[i]<='F')) n=n*16+a[i]-'A'+10; }

return(n); } 8-17

#include

void main() {

void exchange(int n); int n;

printf(\输入一个整数\\n\\n\ scanf(\

printf(\输出是:\\n\\n\ if(n<0) {

putchar('-'); n=-n; }

exchange(n); printf(\}

void exchange(int n) { int i;

if((i=n/10)!=0) exchange(i); putchar(n+'0'); } 8-18

#include void main() {

int day_num(int year,int mon,int day); int year,mon,day;

printf(\输入年、月、日\\n\\n\

scanf(\

printf(\输入的日期是当年的第%d天\\n\\n\}

int date[]={31,28,31,30,31,30,31,31,30,31,30,31}; int day_num(int year,int mon,int day) {

int i,days=0;

for(i=0;i

days+=date[i]; }

days+=day;

if((year%4==0)&&((year0)!=0)||(year@0==0)) days+=1; return days; }

第九章 9-1

#include

#define exchange(x,y) t=x;x=y;y=t void main() {

int x,y,t;

printf(\输入x,y\\n\\n\ scanf(\ exchange(x,y);

printf(\交换后x=%d,y=%d\\n\\n\} 9-2

#include #define acr(x,y) ((x)%(y)) void main() {

int x,y;

printf(\输入x,y\\n\\n\ scanf(\

printf(\余数为%d\\n\\n\} 9-3

#include #include

#define s(a,b,c) ((a+b+c)/2)

#define area(a,b,c,s) sqrt(s*(s-a)*(s-b)*(s-c)) void main() {

float a,b,c,s,area; char m; int flag=1; while(flag==1) {

printf(\输入a,b,c\\n\\n\ scanf(\

if(a>0&&b>0&&c>0&&(a+b>c||a+c>b||b+c>a)&&(fabs(a-b) s=s(a,b,c);

area=area(a,b,c,s);

本文来源:https://www.bwwdw.com/article/k7y.html

Top