【个人回顾】C语言程序设计-第三版-何钦铭主编-4

         写在开头:本文不以分享为目的,只是记录自己课程学习过程中觉得重要的部分知识点或者知识体系,以及可能存在的没有解决的问题,欢迎大家来进行交流和指正,其中ps部分为个人将其他学科与其构建联系的个人理解,因此也欢迎您能花费一部分时间帮我进行查漏补缺或者进行指点,学生拜谢。Orz
        ·本章内容同步于浙江大学何钦铭教授编写的第三版C语言程序设计中第四章的内容,包括课后习题自己所编写的代码将会放在最后。

正文部分

        第三章讲了分支结构来处理当我们遇到不同要求的时候进行不同的处理,那么当我们需要反复执行某些操作来实现对应的目的时,我们就需要使用循环结构。循环结构需要明确两个问题:哪些操作需要反复执行?在什么情况下来反复执行?这两个问题分别对应循环体和循环条件,也是循环程序的实现要点。

本章要点

        1、什么是循环?为什么要使用循环?如何实现循环?

答:循环即将某些操作反复执行,当我们需要重复执行某些操作时,就要使用循环。通常明确了循环体和循环条件后就可以用C语言提供的循环语句来实现循环。

        2、实现循环时。如何确定循环条件和循环体?

答:循环条件即在什么情况下来重复执行,循环体即哪些操作需要反复执行。

        3、怎样使用while和do-while语句实现次数不确定的循环?

答:while语句的格式为:while(表达式){循环体},当表达式所给出的循环条件为真时,循环按照循环体进行循环。在循环体中对循环变量的值进行改变,就可以使满足条件时跳出循环。

        do-while语句的格式为do{循环体}while(表达式)。先执行一遍循环体后,检查表达式。当表达式给出的循环条件为真时,循环按照循环体进行循环,在循环体中对循环变量的值进行改变,就可以使满足条件时跳出循环。

        4、while和do-while语句有什么不同?

答:while语句会首先判断循环条件是否为真,为真才会进行循环。即从0次开始循环。

        do-while语句会首先执行一次循环,然后判断循环条件是否为真,为真后继续循环,为假时跳出循环。即从1次开始循环。

        5、如何使用break语句处理多循环条件?

答:将break语句与if语句配合使用,即条件满足时才执行break来跳出循环。否则意味着永远不会执行循环体中break语句后面的其他语句

        6、如何实现多重循环?

答:通过嵌套不同的循环来实现多重循环。每次执行内层循环后,由外层循环来重置内层循环的循环条件,进而再次从头开始执行内层循环使满足要求。直到满足外层循环的循环条件,直接跳出循环。

个人知识点总结部分

        1、while语句的表达式可以是任意合法的表达式,即可以不显式的给出循环条件,而进行精度要求。应用范围更广。循环体语句只能是一条语句。(可用大括号嵌套,参考前文提到的。)

        2、while语句特点:构成简单,只有一个表达式和一个循环体语句,可以直接把循环问题的的分析设计转换为语句实现。

        3、循环的实现一般包括4部分,分别为初始化、条件控制、重复的操作(循环体)和通过改变循环变量的值最终改变条件的真假性。

        4、题目中指定了循环次数,使用for语句更清晰。其他情况下,多使用while语句。而do-while语句更适合先循环后判断循环条件的情况,一般在循环体的执行过程中明确循环控制条件。

        5、do-while中的表达式可以使任意合法的表达式,循环体语句只能是一条语句,使用时需要另加初始化的部分,循环体语句必须包括能最终改变条件真假性的操作。

        6、素数判断时,只需要循环条件i满足i>m/2即可判定m为素数。

        7、break为强制循环语句,执行会使得循环提前结束,不再执行循环体中位于其后的其他语句。continue语句的作用是跳过循环体重continue后面的语句,继续下一次循环。一般也需要和if语句配合使用。

        8、break与continue的区别:break结束循环,而continue只是跳过后面语句继续循环,break除了用于终止循环歪,还用于switch语句。而continue只用于循环。

        9、函数声明应在主函数之前。(存疑)

        10、对嵌套循环初始化时,一定要分清内外层循环。

 习题部分

1.求奇数和。输人一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相应程序。

#include<stdio.h>
#include<math.h>
int main(void)
{
	int i,sum,item;
	sum=0;
	printf("enter numbers:");
	scanf("%d",&item);
	while(item>0)
	{
		if(item%2!=0)
			sum=sum+item;
		scanf("%d",&item);
	}
printf("the sum of odd is %d\n",sum);
}

2. 展开式求和。输人一个实数x,计算并输出下式的和,直到最后一项的绝对值小于0.00001,计算结果保留4位小数。要求定义和调用函数fact(n)计算n的阶乘,可以调用pow ()函数求幂。试编写相应程序。

        s=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\cdots

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
	/*目的是实现s=1+x+x^2/2!+……的循环*/
	int i,x;/*定义循环次数x和循环变量i*/
	double s,item;/*定义求和和循环体变量*/
	printf("enter a number:");
	scanf("%d",&x);
	s=1;/*定义初值*/
	/*循环体*/
	for(i=1;i>0;i++)
{	
		item=pow(x,i)/fact(i);/*循环项目为x的i次方比上i的阶乘*/
	/*printf("item%d=%f\n",i,item);这个是中间值看有没有正确运转的*/
		if(fabs(item)<0.00001)/*绝对值给定跳出循环的范围*/
			break;
		else
			s=s+item;
	}
	/*输出结果*/
printf("s=1+x+...=%.4lf\n",s);
return 0;
}
/*阶乘函数定义*/
double fact(int n)
{
	int i;
	double result;
	result=1;
	for(i=1;i<=n;i++)
	result=result*i;
	return result;
}

