C语言程序设计(谭浩强第五版)——例题

  • 第1章 程序设计和C语言
  • 第2章 算法——程序的灵魂
  • 第3章 最简单的C程序设计——顺序程序设计
  • 第4章 选择结构程序设计
  • 第5章 循环结构程序设计
  • 第6章 利用数组处理批量数据
  • 第7章 用函数实现模块化程序设计

第1章 程序设计和C语言

【例1.1】要求在屏幕上输出以下一行信息。
This is a C program.

#include<stdio.h>
int main()
{printf("This is a C program.\n");return 0;
}

【例1.2】求两个整数之和。

// 求两个整数之和。
#include<stdio.h>
int main()
{int a,b,sum;a=123;b=456;sum=a+b;printf("sum is %d\n",sum);return 0;
}

【例1.3】求两个整数中的较大者。

// 求两个整数中较大者
// 思路:用一个函数来实现求两个整数中的较大者。在主函数中调用此函数并输出结果。
#include<stdio.h>
int main()
{int max(int x,int y);// 对被调用函数max的声明int a,b,c;scanf("%d,%d",&a,&b) ;c=max(a,b);printf("max=%d\n",c);return 0;
}// 求两个整数中的较大者的max函数
int max(int x, int y)
{int z;if(x>y)z=x;else z=y;return(z);
}

第2章 算法——程序的灵魂

【例2.18】求5!。

// 求5!
#include<stdio.h>
int main()
{int i,t;t=1;i=2;while(i<=5){t=t*i;i=i+1;}printf("%d\n",t);return 0;
}

【例2.19】求多项式1−12+−13+−14+...+199−11001-\frac{1}{2}+-\frac{1}{3}+-\frac{1}{4}+...+\frac{1}{99}-\frac{1}{100}1−21​+−31​+−41​+...+991​−1001​的值。

//求多项式1-1/2+1/3-1/4+...+1/99-1/100的值
#include<stdio.h>
int main()
{int sign=1;double deno=2.0,sum=1.0,term;//定义deno,sum,term为双精度型变量while(deno<=100){sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;}printf("%f\n",sum);return 0;
}

第3章 最简单的C程序设计——顺序程序设计

【例3.1】有人用温度计测量出华氏法表示的温度(如64oF64^oF64oF),今要求把它转换为以摄氏法表示的温度(如17.8oC17.8^oC17.8oC)。

//华氏法转换为摄氏法 c=5/9(f-32)
#include<stdio.h>
int main()
{float f,c; // 定义f和c为单精度浮点类型变量f=64.0;c=(5.0/9)*(f-32);printf("f=%f\nc=%f\n",f,c);return 0;
}

【例3.2】 计算存款利息。有1000元,想存一年。有三种方法可选。
(1) 活期,年利率为r1
(2)一年期定期,年利率为r2
(3)才能两次半年定期,年利率为r3。
请分别计算出一年后按三种方法所得到的本息和。

// 计算存款利息。有1000元,想存一年。有三种方法可选。
// (1) 活期,年利率为r1
// (2)一年期定期,年利率为r2
// (3)才能两次半年定期,年利率为r3。
// 请分别计算出一年后按三种方法所得到的本息和。#include<stdio.h>
int main()
{double 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;
}

【例3.3】给定一个大写字母,要求用小写字母输出。

// 给定一个大写字母,要求用小写字母输出
// 小写字母ASCII码值比大写字母大32#include<stdio.h>
int main()
{char c1,c2;c1='A';c2=c1+32;printf("%c\n",c2);printf("%d\n",c2);return 0;
}

【例3.4】 给出三角形的三边长,求三角形面积。

// 给出三角形的三边长,求三角形面积。
// 三角形面积公式:area=(s(s-a) (s-b)(s-c))^(1/2)
// 其中s=(a+b+c)/2。# include<stdio.h>
# include<math.h>
int main()
{double a,b,c,s,area;a=3.67;b=5.43;c=6.21;s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("a=%f\tb=%f\tc=%f\n",a,b,c);printf("area=%f\n",area);return 0;
}

【例3.5】ax2+bx+c=0ax^2+bx+c=0ax2+bx+c=0方程的根。a,b,ca,b,ca,b,c由键盘输入,设b2−4ac>0b^2-4ac>0b2−4ac>0。

// 求ax^2+bx+c=0方程的根。a,b,c由键盘输入,设b^2-4ac>0。#include<stdio.h>
#include<math.h>
int main()
{double a,b,c,disc,x1,x2,p,q; // disc用来存放判别式(b*b-4ac)的值。scanf("%lf%lf%lf",&a,&b,&c); // 输入双精度型变量的值要用格式声明"%lf" 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.2lf\nx2=%7.2\lf\n",x1,x2);// 7.2指定数据占7列,其中小数占2列 。 return 0;
}

