17 C++循环结构-(do-while循环)2
一、实例
1、模拟法1
在一次风之巅小学文艺汇演中,狐狸老师、尼克、格莱尔同台演出,其中个环节是拍手游戏,狐狸老师每1秒拍一次手,尼克每2秒拍次,格莱尔每4秒拍一次。三人同时开始拍第一次手,每人都拍10次。试编一程序,算一算观众可听到多少声拿声?
按时间顺序,根据每个人的条件模拟拍手过程。开始时,时间为0秒,每人都拍了1次,这时众听到1声本声,每人剩下9次,然后逐一模拟拍手,直到三人各自拍满9次为止。程序中变量time是时间,cout是观众听到的掌声,fag是有人拍手的标记,teacher、nike、glir分别表示狐狸老师、尼克\格莱尔的手次数。流程图如图:

#include <iostream>
using namespace std;
int main()
{
int time, count,teacher,nike, glair;
bool flag;
time=0;
count=1;
teacher=nike=glair=0;
do
{
flag=0;
time++;
if(teacher<9)
{
flag=1;
teacher++;
}
if(nike<9&&time%2==0)
{
flag=1;
nike++;
}
if(glair<9&&time%4==0)
{
flag=1;
glair++;
}
if(flag) count++;
}while(teacher+nike+glair<9*3);
cout<<count<<endl;
return 0;
}
2、模拟法2


#include <iostream>
using namespace std;
int main()
{
int n,nike,glair,num=0;
nike=glair=0;
n=0;
do
{
nike++;
if(nike>20) nike=1;
glair++;
if(glair>30) glair=1;
if(nike==glair) num++;
n++;
}while(n<1000);
cout<<num<<endl;
return 0;
}
3、纯小数转化为最简分数


#include <iostream>
#include <cmath> //调用求浮点数的绝对值函数fabs()
using namespace std;
int main()
{
double x,y;
long long a,b,i,j;
cout<<"请输入一个纯小数"<<endl;
do
{
cout<<"x=";
cin>>x;
}while(x>=1||x<=0);
a=1;
y=x;
while(fabs(y-(int)y)>1e-10) //纯小数化成整数
{
a*=10;
y=x*a; //不可以写成 y=y*10;
} //因误差不停的扩大,会出现死循环
b=y;
cout<<b<<'/'<<a<<endl;
for(i=b;i>=1;i--) //求出a和b的最大公约
if(b%i==0&&a%i==0)
{
j=i; //找出最大公约数后,赋值给j
break; //退出循环
}
cout<<"最简分数为:";
cout<<b/j<<'/'<<a/j<<endl;
return 0;
}
二、练习:
(一)选择题
1、下列选项中不属于图像格式的是( )。
A.jpeg格式 B.txt格式 C.gif格式 D.png格式
2、计算网络最突比的点是( )
A.计算精度高 B.内存容量大 C.远算速度快 D.可以实现资源共享
3、格莱尔收到一封主题为“这是我最近的照片”的陌生电子邮亡,你认为他最好应该( )
A.直接删除 B.打开看看 C.直接转发给同学 D下臷保存
(二)阅读程序写结果。
1、
#include <iostream>
using namespace std;
int main()
{
int n, t,ans;
n=l;
t=2;
ans=0;
do
{
n*=t;
ans+=n;
}while(n<=le+3);
cout << ans << endl;
return 0;
}
n,t,ans输出:__________
2、
#include <iostream>
using namespace std;
int main()
{
long long n, ans=0, k=1;
cin>>n;
do
{
ans+=2;
n-=k;
k+=10*ans;
}while(k<=n);cout << ans;
return 0;
}
输入:100
n,ans,k输出:_________________
3、
#include <iostream>
using namespace std;
int main()
{
int m, sum=0;
cin>>m;
do
{
sum=sum*10+m%10;
m/=10;
}wile(m!=0);
cout <<sum <<endl;
return 0;
}
输入:123
m,sum输出:_____________
(三)完善程序。
1、用另一种方法算一算观众可听到多少声掌声(时间为0秒时,每人同时拍了1次手,所以狐狸老师拍完10次手用了9秒,尼克用了18秒,格莱尔用了36秒)
#include <iostream>
using namespace std;
int main()
{
int ans=10, time=10;
bool flag=0;
do
{
flag=0;
if(time<=18&&time%2==0)flag=1;
if(time<=36&&time%4==0)flag=1;
if(flag)ans++;
_____________;
}while(time<=36);
cout<<_______<<endl;
return 0;
}
2、尼克和格莱尔玩报数游戏,尼克按1x报数,格莱尔按1y报数。两人同时开始,并以同样的速度报数,当两人都报了m个数时,统计出两人同时报相同数的次数。
#include <iostream>
using namespace std;
int main()
{
int n, nike, glair, num=0;
int x, y, m;
cout<<"m=";
cin>>m;
cout <<"x,y=";
______________;
nike=glair=0:
for(n=1;n<=m;n++)
{
______________;
if(nike>x)nike=1:
glair++;
if(glair>y)glair=1;
if(nike==glair) num++;
}
cout<<______<<endl;
return 0;
}
3、把3.14159四舍五入保留n位小数(1≤n≤5).如n=1时输出3.1;n=4时输出3.1416。
#include <iostream>
using namespace std;
int main()
{
double x, y;
int n, m=1;
x=3.14159;
cout<<"n="
do
{
___________;
}while(n<1||n>5);
for(int i=1;i<=n:1++)
_________________;
y=(int)(x*m+0.5);
y=y/m
cout<<y<< endl;
return 0;
}

浙公网安备 33010602011771号