C程序设计(第四版)(谭浩强)完整版课后习
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
答案
C程序设计(第四版)(谭浩强)第一章课后习题答案 #include <stdio.h> //预编译. 代码均调试成功,若有失误大多不是代码问题.自已找找.
int main()
{
}
printf("Welcome to mybbing.com\n"); return 0; //与int main对
应,为了程序可移植性,建议全用int main + return 0;.
P008 1.2 求两个数的和.
#include <stdio.h>
int main()
{
}
int a,b,sum; a=5; b=4; sum=a+b; printf("The sum is %d .\n",sum);
return 0;
P008 1.3 调用函数比较两个数的大小. #include <stdio.h>
int main()
{
int max(int x,int y); //被调用函数在主函数后面,用前先声明. int a,b,c; scanf("%d,%d",&a,&b); //输入时要按格式来,此处的逗号,
用空格会发生错误. c=max(a,b); //a,b作为实参传入被调用函数中. printf("The max is %d .\n",c); return 0;
}
int max(int x,int y) //定义了两个形参.
{
}
int z; //z属于局部变量,可与主函数中相同名字. if (x>y) z=x; z=y; else return(z); //z作为整个程序的出口值,赋给主函数中的c.
P015 0.6 三个数的大小.(数字0表示课后练习题)
#include <stdio.h>
int main()
{
}
int max(int x , int y , int z)
{
} int m; if (x>y && x>z) //求三者之大的一种
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
. m=x; m=y; m=z; if (y>x && y>z) if (z>y && z>x) return
(m); //返回值m给主函数中的d. int a,b,c,d; //d是用于存储最大值的. int max(int x , int y , int z); //测试可知,在VS2008中,可以不预先声明. printf("Please input 3 numbers :\n");
scanf("%d %d %d",&a,&b,&c); printf("The max
is :%d .\n",d); // d可以换成max(a,b,c). d=max(a,b,c); //调用函数
. 中有三个形参,这里需要传入三个实参,才可运算
C程序设计(第四版)(谭浩强)第2章课
后习题答案
算法——程序的灵魂
P017 2.1 计算机1-5相乘的积.
#include <stdio.h>
int main()
{
}
#include <stdio.h> //作出要求:换成1到11间奇数相乘.
int main()
{
}
int i,s=1; //在执行数值操作前一定要先有个初值. for(i=1;i<12;i++) //这里是到,但题目要求的是取单数.也可以是i=i+2 { } printf("The sum
is %d .\n",s); return 0; if(i%2!=0) //i对取模,值为非为奇数;为则为偶数. s=s*i; continue; //跳过这个for循环的这一次,执行下一次. else int i,s=1; //在执行数值操作前一定要先有个初值. for(i=1;i<6;i++) //这里是到6. { } printf("The sum is %d .\n",s); return 0; s=s*i; //相乘
P019 2.2 按要求输出80分以上的学生信息.
暂时没法做.
年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。所以,如果每年定义为365天的话,1年就会多出0.2423天,4年就会多出0.9692天,非常接近1天,这样闰
年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天。
规则
编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf
为:?1)如果年份能被4整除,则该年计为闰年;可是,假如不做调整的话,当400年的时候,累计才多出96.92天,接近于多出97天,闰年的设置却多出来100天,所以要在400年 } if((i%4==0 && i%100!=0)||i%400==0)
//闰年的经典判断条件. printf("%d is a leap year !\n",i);
printf("%d is not a leap year !\n",i); else
#include <stdio.h>
int main()
{
}
float sign=1 , sum=0 , deno , term ; //关于有小数的计算应该用float. for (deno=1;deno<=100;deno++) { } printf("The sum of deno(指定值)
is %f .\n",sum); return 0; //若是到100的话,结果为0.68172
,sing符号,deno为分母. sum=sum+term; //term=sign*(1/deno); //term临时值
第一次总全存储. sign=(-1)*sign; //换号.
P021 2.5 得到一个大于3的数,并判断是否为素数. #include <stdio.h>
int main()
{
}
int i , num ,n ; //像13,37,这样只能让和它本身除以外,没有其它除数的叫素数.
printf("Please input a number :\n"); //获取一个数值
scanf("%d",&num); for(i=2;i<num;i++) //在到此数值间进行
循环除,如果除得尽,就不满足素数要求. { } if(n==0) //单出口问题,虽然
n=0执行多次,但仍然是n=0,这样才会只输出一次. { } else { } return 0; printf("It is not a prime number !"); printf("It is do a prime
number !"); //如果是100-200可以加个”%d”,nmu进去. if(num%i==0) //除得尽,则不是. { } n=0; //按程序走的话,这里会执行多次,不能用printf语句,
会输出多次. n=1; break; //设置跳出,才不会执行多次.
2.11-2.16要求用N-S图表示上列算法.
… … … … 还要伪代码
P036 0.1 调换二个参数的值. #include <stdio.h>
int main()
{
char a=„a?,b=„b?,c; c=a; a=b; b=c;
}
printf("a now is %c , b now is %c !\n",a,b); return 0;
P036 0.2 输入10个数,并输出最大的那一个数. #include <stdio.h>
int main()
{
}
int i,a[10],s=0 ; printf("Please input 10 numbers :\n");
for(i=0;i<=9;i++) { } for(i=0;i<=9;i++) { } printf("%d is the biggest
number !\n",s); return 0; if (s<a[i]) s=a[i]; scanf("%d",&a[i]);
#include <stdio.h>
int main()
{
int i , j , a[4] , s=0 ; printf("Please input 5 numbers :\n"); //此处要回
车. for (i=0 ; i<=4 ; i++) { } for (i=0 ; i<=3 ; i++) //双重循环,先一个外循,
再轮所有小循,轮完后再下一个大循. { { if (a[i]>a[j]) //如果成立,则对
换,小于号表示降序排列,大于号表示升序排列. { s=a[i]; for (j=i+1 ; j<=4 ; j++) //第一个循环是至n-1,第二个循环是到n. scanf("%d",&a[i]); //这是取多个数的代码,可以用while控制取到\n符为止.
}
} } } a[i]=a[j]; a[j]=s; for (i=0 ; i<=4 ; i++) //重新定义循环输出数组中新
排列的数. printf("%d-",a[i]); return 0;
#include <stdio.h>
int main()
{
}
int i , sum=0 ; //这是一个简单的程序. for (i=0 ; i<101 ; i++) sum=sum+i; printf("The sum of one to one hundred is %d !\n",sum); return 0;
P036 0.5 判断一个数能否同时被3和5整除. #include <stdio.h>
int main()
{
}
int n ; printf("Please input a number :\n"); scanf("%d",&n); if(n%3==0&&n%5==0) //关键句,用
"并"的符号. printf ("Can be devide by 3 and 5 !\n"); printf
("Can not be devide by 3 and 5 !\n"); else return 0;
//********************第一种方法.
#include<stdio.h> //网络版本,采用调用函数和求根取素.
#include<math.h> //下面用到sqrt,所以需要包含数据函数.sqrt是求根,属
数学函数.
int main() //学会一个程序采用”主函数+被调用函数”的方式,会比较规范. {
}
int prime_number(double m) //m是形参.
{
int j,k; k=(int)sqrt(m); //求根,(int)是强制转换,求根里要是浮点型.
for(j=2;j<=k;j++) { if(m%j==0) return 0; //此值返回给主函数中的实
参. int i; for (i=100; i<=200; i++) //为了
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写规范,最好加上{},以示清范围. if(prime_number(i) == 1) //i是实参. printf("%d ",i); return 0;
}
} return 1;
//********************第二种方法.
#include <stdio.h>
#include <math.h>
int main()
{
}
int prime(int j) //j是形参,用于接收实参i给的值.
{
int m, n; m=(int)sqrt(j); for (n=2;n<=m;n++) { if(j%n==0) int i;
for(i=100;i<=200;i++) //指定至间. { } return 0; if(prime(i)==1) //这里i为实参,传入形参j中进行运算,然后再由形参j带出返回. printf ("%d is the
prime number !\n",i);
}
} return 0; //返回值,0为不是素数,1是素数. return 1;
//********************第二种方法.
请仿照2.5来写.
P036 0.7 最大公约数和最小公倍数.
#include <stdio.h> //最大公约数用累除法,除到无余数时的被除数是最大公约数. main ()
{
}
int gcd(int x, int y) //最大公约数Greatest Common Divisor
{
}
int lcm(int x, int y) //最小公倍数Lowest Common Multiple
{
int i, temp; if(x<y) //保证二者大的数在X上,小的数在Y上.小于号降序,大于号升序. { //以下为经典三行码,实现两个数的互换. } temp=x; x=y; y=temp;
int temp; while(x%y!=0) { } return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去. y=x%y; //x,y的余数作为下一轮中的Y,由x%y
来取得. x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使
用. int m, n, c, d; int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里
面的实参. int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的
实参. printf("Please input two number :\n"); scanf("%d %d",&m,&n); c=gcd(m,n); //c获取最大公约数
d=lcm(m,n); //d获取最小公倍数 printf("The GCD of %d and %d is : %d !\n", m, n, c); printf("The LCM of %d and %d is : %d !\n",
m, n, d); return 0;
} for(i=1; i<=y; i++) //设定一个区间,从1至小的数之间的循环. { }
if(!((x*i)%y)) //除得尽为零,非零为真,则成立并返回. { //如此往复,直到取模
无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. } return x*i;
最简单的C程序设计——顺序程序设计
P037 3.1 把华氏温度转化为摄氏表示法.
#include <stdio.h>
float F_to_C(float input_fah) //代表华转摄,input_fah是局部变量. {
}
float C_to_F(float input_cen)
{
}
int main()
{
int choice; float input_fah,input_cen,output_fah,output_cen; //局部变量的调用
及参数传递. printf("F_to_C press <1> and C_to_F press <2> !\n"); scanf("%d",&choice); if(choice==1) { }
if(choice==2) { printf("Please input fahrenheit :"); scanf("%f",&input_fah); //这个是主函数定义的变量,虽然和调
用函数同名. output_cen=F_to_C(input_fah); printf("The 华氏 is %d , 摄
氏 is %d .",(int)input_fah,(int)output_cen); float output_fah; output_fah=(9.0/5)*input_cen+32; //转换过程. return output_fah; float output_cen; //这里也是局部变量. output_cen=(5.0/9)*(input_fah-32); //函数的功能体. return
output_cen; //返回值,注意,返回值的数据类型应该和函数一致.
} } printf("Please input centigrade :"); scanf("%f",&input_cen); output_fah=C_to_F(input_cen); printf("The Centigrade is %d , and the Fahrenheit is %d .",(int)input_cen,(int)output_fah); return 0;
P038 3.2 计算存款利息(关于精度问题).
#include <stdio.h>
int main()
{
}
float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3; p1=p0*(1+r1);
p2=p0*(1+r2); p3=p0*(1+r3/2)*(1+r3/2);
printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3); return 0;
#include <stdio.h>
int main() //小写范围是97-122,大写范围是65-90,大写加上即得小写.26个字
母. {
} char c1, c2; c1=„A?; c2=c1+32; printf("%c %d",c2,c2); return 0;
P059 3.4 给出三角形边长,算出面积.
#include <stdio.h>
#include <math.h>
int main()
{
} double a=3.67, b=5.43, c=6.21, s, area; s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area is %f\n",area); //默认可以
组成三角形. return 0;
#include <stdio.h>
#include <math.h>
int main()
{
} double a,b,c,disc,x1,x2,p,q;
scanf("%lf %lf %lf",&a,&b,&c); disc=b*b-4*a*c;
p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf("x1=%7.2f\nx2=%7.2f",x1,x2); return 0;
#include <stdio.h>
#include <math.h>
int main()
{
} double a=1.0; //1是整型,1.0是浮点型,默认是double.可以是float. printf("%.9f\n",a/3); return 0;
#include <stdio.h>
#include <math.h>
int main()
{
} float a; //输出的结果是.333252,float精度6位,所以第七位后不可信. a=10000/3.0; printf("%f\n",a); return 0;
#include <stdio.h>
#include <math.h>
int main()
{
} char a=„B?,b=„O?,c=„Y?; putchar(a); putchar(b); putchar(c); putchar(„\n?); putchar(101); //101是A的ASCII代码的缩写,因为此函数只能输出字符. putchar(66); return 0;
#include <stdio.h>
#include <math.h>
int main()
{
char a,b,c; a=getchar(); b=getchar();
} c=getchar(); putchar(a); putchar(b); putchar(c); //这也是基本回显的C程序代码. putchar(„\n?); return 0;
P081 3.10 getchar得到大写,putchar输出小写. #include <stdio.h>
#include <math.h>
int main()
{
} char a,b; a=getchar(); b=a+32; putchar(b); putchar(„\n?); return 0;
P082 0.1 国民生产总值10年后的增长倍数. #include <stdio.h>
#include <math.h>
int main()
{
} double p,r=0.09,n=10; p=pow((1+r),n); //这是数学函数, pow(x,y)计算x的y
次方. printf("P is %lf when 10 years later .\n",p); return 0; //结果是
0.36倍.
#include <stdio.h>
#include <math.h>
int main()
{
} double p,r,n; //年份和当年利率均有给出. p=1000*(1+5*0.0585); printf("5 years is %lf !\n",p); //1292.5,这是全五年期.lf输出的是
double型. p=(1000*(1+2*0.0468)); p=(p*(1+3*0.0540)); printf("5 years
is %lf !\n",p); //1270.76,这是先二年,再三年的. p=(1000*(1+3*0.0540)); p=(p*(1+2*0.0468)); printf("5 years is %lf !\n",p); //1270.76,这是先
三年,再二年的.证明,是一样的. p=1000*pow((1+0.0414),5); printf("5 years
is %lf !\n",p); //1224.86,这难道说是,相对的存死期越久越值
钱.p=1000*pow((1+0.072/4),4*5); printf("5 years is %lf !\n",p);
//1428.74. return 0;
#include <stdio.h>
#include <math.h>
int main()
{
}
double m,r=0.01,d=300000,p=6000; m=(log10(p/(p-d*r)))/(log10(1+r));
printf("%.1lf",m); //按要求只留一个小数,所以要写%.1lf. return 0;
#include <stdio.h>
char printcode(char f)
{
if(((int)f>86&&(int)f<91)||((int)f>118&&(int)f<123
)) {
}
} return(f-26+4); //因为putchar会自动返回,所以改成return,因为这是在函数
中,调用需要返回值. else { } return(f+4);
int main()
{
char a,b,c,d,e; printf("Please input :\n"); a=getchar(); b=getchar();
c=getchar(); d=getchar(); e=getchar(); //临界问题. printf("%c%c%c%c%c",printcode(a),printcode(b),printcode(c),printcode(
d),printcputchar(putcharcode(a)); putchar(putcharcode(b)); putchar(putcharcode(c));
putchar(putcharcode(d)); putchar(putcharcode(e)); return 0; //注意理解自定义函
数的定义,使用,及形参实参的流向. //p84的是计算问题,自己看着办,最后要求小
数点后两位,用的是%.2lf 来实现,因为没有//p84的是定义问题,第一问,两者都行,
但是定义字母时,scanf要写%c来获取,而定义数值// 第二
问,putchar貌似只能输出字符,所以用printf.putchar本身就是ode(e)); 要求实
部,所以m.n格式中m不写. 时则要用%d来获取. 字符输出函数啦,字符,有木有!!!字符啊!!尽管它的参数可以是putchar(„\101?),效果是输出字符A啊.
} // 第三问,出现"任何"及"无条件",那
么答案明显是"否".可以转换,但要在某此条件下,例如输出和读入
时,%c是字母,而%d是数值,看着办.
选择结构程序设计
P086 4.1 一无二次方程求根的二分支.
#include <stdio.h>
#include <math.h>
int main()
{
} double a,b,c,disc,x1,x2,p,q;
scanf("%lf %lf %lf",&a,&b,&c); disc=b*b-4*a*c;
if(disc<0) //这是选择结构和其判断条件的示例. { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf("x1=%7.2f\nx2=%7.2f",x1,x2); } return 0; printf("This
equation hasn?t real roots\n"); else
P087 4.2 二个数按大小输出. #include <stdio.h>
int main() //此程序代表按大小顺序输出. {
} float a,b,t; scanf("%f %f",&a,&b); //出错时,注意检查这
里是否按格式输入了.比如有个逗号. if(a>b) { }
printf("%5.2f,%5.2f\n",a,b); return 0; t=a; a=b; b=t;
#include <stdio.h>
int main() //此程序代表按大小顺序输出.
{
} float a,b,c,t; scanf("%f %f %f",&a,&b,&c);
. { } if(a>c) //此处执行后,a为小者. if(a>b) //此处执行后,a为小者
{ } if(b>c) //上面已经搞定a是最小者,现在对比得出次小者,并且已经归
到变量中. { } printf("%5.2f,%5.2f%5.2f\n",a,b,c); return 0; t=b; b=c;
c=t; t=a; a=c; c=t; t=a; a=b; b=t;
P099 4.4 判断输入字符,并最终按小写输出. #include <stdio.h>
int main()
{
} char ch; scanf("%c",&ch);
ch=(ch>=„A?&&ch<=„Z?)?(ch+32):ch; //条件运算符,真取前,假取
后. printf("%c\n",ch); return 0;
P100 4.5 按要求输出相应的Y值.
#include <stdio.h>
int main()
{
} int x,y; scanf("%d",&x); if(x>=0) { } else //这个是x<0的范围. { } printf("x=%d,y=%d",x,y); return 0; y=-1; if(x>0) //这个范围要基于x>=0来判断. { } else { } y=0; y=1;
#include <stdio.h>
int main()
{
char grade; scanf("%c",&grade); printf("Your score:");
switch(grade) { case?a?:printf("85-100\n");break; //当多分支结构过于
多时,可以用switch来解决. case?b?:printf("70-84\n");break;
case?c?:printf("60-69\n");break;
case?d?:printf("<60\n");break; default:printf("Enter data error!\n"); } return 0;
}
P104 4.7 按输入执行操作,并且不分大小写. #include <stdio.h>
void action1(int x,int y)
{
}
void action2(int x,int y)
{
}
int main()
{
} char ch; int a=15,b=23; ch=getchar(); switch(ch) { case?a?: case?A?:action1(a,b);break; //a,A共用一个执行语句. case?b?:
case?B?:action2(a,b);break; default:putchar(„\a?); //?\a?可以控制电脑发出蜂鸣声. }
return 0; printf("x*y=%d\n",x*y); printf("x+y=%d\n",x+y);
#include <stdio.h>
int main()
{
int year,leap; printf("Please input the year:\n"); scanf("%d",&year);
} if(year%4==0) //400年里,在100个可除尽4的年里计算,以下是在全范
围 } else { } if(leap) { } else { } printf("a leap
year !"); //不管上面如何判断,最后还是会输出这一句. return 0;
printf("%d is not ",year); printf("%d is ",year); leap=0;
if(year%100==0) //既是100个 } else //这里的范围是
(year%4==0)&&(year%100!=0) { } leap=1; //在合法的100 //相当于
且了两次,只余下唯一一个. { } else //400年里只有1个除得尽,其它都不是.
{ } leap=0; leap=1;
P108 4.9 一元二次等式的全计算过程. #include <stdio.h>
#include <math.h>
int main()
{
double a,b,c,disc,x1,x2,realpart,imagpart;
scanf("%lf %lf %lf",&a,&b,&c);
} printf("The equation "); if(fabs(a)<=1e-6) //fabs是绝对值, le-6,
即是的负六次方,接近或是等于零. { } else { } return
0; disc=b*b-4*a*c; if(fabs(disc)<=1e-6) //指数形式,数字1. { } else
{ } if(disc>1e-6) { } else { } realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf("has complex roots: \n"); printf("%lf + %lfi\n",realpart,imagpart); printf("%lf + %lfi\n",realpart,imagpart); x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("has distinct real roots : %lf and %lf \n",x1,x2); printf("has two equal roots : %lf\n",-b/(2*a)); printf("is not a quadratic !\n"); printf("x1=x2=%lf",-c/b);
P109 4.10 关于多个区间的计算,运费问题为例. #include <stdio.h>
int main()
{
double p,w,s,d,f; printf("p,w,s\n");
scanf("%lf %lf %lf",&p,&w,&s);
}
if(s<250) { } else if(s<500) { } else if(s<1000) { } else if(s<2000) { } else if(s<3000) { } else { } return 0; d=0.15; f=p*w*s*(1-d); printf("%lf",f); d=0.1; f=p*w*s*(1-d); printf("%lf",f); d=0.08; f=p*w*s*(1-d); printf("%lf",f); d=0.05; f=p*w*s*(1-d); printf("%lf",f); d=0.02; f=p*w*s*(1-d); printf("%lf",f); d=0.0; f=p*w*s*(1-d); printf("%lf",f);
P0112 0.4 键盘输入三个数,输出最大者. #include <stdio.h>
int mina,mida,maxa;
int max(int a,int b,int c)
{
}
int main()
{
int a,b,c; printf("Please input 3 numbers :"); scanf("%d %d %d",&a,&b,&c); printf("The max
is %d !\n",max(a,b,c)); return 0; int m; if(a>b) //凡是比较中,大于号代表
升序排列. { } if(a>c) { } if(b>c) { } return (c); //此排序
后,a,b,c由小到大.所以c是返回中最大的. m=a; a=c; c=m; m=a; a=c; c=m; m=a; a=b; b=m;
}
,有判定条件. #include <stdio.h> P0112 0.5 一个小于1000的数
#include <math.h>
int main()
{
double a,b; printf("Please input a number :");
} scanf("%lf",&a); if(a<1000) { } else { } printf("%.0lf",b); //按要求,只取整数. return 0; printf("\a"); //控制蜂鸣声 printf("Please input a number again :"); scanf("%lf",&a);11 b=sqrt(a); b=sqrt(a);
P0112 0.9 一个不多于5位的数,按条件输出. #include <stdio.h>
#include <math.h>
int main()
{
int i,a,b[4],count=0; printf("Please input a number (five-digit number) :"); //意思是五位数以scanf("%d",&a); for(i=0;i<=4;i++) { } printf("%d位数.\n",count); printf("分别输出每一位数字,如下:"); for(i=4;i>=0;i--) { } printf("\n"); printf("倒序输出这一个数字,如下:");
printf("%d ",b[i]); b[i]=a%10; //是%10,不是/10000,结果就是b[0]
至b[4]中存着个,十,百,千,万位. a=a/10; // /10后得到的结果去掉了个数.
if(b[i]!=0) { } count=count+1;
for(i=0;i<=4;i++) { } printf("\n"); return 0; printf("%d",b[i]);
}
#include <stdio.h>
int main()
{
double a,b; printf("Please input profit amount :"); scanf("%lf",&a); if(a<=10) //这个是整个if 的基础. { } else
if(a<=20) //以上面为基础,这已经代表了10-20间了!!! { } else if(a<=40)
//同理,这是20-40间. { } else if(a<=60) { } else if(a<=100) { } else //这里是大于100的. { } printf("The reward is %lf !\n",b); return 0; b=1+0.75+0.1+0.06+(a-100)*0.01; b=1+0.75+0.1+0.06+(a-60)*0.15; b=1+0.75+0.1+(a-40)*0.03; b=1+0.75+(a-20)*0.05; b=1+(a-10)*0.075; b=a*0.1;
}
P0112 0.10 按要求提成奖金(switch写法).
#include <stdio.h>
double GetProfit(double c)
{
}
int main()
{
double a; char c; printf("Your choice :\nA : 0-10 ;\nB : 10-20 ;\nC : 20-40 ;\nD : 40-60 ;\nE : scanf("%c",&c); //不同档时,应照档的
规定数值进行输入,否则结果不会是正确的. switch(c) //前三后三用于比较调用
函数. { //GetProfit(c)引入的实参没有意义,返回值和引入的实参没关系,反而由键
盘获得. case?A?:{ printf("The reward
is %lf !\n",GetProfit(c)*0.1);};break; case?B?:{ printf("The reward
is %lf !\n",1+(GetProfit(c)-10)*0.075);}break; case?C?:{ printf("The reward
is %lf !\n",1+0.75+(GetProfit(c)-20)*0.05);}break; case?D?:{printf("Please input profit
amount :");scanf("%lf",&a);printf("The
printf("Please input profit amount :"); scanf("%lf",&c); return (c); //返回本身了,如果有进一步的计算结果,将值赋给其它变量,也可以
返回. 60-100 ;\nF : 100-1000 ;\n"); //0-10 0.100 //10-20 0.075 //20-40 0.050 reward is %lf !\n",1+0.75+0.1+(a-40)*0.03);}break;
//40-60 0.030
case?E?:{printf("Please input profit
amount :");scanf("%lf",&a);printf("The
reward is %lf !\n",1+0.75+0.1+0.6+(a-60)*0.15);}break;
//60-100 0.015
case?F?:{printf("Please input profit
amount :");scanf("%lf",&a);printf("The
reward is %lf !\n",1+0.75+0.1+0.6+0.6+(a-100)*0.01);}break;
//100-1000 0.010
{}包括 default:printf("Error data !");break; //可以有一个执行体,用
起来. } return 0;
}
#include <stdio.h>
int main()
{
} int a[10],i,j,m,n; //变量可以在写代码过程中再回来临时添加. printf("
请输入数值的个数: (十个以 //到这里需要变量来承载数值的个数,设m,回头去定
义变量那写上m. printf("请分别输入相对应个数的数值:");
for(i=0;i<m;i++) { } for(i=0;i<m;i++) { } for(i=0;i<m;i++) { }
return 0; printf("%d",a[i]); for(j=i+1;j<m;j++) { } if(a[i]>a[j]) //这是选择排序法.升序. { } n=a[i]; //这里需要一个用
于临时变量的n,所以回头去写上. a[i]=a[j]; a[j]=n;
scanf("%d",&a[i]);
C程序设计(第四版)(谭浩强)第五章课后习
题答案
循环结构程序设计
#include <stdio.h>
int main()
{
}
int i=1,sum=0; while(i<=100) //对于需要运算的值,要么在运算前可以
赋值,要么一开始要指定. { } printf("The sum is %d .\n",sum); return 0; sum=sum+i; i++;
P117 5.2 用do-while来做1至100的合. #include <stdio.h>
int main()
{
} int i=1,sum=0; do // do-while可以做的事,用while都可以做到.
{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.
sum=sum+i; i++; }while(i<=100); printf("The sum is %d .\n",sum);
return 0;
#include <stdio.h>
int main()
{
int i,sum=0; printf("Please input a number :"); scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.
while(i<=10) {
}
} sum=sum+i; i++; printf("The sum of 1-10 is %d .\n",sum); return 0;
#include <stdio.h>
int main()
{
} int i,sum=0; printf("Please input a number :"); scanf("%d",&i); //输入10以 sum=sum+i;
i++; }while(i<=10); //此重点在于理解二者的差别. printf("The sum of 1-10 is %d .\n",sum); return 0;
#include <stdio.h>
int main()
{
int i,b=0,a,c; for(i=0;i<=1000;i++) { } c=b/i; printf("conut is %d ,
aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误. return 0;
printf("Please input amount :"); //循环体} break; //break是用于跳
出循环,对if无效,对while for switch 这一类.
}
P127 5.5 continue的例子. #include <stdio.h>
int main()
{
} int i; for(i=1;i<20;i++) { } printf("\n"); return 0;
if(i%3!=0) { } printf("%d ",i); continue; //跳过本次I,执行下
一个i.
P128 5.6 形成一个4*5的矩阵. #include <stdio.h>
int main()
{
int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a” . for(i=1;i<=4;i++) { for(j=1;j<=5;j++,a++) // a用来控制换行. { } if(a%5==0) { } printf("%d\t",i*j);
printf("\n"); } printf("\n"); return 0;
}
P131 5.7 用一个交错的式子求哌的近似值.
#include <stdio.h>
#include <math.h>
int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).
{
}
//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.
//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.
//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.
//
//int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1
//{
// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.
// int d,e,f;
// m=1;
// a=1.0/3;
// b=1/3;
// c=m/3;
// d=1.0;
// e=1/4; warning C4305: “=”: 从“double”到“float”截断 . float s=1,n=1,m,sum=0,t;
for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去. { //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环. } printf("四分之一哌的值是%f.\n",sum); printf("
一个完整哌的值是%f.\n",sum*4); return 0; t=(s)*(n/m); //这是第一项,s是符号, if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去. { }
sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了. s=s*(-1);
//变号一次. break;
// f=1.0/4;
// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩
%d来输展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用出.
// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!
// return 0;
//}
#include <stdio.h>
int main() //这个就是著名的Fibonacci(费波那契数列问题)
{
int f1=1,f2=1,f3,i; printf("%12d\n%12d\n",f1,f2); for(i=1;i<=38;i++)
//注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!
} { } return 0; f3=f1+f2; printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题., f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是. f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.
#include <stdio.h>
#include <math.h>
int main()
{
double num; int i; printf("Please input a number :");
scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.
} for(i=2;i<=sqrt(num);i++) //这边是<=号没错. { if((int)num%i==0)
//如果在这期间有任何一个可以为零的话,则不是素数. { break; //当然跳出. } } //执行到这里的时候,i=5,已经变成了!! if(i<=sqrt(num)) { }
else //如上所述,i=5,超出了求根的值,所以是素数.
{ printf("Yes %d",(int)num); } return 0; printf("Not %d",(int)num);
#include <stdio.h> //不解释,HOHO>>>>... #include <math.h>
int main()
{
double j; int i,k=0; for(j=100;j<=200;j++) { for(i=2;i<=sqrt(j);i++) { } k=k+1; //这里是布局
的开头.学习一下,有助逻辑. if(i<=sqrt(j)) { printf("Not %d
",(int)j); if(k%5==0) //5个换一次行. { printf("\n"); if((int)j%i==0) { break; }
}
} } } else { } printf("Yes %d ",(int)j); if(k%5==0) { }
printf("\n"); return 0;
P139 5.11 密码转换. #include <stdio.h>
int main()
{
} char c; c=getchar(); while(c!=„\n?) //这也可以用数组来实现.
{ } printf("\n"); //这是布局问题. return 0;
if((c>=„a?&&c<=„z?)||(c>=„A?&&c<=„Z?))
{ }
if((c>=„w?&&c<=„z?)||(c>=„W?&&c<=„Z?)) { } else
{ } printf("%c",c); c=getchar(); //套在循环里,依次得到字母,而
while中判断回车为结束. c=c+4; c=c-22;
#include <stdio.h> //最大公约数用累除法,除到无余数时的被除数是最
大公约数. main ()
{
}
int gcd(int x, int y) //最大公约数Greatest Common Divisor
{
}
int lcm(int x, int y) //最小公倍数Lowest Common Multiple
{
} int i, temp; if(x<y) //此段代码结果是保证二者大的数在X上,小的数在Y
上.即小于号降序. { //以下为经典三行码,实现两个数的互换. } for(i=1;
i<=y; i++) //设定一个区间,从1至大的数之间的循环. { } if(!((x*i)%y))
//此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮. { //如此
往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. }
return x*i; temp=x; x=y; y=temp; int temp; while(x%y!=0) { } return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. temp=y;
//y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去. y=x%y; //x,y的
余数作为下一轮中的Y,由x%y来取得. x=temp; //刚才temp中存储了y的值,
现在拿出来作为下一轮中的X使用. int m, n, c, d; int gcd(); //这是最大公约数
的缩写,此处调用函数,可以不写里面的实参. int lcm(); //这是最小公倍数的缩
写,此处调用函数,可以不写里面的实参. printf("Please input two
number :\n"); scanf("%d %d",&m,&n); c=gcd(m,n); //c获取最大公约数 d=lcm(m,n); //d获取最小公倍数 printf("The GCD
of %d and %d is : %d !\n", m, n, c); printf("The LCM of %d and %d is : %d !\n", m, n, d); return 0;
#include <stdio.h>
int main()
{
char ch; int a=0,b=0,c=0,d=0,e=0; printf("Please input the string\n"); while((ch=getchar())!=„\n?) //直到回车. { } printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e);
if(ch<=„z?&&ch>=„a?) { } else if(ch==„ „) { } else if(ch<58&&ch>47) { } else if(ch<=„Z?&&ch>=„A?) { } else { } e++; b++; d++; c++; a++; }
P140 0.5 2+22+222+2222系列的和. #include <stdio.h> //不理解时
可以百度或是谷歌更多的信息.
int main() //想办法既快速做完,又要消化理解!!!
{
} int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松.
scanf("%d %d",&a,&n); //a是数字,n是要乘的个数.
temp=a; //先把第一阶的值存起来. for(i=0;i<n;i++) { }
printf("= %d .",sum); return 0; sum=sum+a; printf("%d + ",a); //事关布局. a=a*10+temp; //重点是每次乘,然后加上上一个数.
P140 0.6 1!+2!+3!+4!.....的值.
#include <stdio.h>
int main() //1!+2!+3!+4!.....
{
} int i,j,k,sum=0,m=1; scanf("%d",&k); //比如设定为,值为. for(i=1;i<=k;i++) //第一层循环,指定到. { } printf("%d",sum); //完全不理解时,搜索并参考. return 0; //尝试自己做,第一次做出来就是自己的东西了. for(j=1;j<=i;j++) //第二层循环,指定至当前数. { m=m*j; } //到此是阶乘的结构. sum=sum+m; m=1;
#include <stdio.h>
int main()
{
} int a,b; double c,asum=0,bsum=0,csum=0; for(a=1;a<=100;a++) //三个块分别注释验证结果. { } for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言. { } for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中. { } printf("%lf",asum+bsum+csum); return 0; csum=csum+1/c;
bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c. asum=asum+a;
P
P
#include <stdio.h>
#include <math.h>
int main()
{
} int j,k,s[6],x=100,y,sum=0; for(j=153;j<=154;j++) { } return 0;
for(k=2;k>=0;k--) { } printf("%d\n",sum);
s[k]=j%(int)pow(10,k+1)/(int)pow(10,k); y=pow(s[k],3); sum+=y;
printf("%d-%d--%d\t",k,s[k],j);
P140 0.8 水仙花数. //#include <stdio.h> //一步步的发现问题. //
//int main() //在%和/号之间,以前pow.以后再做.
//{
// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了.
// for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟. // {
//
//
//
//
//
//
//
//
//
//
//
//
// }
// return 0;
//} //为什么还是无法实现?!
#include <stdio.h>
#include <math.h>
int main()
{
} int a,b,c,i,sum=0; //这里只计算三位数的. for(i=100;i<1000;i++)
{ } return 0; a=i/100; b=i%100/10; c=i%10; sum+=a*a*a+b*b*b+c*c*c;
if(sum==i) { } sum=0; printf("%d 是水仙花数.\n",i); for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. { } for(k=0;k<=i;k++) { } if(sum==j) { } sum=0; printf("%d
是水仙花数!\n",j); sum+=pow((j%pow(10,i+1)/pow(10,i)),3);
P141 0.9 完数.
#include <stdio.h>
int main()
{
} int i,j,r; for(i=1;i<=1000;i++) //零是个临界值,不能包括它. { } return 0; r=0; //每次清零重来.类似水仙中的sum. for(j=1;j<i;j++) { } if(r==i) //若相等. { } printf("%d 是完数.\n",i); if(i%j==0) //除得尽即是因子. { } r=r+j; //然后累加进去.
P141 0.10 2/1+3/2+5/3+8/5+13/8… #include <stdio.h>
int main() //10.007051
{
} double i,a=2,b=1,c,s=0; //a是分子,b是分母. for(i=0;i<6;i++) //二十可以用户指定. { } printf("%lf\n",s); return 0; s+=a/b; //中间储值变量. c=a+b; b=a; a=c;
#include <stdio.h>
int main() //从一百开始,减一半再自加两次,下降一次,反弹一次. {
} double sum=100,high=100,up,donw,i; for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百. { } printf("%lf %lf\n",donw,sum); return 0;
up=high/2; donw=up; high=donw; //自咬尾巴问题. sum+=donw*2;
#include <stdio.h>
int main() //从一百开始,减一半再自加两次,下降一次,反弹一次. {
} int i,sum=1; for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配. { } //printf("%d\n",sum); return 0; printf("倒数第%d天还剩有%d个桃子.\n",i,sum); sum=(sum+1)*2;
P141 0.16 输出星号棱形图案. #include <stdio.h>
#include <conio.h>
main() //只关注左半部分.右半部分无视空格.
{
int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶.
for(i=1;i<=m;i++) //上半部分.其实也是正三角.
{
for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格.
printf(" ");
for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五...
printf("*");
printf("\n");
}
for(i=m-1;i>0;i--) //下半部分.其实也是倒三角.
{ //减一是因为行数问题.这是中心行以下的.
for(j=m-1;j>=i;j--)
printf(" ");
for(k=1;k<2*i;k++)
printf("*");
printf("\n");
}
getch(); //用户反应后结束.但,没必要.
}
第六章
第六章 循环控制
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 +5 +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);
}
,10)之间的根 6.13用二分法求方程在(-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+!=’\0’;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("\40");}
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+!=’\0’;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+!=’\0’;i++)
str3[i]=str1[i];
for(j=0;str2*j+!=’\0’;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+!=’\0’) i++;
if(s1*i+==’\0’&&s2*i+==’0’) resu=0;
else resu=s1[i]-s2[i];
printf("\n result:%d\n",resu);
}
7.15 编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不用strcpy函数。拷贝时,’\0’也要拷贝过去,’\0’后面的字符不拷贝。
解:
#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];
%s\n",s1); printf("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写一个函数,使给定的一个二维数组(,×,)转置,即行列互换。 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+!=’\0’;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+!=’\0’;i++)
{if(str0[i]>=65&&str0[i]<=90||str0[i]>=97&&str0[i]&l
t;=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];
\0’;i++) for(;str1*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 +/n-(SXi/n) ,为一学生的平均分
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+=’\0’;
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+=’\0’;
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’变成’,’其它字符不变)。用命令来控制是否要译成密码。例如:
#define CHANGE 1
则输出密码。若:
#define CHANGE 0
则不译为密码,按原码输出。
#define CHANGE 1
main()
{char str[80],c;int i=0;
gets(str);
while(str*i+!=’\0’)
{
#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!=’\0’)
{
#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定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
解:Struct
{int year;
int month;
int day;
}date;
main()
{int days;
printf(“Input year,month,day:”);
scanf(“%d,%D,%d”,&date.year,&date.month,&date.day);
switch(date.month)
{case 1: days=date.day; break;
case 2: days=date.day+31; break;
case 3: days=date.day+59; break;
case 4: days=date.day+90; break;
case 5: days=date.day+120; break;
case 6: days=date.day+31; break;
case 7: days=date.day+181; break;
case 8: days=date.day+212; break;
case 9: days=date.day+243; break;
case 10: days=date.day+273; break;
case 11: days=date.day+304; break;
case 12: days=date.day+334; break;
}
if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&a
mp;date.month>=3)days+=1; printf(“\n%d/%d is the %dth day in%d.”,date.month,data.day,days,date,year);
}
11.2写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日数传回主函数输出。
解:struct y_m_d
{int year:
int month;
int day;
}date;
intdays(struct y_m_d date1)
{int sum;
switch(data.month)
{case 1:sum=date1.day; break;
case 2:sum=date1.day+31; break;
case 3:sum=date1.day+59; break;
case 4:sum=date1.day+90; break;
case 5:sum=date1.day+120; break;
case 6:sum=date1.day+151; break;
case 7:sum=date1.day+181; break;
case 8:sum=date1.day+212; break;
case 9:sum=date1.day+243; break
case 10:sum=date1.day+243; break
case 11:sum=date1.day+243; break
case 12:sum=date1.day+243; break
}
};
11.3编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。 解:
#define N 5
struct student
{char num[6];
char name[8];
int score[4];
}stu[N];
main()
{int I,j ;
for(I=0;I<N;I++)
,printf(“\Input score 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(“%d”,&stu*i+.score*j+);
}
printf(“\n”);
}
print(stu);
}
print(struct student stu[6])
{int I,j;
printf(“%5s%10s”,stu*i+.num,stu*i+.name);
for(j=0;j<3;j++)
printf(“%9d”,stu*i+.score*j+);
print(“\n”);
}
11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。
解:
#define N 5
struct student
{char num[6];
char name[8];
int score[4]
}stu[N];
input(struct student stu[])
{int I,j;
for(I=0;I<N;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++);
scanf(“%d”, &stu*i+.score*j+);-
}
printf(“\n”);
}
}
11.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘
输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的
数据(包括学号、姓名、3门课成绩)
解:#define N 10
struct student
{char num[6]
char name[8]
int score[4]
float avr;
}stu[N];
main()
{int I,j,max,maxi,sum;
float average;
for(I=0;I<N;I++)
,printf(“\nInput 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(“%d”, &stu*i+.score*j]);
}
}
average=0;
max=0;
maxi=0;
for(i=0;i<3;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 score1 score2 score3 average\n”);
for(I=0;I<N;I++)
,printf(“%5s%10s”,stu*i+.num, stu*i+.name);
for(j=0;j<3;j++)
printf(“%9d”,stu*i+.score*j+);
printf(“%8.2f\n”,stu*i+.avr);
}
printf(“average=%6.2f\n”,average);
printf(“The highest score is:%s,score total:%d.”stu*maxi+.name,max);
}
11.6 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的Null o
#define NEWSIZE 1000
char newbuf[NEWSIZE];
char *newp=newbuf;
free(char *p)
{if((p>=newbuf)&&(p<newbuf+NEWSIZE))
newp=p;
}
11.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。
解:
#include<stdio.h>
#define NULL 0
#define LENsizeof(struct student)
strut student
{long num;
int scor;
struct student *next
};
struct student listA,listB;
int n,sum=0;
main()
{struct student *creat(void);
struct student *insert(struct student *,struct student *); void print(struct student
*);
stuct student *ahead , *bhead,*abh;
printf(“\ninput list a:\n”);
ahead=creat();
sum=sum+|n;
abh=insert(ahead,bhead);
print(abh);
}
struct student *creat(void)
{struct student *p1,*p2,*head;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf(“input number&scores of student:\n”);
printf(“if number Is 0,stop inputing.\n”);
scanf(“%ld,%d”,&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else p2->next =p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf(“%ld,,%d”,&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
struct student *insert(struct student *ah,struct student *bh) {struct student
*pa1 , *pa2,*pb1,*pb2;
pa2=pa1=ah;
pb2=pb1=bh;
do
{while((pb1->num>pa1->num)&&(pa1->next!=NULL))
{pa2=pa1;
pa1=pa1->next;
}
if(pb->num<=pa1->num)
{if(ah=pa1)
ah=pb1;
else pa2->next=pb1;
pb1=pb1->next;
pb2->next=pa1;
pa2=pb2;
pb2=pb1;
}
}
while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
if((pb1->num>pa1->num)&&(pa1->next==NULl))
ap1->next=pb1;
return(ah);
}
void print(struct student *head)
{struct student *p;
printf(“%ld%d\n”,p->num,p->score);
p=p->next;
while(p!=NULL);
}
11.9 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出
圈子。找出最后留在圈子中的人原来的序号。
解:
#define N 13
struct person
{int number;
int nextop;
}link[N+1];
main()
{int I,count,h;
for(I=1;I<=N;I++)
{if(I==N)
link[i].nextp=1;
else
link[i].nextp=I+1;
link[i].number=I;
}
printf(“\n”);
count=0;
h=N;
printf(“sequence that person2 leave the circle:\n”);
while(count<N-1)
{I=0;
while(I!=3)
{h=link[h].nextp;
if(link[h].number)
I++;
}
printf(“%4d”,link*h+.number);
link[h].number=0;
count++;
}
printf(“\nThe last one is”);
for(I=1;ii<=N;I++)
if(link[i].number)
printf(“%3d”,lin*i+.number);
}
11.10有两个链表a和b,设结点中包含学号、姓名。从1链表中删去与b链表
中有相同学号的那些结点。
解:
#define LA 4
#define LB 5
#define NULL 0
struct student
{char nump[6];
char name[8];
struct student *next;
}A[LA],b[LB];
main()
,struct student
a*LA+=,,“101”,”Wang”-,,“102”,”LI”-,,“105”,”zhang”-,,“106”,”Wei”--;
struct
studentb*LB+=,,“103”,”Zhang”-,,“104”,”Ma”-,,“105”,”Chen”-,,“107”,”Guo”-,
,“108”,”Lui”--;
int I,j;
struct student *p, *p1,*p2,*pt,*head1,*head2;
head1=a;
head2=b;
printf(“list a :\n”);
for(p1=head1,i=1;p1<a=LA;i++)
{p=p1;
p1->next=a+I;
printf(“%8s%8s\n”,p1->num,p1->name);
p1=p1->next;
}
p->next=NULL;
printf(“\n list b:\n”);
for(p2=head2,I=1;p2<b+LB;I++)
{p=p2;
p2->next=b+I;
printf(“%8s%8s\n”,p2->num,p2->name);
p2=pa->next;
}
p->next=NULL;
printf(“\n”);
p1=head1;
while(p1!=NULL)
{p2=head2;
while(p2!=NULL&&strcmp(p1->num,p2->num)!=0)
p2=p2->next;
if(strcmp(p1->num,p2->num==0))
if(p1==head1)
head1=p1->next;
else
p->next=p1->next;
p=p1;
p1=p1->next;
}
p1=hedad1;
printf,“\n result:\n”-;
while(p1!=NULL)
,printf(“%7s %7s\n”,p1->num,p1->name);
p1=p1->next;
}
}
11.11建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年
龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
解:#define NULL 0
#define LEN sizeof(struct student)
struct student
{char num[6];
char name[8];
char sex[2];
int age;
stuct student *next;
}stu[10];
main()
{struct student *p,*pt,*head;
int I,length,iage,flag=1;
int find=0;
while(flag==1)
,printf(“input length of list(<10):”);
scanf(“%d”,&length);
if(length<10)
flag=0;
}
for(I=0;I<lenth;I++)
{p=(struct student *)malloc(LEN);
if(I==0)
head=pt=p;
else
pt->next=p;
pt=p;
ptintf(“NO:”);
scanf(“%s”,p->num);
prntf(“name:”);
scanf(“%s”,p->name);
printf(“sex:”);
scanf(“%s”,p->sex);
printf(“age:”);
scanf(“%s”,p->age);
}
p->next=NULL;
p=head;
printf(“\n NO. name sex age\n”);
while(p!=NULL)
,printf(“%4s%8s%6s%6d\n”,p->num, p->name, p->sex, p->age);
p=p->next;
}
printf(“Input age:”);
scanf(“%d”,&iage);
pt=head;
p=pt;
if(pt->age==iage)
{p=pt->next;
head=pt=p;
find=1;
}
else
pt=pt->next;
while(pt!=NULL)
{if(pt->age==iage)
{p->next=pt->next;
find=1;
}
else p=pt;
pt=pt->next;
}
if(!find)
printf(“Not found%d.”,iage);
p=head;
printf(“\n NO.name sex age\n”);
while(p!=NULL)
{
printf(“%4s%8s”,p->num,p->name);
printf(“%6s%6d”,p->sex,p->age);
p=p->next;
}
}
11.12将一个链表按逆序排列,即将链头当链尾,链尾当链头。 解:
# define NULL 0
struct stu
{int num;
struct stu *next;
}
main()
{int len=1l
struct stu *p1,*p2,*head,*new,*newhead;
p1=p2=head=(struct stu * )malloc(sizeof(strct stu));
printf(“input number(0:list end):”);
scanf(“%d”,&p1->num);
while(p1->num!=o)
{p1=(struct stu*)malloc(sizeof(struct stu));
printf(“input number(n:listend):”);
scanf(“%d”,&p1->num);
if(p1->num==0)
p2->next=null;
else
{p2=>next=p1;
p2=p1;
len++;
}
}
p1=head;
pritnf(“\n the original list:\n”);
do
,printf(“%4d”,p1->num);
if(p1->next!=NULL)
p1=p1->next;
}
while(p1->next!=NULL)
{p2=p1;
p1=p1->next;
}
if(I==0)
newhead=new=p1; else
new=nes->next=p1; p2->next=NULL;
}
printf(\n\n The new listL\n); p1=newhead;
for(I=0l;I<len;I++) ,pritf(“4d,p1->num”); p1=p1->next,
}
printf(“\n”);