【例3.6】用%f输出实数,只能得到6位小数。

//  用%f输出实数,只能得到6位小数。#include<stdio.h>
int main()
{double a=1.0;printf("%f\n",a/3);return 0;
}

【例3.7】float型数据的有效位数。

// float型数据的有效位数#include<stdio.h>
int main()
{float a;a=1000/3.0;printf("%f\n",a);return 0;
}

【例3.8】先后输出BOY三个字符。

// 先后输出BOY三个字符。#include<stdio.h>
int main()
{char a='B',b='O',c='Y';putchar(a);putchar(b);putchar(c);putchar('\n');return 0;
}

【例3.9】从键盘输入BOY三个字符,然后把它们输出到屏幕。

// 从键盘输入BOY三个字符,然后把它们输出到屏幕。 #include<stdio.h>
int main()
{char a,b,c;a=getchar();b=getchar();c=getchar();putchar(a);putchar(b);putchar(c);putchar('\n');return 0;
}

【例3.10】改写例3.3程序,使之可以适用于任何大写字母。从键盘输入一个大写字母,在显示屏上显示对应的小写字母。

// 从键盘输入一个大写字母,在显示屏上显示对应的小写字母。#include<stdio.h>
int main()
{char c1,c2;c1=getchar();c2=c1+32;putchar(c2);putchar('\n');return 0;
}

第4章 选择结构程序设计

【例4.1】在例3.5的基础上对程序进行改进。
题目要求解得ax2+bx+c=0ax^2+bx+c=0ax2+bx+c=0的根。有键盘输入a,b,ca,b,ca,b,c。假设a,b,ca,b,ca,b,c的值任意,并不保证b2−4ac≥0b^2-4ac\ge0b2−4ac≥0。
需要在程序中进行判别,如果b2−4ac≥0b^2-4ac\ge0b2−4ac≥0,就计算并输出方程的两个实根。
否则,输出“此方程无实根”的信息。

// 在3_5的基础上对程序进行改进。
// 题目要求解得ax^2+bx+c=0的根。
// 有键盘输入a,b,c。假设a,b,c的值任意,并不保证b^2-4ac>=0。
// 需要在程序中进行判别,如果b^2-4ac>=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;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("real roots:\nx1=%7.2f\nx2=%7.2f\n",x1,x2);}
}

【例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;
}

【例4.3】输入三个数a,b,ca,b,ca,b,c,要求按由从小到大的顺序输出。

// 输入三个数,按由从小到大的顺序输出。#include<stdio.h>
int main()
{float a,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%5.2f,%5.2f,%5.2f\n",a,b,c);return 0;
}

【例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;
}

【例4.5】
y={−1(x<0)0(x=0)1(x>0)y=\left\{\begin{aligned}-1& \quad(x<0)\\0&\quad(x=0)\\1&\quad(x>0)\end{aligned}\right.y=⎩⎪⎨⎪⎧​−101​(x<0)(x=0)(x>0)​

// 阶跃函数#include<stdio.h>
int main()
{int x,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;else y=1;printf("x=%d,y=%d\n",x,y);return 0;
}
// 可以改写为:
/*
int main()
{intx,y;scanf("%d",&x);if(x>=0)if(x>0) y=1;esle y=0;else y=-1;printf("x=%d,y=%d\n",x,y);return 0;
}
*/

【例4.6】按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为7084分,C等为6069分,D等为60分以下。成绩的等级由键盘输入

// 按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60~69分,D等为60分以下。成绩的等级由键盘输入。#include<stdio.h>
int main()
{char grade;scanf("%c",&grade);printf("Your score:");switch(grade){case 'A':printf("85~100\n");break;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;
}

【例4.7】用switch语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个’A’或’a’字符,就会执行A操作,输入一个’B’或’b’字符,就会执行B操作。

// 用switch语句处理菜单命令。
// 在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个'A'或'a'字符,
// 就会执行A操作,输入一个'B'或'b'字符,就会执行B操作。#include<stdio.h>
int main()
{void action1(int,int),action2(int,int); // 函数声明char ch;int a=15,b=23;ch=getchar();switch(ch){case 'a':case 'A':action1(a,b);break;case 'b':case 'B':action2(a,b);break;default:putchar('\a');}return 0;
}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);
}

【例4.8】判断某一年是否为闰年。

// 判断某一年是否为闰年#include<stdio.h>
int main()
{int year,leap;printf("enter year:");scanf("%d",&year);if(year%4==0){if(year%100==0){if(year%400==0)leap=1;elseleap=0;}elseleap=1;}else leap=0;if(leap)printf("%d is",year);elseprintf("%d is not ",year) ;printf("a leap year.\n");return 0;} // 11-24可以改写为
/*
if(year%4!=0)leap=0;
else if (year%100!=0)leap=1;
else if(year%400!=0)leap=0;
elseleap=1;
*/ //或者
/*
if((year%4==0&&year%100!=0)||(year%400==0))leap=1;
elseleap=0;
*/

【例4.9】求ax2+bx+c=0ax^2+bx+c=0ax2+bx+c=0方程的解。

// 求ax^2+bx+c=0方程的解。
/*
1. a=0,不是二次方程。
2. b^2-4ac=0,有两个相等实根。
3. b^2-4ac>0,有两个不等实根。
4. b^2-4ac<0,有两个共轭复根。应当以p+qi和p-qi的形式输出复根。其中,p=-b/2a,q=[(b^2-4ac)^(1/2)]/(2a)。
*/#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)printf("is not a quadratic\n");else{disc=b*b-4*a*c;if(fabs(disc)<=1e-6)printf("has two equal roots:%8.4f\n",-b/(2*a));elseif(disc>1e-6){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);}else{realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(" has complex roots:\n");printf("%8.4f+%8.4fi\n",realpart,imagpart);printf("%8.4f-%8.4fi\n",realpart,imagpart);}}return 0;
}

