第五章 循环结构程序设计

//习题1.请画出例5.6中给出的3个程序段的流程图
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述


//习题2.请补充例5.7程序,分别统计当“fabs(t)>=1e-6”和“fabs(t)>=1e-8”时执行循环的次数。
#include <stdio.h>
#include <math.h> //程序中用到的数学函数fabs,应包含头文件math.h
int main()
{
	int sign=1,count=0; //sign用来表示数值的符号
	double pi=0.0,n=1.0,term=1.0; //pi开始代表多项式的值,最后代表3.1415926........,n代表分母
								 //term代表当前值的项
	while(fabs(term)>1e-8)
	//while(fabs(term)>1e-6)//检查当前项term的绝对值是否大于或等于10^-6
	{
		pi=pi+term;//把当前项term累加到pi中
		n=n+2;//n+2是下一项的分母
		sign=-sign;//sign代表符号,下一项的符号与上一项符号相反
		term=sign/n;//求出下一项的值term
		count++;//这是添加的统计执行次数的一行执行次数
	}
	pi=pi*4; //多项式的和pi乘以4,才是派的近似值
	printf("pi=%10.8f\n",pi);//输出pi的近似值
	printf("程序执行了%d次",count);
	return 0;
}

//习题3.输入两个正整数m和n,求其最大公约数和最小公倍数。
#include <stdio.h>
int main()
{
	int n,m;
	int a,b,t;
	printf("请输入n和m,一回车代表一个数字:\n");
	scanf("%d%d",&n,&m);
	//求最大公约数
	a=(n>m?n:m);b=(n<m?n:m);//a存放两数最大值,b存放两数最小值
	while(a%b>0)
	{	
		t=a%b;
		a=b;
		b=t;
	}
	//求最小公倍数
	//最小公倍数=两整数的乘积÷最大公约数
	printf("%d和%d的最大公约数为%d,最小公倍数为%d\n",n,m,b,(n*m/b));
	return 0;
}

//习题4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include <stdio.h>
int main()
{
	char ch;
	int zmcount=0,kgcount=0,numcount=0,qtcount=0;
	printf("请输入一串字符:\n");
	do
	{
		scanf("%c",&ch);
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			zmcount++;
		else if(ch==' ')
			kgcount++;
		else if(ch>='0'&&ch<='9')
			numcount++;
		else
			qtcount++;
	}while(ch!='\n');
	printf("英文字母有%d个:\n",zmcount);
	printf("空格有%d个:\n",kgcount);
	printf("数字有%d个:\n",numcount);
	printf("其他字符有%d个:\n",qtcount-1);//除去空格
	return 0;
}

//习题5.

这里是引用

#include<stdio.h>
#include<math.h>
int main()
{
	int n,sum=0,a=2;
	printf("请输入一个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{	
		sum+=a;
		a=a*10+a%10;
	}
	printf("Sn=%d",sum);
	return 0;
}

//习题6.

这里是引用

#include <stdio.h>
void main()
{
	int i,j,sum=0;
	for(i=1;i<=20;i++)
	{
		int pro=1;//用来存放每一个数的阶乘
		for(j=1;j<=i;j++)
		{
			pro*=j;
		}
		sum+=pro;
	}
	printf("1--20的阶乘之和为:%d",sum);
}

//习题7.

这里是引用

#include <stdio.h>
void main()
{
	int i,sum=0;
	for(i=1;i<=100;i++)
	{
		sum+=i;//1-100的和
	}
	for(i=1;i<=50;i++)
	{
		sum+=(i*i);//1-50的平方的和
	}
	for(i=1;i<=10;i++)
	{
		sum+=(1/i);//1-10分之一的和
	}
	printf("1-100、/1-50的平方、1-10分之一的和为%d",sum);
}

//习题8.

这里是引用

#include <stdio.h>
void main()
{
	int a,b,c,i;
	for(i=100;i<1000;i++)
	{
		//分别取出各位数字
		a=i%10;
		b=i%100/10;
		c=i/100;
		//判断它每一位的三次方之和是否等于其本身,如果是,输出
		if(a*a*a+b*b*b+c*c*c==i)
			printf("%d\t",i);
	}
}

//习题9.一个数如果恰好等于它的因子之和,这个数就是“完数”。例如,6的因子之和为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:

6 its factors are 1,2,3

#include <stdio.h>
void main()
{
	int i,j,pro;
	for(i=2;i<1000;i++)
	{
		pro=0;
		for(j=1;j<i;j++)
		{
			if(i%j==0) //求出每一个因子
				pro+=j;
		}
		if(pro==i) //判断是否为完数
		{
			printf("%d its factors are",i);
			for(j=1;j<i;j++)
			{
				if(i%j==0)
					printf("%d\t",j);
			}
			printf("\n");
		}
		
	}
}

