//习题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);
}
}
}
}
}
}