【例4.10】运输公司对用户计算运输费用。路程越远,运费越低,标准如下:
s<250 没有折扣
250<=s<500 2%折扣
500<=s<1000 5%折扣
1000<=s<2000 8%折扣
2000<=s<3000 10%折扣
3000<=s 15%折扣

/* 运输公司对用户计算运输费用。路程越远,运费越低,标准如下: s<250            没有折扣 250<=s<500       2%折扣 500<=s<1000      5%折扣 1000<=s<2000     8%折扣 2000<=s<3000     10%折扣 3000<=s          15%折扣
*//*
分析: 每吨每千米货物的基本运费为p(price),货物重为w(weight),距离为s,折扣为d(discount),
总运费f(freight)的计算公式为f=p*w*s(1-d)经分析发现折扣的变化是有规律的,折扣的变化点都是250的倍数(250,500,1000,2000,3000)
用c表示250的倍数。c<1时,s<250,无折扣;1<=c<2时,表示250<=s<500,折扣d=2%,2<=c<4时,d=5%,
4<=c<8时,d=8%,8<=c<12时,d=10%,c>=12时,d=15%
*/
#include<stdio.h>
int main()
{int c,s;float p,w,d,f;printf("please enter price, weight, discount:");// 提示输入的数据scanf("%f,%f,%d",&p,&w,&s) ;// 输入单间、重量、距离if(s>=3000) c=12; //3000km以上为同一折扣else c=s/250;switch(c) {case 0:d=0;break;case 1:d=2;break;case 2: case 3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;}f=p*w*s*(1-d/100);printf("freight=%10.2f\n",f) ;return 0;}

第5章 循环结构程序设计

【例5.1】求1+2+3+...+1001+2+3+...+1001+2+3+...+100,即∑n=1100n\sum_{n=1}^{100}n∑n=1100​n。

// 求1+2+3+...+100,即\sum_{n=1}^{100}n#include<stdio.h>
int main()
{int i=1,sum=0; // 定义变量i的初值为1,sum的初值为0 while(i<=100) // 当i>100,条件表达式i<=100的值为假,不执行循环体 {             // 循环体开始 sum=sum+i;  // 第1次累加后,sum的值为1 i++;    // 加完后,i的值加1,为下次累加做准备 }           // 循环体结束 printf("sum=%d\n",sum); // 输出1+2+3+...+100的累加和 return 0;
}

【例5.2】用do while 求1+2+3+...+1001+2+3+...+1001+2+3+...+100,即∑n=1100n\sum_{n=1}^{100}n∑n=1100​n。

// 用do while 求1+2+3+...+100,即\sum_{n=1}^{100}n#include<stdio.h>
int main()
{int i=1,sum=0;do {sum=sum+i;i++;}while(i<=100);printf("sum=%d\n",sum);    // 输出1+2+3+...+100的累加和 return 0;
}

【例5.3】while和do while循环的比较。

// do while 和 while 的比较// (1)用while循环
#include<stdio.h>
int main()
{int i,sum=0;printf("please enter i,i=?");scanf("%d",&i);while(i<10){sum=sum+i;i++;}printf("sum=%d\n",sum);return 0;
}// 运行两次
//1
//11

// do while 和 while 的比较// (2)用do while循环
#include<stdio.h>
int main()
{int i,sum=0;printf("please enter i,i=?");scanf("%d",&i);do{sum=sum+i;i++;}while(i<=10);printf("sum=%d\n",sum);return 0;
}// 运行两次
//1
//11

【例5.4】在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。

// 在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。#include<stdio.h>
#define SUM 100000
int main()
{float amount,aver,total;int i;for (i=1,total=0;i<=1000;i++) {printf("please enter amount:");scanf("%f",&amount);total=total+amount;if(total>=SUM)break;}aver=total/i;printf("num=%d\naver=%10.2f\n,",i,aver);return 0;
}

【例5.5】要求输出100~200的不能被3整除的数。

// continue语句提前结束本次循环// 要求输出100~200的不能被3整除的数#include<stdio.h>
int main()
{int n;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d ",n);}printf("\n");return 0;
}

【例5.6】输出以下4*5的矩阵。
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20

// 输出以下4*5的矩阵#include<stdio.h>
int main()
{int i,j,n=0;for (i=1;i<=4;i++)for(j=1;j<=5;j++,n++)// n用来累计输出数据的个数 {if(n%5==0)printf("\n");printf("%d\t",i*j);}printf("\n");return 0;}
// break 和 continue 的区别
// break 跳到下一个循环语句
// continue 跳到下一个判断
#include<stdio.h>
int main()
{int i,j,n=0;for (i=1;i<=4;i++)for(j=1;j<=5;j++,n++)// n用来累计输出数据的个数 {if(n%5==0)printf("\n");if(i==3&&j==1) break;printf("%d\t",i*j);}printf("\n");return 0;}
// break 和 continue 的区别
// break 跳到下一个循环语句
// continue 跳到下一个判断
#include<stdio.h>
int main()
{int i,j,n=0;for (i=1;i<=4;i++)for(j=1;j<=5;j++,n++)// n用来累计输出数据的个数 {if(n%5==0)printf("\n");if(i==3&&j==1) continue;printf("%d\t",i*j);}printf("\n");return 0;}

【例5.7】公式π4≈1−13+15−17+...\frac{\pi}{4}≈1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+...4π​≈1−31​+51​−71​+...求π\piπ得近似值,直至发现某一项的绝对值小于10−610^{-6}10−6为止(该项不累加)。

// 用公式pi/4≈1-1/3+1/5-1/7+...求pi得近似值,直至发现某一项的绝对值小于10^(-6)为止#include<stdio.h>
#include<math.h>
int main()
{int sign=1;double pi=0.0,n=1.0,term=1.0;// pi开始代表多项式的值,最后代表pi的值,n代表分母,term代表当前项的值while(fabs(term)>=1e-6) {pi=pi+term;n=n+2;sign=-sign;term=sign/n;  }pi=pi*4;printf("pi=%10.8f\n",pi);return 0;}

【例5.8】求Fibonacci数列的前40个 数。这些数列有如下特点:第1,2两个数为1,1。
从第3个数开始,该数是前面两个数之和。
{F1=1(n=1)F2=1(n=2)Fn=Fn−1+Fn−2(n>=3)\left\{ \begin{aligned} F_1&=1&(n=1)\\ F_2&=1&(n=2)\\ F_n&=F_{n-1} +F_{n-2}&(n>=3) \end{aligned} \right.⎩⎪⎨⎪⎧​F1​F2​Fn​​=1=1=Fn−1​+Fn−2​​(n=1)(n=2)(n>=3)​

// 求Fibonacci数列的前40个 数。这些数列有如下特点:第1,2两个数为1,1。
// 从第3个数开始,该数是前面两个数之和。
// F_1=1(n=1)
// F_2=1(n=2)
// F_n=F_{n-1} +F_{n-2}(n>=3)#include<stdio.h>
int main()
{int f1=1,f2=1,f3;int i;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++){f3=f1+f2;printf("%12d\n",f3);f1=f2;f2=f3;}return 0;
}
// 改进5_8#include<stdio.h>
int main()
{int f1=2,f2=1;int i;for(i=1;i<=20;i++){printf("%12d %12d",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+1;}return 0;
}

【例5.9】输入一个大于3的整数n,判定他是否为素数(prime,又称质数)。

// 输入一个大于3的整数n,判定他是否为素数(prime,又称质数)#include<stdio.h>
int main()
{int n,i;printf("please enter a integer number, n=?");scanf("%d",&n);for(i=2;i<n;i++)if(n%i==0)break;if(i<n)printf("%d is not a prime number.\n",n);else printf("%d is a prime number.\n",n);return 0;
}
// 5_9程序改进
// 输入一个大于3的整数n,判定他是否为素数(prime,又称质数)#include<stdio.h>
#include<math.h>
int main()
{int n,i,k;printf("please enter a integer number, n=?");scanf("%d",&n);k=sqrt(n);for(i=2;i<k;i++)if(n%i==0)break;if(i<k)printf("%d is not a prime number.\n",n);else printf("%d is a prime number.\n",n);return 0;
}

【例5.10】求100~200的全部素数。

// 求100~200的全部素数。#include<stdio.h>
#include<math.h>
int main()
{int n,k,i,m=0;for(n=101;n<=200;n=n+2){k=sqrt(n);for(i=2;i<=k;i++)if(n%i==0)break;if(i>=k+1){printf("%d ",n);m=m+1;}if(m%10==0)printf("\n");}printf("\n");return 0;
}

【例5.11】译秘密 。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文 。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。
字母按上述规律转换,非字母字符保持原状不变,如“China”转换为“Glmre!”
从键盘输入一行字符,要求输出其相应的密码。

// 译秘密 。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文 。
// 例如,可以按以下规律将电文变成密码:
/*  将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。字母按上述规律转换,非字母字符保持原状不变,如“China”转换为“Glmre!”从键盘输入一行字符,要求输出其相应的密码。*/ #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();}printf("\n");return 0;
}
// 5_11改进
#include<stdio.h>
int main()
{char c;while((c=getchar())!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){c=c+4;if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;}printf("%c",c);}printf("\n");return 0;
}

第6章 利用数组处理批量数据

【例6.1】对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。

// 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。#include<stdio.h>
int main()
{int i,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>-0;i--)printf("%d ",a[i]);printf("\n");return 0;
}

【例6.2】用数组来处理求Fibonacci数列问题。

// 用数组来处理求Fibonacci数列问题。#include<stdio.h>
int main()
{int i;int f[20]={1,1};    // 对最前面的两个元素f[0]和f[1]赋初值1for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; // 先后求出f[2]~f[19]的值 for(i=0;i<20;i++){if(i%5==0)printf("\n");printf("%12d",f[i]);}printf("\n") ;return 0;
}

【例6.3】有10个地区的面积,要求对它们按有小到大的顺序排列。

// 有10个地区的面积,要求对它们按有小到大的顺序排列。#include<stdio.h>
int main()
{int a[10];int i,j,t;printf("input 10 numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("the sorted numbers:\n");for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;
}

【例6.4】将一个二维数组行和列的元素呼唤,存到另一个二维数组中.

/*
将一个二维数组行和列的元素呼唤,存到另一个二维数组中,例如:
a=[ 1 2 34 5 6]
b=[ 1 42 53 6]
*/ #include<stdio.h>
int main()
{int a[2][3]={{1,2,3},{4,5,6}};int b[3][2],i,j;printf("array a:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];} printf("\n");}printf("araay b:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++){printf("%5d",b[i][j]);}printf("\n");}return 0;
}

【例6.5】有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。

// 有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。#include<stdio.h>
int main()
{int i,j,row=0,col=0,max;int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};max=a[0][0];for(i=0;i<=2;i++){for(j=0;j<=3;j++){if(a[i][j]>max){max=a[i][j];row=i;col=j;}}}printf("max=%d\nrow=%d\ncolum=%d\n",max,row,col);return 0;
}

【例6.6】输出一个已知的字符串。

// 输出一个已知的字符串。#include<stdio.h>
int main()
{char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};int i;for(i=0;i<15;i++){printf("%c",c[i]);}printf("\n");return 0;
}

【例6.7】输出一个菱形图。

// 输出一个菱形图。#include<stdio.h>
int main()
{char diamond[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};int i,j;for(i=0;i<5;i++){for(j=0;j<5;j++){printf("%c",diamond[i][j]);}printf("\n");}return 0;
}

【例6.8】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

// 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。#include<stdio.h>
int main()
{char string[81];int i,num=0,word=0;char c;gets(string);for(i=0;(c=string[i])!='\0';i++){if(c==' '){word=0;   }else if(word==0){word=1;num++;}}printf("There are %d words in this line.\n",num);return 0;}

【例6.9】有3个字符串,要求找出其中“最大”者。

// 有3个字符串,要求找出其中“最大”者。#include<stdio.h>
#include<string.h>
int main()
{char str[3][20];char string[20];int i;for(i=0;i<3;i++){gets(str[i]);}if(strcmp(str[0],str[1])>0){strcpy(string,str[0]);}else{strcpy(string,str[0]);}if(strcmp(str[2],string)>0){strcpy(string,str[2]);}printf("\nthe largest string is:\n%s\n",string);return 0;
}

第7章 用函数实现模块化程序设计

【例7.1】想输出以下的结果,用函数调用实现。
*****************
How do you do!
*****************

// 想输出以下的结果,用函数调用实现。
/*
*****************
How do you do!
*****************
*/ #include<stdio.h>
int main()
{void print_star() ;void print_message();print_star();print_message() ;print_star();return 0;
}void print_star()
{printf("*****************\n");} void print_message()
{printf("How do you do!\n");
}

【例7.2】输入两个整数,要求输出其中值较大者。 要求用函数来找到大数。

// 输入两个整数,要求输出其中值较大者。 要求用函数来找到大数。int max(int x,int y)
{int z;z=x>y?x:y;return(z);
}
#include<stdio.h>
int main()
{int max(int x,int y);int a,b,c;printf("please enter two integer numbers:");scanf("%d,%d",&a,&b);c=max(a,b);printf("max is %d\n",c);return 0;
}

【例7.3】将例7.2稍作改动,将在max函数中定义的变量z改为float型。函数返回值的类型与指定的函数类型不同,分析其处理方法。

// 将例7.2稍作改动,将在max函数中定义的变量z改为float型。函数返回值的类型与指定的函数类型不同,分析其处理方法。#include<stdio.h>
int main()
{int max(float x,float y);float a,b;int c;scanf("%f,%f",&a,&b);c=max(a,b);printf("max is %d\n",c);return 0;
}
int max(float x,float y)
{float z;z=x>y?x:y;return(z);
}

【例7.4】输人两个实数,用一个函数求出它们之和。

// 输人两个实数,用一个函数求出它们之和。#include<stdio.h>
int main()
{float add(float x,float y);float a,b,c;printf("Please enter a and b:");scanf("%f,%f",&a,&b);c=add(a,b);printf("sum is %f\n",c) ;return 0;} float add(float x,float y)
{float z;z=x+y;return(z);
}

【例7.5】输入 4个整数,找出其中最大的数。用函数的嵌套调用来处理。

// 输入 4个整数,找出其中最大的数。用函数的嵌套调用来处理。#include<stdio.h>
int main()
{int max4(int a,int b,int c,int d);int a,b,c,d,max;printf("Please enter 4 integer numbers:");scanf("%d %d %d %d",&a,&b,&c,&d);max=max4(a,b,c,d);printf("max=%d \n",max);return 0;
}int max4(int a,int b,int c,int d)
{int max2(int a,int b);int m;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);
}int max2(int a,int b)
{if(a>=b)return a;elsereturn b;
}

【例7.5.1】7.5改进

// 7.5改进#include<stdio.h>
int main()
{int max4(int a,int b,int c,int d);int a,b,c,d,max;printf("Please enter 4 interger numbers:");scanf("%d %d %d %d",&a,&b,&c,&d);max=max4(a,b,c,d);printf("max=%d \n",max);return 0;
}int max4(int a,int b,int c,int d)
{int max2(int a,int b);return max2(max2(max2(a,b),c),d);
}int max2(int a,int b)
{return (a>=b?a:b) ;}

【例7.6】有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。

/* 有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。
问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。
请问第5个学生多大。
*//*
解:年龄可用数学公式表示为
age(n)=10  (n=1)
age(n)=age(n-1)+2 (n>1)
*/int age(int n)
{int c;if(n==1)c=10;elsec=age(n-1)+2;return c;
}#include<stdio.h>
int main()
{int age(int n);printf("NO.5,age:%d\n",age(5));return 0;
}

【例7.7】用递归方法求n!

// 用递归方法求n!/*
求解公式:
n!=1(n=0,1)
n!=n*(n-1)!(n>1)
*/ #include<stdio.h>
int main()
{int fac(int n);int n;int y;printf("input an integer number:");scanf("%d",&n);y=fac(n);printf("%d!=%d\n",n,y);return 0;
}int fac(int n)
{int f;if(n<0)printf("n<0,data error!");else if(n==0||n==1)f=1;else f=fac(n-1)*n;return f;
}

【例7.8】Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。
问题是这样的∶古代有一个梵塔,塔内有3个座 A,B,C。开始时 A座上有64个盘子,盘子大小不等,大的在下,小的在上。
有一个老和尚想把这64个盘子从 A座移到 C座,但规定每次只允许移动—个盘,目在移动过程中在3 个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用 B座。要求编程序输出移动盘子的步骤。

/*
Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。
问题是这样的∶古代有一个梵塔,塔内有3个座 A,B,C。开始时 A座上有64个盘子,盘子大小不等,大的在下,小的在上。
有一个老和尚想把这64个盘子从 A座移到 C座,但规定每次只允许移动—个盘,目在移动过程中在3 个座上都始
终保持大盘在下,小盘在上。在移动过程中可以利用 B座。要求编程序输出移动盘子的步骤。
*/#include<stdio.h>
int main()
{void hanoi(int n,char one,char two,char three);int m;printf("input the number of diskes:");scanf("%d",&m);printf("The step to move %d diskes:\n",m);hanoi(m,'A','B','C') ;
}void hanoi(int n,char one,char two,char three)
{void move(char x,char y);if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}
}void move(char x,char y)
{printf("%c->%c\n",x,y);
}