//习题10.

这里是引用

#include <stdio.h>
void main()
{
	int i;
	float sum=2;//把第一项直接加进去
	float f1=2,f2=1,t;//f1为分子,f2为分母
	for(i=0;i<19;i++)//由于第一项已经加如sum,所以只需要加19次
	{
		t=f1;
		f1=f1+f2;
		f2=t;
		sum+=f1/f2;
	}
	printf("这个数列的前20项之和为:%d",sum);
}

//习题11.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第十次落地时共经过了多少米,第十次反弹多高。
#include <stdio.h>
void main()
{
	int i;
	float sum=100,a=100;//把第一次落地时经过的100m加进去
	for(i=1;i<=10;i++)
	{	a/=2;
		if(i==10)
		{
			printf("第十次落地反弹%fm\n",a);
			break;//第十次落地之后不在计算经过的距离
		}
		sum+=a*2;
	}
	printf("第十次落地经过了%fm\n",sum);
}

//习题12.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天早上想再吃时,就只剩下一个桃子了。求第一天共摘多少个桃子。
#include <stdio.h>
void main()
{
	int peach=1,i;
	for(i=9;i>=1;i--)
	{
		peach=(peach+1)*2;//前一天的桃子等于后一天的桃子加一的两倍
	}
	printf("第一天总过摘了%d个桃子\n",peach);
}

//习题13.

这里是引用

#include<stdio.h>
#include<math.h>
void main()
{
	float x1,x0,a;
	printf("请输入a:");
	scanf("%f",&a);
	x1=1.0;//可以任意赋值
	do
	{
		x0=x1;
		x1=(x0+a/x0)/2;
	}while(fabs(x0-x1)>=1e-5);
	printf("%.2f",x1);
}

//习题14.

这里是引用

#include <stdio.h>
#include <math.h>
int main()
{
	double x1=0,x2=1.5,fx1,fx2;
	do
	{
		x1 = x2;
        fx1 = 2 * x1*x1*x1 - 4 * x1*x1 + 3 * x1 - 6;
        fx2 = 6 * x1*x1 - 8 * x1 + 3;
        x2 = x1 - fx1 / fx2;
	}while(fabs(x1-x2)>=1e-7);
	printf("x=%.2lf",x2);
}

//习题15.

这里是引用

#include <stdio.h>
#include <math.h>
//将x代入原方程求得数 
double fun(double x)
{
	double f;
	f = (2 * pow(x,3) - 4 * pow(x,2) + 3 * x - 6);
	return f;
}
int main()
{
	double a = -10.0,b = 10.0,x;
	x = (a + b) / 2;
	
	//这里是二分法的方法 
	while(fun(x) != 0)
	{
		if(fun(a)*fun(x) < 0)
		{
			b = x;
		}
		if(fun(b)*fun(x) < 0)
		{
			a = x;
		}
		x = (a + b) / 2;
	}
	
	printf("根为:%lf",x);
 } 

//习题16.输出以下图案:

这里是引用

#include<stdio.h>
void main()
{
	int i,j,k;
	//以下是上四行
	for(i=1;i<=4;i++)//行
	{
		for(k=1;k<=4-i;k++)//空格
		{
			printf(" ");
		}
		for(j=1;j<=2*i-1;j++)//*
		{
			printf("*");
		}
		printf("\n");
	}
	for(i=1;i<=3;i++)
	{
		for(k=1;k<=i;k++)
		{
			printf(" ");
		}
		for(j=1;j<=7-2*i;j++)
		{
			printf("*");
		}
		printf("\n");
	}
}

//习题17.两个乒乓球队进行比赛,各出3人。甲队为A、B、C3人,乙队为X、Y、Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编程序找出3对赛手的名单。
#include<stdio.h>
void main()
{
	int i,j,k;
	for(i='X';i<='Z';i++)//可能与A要比的
	{
		for(j='X';j<='Z';j++)//可能与B要比的
		{
			if(i!=j)//一个人只能比一次
			{
				for(k='X';k<='Z';k++)//可能和C要比的
				{
					if(i!=k&&j!=k)//一个人只能比一次
					{
						if(i!='X'&&k!='X'&&k!='Y')//A不和X比,C不和X、Y比
							printf("A--%c\nB--%c\nC--%c\n",i,j,k);
					}
				}
			}
		}	
	}
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值