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

第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} 121+31+41+...+9911001的值。

//求多项式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 b24ac>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 b24ac0
需要在程序中进行判别,如果 b 2 − 4 a c ≥ 0 b^2-4ac\ge0 b24ac0,就计算并输出方程的两个实根。
否则,输出“此方程无实根”的信息。

// 在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π131+5171+... π \pi π得近似值,直至发现某一项的绝对值小于 1 0 − 6 10^{-6} 106为止(该项不累加)。

// 用公式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=Fn1+Fn2(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.】

  • 14
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值