【例7.9】输入10个数,要求输出其中值最大的元素和该数是第几个数。

// 输入10个数,要求输出其中值最大的元素和该数是第几个数。#include<stdio.h>
int main()
{int max(int x,int y);int a[10],m,n,i;printf("enter 10 integer numbers:");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=1,m=a[0];i<10;i++){if(max(m,a[i])>m){m=max(m,a[i]);n=i;}} printf("The largest number is %d\nit is the %dth number.\n",m,n+1);
}int max(int x,int y)
{return (x>y?x:y);
}

【例7.10】有一个一维数组 score,内放 10个学生成绩,求平均成绩。

// 有一个一维数组 score,内放 10个学生成绩,求平均成绩。#include<stdio.h>
int main()
{float average(float array[10]);float score[10],aver;int i;printf("input 10 scores:\n");for(i=0;i<10;i++)scanf("%f",&score[i]);printf("\n");aver=average(score);printf("average score is %5.2f\n",aver);return 0;
}
float average(float array[10])
{int i;float aver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i] ;aver=sum/10;return aver;
}

【例7.11】有两个班级,分别有35 名和 30名学生,调用一个 average 函数,分别求这两个班的学生的平均成绩。

// 有两个班级,分别有35 名和 30名学生,调用一个 average 函数,分别求这两个班的学生的平均成绩。#include<stdio.h>
int main()
{float average(float array[],int n);float score1[5]={98.5,97,91.5,60,55};float score2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf("The average of class A is %6.2f\n",average(score1,5));printf("The average of class B is %6.2f\n",average(score2,10));return 0;
}   float average(float array[],int n)
{int i;float aver,sum=array[0];for(i=1;i<n;i++)sum=sum+array[i] ;aver=sum/n;return aver;
}

