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

2023-11-02

第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.】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • android 开发时出现 Please ensure that adb is correctly located at '...\adb.exe' and can be executed

    android 开发时出现 Please ensure that adb is correctly located at adb exe and can be executed 分类 android 2013 10 21 14 51 446
  • 解决图片太大溢出问题、CSS 限制图片最大宽度、图片按比例自动缩放

    在网上找了很久 这里保存一下 方便以后使用 实现思路很简单 改造js代码 既然图片很大 那么我们先用最经典的限制width的方法限制大图的宽度 但是小图怎么办 小图我们用onload的方法再缩小 就这么搞定了 完美代码如下 对应的JS代码
  • 【chatgpt谈前端三大主流框架】React、Vue和Angular的优缺点及如何选择

    文章目录 React 优点 缺点 Vue 优点 缺点 Angular 优点 缺点 总结 脑筋急转弯小程序抢先体验 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿的个人社区 专栏地址 vue2从入门到精
  • JavaWeb Maven 所需jar包

    JavaWeb Maven 所需jar包
  • esp32cam 服务端远程视频方案

    esp32cam 服务端远程视频方案 现有功能更完善的服务端视频方案 开源地址 https gitcode net qq 26700087 lightcam 功能更全的esp32监控 部署起来会麻烦一些 但功能更加完善 说明 本方案为esp
  • FPGA的基础结构

    深入理解 FPGA 的基础结构 知乎 zhihu com 原理和结构 FPGA的构成要素 逻辑要素 逻辑块 Logic Block LB 用于实现逻辑电路 可编程逻辑的逻辑块的实现方式有乘积项 查找表 数据选择器 Multiplexer M
  • 搭建三节点的kubernetes(K8S)集群

    Kubernates安装配置文档 先决条件 1 需要的yaml文件所在的github地址如下 https github com luckylucky421 kubernetes1 17 3 tree master 2 下文里初始化k8s集群
  • Jupyter notebook快速入门教程

    本篇将给大家介绍一款超级好用的工具 Jupyter notebook 为什么要介绍这款工具呢 如果你想使用Python学习数据分析或数据挖掘 那么它应该是你第一个应该知道并会使用的工具 它很容易上手 用起来非常方便 是个对新手非常友好的工具
  • Matlab快速创建矩阵的方法(创建特殊矩阵)

    在matlab的使用过程中经常会需要用到矩阵 有时想要创建一些数据比较多的矩阵 对矩阵的内容要求可能并不高或者要创建一些特殊矩阵 下面将提供一些matlab内部提供的一些快速创建矩阵的方法 1 创建单位矩阵 eye n 创建n n的单位矩阵
  • GitHub托管HTML页面,让其他人轻松访问自己的页面

    如何通过GitHub来托管自己写的HTML页面 能够轻松让其他人访问你的页面 还可以通过GitHub让多人参与进来你的项目 以下是详细步骤 1 创建账户 登陆https github com 注册成功 1 https guides gith
  • SpringBoot2.0学习笔记:(九) Spring Boot中集成Mybatis与Druid

    一 项目的搭建 Druid对Spring boot做了很好的适配 所有的工作都只需要在配置文件中完成 具体的Druid在Spring Boot中的配置可以看 GitHub文档 首先看一下项目引入的jar包
  • flink学习46:flinkSQL自定义函数

    标量函数 实例 表值函数 聚合函数
  • 点击登录按钮弹出登录模态框

  • 拯救者y7000笔记本VMware虚拟机打开蓝屏问题

    VMware虚拟机安装后开启虚拟机蓝屏检查步骤 一 必须确定你的CPU开启了虚拟化才行 要先开启虚拟化再去控制面板里设置 查看是否开启虚拟化方法 在win10系统最下方任务栏空白处 右键鼠标打开任务管理器 也可以点击快捷键Ctrl Alt
  • go语言实现邮件发送

    go语言实现邮件发送 安装相关的包 go get github com jordan wright email 代码篇 package main import fmt github com jordan wright email log n
  • Zotero软件与ChatGPT连用模版

    Zotero软件与ChatGPT连用模版 整体流程 其他配置 全文 AskPDF position 10 color 0EA293 trigger 本文 这篇文章 论文 You are a helpful assistant Context
  • 缓存一致性问题解决方案

    通常情况下 我们使用缓存的主要目的是为了提升查询的性能 大多数情况下 是这样使用缓存的 当数据库有数据更新时 在很长的一段时间内 决定于缓存的过期时间 用户请求从缓存中获取到的都可能是旧值 而非数据库的最新值 那么 该如何更新缓存呢 目前有
  • Python实现电商订单的数据分析

    一 数据信息 数据集 阿里云天池 数据来源 说明 本数据集共有104557条数据 共计11个字段 字段 id 序号 orderID 订单id userID 用户id goodsID 商品id orderAmount 订单总额 payment
  • 【Python刷题】P1

    Python刷题P1 第一题 第二题 第一题 1 给定一个非空的字符串 s 检查是否可以通过由它的一个子串重复多次构成 示例 1 输入 s abab 输出 true 解释 可由子串 ab 重复两次构成 示例 2 输入 s aba 输出 fa
  • C语言程序设计(谭浩强第五版)——例题

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