14C++循环结构-while循环(1)
一、while语句
问题:试编一程序,在屏幕上输出1~5这几个数字。
今天,我们用while语句来编写这个程序。while语句的特点是先判断表达式,后执行语句。其一般形式为:
while(表达式)
语句;
当表达式的值为真(非0)时,就不断地执行循环体内的语句,所以while循环称为当型循环。while语句的执行过程如图

解决问题程序流程图:

#include <iostream>
using namespace std;
int main()
{
int i=1;
while(i<=5)
{
cout<<i<<endl;
i++;
}
return 0;
}
注:while循环的循环体若由多个语句组成,则须将多个语句用“{}”括起来,成为一个复合语句。
英汉小词典:
while[wail]当··的候
练习:
(1)一片容量为16GB的SD卡能存储大约( )张大小为2MB的
数码相片。
A.4000 B.8000 C.1600 D.16000
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int i=0;
while(i<=8)
{
cout<<i<<' ';
i=i+4;
}
cout <<i<<endl;
return 0;
}
i的输出:______________
(3)完善程序。
求6+12+18+24+·+180的和是多少。
#include<iostream>
using namespace std;
int main()
{
int i=6, sum=0;
while(i<=180)
{
_________________;
_________________;
}
cout <<"sum="<< sum <<endl;
return 0;
}
二、死循环
问题:“阿门阿前一棵葡萄树,阿嫩阿嫩绿的刚发芽,蜗牛背着那重重的壳呀,一步一步地往上爬···”有一棵光滑的葡萄树高17分米,一只蜗牛从底部向上爬,每分钟爬3分米,但每爬一分钟后都要休息一分钟,休息期间又要滑下1分米。
试编一程序,计算该蜗牛需要多少分钟才能爬到树顶。
用变量t表示蜗牛爬树时用的时间,i表示向上爬的分米数。流程图如图:

#include <iostream>
using namespace std;
int main()
{
int i,t;
t=i=0;
while(1)
{
t++;
i+=3;
if (i>=17) break;
t++;
i--;
}
cout<<"需要"<<t<<"分钟"<<endl;
return 0;
}
while(1)中条件是1,它的值永远为真,若在循环体中没有break语句来终止循环,则会形成死循环。一般情况下,编程中要尽量避免出现死循环,但在实际应用中,有时也需要用到死循环。在单片机、嵌入式编程中经常要用到死循环。
同时,不存在一种算法,能够判断任何程序是否会出现死循环。因此,任何编译系统都不做死循环检查。
练习:
(1)语句“while(1)cout<<'?;'是一个死循环,运行时它将无休止地打印问号。下面关于死循环的说法中,正确的是( )。
A.一个无法靠自身的控制终止的循环称为“死循环”
B.有些编译系统可以检测出死循环
C.死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
D.死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也是可以检测的
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int i=10,n;
cin>>n;
while(true)
{
cout<<i;
if(i<=n)break;
i-=3;
}
return 0;
}
输入:5
i,n的输出:_________________
(3)完善程序。
求风之巅小学某次信息学竞赛同学们的平均分,以-1表示输入结束。
#include <iostream>
using namespace std;
int main(){
int i=0;
float n, pjfen, sum=0.0;
cin>>n;
while(_____)
{
i++;
_____;
cin>>n;
}
if(i!=0)
{
pjfen=sum/i;
cout<"平均分:"<<pjfen;
}
return 0;
}
三、枚举算法
问题:尼克和格莱尔两人每隔不同天数都要到雷锋馆去做义工。尼克3天去一次,格莱尔4天去一次。有一天,他俩恰好在雷锋相遇,问至少再过多少天他俩又会在雷锋馆相遇?
试编一程序,求出他俩下次相遇最小的天数。
这是求两个数的最小公倍数问题,最小公倍数一定是大数的倍数,先从中找出大的数,然后从大数的1倍、2倍、3倍··依次枚举,找到第1个也是小数倍数的数,这个数就是它们的最小公倍数。流程图如图:

#include <iostream>
using namespace std;
int main()
{
int x,y,temp,s,i=1;
cout<<"请输入两个自然数:";
cin>>x>>y;
if(x>y)
{
temp=x;
x=y;
y=temp;
}
s=y*i;
while(s%x!=0)
{
i++;
s=y*i;
}
cout<<"最小公倍数:"<<s<<endl;
return 0;
}
当然也可以从较小的数的1倍、2倍、3倍……依次枚举,找到第1个也是大数倍数的数就是最小公倍数。但枚举的次数会变多,运行时间会变长。
练习:
(1)
(2)阅读程序写结果。
#include <siostream>
using namespace std;
int main()
{
int s,n.a;
s=0;
a=10;
cin>>n;
while(a>n)
{
s++;
a=2;
cout<<s<<endl;
return 0;
}
输入:2
s,n,a的输出:_________________
(3)完善程序。
尼克参加了多次信息学比赛,在最近一次比赛时发现,如果这次比赛他得了98分,那么他所有比赛的平均分是92分;如果这次得了78分,他的平均分是87分,尼克共参加了多少次比赛?
#include <iostream>
using namespace std;
int main()
{
int _____;
x=2;
while(92*x-98!=87*x-78)
______________________;
cout<<x<<endl;
return 0;
}
四、辗转相除法
问题:尼克有一根长15米的铁丝,格莱尔有一根长18米的铁丝,要把它们截成同样长的小段,不许剩余,每段最长有几米?试编一程序,求出每段最长的米数。
这是求最大公约数的问题。两根铁丝的长度分别用m和n表示,采用辗转相除法求最大公约数,其思路是:
(1)求m除以n的余数r。
(2)当r==0时,则n为最大公约数,输出n并结束程序;当r!=0,执行(3)。
(3)将n的值赋给m,将r的值赋给n;再求m除以n的余数r。
(4)转到第2步。流程图如图:

#include <iostream>
using namespace std;
int main()
{
long long m,n,r;
cout<<"输入两个正整数:";
cin>>m>>n;
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
cout<<"最大公约数:"<<n<<endl;
return 0;
}
练习:
(1)请问21和14的最大公约数用二进制表示为( )
B.(00000111)2
A.(00000101)2
D.(10001110)2
C.(00001000)2
2.阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int x, y, temp, ans;
cin>>x>>y;
if(x<y)
{
temp=x;
x=y;
y=temp;
}
while(x!=y)
{
x-=y;
if(x<y)
{
temp=x;
x=y;
y=temp;
}
}
ans=x;
cout << ans << endl;
return 0;
}
(3)完善程序。
幼儿园中班有36个小朋友,小班有30个小朋友。按班分组,两个班各组的人数一样多,问每组最多有多少个小朋友?
#include <iostream>
using namespace std;
int main()
{
int x,y.n,temp;
______________;
if(x>y)
{
temp=x;
x=y;
y=temp;
}
n=x;
while(___________)
n--;
cout<<"每组的人数最多为:"<<n<<endl;
return 0;

浙公网安备 33010602011771号