【例7.】

【例7.12】用选择法对数组中10个整数按由小到大排序。

// 用选择法对数组中10个整数按由小到大排序。/*
解∶所谓选择法就是先将10个数中最小的数与a[0]对换;
再将 a[1]~a[9]中最小的数与 a[1]对换……
每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。
*/
#include<stdio.h>
int main()
{void sort(int array[],int n);int a[10],i;printf("enter array:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);printf("The sorted array:\n");for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;
}void sort(int array[],int n)
{int i,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j;t=array[k];array[k]=array[i];array[i]=t;}
}

【例7.13】有一个3*4的矩阵,求所有元素中的最大值。

// 有一个3*4的矩阵,求所有元素中的最大值。#include<stdio.h>
int main()
{   int max_value(int arrat[][4])   ;int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("Max value is %d\n",max_value(a));return 0;
}int max_value(int array[][4])
{int i,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return max;}

【例7.14】有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。

//  有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。#include<stdio.h>
float Max=0,Min=0;    // 定义全局变量
int main()
{float average(float array[],int n);float ave,score[10];int i;printf("Please enter 10 scores:");for(i=0;i<10;i++)scanf("%f",&score[i]);ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);return 0;
}
float average(float array[],int n)
{int i;float aver,sum=array[0];Max=Min=array[0];for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];else if(array[i]<Min)Min=array[i];sum=sum+array[i];} aver=sum/n;return aver;
}

