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;
posted @ 2025-01-03 16:23  gdyyx  阅读(512)  评论(0)    收藏  举报