第四章 循环结构
while语句
while(表达式) //表达式为真循环执行,为假循环终止
{
循环体语句;
}
格雷戈里公式求π的近似值
用格雷戈里公式求π的近似值.精度eps,精确到最后一项得绝对值小于定精度eps
#include<stdio.h>
#include<math.h> //运用到数学函数,绝对值fabs( )
int main()
{
int denominator,flag,i; //有式子得,分母、正负号、项数、精度、项、和
double eps,item,pi;
scanf("%lf",&eps);
i=1; //循环初始化
flag=1;
denominator=1;
item=1.0;
pi=0; //累加值,初值为0
while(fabs(item)>=eps) //循环执行条件:项的绝对值大于定精度(精确到最后一项得绝对值小于定精度eps)
{ //执行条件是运用while语句的关键
pi=pi+item;
i++;
flag=-flag;
denominator=denominator+2;
item=flag*1.0/denominator; //item值计算得
}
pi=pi+item; //最后一项得出后,没有进行循环语句中的累加
pi=pi*4; //公式π/4=pi
printf("pi=%.4f\n",pi);
printf("i=%d\n",i);
return 0;
}
*重点:多个变量的确定、运行条件fabs(item)>=eps
、循环顺序以及对其的补充pi=pi+item;
多次输入数据
统计一批学生的平均成绩与不及格人数
scanf("%lf",&score); //*对第一输入数据执行程序
while(score>=0) //输入多个成绩,成绩为非负数,得运行条件
{
total=total+score; //total,总和
num++; //num,个数
if(score<60)
{
count++;
}
scanf("%if",&score); //*读入一个新数据,为下个循环做准备
}
if(num!=0){} //求平均数,average=total/num,分母num不能为0,故分支
else{}
return 0;
*重点:两个scanf()、循环运行条件score>=0
与for语句比较
*while构成简单,一个表达式和一条循环体语句
*转化
for(表达式1;表达式2;表达式3) // 表达式1;
{ // while(表达式2)
循环体语句; // { for循环体语句;
} // 表达式3;
// }
*择优
题目指定循环次数则用for语句;由某一项的值来控制循环则用while语句
do-while语句
do
{
循环体语句;
}
while(表达式); //注意要加‘;’
*for和while是循环前先判断条件,为真才进行。
do-while语句是先执行循环体,后判断循环条件,故循环至少进行一次
*小程序:统计位数
t_number=number;
if(number<0) //解决正负数据 ,用省略else的if语句
{
t_number=-t_number; // t_number:为保护输入数据number不该变,代替number执行下面的执行程序
}
do{
count++;
t_number=t_number/10; //位数用/10,重新赋值t-number
}while(t_number!=0); //判断循环条件
*小程序:逆序输出一个正整数
do{
printf("%d ",number%10); //直接取余,输出最后一位
number=number/10; //除10,消末位
}while(number!=0);
break语句
break语句的作用:为真,强制循环结束。除循环,还可用于switch语句,即只用于两个
continue语句:为真,跳过后面语句继续下一个循环。只能用于循环,一个
判断素数
#include<stdio.h>
#include<math.h>
int main()
{
int i,limit,m; //素数,确定范围
scanf("%d",&m); //分类讨论
if(m<=1) //不可能是;一定是;可能是(进行判断条件)
{
printf("no!\n");
}
else if(m==2)
{
printf("yes!\n");
}
else
{
limit=sqrt(m)+1;
for(i=2;i<=limit;i++) //进行循环条件是i<=limit
{
if(m%i==0){break;} //正常结束循环是i>limit
}
if(i>limit) { printf("yes!\n");}
else { printf("no!\n"); }
}
return 0;
}
进阶版,求m到n之间的全部素数
自测
#include<stdio.h>
#include<math.h>
int main()
{
int i,k,limit,flag,m,n,count;
scanf("%d%d",&m,&n); //漏打函数scanf(),无法输入
if(m<1||n>500||m>n){ printf("Invalid.\n") ; }
else
{
for(k=m;k<=n;k++)
{
if(k<=1) { flag=0; }
else if (k==2){ flag=1; }
else
{
flag=1; //先假设k为素数
limit=sqrt(k)+1;
for(i=2;i<=limit;i++)
{
if(k%i==0) //素数条件,写反了
{ flag=0;
break; //漏打break语句,运行时间变长
}
}
}
if(flag==1) //不知道在哪里进行flag取值判断结果 通过flag取值,对外循环进行的k进行结果表示
{
printf("%6d",k);
count++;
if(count%10==0){ printf("\n"); }
}
}
}
return 0;
}
*flag表示是否为素数
求1!+2!+…+n!
方法1:定义和调用函数
#include<stdio.h>
double fact(int n); //定义和调用求阶层函数fact(),有“;”
int main()
{
int i,n; //
double sum; //
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
{
sum=sum+fact(i);
}
printf("1!+2!+...+%d!=%.0f\n",n,sum);
return 0;
}
double fact(int n) //定义函数,注意格式
{
int i;
double result;
if(n<0) //分类情况
{
return 0;
}
result=1;
for(i=1;i<=n;i++)
{
result=result*i;
}
return result; //返回所需值,result
}
带程序除了可以通过调用函数实现,也可通过,嵌套循环实现。
方法2:嵌套循环
sum=0; //sum和item的数值初始化不要放错位置
for(i=1;i<=n;i++) //区别i与j 数!i=数 有1到n个 表示阶乘的个数
{
item=1; //item放在这表示每一次进入内循环,item的值重新为1
for(j=1;j<=i;j++) // 求阶乘 i!=1*2*3*...*i 表达阶乘的单个值
{
item=item*j;
}
sum=sum+item;
}
循环结构程序设计
求最值问题
//从输入的n个成绩中选出最高分,用for语句
int i,n,mark,max;
scanf("%d",&n);
scanf("%d",&mark);
max=mark; //先将第一输入的分数赋值给max
for(i=i;i<n;i++)
{
scanf("%d",&mark);
if(mark>max) //通过比较,之后输入的mark和当前的max,确定是否重新赋值max
{
max=mark;
}
}
printf("Max is %d\n",max);
//从输入的一批以负数结束的成绩中选出最高分,用while语句
while的执行循环条件是mark>=0
斐波那契数列
1,1,2,3,5,8,… ,n
运用迭代法——一个不断从变量的旧值递推新值的过程
//输入正整数n(1<=n<=46),输出前n项
#include<stdio.h>
int main()
{
int i;n;x1;x2;x;
scanf("%d",&n); //n确定个数
if(n<1||n>46){ printf("Invalid.\n")} //范围确定
else if(n==1){ printf("%10d",1)} //%10d 输出格式:在输出值前有10个空格
else
{
x1=1;
x2=1;
printf("%10d%10d",x1,x2);
for(i=3;i<=n;i++) //从第三个数开始进行循环
{
x=x1+x2; //得到新值
printf("%10d",x); //将新值输出
if(i==5){ printf("\n"); } //要求5个换行
x1=x2; //更新x1和x2
x2=x;
}
}
return 0;
}
习题解惑
++i:先加后赋值
i++:先赋值后加
do-while语句结束循环,2种,break和条件表达式为假(0)
求序列和 s=1+12+123+1234+12345
int i,s=0,t=0; //变量 t 用于存放其表达式的各项
for(i=1;i<=5;i++)
{
t=10*t+i; //关键步:t=t*10+i
s=s+t; //由于 i =1时,要使得 t =1; i =2时,要使得 t =12; i =3时,要使得 t =123;依此类推。
} //故每一次循环的 t 的值与此次的 i 及上次的 t 密切相关
printf("%d",s); //即每一次的 t 值可用上次的 t 乘以10再加上此次的 i 的值代替
int i,s=0,t=0; //变量 t 用于存放其表达式的各项
for(i=1;i<=5;i++)
{
t=10*t+i; //关键步:t=t*10+i
s=s+t; //由于 i =1时,要使得 t =1; i =2时,要使得 t =12; i =3时,要使得 t =123;依此类推。
} //故每一次循环的 t 的值与此次的 i 及上次的 t 密切相关
printf("%d",s); //即每一次的 t 值可用上次的 t 乘以10再加上此次的 i 的值代替