3.求序列和。输人一个正整数n,输出2/1+3/2+5/3+8/5 +..的前n项之和,保留2位小数。该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。试编写相应程序。

#include<stdio.h>
#include<math.h>
int main(void)
{
	int i,n;
	double a,b,c;
	double item,sum;
	printf("enter the limit number n=:");
	scanf("%d",&n);
	sum=0;
	a=1.0;
	b=2.0;
	for(i=1;i<=n;i++)
	{
		item=b/a;/*中间监测点
printf("item=%.2f\n",item);*/
		c=b;
		b=a+b;
		a=c;
		sum=sum+item;
	}
printf("sum=%.2f\n",sum);
return 0;

}

4.求序列和。输人两个正整数a和n,求a+aa+aaa+aa...a (n个a)之和。例如,输入2和3,输出246 (2 +22 + 222)。试编写相应程序。

#include<stdio.h>
#include<math.h>
int main(void)
{
	int i,a,n;
	double item,sum;
	printf("enter the bottle number:");
	scanf("%d",&a);
	printf("enter the limit time number:");
	scanf("%d",&n);
	sum=0;
	item=0;
	for(i=1;i<=n;i++){
		item=10*item+a;
		sum=sum+item;
	}

	printf("the sum is %.0f\n",sum);
	return 0;
}

5.换硬币。将一笔零钱(大于8分,小于1元,精确到分)换成5分、2分和1分的硬币,每种硬币至少有一枚。输人金额,问有几种换法?针对每一种换法,输出各种面额硬币的数量和硬币的总数量。试编写相应程序。

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
int cent,five,two,one;
printf("enter the cent from 8 to 10:");
scanf("%d",&cent);
if(cent>=8&&cent<=10)
for(five=1;five<=2;five++)
for(two=1;two<=5;two++)
for(one=1;one<=10;one++)
if(5*five+2*two+1*one==cent)

printf("five cent=%d,two cent=%d,one cent=%d\n",five,two,one);
return 0;
}

6.输出水仙花数。输人一个正整数n (3≤n≤7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于它本身。

例如153的各位数字的立方和是1^3+5^3+3^3=153。试编写相应程序。

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
int q,i,count;
int a,b;
int n,number,sum;
printf("enter a number from 3 to 7:");
scanf("%d",&n);
a=pow(10,n-1);
b=pow(10,n);
if(n<3||n>7)
printf("enter wront number\n");
else
for(i=a;i<=b;i++){
	number=i;
	sum=0;
	while(number!=0){
		q=number%10;
		number=number/10;
		sum=sum+pow(q,n);
	}
	if(sum==i)
		printf("%d\n",i);
}
return 0;
}

7.求最大公约数和最小公倍数。输人两个正整数m和n (m≤1 000,n≤1 000),求其最大公约数和最小公倍数。试编写相应程序。

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
	int a,i,m,n;
	int max,min;
	printf("enter two number:");
	scanf("%d%d",&m,&n);
	if(n>1000||m>1000){
	printf("enter wrong number:");
	return 0;}
		for(i=1;i<1000;i++)
		{
			if((m%i==0)&&(n%i==0))
				max=i;
		}
		min=m*n/max;
printf("the 最大公约数 is %d\nthe 最小公倍数 is %d\n",max,min);

}

8.高空坠球。皮球从height (米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹......如此反复。问皮球在第n次落地时,在空中- -共经过多少距离?第n次反弹的高度是多少?输出保留1位小数。试编写相应程序。

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
	int i,n;
	double height,sum;
	printf("enter height =:");
	scanf("%lf",&height);
	printf("enter a number n:");
	scanf("%d",&n);
	sum=0;
	for(i=1;i<=n;i++)
	{	height=height*0.5;
	sum=sum+height;}
	printf("the %d times height is %f\n,the total height is %f\n",n,height,sum);
}

9.打印菱形星号“*”图案。输人一个正整数n (n为奇数),打印一个高度为n的“*”菱形图案。例如,当n为7时,打印出以下图案。试编写相应程序。

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
int i,j,n;
int a,b;
printf("enter a odd number n=:");
scanf("%d",&n);
a=(n+1)/2;
b=(n-1)/2;
if(n%2==0){
printf("enter wrong number.\n");
return 0;}
for(i=1;i<=a;i++){
	for(j=2*(a-i);j>0;j--)
		printf(" ");
	for(j=1;j<=2*i-1;j++)
		printf(" *");
	printf("\n");
}
for(i=1;i<=b;i++){
	for(j=1;j<=2*i;j++)
			printf(" ");
	for(j=1;j<=2*(a-i)-1;j++)
		printf(" *");
	printf("\n");
}
return 0;
}

10.猴子吃桃问题。一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第n天早上想再吃时,只剩下一个桃子了。问:第一天共摘了多少个桃子?试编写相应程序。(提示:采取逆向思维的方法,从后往前推断)

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
int i,n;
double a;
printf("enter day:");
scanf("%d",&n);
a=1;
for(i=1;i<=n-1;i++)
{
	a=(a+1)*2;
}
printf("the first day had catch  peach number is %.0f\n",a);
return 0;
}

11.兔子繁衍问题。一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到n对?输入一个不超过10 000的正整数n,输出兔子总数达到n最少需要的月数。试编写相应程序。
 

#include<stdio.h>
#include<math.h>
double fact(int n);
int main(void)
{
	int i,pair;
	int n;
	printf("enter number pair of rabbit :");
	scanf("%d",&n);
	i=1;
	pair=1;
	while(pair<n){
		i=i+3;
		pair=pair*2;
	}
	printf("the month is %d\n",i);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值