【例7.】

C语言程序设计(谭浩强第五版)——例题相关推荐

  1. C语言程序设计谭浩强第五版复习梳理2

    第2章 算法--程序的灵魂 前言:前两章都是c语言基础知识,软考还有考研笔试可能会考,下一章开始学的才是真正的编程. 2.1程序=算法+数据结构 算法+数据结构=程序 数据结构: 对数据的描述.在程序 ...

  2. C程序设计谭浩强第五版课后答案 第三章习题答案

    C语言程序设计谭浩强第五版课后答案第三章 1.假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比.计算公式为p=(1+r)np = (1+r)^np=(1+r ...

  3. C程序设计(谭浩强第五版)总结

    C程序设计(谭浩强第五版)总结 本篇文章主要是总结谭浩强第五版C语言书上的重点和易漏点的知识点,其目的主要是给高校期末考试的同学们点参考.本文所参考的书籍是谭浩强的<C程序设计(第五版)> ...

  4. 《C语言程序设计》(谭浩强第五版) 第2章 算法——程序的灵魂

    <C语言程序设计>(谭浩强第五版) 第2章 算法--程序的灵魂 习题解析与答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解 ...

  5. C语言程序设计(谭浩强第五版)——习题

    C语言程序设计(谭浩强第五版)--习题 第3章 最简单的C程序设计--顺序程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 利用数组处理批量数据 第3章 最简单的C程序设计--顺序 ...

  6. 《C语言程序设计》谭浩强 第五版 编程10题解答2

    <C语言程序设计>谭浩强 第五版 编程10题解答2 11.素数计算 编写程序计算500-800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔减.加之和,即第1个素数- ...

  7. 自学c程序设计之路,谭浩强第五版,(一)程序设计与c语言

    由于本人提升技能需求,开始自学c语言程序设计,教材为<c程序设计>第五版谭浩强著.该系列为本人的学习笔记,记录的是知识点与例题,学到哪里,更到哪里.也希望能对正在学c程序设计的朋友有帮助. ...

  8. C语言(谭浩强第5版)课后习题知识总结

    目录 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第一章 1.程序:就是一组计算机能够识别和执行的指令集合,每一条指令使计算机执行特定操作. 程序设计:从确定任务到 ...

  9. 《C语言程序设计》(谭浩强第五版) 第8章 善于利用指针 习题解析与答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 本章习题均要求用指针方法处理. 题目1:输入3个整数,按由小到大的顺序输 ...

  10. 《C语言程序设计》(谭浩强第五版) 第6章 利用数组处理批量数据 习题解析与答案

    你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题. 题目1:用筛选法求100 之内的素数. 解: 所谓"筛选法&q ...

最新文章

  1. Lossless Codec---APE代码解读系列(二)
  2. 【WEB安全】In0ri:基于深度学习的网站内容污染检测系统
  3. 将本地镜像发布到阿里云
  4. 在服务器使用mysql_Linux服务器---使用mysql
  5. switch和toggle在软件开发中的含义和区别
  6. 禁止选择文字和文本超出显示省略号
  7. Linux安装Prometheus
  8. 凸包算法-流程及代码简述
  9. 基于itext的pdf拼接
  10. Scala实现Kafka生产者与消费者实例
  11. dataframe按照拼音排序
  12. 毕达哥拉斯的数字和定理 -逻辑与算法之四
  13. win7虚拟机_win7系统如何安装virtual pc虚拟机 安装virtual pc虚拟机方法【介绍】
  14. zabbix 5.0所有依赖包_开源的Zabbix报表系统ZbxTable正式发布!
  15. 如何旋转反着的PDF文件
  16. 如何把C盘下用户的中文用户名改成英文用户名
  17. 安全问题的思考---君子不立于危墙之下
  18. 程序员眼中的优秀记帐软件
  19. 微信小程序 页面传参(url)参数过长报错解决办法
  20. PaaS将吞噬云计算?Kubernetes的市场冲击波

热门文章

  1. 《Python 编程从入门到实践》 ———— Python学习笔记完结篇
  2. conda cudnn版本升级_Ubuntu16.04深度学习环境+个人桌面配置(CUDA10.1 + cudnn8.0.4 + pytorch1.7)...
  3. PIE Engine系列1 遥感数据下载器的实现(含源码)
  4. 第一本微服务网关图书上市,详解 GitHub 28.3k+ 标星项目 Kong
  5. 背包九讲——全篇详细理解与代码实现
  6. java参数默认值_java函数参数默认值
  7. 联想小新潮7000-13 型号:LENOVO 81BS 制作黑苹果,MACos 10.14.2+WIN 10 双系统
  8. hp laserjet 1213 linux驱动下载,惠普HP LaserJet Pro M1213nf 一体机驱动
  9. macOS镜像下载(ISO、DMG)
  10. MFC BMP设置Bitmap的分辨率DPI为600点 gdiplus 生成标签