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 − 1 2 + − 1 3 + − 1 4 + . . . + 1 99 − 1 100 1-\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】有人用温度计测量出华氏法表示的温度(如 6 4 o F 64^oF 64oF),今要求把它转换为以摄氏法表示的温度(如 17. 8 o C 17.8^oC 17.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】 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0方程的根。 a , b , c a,b,c a,b,c由键盘输入,设 b 2 − 4 a c > 0 b^2-4ac>0 b2−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的基础上对程序进行改进。
题目要求解得 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0的根。有键盘输入 a , b , c a,b,c a,b,c。假设 a , b , c a,b,c a,b,c的值任意,并不保证 b 2 − 4 a c ≥ 0 b^2-4ac\ge0 b2−4ac≥0。
需要在程序中进行判别,如果 b 2 − 4 a c ≥ 0 b^2-4ac\ge0 b2−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 , c a,b,c a,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;
else
if(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;
else
leap=0;
}
else
leap=1;
}
else
leap=0;
if(leap)
printf("%d is",year);
else
printf("%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;
else
leap=1;
*/
//或者
/*
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
else
leap=0;
*/
【例4.9】求 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+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));
else
if(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 + . . . + 100 1+2+3+...+100 1+2+3+...+100,即 ∑ n = 1 100 n \sum_{n=1}^{100}n ∑n=1100n。
// 求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 + . . . + 100 1+2+3+...+100 1+2+3+...+100,即 ∑ n = 1 100 n \sum_{n=1}^{100}n ∑n=1100n。
// 用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 − 1 3 + 1 5 − 1 7 + . . . \frac{\pi}{4}≈1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+... 4π≈1−31+51−71+...求 π \pi π得近似值,直至发现某一项的绝对值小于 1 0 − 6 10^{-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个数开始,该数是前面两个数之和。
{ F 1 = 1 ( n = 1 ) F 2 = 1 ( n = 2 ) F n = F n − 1 + F n − 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. ⎩⎪⎨⎪⎧F1F2Fn=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]赋初值1
for(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 3
4 5 6]
b=[ 1 4
2 5
3 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;
else
return 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;
else
c=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语言程序设计(谭浩强第五版)——例题
发布评论