导读: Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和 ...
java程序设计实用教程第四版答案
C语言程序设计第四版 谭浩强 课后习题答案完整版
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<b)
max=b;
if(max<c)
max=c;
printf(“最大数为:“%d”,max);
}
第三章
3.6写出以下程序运行的结果。
main()
{char c1=’a’,c2=’b’,c3=’c’,c4=’1’,c5=’6’;
printf(“a%cb%c\tc%c\tabc\n”,c1,c2,c3);
printf(“\t\b%c %c”,c4,c5);
}
解:
aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabc
AㄩN
3.7 要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。
解:
#include <stdio.h>
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",c1,c2,c3,c4,c5);
}
运行结果:
密码是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("a=%2d b=%2d c=%2d\n",a,b,c);
printf("x=%f,y=%f,z=%f\n",x,y,z);
printf("x+y=%5.2f y+z=%5.2f z+x=%5.2f\n",x+y,y+z,z+x);
printf("u=%6ld n=%9ld\n",u,n);
printf("%s %s %d%s\n","c1=’a’","or",c1,"(ASCII)");
printf("%s %s %d%s\n","c2=’a’","or",c2,"(ASCII)");
}
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=%d_b=%d",&a,&b);
scanf("_x=%f_y=%e",&x,&y);
scanf("_c1=%c_c2=%c",&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("%f,%f",&r,&h);
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("C1=%.2f\n",C1);
printf("Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n",Sa,Sb,Va,Vb);
}
4.9输入一个华氏温度,要求输出摄氏温度。公式为
c=5(F-32)/9
输出要求有文字说明,取位2小数。
main()
{float F,c;
scanf("%f",&F);
c=5*(F-32)/9;
printf("c=%.2f",c);
}
4.10编程序,用getchar函数读入两个字符给c1、c2,然后分别用函数和函数输出这两个字符。并思考以下问题:(1)变量c1、c2应定义为字符型或整形?抑二者皆可?(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3)整形变量与字符变量是否在任何情况下都可以互相代替?如:
char c1,c2;
与
int c1,c2;
是否无条件的等价?
#include"stdio.h"
main()
{char c1,c2;
c1=getchar();c2=getchar();
putchar(c1);putchar(’\n’);putchar(c2);putchar(’\n’);
}
#include"stdio.h"
main()
{char c1,c2;
c1=getchar();c2=getchar();
printf("c1=%d c2=%d\n",c1,c2);
printf("c1=%c c2=%c\n",c1,c2);
}
第五章
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 <stdio.h>
main()
{ int a,b,c;
printf("请输入3个整数:");
scanf("%d,%d,%d",&a,&b,&c);
if(a<b)
if(b<c) printf("max=%d\n",c);
else printf("max=%d\n",b);
else if(a<c) printf("max=%d\n",c);
else printf("max=%d\n",a);
}
方法二:使用条件表达式,可以使程序更加简明、清晰。
程序如下:
#include <stdio.h>
main()
{ int a,b,c,temp,max;
printf("请输入3个整数:");
scanf("%d,%d,%d",&a,&b,&c);
temp=(a>b)?a:b; /* 将a和b中的大者存人temp中 */
max=(temp>c)?temp:c; /* 将a和b中的大者与c比较,取最大者*/
printf("3个整数的最大数是%d\n”,max);
}
5.5 有一函数:
写一程序,输入x值,输出y值。
解:
#include <stdio.h>
main()
{int x,y;
printf("输入x:");
scanf("%d",&x);
if(x<1) /* x<1 */
{ y=x;
printf("x=%3d, y=x=%d\n",x,y);
}
else if (x<10) /* 1≤x-10 */
{ y=2*x-1;
printf("x=%3d, y=2*x-1=%d\n",x,y);
}
else /* x≥10 */
{ y=3*x-11;
printf("x=%3d, y=3*x-11=%d\n",x,y);
}
}
5.6 给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~90分为’B’,70~79分为’C’,60分以下为’D’。
解:
程序如下:
#include <stdio.h>
main()
{ float score;
char grade;
printf("请输入学生成绩:");
scanf("%f",&score);
while(score>100||(score<0)
{ printf("\n输入有误,请重新输入:");
scanf("%f",&score);
}
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 2:
case 1:
case 0: grade=’E’;
}
printf("成绩是%5.1f,相应的等级是%c。\n",score,grade);
}
说明:对输入的数据进行检查,如小于0或大于100,要求重新输入。(int)(score/10)的作用是将 (score/10) 的值进行强制类型转换,得到一个整型值。
5.7 给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。
解:
#include <stdio.h>
main()
{ long int num;
int indiv,ten,hundred,thousand,ten_thousand,place;
/*分别代表个位、十位、百位、千位、万位和位数*/
printf("请输入一个整数(0~99999):");
scanf("%ld",&num);
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("place =%d\n", place);
ten_thousand=num/10000;
thousand=num/1000%10;
hundred=num/100%10;
ten=num%100/10;
indiv=num%10;
switch(place)
{ case 5: printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);
printf("\n反序数字为;");
printf("%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);
break;
case 4: printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);
printf("\n反序数字为:");
printf("%d%d%d%d\n",indiv,ten,hundred,thousand);
break;
case 3: printf("%d,%d,%d",hundred,ten,indiv);
printf("\n反序数字为:");
printf("%d%d%d\n",indiv,ten,hundred);
break;
case 2: printf("%d,%d",ten,indiv);
printf("\n反序数字为:");
printf("%d%d\n",indiv,ten);
break;
case 1: printf("%d",indiv);
printf("\n反序数字为:");
printf("%d\n",indiv);
break;
}
}
5.8 企业发放的奖金根据利润提成。java程序设计实用教程第四版答案利润I低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(100000<I≤200000)时,其中10万元按10%提成,高于10万元的部分,可提成7.5% ;200000<I≤400000时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按1.5%提成;I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。要求:(1)用if语句编程序;(2)用switch语句编程序。
解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按7.5%提成。
(1) 用if语句编程序。
#include <stdio.h>
main()
{ long i;
float bonus,bon1,bon2,bon4,bon6,bon10;
bon1=100000*0.1; /*利润为10万元时的奖金*/
bon2=bon1+100000*0.075; /*利润为20万元时的奖金*/
bon4=bon2+200000*0.05; /*利润为40万元时的奖金*/
bon6=bon4+200000*0.03; /*利润为60万元时的奖金*/
bon10=bon6+400000*0.015; /*利润为100万元时的奖金*/
printf("请输入利润i:");
scanf("%ld",&i);
if(i<=100000)
bonus=i*0.1; /*利润在10万元以内按0.1提成奖金*/
else if(i<=200000)
bonus=bon1+(i-100000)*0.075; /*利润在10万至20万元时的奖金*/
else if(i<=400000)
bonus=bon2+(i-200000)*0.05; /*利润在20万至40万元时的奖金*/
else if(i<=600000)
bonus=bon4+(i-400000)*0.03; /*利润在40万至60万元时的奖金*/
else if(i<=1000000)
bonus=bon6+(i-600000)*0.015; /*利润在60万至100万元时的奖金*/
else
bonus=bon10+(i-1000000)*0.01; /*利润在100万元以上时的奖金*/
printf(”奖金是%10.2f\n",bonus);
}
此题的关键在于正确写出每一区间的奖金计算公式。例如利润在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 <stdio.h>
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("%ld",&i);
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("奖金是%10.2f",bonus);
}
5.9 输入4个整数,要求按由大到小的顺序输出。
解:此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以有更多的排序方法。
#include <stdio.h>
main()
{ int t,a,b,c,d;
printf("请输入4个整数:");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("\n a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
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("%d, %d, %d, %d\n",a,b,c,d);
}
5.10 有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
程序如下:
#include <stdio.h>
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("%f,%f",&x,&y);
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",h);
}
第六章
第六章 循环控制
6.1输入两个正整数m和n,求其最大公约数和最小公倍数。
main()
{long m,n,i=1,j,s;
scanf("%ld,%ld",&m,&n);
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("s=%ld,j=%ld\n",s,j);
}
6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include"stdio.h"
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("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);
}
6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。
#include"math.h"
main()
{int n,sum=0,i=1,s=2;
scanf("%d",&n);
while(i<=n)
{sum=sum+s;s=s+2*pow(10,i);
i++;}
printf("sum=%d\n",sum);
}
6.4 求 ,(即求1!+2!+3!+4!+5!+…+20!)
main()
{int n,i=1;long sum=0,s=1;
scanf("%d",&n);
while(i<=n) {s=s*i;sum=sum+s;i++;}
printf("sum=%ld\n",sum);
}
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("sum=%f\n",sum);
}
6.6打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。
#include"math.h"
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("%5d",x);x++;}
}
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<m;i++)
if(m%i==0) s=s+i;
if(m-s==0)
{printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0)
printf("%d ",j);printf("\n");}
}
}
或
main()
{int m,i,j,s;
for(m=6;m<1000;m++)
{s=m-1;
for(i=2;i<m;i++)
if(m%i==0) s=s-i;
if(s==0)
{printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0)
printf("%d ",j);printf("\n");}
}
}
6.8有一分数序列:
求出这个数列的前20项之和。
main()
{int i=1,n;double t,x=1,y=2,s,sum=0;
scanf("%ld",&n);
while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;}
printf("%f\n",sum);
}
6.9一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?
main()
{int i,n;double h=100,s=100;
scanf("%d",&n);
for(i=1;i<=n;i++)
{h*=0.5;if(i==1) continue;s=2*h+s;}
printf("h=%f,s=%f\n",h,s);
}
6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
main()
{int i=1,sum=0;
for(;i<=10;sum=2*sum+1,i++);
printf("sum=%d\n",sum);
}
6.11用迭代法求 。求平方根的迭代公式为:
要求前后两次求出的得差的绝对值少于0.00001。
#include"math.h"
main()
{float x0,x1,a;
scanf("%f",&a);
x1=a/2;
do
{x0=x1;x1=(x0+a/x0)/2;}
while(fabs(x0-x1)>=0.00001);
printf("%.3f\n",x1);
}
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("x=%.3f\n",x);
}
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("x1=%.3f,x2=%.3f\n",x1,x2);
}
6.14打印以下图案
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include"math.h"
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("\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");
}
}
第七章
第七章 数组
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<i)
if(a[i]%j==0)
break;
if(a[i]-j==0)
printf("%5d",a[i]);
}
}
printf("\n");
}
或
#include"math.h"
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<k) if(a[i]%j==0)
break;
if(j>=k+1)
printf("%5d",a[i]);
}
printf("\n");
}
7.2用选择法对10个整数从小到大排序。
main()
{ int i,j,a[10],t;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
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("%5d",a[i]);
}
或
main()
{static int a[10],i,j,k,t;
for(i=1;i<11;i++)
scanf("%d",&a[i]);
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("%d",a[i]);
printf("\n");
}
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("%d",&a[i][j]);
s1=a[0][0]+a[1][1]+a[2][2];
s2=a[0][2]+a[1][1]+a[2][0];
printf("s1=%d,s2=%d\n",s1,s2);
}
或
main()
{
static int i,j,s1,s2,a[3][3];
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
scanf("%d",&a[i][j]);
s1=a[1][1]+a[2][2]+a[3][3];
s2=a[1][3]+a[2][2]+a[3][1];
printf("%d,%d\n",s1,s2);
}
7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。
main()
{ static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t;
scanf("%d",&a[9]);
for(i=9;i>0;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("%5d",a[i]);printf("\n");
}
或
main()
{
static int a[5]={1,4,5,6,7};
int i,t,b;
scanf("%d",&b);
for(i=0;i<5;i++)
{if(b<=a[i])
{t=a[i];a[i]=b;b=t;}
printf("%d ",a[i]);}
printf("%d",b);
}
7.5将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。
main()
{ int i,b[10];
for(i=0;i<10;i++)
scanf("%d",&b[i]);
for(i=9;i>-1;i--)
printf("%5d",b[i]);
printf("\n");}
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("%-5d",b[m][n]);}printf("\n");
}
}
}
或
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("%d",a[i][j]);
}
7.7 打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求打印出由1~n2的自然数构成的魔方阵。
解:
#include <stdio.h>
main()
{ int a[16][16],i,i,k,p,m,n;
p=1;
while(p==1) /*要求阶数为1~15的商数*/
{ printf("Enter n(n=1~15):");
scanf("%d",&n);
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;
j=n/2+1; /*建立魔方阵*/
a[1][j]=1;
for(k=2;k<=n*n;k++)
{ i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1;
}
else
{ if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0) a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++) /*输出魔方阵*/
{ for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
7.8找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。
main()
{int a[5][5],b[5],c[5],d[5][5],k=0,l=0;int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&d[i][j]);
for(i=0;i<5;i++)
for(j=0;j<5;j++,a[i][j]=d[i][j]);
for(i=0,k=0;i<5;i++,k++)
for(j=0;j<4;j++)
{if(a[i][j]>=a[i][j+1])
b[k]=a[i][j+1]=a[i][j];
else
b[k]=a[i][j+1];
}
for(j=0,l=0;j<5;j++,l++)
for(i=0;i<4;i++)
{if(a[i][j]<=a[i+1][j])
c[l]=a[i+1][j]=a[i][j];
else
c[l]=a[i+1][j];
}
for(i=0,k=0;i<5;i++,k++)
for(j=0,l=0;j<5;j++,l++)
if(d[i][j]-b[k]==0)
{if(d[i][j]-c[l]==0)
printf("d[%d][%d]=%d\n",i,j,d[i][j]);
else
printf("d[%d][%d]=%d isnot andi\n",i,j,d[i][j]);
}
}
7.9有个15数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值。如果该数不在数组中,则打印出"无此数"
#include"math.h"
main()
{static int i,j,m,a[15]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812};
scanf("%d",&m);
for(j=0;j<15;j++)
printf("%4d",a[j]);
printf("\n");
i=7;
while(fabs(i-7)<8)
{if(m<a[7])
{if(a[i]-m==0)
{printf("it is at (%d)\n",i+1);break;}i--;}
else if(m>a[7])
{if(a[i]-m==0)
{printf("it is at (%d)\n",i+1);break;}i++;}
else
printf("8\n");
}
if(fabs(i-7)-8==0)
printf("There is not\n");
}
7.10有一篇文章,共有3行文字,每行有个80字符。要求分别统计出其中英文大写字母、小写字母、空格以及其它字符的个数。
main()
{int i,j=0,k=0,l=0,m=0,n=0;char str0[301],str1[100],str2[100],str3[100];
gets(str1);gets(str2);gets(str3);
strcat(str0,str1);strcat(str0,str2);strcat(str0,str3);
for(i=0;str0[i]!=’{content}’;i++)
{if(str0[i]>=65&&str0[i]<=90) j++;
else if(str0[i]>=97&&str0[i]<=122) k++;
else if(str0[i]>=48&&str0[i]<=57) l++;
else if(str0[i]==32) m++;
else n++;}
printf("Daxie Xiaoxie Shuzi Kongge Qita\n");
printf("%5d %7d %5d %6d %4d\n",j,k,l,m,n);
}
7.11打印以下图案
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
main()
{int i,j,k;char a[5][5];
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
{a[i][j]=’*’;printf("%c",a[i][j]);}
printf("\n");
for(k=1;k<=i+1;k++)
printf("");}
printf("\n");
}
7.12有一行电文译文下面规律译成密码:
A->Z a->z
B->Y b->y
C->X c->x
…
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变,要求编程序将密码回原文,并打印出密码和原文。
main()
{ int i;char str1[100],str2[100];
gets(str1);
for(i=0;str1[i]!=’{content}’;i++)
if(str1[i]>=65&&str1[i]<=90)
str2[i]=155-str1[i];
else if(str1[i]>=97&&str1[i]<=122)
str2[i]=219-str1[i];
else
str2[i]=str1[i];
printf("%s\n%s\n",str1,str2);
}
7.13编一程序,将两个字符串连接起来,不要strcat函数。
main()
{ int i,j;char str1[100],str2[100],str3[201];
gets(str1);
gets(str2);
for(i=0;str1[i]!=’{content}’;i++)
str3[i]=str1[i];
for(j=0;str2[j]!=’{content}’;j++)
str3[j+i]=str2[j];
printf("%s\n%s\n%s\n",str1,str2,str3);
}
7.14编一个程序,将两个字符串S1和S2比较,如果S1>S2,输出一个正数;S1=S2,输出0;S1<S2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,’A’与’C’相比,由于’A’<’C’,应输出负数,由于’A’与’C’的码差值为2,因此应输出"-2"。同理:"And"和"Aid"比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出"5"。
#include <stdio.h>
#include <string.h>
main()
{ int i,resu;
char s1[100],s2[100];
printf("\n input string1:");
gets(s1);
printf("\n Input string2:");
gets(s2);
i=0;
while(s1[i]==s2[i]&&s1[i]!=’{content}’) i++;
if(s1[i]==’{content}’&&s2[i]==’0’) resu=0;
else resu=s1[i]-s2[i];
printf("\n result:%d\n",resu);
}
7.15 编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不用strcpy函数。拷贝时,’{content}’也要拷贝过去,’{content}’后面的字符不拷贝。
解:
#include "stdio.h"
main()
{ char s1[80],s2[80];
int i;
printf("Input s2:");
scanf("%s",s2);
for(i=0;i<strlen(s2);i++)
s1[i]=s2[i];
printf("s1:%s\n",s1);
}
第八章
第八章 函数
1.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
maxyueshu(m,n)
int m,n;
{ int i=1,t;
for(;i<=m&&i<=n;i++)
{if(m%i==0&&n%i==0)
t=i;
}
return(t);
}
minbeishu(m,n)
int m,n;
{int j;
if(m>=n) j=m;
else j=n;
for(;!(j%m==0&&j%n==0);j++);
return j;
}
main()
{int a,b,max,min;
printf("enter two number is: ");
scanf("%d,%d",&a,&b);
max=maxyueshu(a,b);
min=minbeishu(a,b);
printf("max=%d,min=%d\n",max,min);
}
8.2求方程 的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。
#include"math.h"
float yishigen(m,n,k)
float m,n,k;
{float x1,x2;
x1=(-n+sqrt(k))/(2*m);
x2=(-n-sqrt(k))/(2*m);
printf("two shigen is x1=%.3f and x2=%.3f\n",x1,x2);
}
float denggen(m,n)
float m,n;
{float x;
x=-n/(2*m);
printf("denggen is x=%.3f\n",x);
}
float xugen(m,n,k)
float m,n,k;
{float x,y;
x=-n/(2*m);
y=sqrt(-k)/(2*m);
printf("two xugen is x1=%.3f+%.3fi and x2=%.3f-%.3fi\n",x,y,x,y);
}
main()
{float a,b,c,q;
printf("input a b c is ");
scanf("%f,%f,%f",&a,&b,&c);
printf("\n");
q=b*b-4*a*c;
if(q>0) yishigen(a,b,q);
else if(q==0) denggen(a,b);
else xugen(a,b,q);
}
8.2写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。
psushu(m)
int m;
{int i=2,t;
for(;i<=m;i++)
if(m%i==0&&i<m) break;
if(m-i==0) t=1;
else t=0;
return m;
}
main()
{int a,s;
printf("enter sushu is \n");
scanf("%d",&a);
s=psushu(a);
if(s==1) printf("a is sushu\n");
else printf("s is not sushu\n");
}
8.4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。
int zhuangzhi(b)
int b[3][3];
{int i,j,t;
for(i=0;i<3;i++)
for(j=0;j>=i&&j<3-i;j++)
{t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;}
}
main()
{int a[3][3];int i,j;
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++)
printf(" %d",a[i][j]);
printf("\n");}
zhuangzhi(a);
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf(" %d",a[i][j]);
printf("\n");}
}
8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。
main()
{char str0[100];
gets(str0);
fanxu(str0);
puts(str0);
}
fanxu(str1)
char str1[100];
{int i,t,j;
char str2[100];strcpy(str2,str1);
t=strlen(str1);
for(i=0,j=t-1;j>-1;i++,j--)
str1[i]=str2[j];
}
8.6写一函数,将两个字符串连接。
lianjie(a,b)
char a[100],b[100];
{strcat(a,b);
}
main()
{char str1[100],str2[100];
gets(str1);gets(str2);
lianjie(str1,str2);
puts(str1);
}
8.7写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。
fuzhi(a,b)
char a[100],b[100];
{int i,j=0;
for(i=0;a[i]!=’{content}’;i++)
if(a[i]==97||a[i]==101||a[i]==105||a[i]==111||a[i]==117||a[i]==65||
a[i]==69||a[i]==73||a[i]==85) {b[j]=a[i];j++;}
}
main()
{char str1[100],str2[100];
gets(str1);
fuzhi(str1,str2);
puts(str2);
}
8.8写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出"1_9_9_0"。
char f(b)
char b[4];
{int i=0;
for(;i<4;i++)
{printf(" ");
printf("%c",b[i]);}
printf("\n");
}
main()
{int a,u,v,w,t;char c[4];
scanf("%4d",&a);
u=a*0.001;v=0.01*(a-1000*u);w=(a-1000*u-100*v)*0.1;t=a-1000*u-100*v-10*w;
c[0]=u+48;
c[1]=v+48;
c[2]=w+48;
c[3]=t+48;
f(c);
}
8.9编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。
char tongji(str0,b)
char str0[100];
int b[4];
{int i;
for(i=0;str0[i]!=’{content}’;i++)
{if(str0[i]>=65&&str0[i]<=90||str0[i]>=97&&str0[i]<=122) b[0]++;
else if(str0[i]>=48&&str0[i]<=57) b[1]++;
else if(str0[i]==32) b[2]++;
else b[3]++;}
}
main()
{char str1[100];static int i,a[4];
gets(str1);
tongji(str1,a);
printf("zimu Shuzi Kongge Qita\n");
for(i=0;i<4;i++)
printf("%-8d ",a[i]);printf("\n");
}
8.10写一函数,输入一行字符,将此字符串中最长的单词输出。
cechang(str1,word0)
char str1[100],word0[15];
{int i=0,j=0,t=0;
static char word1[15];
for(;str1[i]!=’{content}’;i++)
{if(!(str1[i]>=97&&str1[i]<=122||str1[i]>=65&&str1[i]<=90))
{t=j;j=0;continue;}
word1[j]=str1[i];j++;
if(j>=t) strcpy(word0,word1);}
}
main()
{char str0[100],longword[15];
gets(str0);
cechang(str0,longword);
puts(longword);
}
8.11写一函数用起泡法对输入的个字符按由小到大的顺序排列。
int paixu(x)
int x[];
{int i,j,t;
for(j=1;j<10;j++)
for(i=0;i<=9-j;i++)
if(x[i]>x[i+1]) {t=x[i+1];x[i+1]=x[i];x[i]=t;}
}
main()
{int y[10];int i;
for(i=0;i<10;i++)
scanf("%d",&y[i]);
paixu(y);
for(i=0;i<10;i++)
printf("%5d",y[i]);
printf("\n");
}
8.12用牛顿迭代法求根。方程为: ,系数a,b,c,d由主函数输入。求X在1附近的一个实根。求出后由主函数输出。
double qigen(s,t,u,v)
int s,t,u,v;
{double x,y;x=1;
do{y=s*x*x*x+t*x*x+u*x+v;
x=x-y/(3*s*x*x+2*t*x+u);}
while(y!=0);
return x;
}
main()
{int a,b,c,d;double x;
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
x=qigen(a,b,c,d);
printf("x=%.3f\n",x);
}
8.13用递归方法求n阶勒让德多项式的值递归公式为
float p(x0,n)
int n;float x0;
{float y;
if(n==0||n==1) if(n==1) y=x0;else y=1;
else y=((2*n-1)*x0*p(x0,n-1)-(n-1)*p(x0,n-2))/n;
return(y);
}
main()
{float x,y0;int a,i;
scanf("%f,%d",&x,&a);
y0=p(x,a);
printf("y0=%.3f\n",y0);
}
8.14输入10个学生5门课的成绩,分别用函数求:①每个学生平均分;②每门课的平均分;③找出最高分所对应的学生和课程;④求平均分方差:δ=[SXi^2]/n-(SXi/n)^2,为一学生的平均分
float x1[10],x2[5];
float pp(),cc(),find(),xx();
main()
{char name[10][20],class[5][20];float score[10][5],o,k=0,max[5];int a[5],i,j;
for(i=0;i<10;i++)
gets(name[i]);
for(j=0;j<5;j++) gets(class[j]);
for(i=0;i<10;i++)
for(j=0;j<5;j++)
scanf("%f",&score[i][j]);
pp(score);
cc(score);
find(score,max,a);
o=xx(k);
for(i=0;i<10;i++)
{puts(name[i]);
printf("%.3f\n",x1[i]);}
for(j=0;j<5;j++)
{puts(class[j]);printf("%.3f\n",x2[j]);}
for(j=0;j<5;j++) {printf("%.3f \n",max[j]);
puts(name[a[j]]);
puts(class[j]);}
printf("o=%.3f\n",o);
}
float pp(f)
float f[10][5];
{float sum=0;int i,j;
for(i=0,sum=0;i<10;i++)
{for(j=0;j<5;j++)
sum=sum+f[i][j];
x1[i]=sum/5;}
}
float cc(y)
float y[10][5];
{float sum=0;int i,j;
for(j=0;j<5;j++)
{for(i=0;i<10;i++)
sum=sum+y[i][j];
x1[j]=sum/10;}
}
float find(z,s,t)
float z[10][5],s[5];int t[5];
{int i,j;
for(j=0,s[j]=z[0][j];j<5;j++)
for(i=0;i<10;i++)
if(s[j]<z[i][j]) {s[j]=z[i][j];t[j]=i;}
}
float xx(q)
float q;
{float f=0,e=0;int i;
for(i=0;i<10;i++)
{e=x1[i]*x1[i]+e;
f=f+x1[i];}
q=e/10-(f/10)*(f/10);
return(q);
}
8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
#define N 10
find(a,b)
int a[],b[];
{int i,j,s,t,c[N][2];
for(i=0;i<N;i++)
{c[i][1]=a[i];c[i][1]=i;}
for(i=0;i<N;i++)
for(j=0;j<N-i-1;j++)
if(c[i][0]>c[i+1][0])
{t=c[i][0];c[i][0]=c[i+1][0];c[i+1][0]=t;
s=c[i][1];c[i][1]=c[i+1][1];c[i+1][1]=s;}
for(i=0;i<N;i++)
b[i]=c[i][1];
return;
}
lookfor(h,k)
int h[],k;
{int i,j;
for(i=0;i<N;i++)
if(h[i]-k==0) j=i;
return j;
}
main()
{int number[N],x[N],i,j,u,p;char name[N][20];
for(i=0;i<N;i++)
{gets(name[i]);
scanf("%d",&number[i]);}
scanf("%d",&p);
find(number,x);
u=lookfor(number,p);
for(i=0;i<N;i++)
{printf("%d",number[i]);
puts(name[x[i]]);}
puts(name[x[u]]);
}
8.16写一函数,输入一个十六进制数,输出相应的十进制数。
#include"math.h"
int x;
ff(shu)
char shu[];
{int i=strlen(shu)-1,sum=0;
for(;i>-1;i++)
{if {if(48<=shu[i]<=57) sum=sum+(shu[i]-48)*pow(16,(i-1));
else if(65<=shu[i]<=90) sum=sum+(shu[i]-55)*pow(16,(i-1));
else if(97<=shu[i]<=102) sum=sum+(shu[i]-87)*pow(16,(i-1));
x=1;}
else x=0;
return x;
}
main()
{char shufu[100];int s;
gets(shufu);s=ff(shufu);
if(x) printf("s(D)=%d\n",s);
else printf("The number is not ox\n");
}
8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串"486"。n的位数不确定,可以是任意位数的整数。
#include"math.h"
int x[10];
pf(m,n)
unsigned long m;int n;
{int y;
if(n==0) {y=(int)(m%10);x[0]=y;}
else {y=(unsigned long)((m-pf(m,n-1))/pow(10,n))%10;x[n]=y;}
return(y);
}
main()
{unsigned long a,b;int i,j,k;char c[11];
scanf("%ld",&a);
for(j=0,b=a;b>0.1;j++,b/=10);
pf(a,j-1);
for(i=0,k=j-1;i<j;i++,k--)
c[i]=x[k]+48;c[10]=’{content}’;
puts(c);}
或
#include"math.h"
char x[11];
pf(m,o)
unsigned long m;int o;
{int j,i;
for(i=o-1,j=0;i>-1;i--,j++)
x[i]=(int)((unsigned long)(m/pow(10,j))%10)+48;
return;
}
main()
{unsigned long a,b;int j,i;
scanf("%ld",&a);
for(j=0,b=a;b>0.1;j++,b/=10);
pf(a,j);
puts(x);printf("%d\n",j);}
或
#include"math.h"
int x[10];unsigned long m;
pf(n)
int n;
{int y;
if(n==0) {y=m%10;x[0]=y;}
else {y=(unsigned long)((m-pf(n-1))/pow(10,n))%10;x[n]=y;}
return(y);
}
main()
{unsigned long a;int i,j,k;char c[11];
scanf("%ld",&m);
for(j=0,a=m;a>0.1;j++,a/=10);
pf(j-1);
for(i=0,k=j-1;i<j;i++,k--)
c[i]=x[k]+48;c[10]=’{content}’;
puts(c);}
8.18给出年、月、日,计算该日是该年的第几天。
int find(x,y,z)
int x,y,z;
{ int i,t,s,days=0;
if(x%4==0) t=1;
else t=0;
for(i=1;i<y;i++)
{if(i==2) s=2-t;
else s=0;
days=days+30+i%2-s;
}
days=days+z;
return(days);
}
main()
{int year,month,date,day;
scanf("%d %d %d",&year,&month,&date);
day=find(year,month,date);
printf("THE DATE IS THE %dth DAYS\n",day);
}
第九章
第九章 编译预处理
9.1定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
#define CHANGE(a,b,t) t=a;a=b;b=a
main()
{int c,d,s;
scanf("%d,%d",&c,&d);
CHANGE(c,d,s);
printf("c=%d,d=%d\n",c,d);
}
9.2输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
#define Q(a,b) a%b
main()
{int c,d,t;
scanf("%d %d",&c,&d);
t=Q(c,d);
printf("t=%d\n",t);
}
9.3三角形面积为:
其中S=(a+b+c)/2,a、b、c为三角形的三边。定义两个带参的宏S,一个用来求area,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积area。
#include"math.h"
#define SSS(m,n,k) (m+n+k)/2
#define AQRT(m,n,k) sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k))
main()
{float a,b,c,s,area;
scanf("%f %f %f",&a,&b,&c);
s=SSS(a,b,c);
area=AQRT(a,b,c);
printf("s=%.3f area=%.3f\n",s,area);
}
或
#include"math.h"
#define SSS(m,n,k) (m+n+k)*0.5
#define AQRT(m,n,k) sqrt(((m+n+k)/2)*((m+n+k)/2-m)*((m+n+k)/2-n)*((m+n+k)/2-k))
main()
{float a,b,c,t,area;
scanf("%f %f %f",&a,&b,&c);
t=SSS(a,b,c);
area=AQRT(a,b,c);
printf("t=%.3f;area=%.3f\n",t,area);
}
或
#include"math.h"
#define SSS(m,n,k) ((m+n+k)/2)
#define AQRT(m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k) sqrt(SSS*(SSS-m)*(SSS-n)*(SSS-k))
main()
{float a,b,c,t,area;
scanf("%f %f %f",&a,&b,&c);
t=SSS(a,b,c);
area=AQRT(a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c);
printf("t=%.3f;area=%.3f\n",t,area);
}
9.4给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为
#define LEAP_YEAR(y) (读者设计的字符串)
在程序中用以下语句输出结果:
if (LEAP_YEAR(year)) printf("%d is a leap year",year);
else printf ("%d is not a leap year",year);
#define LEAPYEAR(y) y%4
main()
{int y;
scanf("%d",&y);
if(LEAPYEAR(y)) printf("%d is a not leap year\n",y);
else printf("%d is a lear year\n",y);
}
9.6请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。
#define PR1(x) printf("%6.2f\n",x)
#define PR2(x) printf("%6.2f\t%6.2f\n",x,x)
#define PR3(x) printf("%6.2f\t%6.2f\t%6.2f\n",x,x,x)
main()
{float a;scanf("%f",&a);
PR1(a);PR2(a);PR3(a);
}
9.7设计所需的各种各样的输出格式(包括整数、实属、字符串等),用一个文件名"fornat.h",把信息都放到这个文件内,另编一个程序文件,用命令#include "fornat.h"以确保能使用这些格式。
分别用函数和带参的宏,从三个数中找出最大的数。
#define MAX(a,b,c) (a>((b>c)? b:c))? a:((b>c)? b:c)
main()
{float x,y,z,t;
scanf("%f,%f,%f",&x,&y,&z);
t=MAX(x,y,z);
printf("%.4f\n",t);
}
9.10用条件编译方法实现以下功能:
输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。用命令来控制是否要译成密码。例如:
#define CHANGE 1
则输出密码。若:
#define CHANGE 0
则不译为密码,按原码输出。
#define CHANGE 1
main()
{char str[80],c;int i=0;
gets(str);
while(str[i]!=’{content}’)
{
#if CHANGE
if(str[i]==90||str[i]==122) str[i]=str[i]-25;
else if(str[i]>=65&&str[i]<90||str[i]>=97&&str[i]<122) str[i]=str[i]+1;
#endif
i++;
}
puts(str);
}
或
#define CHANGE 1
main()
{char str[80],*c;int i=0;
gets(str);c=str;
while(*c!=’{content}’)
{
#if CHANGE
if(*c==90||*c==122) *c=*c-25;
else if(*c>=65&&*c<90||*c>=97&&*c<122) *c=*c+1;
#endif
c++;
}
puts(str);
}
第十章
第十章 指针
10.1输入三个整数,按由小到大的顺序输出。
main()
{ int a,b,c,*p1,*p2,*p3,t;
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(*p1>*p2)
{t=p1;p1=p2;p2=t;}
if(*p1>*p3)
{t=p1;p1=p3;p3=t;}
if(*p2>*p3)
{t=p2;p2=p3;p3=t;}
printf("%d,%d,%d\n",*p1,*p2,*p3);
}
或
main()
{int a,b,c,*p1,*p2,*p3,t;
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(a>b)
{t=*p1;*p1=*p2;*p2=t;}
if(a>c)
{t=*p1;*p1=*p3;*p3=t;}
if(b>c)
{t=*p2;*p2=*p3;*p3=t;}
printf("%d,%d,%d\n",a,b,c);
}
10.2输入三个字符串,按由小到大的顺序输出
#define N 3
#define M 20
main()
{char str0[N][M],str1[M],*p,*q;
int i,l,m,n;
q=str0;
for(;p<q+N;p++)
gets(p);
l=strcmp(q,q+1);
if(l>0)
{strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);}
m=strcmp(q,q+2);
if(m>0)
{strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);}
n=strcmp(q+1,q+2);
if(n>0)
{strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);}
for(p=q;p<q+N;p++)
puts(p);
}
10.3输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;①输入10个数;②进行处理;③输出10个数。
f(x,n)
int x[],n;
{int *p0,*p1,i,j,t,y;
i=j=x[0];p0=p1=x;
for(y=0;y<n;y++)
{if(x[y]>i)
{i=x[y];p0=&x[y];}
else if(x[y]<j)
{j=x[y];p1=&x[y];}}
t=*p0;*p0=x[n-1];x[n-1]=t;
t=*p1;*p1=x[0];x[0]=t;
return;
}
main()
{int a[10],u,*r;
for(u=0;u<10;u++)
scanf("%d",&a[u]);
f(a,10);
for(u=0,r=a;u<10;u++,r++)
printf(" %d",a[u]);
printf("\n");
}
10.4有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。
#define N 10
void shift(p,x)
float *p;int x;
{float a[N],*q,*o;int i;
o=a;q=p;
for(i=0;i<x;i++)
*(o+i)=*(q+N-x+i);
for(p=p+N-1;p>=q;p--)
*p=*(p-x);
for(i=0;i<x;i++)
*(q+i)=*(o+i);
return;}
main()
{float shuzhu[N],*u,*v;
int h,i;u=v=shuzhu;
scanf("%f",&h);
for(;u<v+N;u++)
scanf("%f",u);
shift(v,h);
for(u=v;u<v+N;u++)
printf("%.2f ",*u);
printf("\n");
}
10.5有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
#define N 5
main()
{int i,j,k,a[N+1],*p;
for(i=0,p=a;p<=a+N;i++,p++)
*p=i;
p=a+1;k=N;
for(i=0,j=1;k!=1;j++)
{if(p>(a+N))
p=a+1;
if(*p!=0)
i++;
if((i-3)==0)
{*p=0;i=0;k--;}
p++;
}
for(i=1;i<=N;i++)
if(a[i]!=0)
printf("The last number is %d\n",a[i]);}
10.7有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
#include"stdio.h"
#define N 10
main()
{char a[N+1],b[N+1],*p,*q;
int m;
gets(a);
scanf("%d",&m);
p=a+m;q=b;
strcpy(q,p);
puts(q);
}
10.6写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。
第十一章
11.1定义一个结构体变量(包括年、月、日)。计算该
java程序设计实用教程第四版答案相关热词搜索:程序设计 答案 教程
1、2015年山东烟台中考物理试卷及答案(完整版)[1]。(2015-07-05)
2、2015年云南中考政治答案(已公布)[1]。(2015-07-05)
3、2015年广东揭阳中考地理试卷及答案(完整版)[1]。(2015-07-05)
4、2015年浙江义乌中考物理试卷及答案(完整版)[1]。(2015-07-05)
5、2015年浙江义乌中考化学试卷及答案(完整版)[1]。(2015-07-05)
6、2015年广东揭阳中考地理试题及答案(已公布)[1]。(2015-07-05)
7、2015年广东揭阳中考生物试题及答案(已公布)[1]。(2015-07-05)
8、2015年广东揭阳中考历史试卷及答案(完整版)[1]。(2015-07-05)
最新推荐成考报名
更多- 歇后语_歇后语大全_歇后语大全及答案_爆笑歇后语
- 大学排名_大学排名2018排行_大学查询_中国大学名单
- 成语大全_四字成语_在线成语词典_成语查询
- 成语接龙大全查询,成语接龙游戏,在线成语接龙
- 全国安全教育平台入口_学校安全教育平台
- 社保查询网-社会保障卡查询,社会保险查询,社保网上查询
- 汉字简体繁体转换_在线繁体字转换工具
- 数字大写转换|人民币金额(数字)大小写转换在线工具
- 年龄计算器实际岁数计算器 - 周岁虚岁计算器
- 产假计算器-算产假计算器在线2018-2018年产假自动计算器
- 预产期计算器-怀孕孕期计算器-怀孕天数计算
- 中国文库网-教育资源网-范文文章
- 邮编区号查询网
- 致富商机网-致富点子_创业项目
- 创业项目网--最热门的投资项目
- 中国邮政邮编查询号码
- 电话区号查询
- 全国车牌号归属地大全
- 在线网速测试|宽带速度测试
- 人民币汇率查询
- ●理财有没有风险 金融互联网理财
- ●qq网名
- ●2016最新伤感说说
- ●谈笑风生造句
- ●读书的名言
- ●资产清查报告
- ●贫困户申请书
- ●财务自查报告
- ●离婚起诉书
- ●赞美老师的演讲稿
- ●车间管理
- ●车辆购置税
- ●跨越百年的美丽读后感
- ●跟女友离别的话
- ●超市管理制度
- ●起诉状范本
- ●赠别诗大全
- ●描写夏天的句子
- ●描写友谊的诗句
- ●迁户口申请书
- ●转正申请表范本
- ●这个杀手不太冷台词
- ●运动会稿子精选
- ●那么那么造句
- ●送给男朋友的情话大全
- ●钳工实训报告
- ●霸气说说大全
- ●骂人不带脏字的
- ●幼儿园见习个人总结
- ●追女孩子的短信