C程序设计(第四版)(谭浩强)完整版 课后习题答案
- 格式:doc
- 大小:444.00 KB
- 文档页数:83
C程序设计(第四版)(谭浩强)第一章课后习题答案
P006 1.1 向屏幕输出文字.
#include<stdio.h>//预编译. 代码均调试成功,若有失误大多不是代码问题.自已找找.
int main()
{
printf("Welcome to \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;
else
z=y;
return(z); //z作为整个程序的出口值,赋给主函数中的c.
}
P015 0.6 三个数的大小.(数字0表示课后练习题)
#include<stdio.h>
int main()
{
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);
d=max(a,b,c); //调用函数中有三个形参,这里需要传入三个实参,才可运算.
printf("The max is :%d .\n",d); // d可以换成max(a,b,c).
}
int max(int x , int y , int z)
{
int m;
if (x>y && x>z) //求三者之大的一种方法.
m=x;
if (y>x && y>z)
m=y;
if (z>y && z>x)
m=z;
return (m); //返回值m给主函数中的d.
}
C程序设计(第四版)(谭浩强)第2章课
后习题答案
算法——程序的灵魂
#include<stdio.h>
int main()
{
int i,s=1; //在执行数值操作前一定要先有个初值.
for(i=1;i<6;i++) //这里是到6.
{
s=s*i; //相乘
}
printf("The sum is %d .\n",s);
return 0;
}
#include<stdio.h> //作出要求:换成1到11间奇数相乘.
int main()
{
int i,s=1; //在执行数值操作前一定要先有个初值.
for(i=1;i<12;i++) //这里是到,但题目要求的是取单数.也可以是i=i+2
{
if(i%2!=0) //i对取模,值为非为奇数;为则为偶数.
s=s*i;
else
continue; //跳过这个for循环的这一次,执行下一次.
}
printf("The sum is %d .\n",s);
return 0;
}
P019 2.2 按要求输出80分以上的学生信息.
暂时没法做.
P019 2.3 判断2000-2500年中的闰年,并输出.
年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。
所以,如果每年定义为365天的话,1年就会多出0.2423天,4年就会多出0.9692天,非常接近1天,这样闰
年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天。
规则为:·1)如果年份能被4整除,则该年计为闰年;可是,假如不做调整的话,当400年的时候,累计才多出96.92天,接近于多出97天,闰年的设置却多出来100天,所以要在400年内,再撤销3个闰年。
怎么撤销呢?就有了下面这个规则:·2)如果年份能被100整除,则不计为闰年;问题又来了,400年里有4个100年吧,去掉后四个100年后,又少了一个,所以再加一个规则就是:·3)如果年份能被400整除,则计为闰年。
简单说来每400年里设置了97个闰年,也就是400里的前3个100年不设置闰年,误差被调整到400年仅有0.08天。
#include<stdio.h>
int main()
{
int i;
for(i=2000;i<=2200;i++)
{
if((i%4==0 && i%100!=0)||i%400==0) //闰年的经典判断条件.
printf("%d is a leap year !\n",i);
else
printf("%d is not a leap year !\n",i);
}
}
P020 2.4 求(1)-(1/2)+(1/3)……+(1/99)-(1/100)的值.
#include<stdio.h>
int main()
{
float sign=1 , sum=0 , deno , term ; //关于有小数的计算应该用float.
for (deno=1;deno<=100;deno++)
{
term=sign*(1/deno); //term临时值,sing符号,deno为分母.
sum=sum+term; //第一次总全存储.
sign=(-1)*sign; //换号.
}
printf("The sum of deno(指定值) is %f .\n",sum);
return 0; //若是到100的话,结果为0.68172
}
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(num%i==0) //除得尽,则不是.
{
n=1;
break; //设置跳出,才不会执行多次.
}
n=0; //按程序走的话,这里会执行多次,不能用printf语句,会输出多次.
}
if(n==0) //单出口问题,虽然n=0执行多次,但仍然是n=0,这样才会只输出一次.
{
printf("It is do a prime number !"); //如果是100-200可以加个”%d”,nmu进去.
}
else
{
printf("It is not a prime number !");
}
return 0;
}
2.6-2.10要求用流程图表示上列算法.
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++)
{
scanf("%d",&a[i]);
}
for(i=0;i<=9;i++)
{
if (s<a[i]) s=a[i];
}
printf("%d is the biggest number !\n",s);
return 0;
}
P036 0.3 按大小顺序输出一些数.
#include<stdio.h>
int main()
{
int i , j , a[4] , s=0 ;
printf("Please input 5 numbers :\n"); //此处要回车.
for (i=0 ; i<=4 ; i++)
{
scanf("%d",&a[i]); //这是取多个数的代码,可以用while控制取到\n符为止.
}
for (i=0 ; i<=3 ; i++) //双重循环,先一个外循,再轮所有小循,轮完后再下一个大循.
{
for (j=i+1 ; j<=4 ; j++) //第一个循环是至n-1,第二个循环是到n.
{
if (a[i]>a[j]) //如果成立,则对换,小于号表示降序排列,大于号表示升序排列.
{
s=a[i];
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;
}
#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");
else
printf ("Can not be devide by 3 and 5 !\n");
return 0;
}
//********************第一种方法.
#include<stdio.h> //网络版本,采用调用函数和求根取素.
#include<math.h>//下面用到sqrt,所以需要包含数据函数.sqrt是求根,属数学函数.
int main() //学会一个程序采用”主函数+被调用函数”的方式,会比较规范.
{
int i;
for (i=100; i<=200; i++) //为了书写规范,最好加上{},以示清范围.
if(prime_number(i) == 1) //i是实参.
printf("%d ",i);
return 0;
}
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; //此值返回给主函数中的实参.
}
return 1;
}
//********************第二种方法.
#include<stdio.h>
#include<math.h>
int main()
{
int i;
for(i=100;i<=200;i++) //指定至间.
{
if(prime(i)==1) //这里i为实参,传入形参j中进行运算,然后再由形参j带出返回.
printf ("%d is the prime number !\n",i);
}
return 0;
}
int prime(int j) //j是形参,用于接收实参i给的值.
{
int m, n;
m=(int)sqrt(j);
for (n=2;n<=m;n++)
{
if(j%n==0)
return 0; //返回值,0为不是素数,1是素数.
}
return 1;
}
//********************第二种方法.
请仿照2.5来写.
#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.
main ()
{
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;
}
int gcd(int x, int y) //最大公约数Greatest Common Divisor
{
int temp;
while(x%y!=0)
{
temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.
y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.
x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.
}
return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. }
int lcm(int x, int y) //最小公倍数Lowest Common Multiple
{
int i, temp;
if(x<y) //保证二者大的数在X上,小的数在Y上.小于号降序,大于号升序.
{ //以下为经典三行码,实现两个数的互换.
temp=x;
x=y;
y=temp;
}
for(i=1; i<=y; i++) //设定一个区间,从1至小的数之间的循环.
{
if(!((x*i)%y)) //除得尽为零,非零为真,则成立并返回.
{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.
return x*i;
}
}
}
最简单的C程序设计——顺序程序设计
#include<stdio.h>
float F_to_C(float input_fah) //代表华转摄,input_fah是局部变量.
{
float output_cen; //这里也是局部变量.
output_cen=(5.0/9)*(input_fah-32); //函数的功能体.
return output_cen; //返回值,注意,返回值的数据类型应该和函数一致.
}
float C_to_F(float input_cen)
{
float output_fah;
output_fah=(9.0/5)*input_cen+32; //转换过程.
return output_fah;
}
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)
{
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);
}
if(choice==2)
{
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;
}
P055 3.3 大写转换成小写
#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;
}
P071 3.6 用%f输出实数,只能得到六位小数.
#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;
}
P078 3.8 使用putchar函数输出.
#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;
}
P079 3.9 使用getchar得到字符.
#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;
}
P083 0.3 求几个月要以还贷.
#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;
}
P084 0.6 字母密码转换,调用函数及临界处理.
#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),printc ode(e));
putchar(putcharcode(a));
putchar(putcharcode(b));
putchar(putcharcode(c));
putchar(putcharcode(d));
putchar(putcharcode(e));
return 0; //注意理解自定义函数的定义,使用,及形参实参的流向.
//p84的是计算问题,自己看着办,最后要求小数点后两位,用的是%.2lf 来实现,因为没有要求实部,所以m.n格式中m不写.
//p84的是定义问题,第一问,两者都行,但是定义字母时,scanf要写%c来获取,而定义数值时则要用%d来获取.
// 第二问,putchar貌似只能输出字符,所以用printf.putchar本身就是字符输出函数啦,字符,有木有字符啊!!尽管它的参数可以是putchar('\101'),效果是输出字符A啊.
// 第三问,出现"任何"及"无条件",那么答案明显是"否".可以转换,但要在某此条件下,例如输出和读入时,%c是字母,而%d是数值,看着办.
}
选择结构程序设计
#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) //这是选择结构和其判断条件的示例.
printf("This equation hasn't real roots\n");
else
{
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;
}
P087 4.2 二个数按大小输出.
#include<stdio.h>
int main() //此程序代表按大小顺序输出.
{
float a,b,t;
scanf("%f %f",&a,&b); //出错时,注意检查这里是否按格式输入了.比如有个逗号.
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%5.2f,%5.2f\n",a,b);
return 0;
}
#include<stdio.h>
int main() //此程序代表按大小顺序输出.
{
float a,b,c,t;
scanf("%f %f %f",&a,&b,&c);
if(a>b) //此处执行后,a为小者.
{
t=a;
a=b;
b=t;
}
if(a>c) //此处执行后,a为小者.
{
t=a;
a=c;
c=t;
}
if(b>c) //上面已经搞定a是最小者,现在对比得出次小者,并且已经归到变量中.
{
t=b;
b=c;
c=t;
}
printf("%5.2f,%5.2f%5.2f\n",a,b,c);
return 0;
}
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;
}
#include<stdio.h>
int main()
{
int x,y;
scanf("%d",&x);
if(x>=0)
{
if(x>0) //这个范围要基于x>=0来判断.
{
y=1;
}
else
{
y=0;
}
}
else//这个是x<0的范围.
{
y=-1;
}
printf("x=%d,y=%d",x,y);
return 0;
}
P102 4.6 switch的简单应用.
#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;
}
#include<stdio.h>
void action1(int x,int y)
{
printf("x+y=%d\n",x+y);
}
void action2(int x,int y)
{
printf("x*y=%d\n",x*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;
}
#include<stdio.h>
int main()
{
int year,leap;
printf("Please input the year:\n");
scanf("%d",&year);
if(year%4==0) //400年里,在100个可除尽4的年里计算,以下是在全范围内计算.
{
if(year%100==0) //既是100个内的,又是可以除尽100的,算是且.
{
if(year%400==0) //相当于且了两次,只余下唯一一个.
{
leap=1;
}
else//400年里只有1个除得尽,其它都不是.
{
leap=0;
}
}
else//这里的范围是(year%4==0)&&(year%100!=0)
{
leap=1; //在合法的100内,又不是2100,2200一类的,当然属闰年.
}
}
else
{
leap=0;
}
if(leap)
{
printf("%d is ",year);
}
else
{
printf("%d is not ",year);
}
printf("a leap year !"); //不管上面如何判断,最后还是会输出这一句.
return 0;
}
#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,即是的负六次方,接近或是等于零.
{
printf("is not a quadratic !\n");
printf("x1=x2=%lf",-c/b);
}
else
{
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6) //指数形式,数字1.
{
printf("has two equal roots : %lf\n",-b/(2*a));
}
else
{
if(disc>1e-6)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("has distinct real roots : %lf and %lf \n",x1,x2);
}
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);
}
}
}
return 0;
}
#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)
{
d=0.0;
f=p*w*s*(1-d);
printf("%lf",f);
}
else if(s<500)
{
d=0.02;
f=p*w*s*(1-d);
printf("%lf",f);
}
else if(s<1000)
{
d=0.05;
f=p*w*s*(1-d);
printf("%lf",f);
}
else if(s<2000)
{
d=0.08;
f=p*w*s*(1-d);
printf("%lf",f);
}
else if(s<3000)
{
d=0.1;
f=p*w*s*(1-d);
printf("%lf",f);
}
else
{
d=0.15;
f=p*w*s*(1-d);
printf("%lf",f);
}
return 0;
}
#include<stdio.h>
int mina,mida,maxa;
int max(int a,int b,int c)
{
int m;
if(a>b) //凡是比较中,大于号代表升序排列.
{
m=a;
a=b;
b=m;
}
if(a>c)
{
m=a;
a=c;
c=m;
}
if(b>c)
{
m=a;
a=c;
c=m;
}
return (c); //此排序后,a,b,c由小到大.所以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;
}
#include<stdio.h>
#include<math.h>
int main()
{
double a,b;
printf("Please input a number :");
scanf("%lf",&a);
if(a<1000)
{
b=sqrt(a);
}
else
{
printf("\a"); //控制蜂鸣声
printf("Please input a number again :");
scanf("%lf",&a);11
b=sqrt(a);
}
printf("%.0lf",b); //按要求,只取整数.
return 0;
}
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++)
{
b[i]=a%10; //是%10,不是/10000,结果就是b[0]至b[4]中存着个,十,百,千,万位.
a=a/10; // /10后得到的结果去掉了个数.
if(b[i]!=0)
{
count=count+1;
}
}
printf("%d位数.\n",count);
printf("分别输出每一位数字,如下:");
for(i=4;i>=0;i--)
{
printf("%d ",b[i]);
}
printf("\n");
printf("倒序输出这一个数字,如下:");
for(i=0;i<=4;i++)
{
printf("%d",b[i]);
}
printf("\n");
return 0;
}
P0112 0.10 按要求提成奖金(if写法). #include<stdio.h>
int main()
{
double a,b;
printf("Please input profit amount :");
scanf("%lf",&a);
if(a<=10) //这个是整个if 的基础.
{
b=a*0.1;
}
else if(a<=20) //以上面为基础,这已经代表了10-20间了
{
b=1+(a-10)*0.075;
}
else if(a<=40) //同理,这是20-40间.
{
b=1+0.75+(a-20)*0.05;
}
else if(a<=60)
{
b=1+0.75+0.1+(a-40)*0.03;
}
else if(a<=100)
{
b=1+0.75+0.1+0.06+(a-60)*0.15;
}
else//这里是大于100的.
{
b=1+0.75+0.1+0.06+(a-100)*0.01;
}
printf("The reward is %lf !\n",b);
return 0;
}
#include<stdio.h>
double GetProfit(double c)
{
printf("Please input profit amount :");
scanf("%lf",&c);
return (c); //返回本身了,如果有进一步的计算结果,将值赋给其它变量,也可以返回.
}
int main()
{
double a;
char c;
printf("Your choice :\nA : 0-10 ;\nB : 10-20 ;\nC : 20-40 ;\nD : 40-60 ;\nE :
60-100 ;\nF : 100-1000 ;\n");
scanf("%c",&c); //不同档时,应照档的规定数值进行输入,否则结果不会是正确的.
switch(c) //前三后三用于比较调用函数.
{ //GetProfit(c)引入的实参没有意义,返回值和引入的实参没关系,反而由键盘获得.
case'A':{ printf("The reward is %lf !\n",GetProfit(c)*0.1);};break; //0-10 0.100
case'B':{ printf("The reward is %lf !\n",1+(GetProfit(c)-10)*0.075);}break; //10-20 0.075
case'C':{ printf("The reward is %lf !\n",1+0.75+(GetProfit(c)-20)*0.05);}break; //20-40 0.050
case'D':{printf("Please input profit amount :");scanf("%lf",&a);printf("The
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("请输入数值的个数: (十个以内)");
scanf("%d",&m); //到这里需要变量来承载数值的个数,设m,回头去定义变量那写上m.
printf("请分别输入相对应个数的数值:");
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(a[i]>a[j]) //这是选择排序法.升序.
{
n=a[i]; //这里需要一个用于临时变量的n,所以回头去写上.
a[i]=a[j];
a[j]=n;
}
}
}
for(i=0;i<m;i++)
{
printf("%d",a[i]);
}
return 0;
}
C程序设计(第四版)(谭浩强)第五章课后习
题答案
循环结构程序设计
P115 5.1 用while计算1至100的合.
#include<stdio.h>
int main()
{
int i=1,sum=0;
while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.
{
sum=sum+i;
i++;
}
printf("The sum is %d .\n",sum);
return 0;
}
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;
}
P118 5.3 比较do-while与while的差别.
#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以内,结果一样.输入11的话,先做操作,所以sum=11.
do
{
sum=sum+i;
i++;
}while(i<=10); //此重点在于理解二者的差别.
printf("The sum of 1-10 is %d .\n",sum);
return 0;
}
P126 5.4 break的例子.
#include<stdio.h>
int main()
{
int i,b=0,a,c;
for(i=0;i<=1000;i++)
{
printf("Please input amount :"); //循环体内套有输出语句以及跳出语句.
scanf("%d",&a);
b=b+a;
if(b>=100)
{
break; //break是用于跳出循环,对if无效,对while for switch 这一类.
}
}
c=b/i;
printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.
return 0;
#include<stdio.h>
int main()
{
int i;
for(i=1;i<20;i++)
{
if(i%3!=0)
{
continue; //跳过本次I,执行下一个i.
}
printf("%d ",i);
}
printf("\n");
return 0;
}
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("\n");
}
printf("%d\t",i*j);
}
}
printf("\n");
return 0;
#include<stdio.h>
#include<math.h>
int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).
{
float s=1,n=1,m,sum=0,t;
for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.
{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.
t=(s)*(n/m); //这是第一项,s是符号,
if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.
{
break;
}
sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.
s=s*(-1); //变号一次.
}
printf("四分之一哌的值是%f.\n",sum);
printf("一个完整哌的值是%f.\n",sum*4);
return 0;
}
//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.
//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.
//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.
//
//int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.
//{
// 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;
// f=1.0/4;
// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.
// 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,边界问题一定要注意,不可以太随意
{
f3=f1+f2;
printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,
f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.
f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.
}
return 0;
}
P135 5.9 还是求素数,方法不一样.
#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))
{
printf("Not %d",(int)num);
}
else//如上所述,i=5,超出了求根的值,所以是素数.
{
printf("Yes %d",(int)num);
}
return 0;
}
P137 5.10 求100至200间的素数.
#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++)
{
if((int)j%i==0)
{
break;
}
}
k=k+1; //这里是布局的开头.学习一下,有助逻辑.
if(i<=sqrt(j))
{
printf("Not %d ",(int)j);
if(k%5==0) //5个换一次行.
{
printf("\n");
}
}
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') //这也可以用数组来实现.
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{
if((c>='w'&&c<='z')||(c>='W'&&c<='Z'))
{
c=c-22;
}
else
{
c=c+4;
}
printf("%c",c);
c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.
}
}
printf("\n"); //这是布局问题.
return 0;
}。