16C++循环结构-(do-while循环)1
一、do-while 语句
问题:每次测试后狐狸老师总会把成绩输入计算机,进行处理分析。但输入时有时会出错,如当满分为100分时,输入小于0或大于100的数,表示输入有误。试编一程序,输入某一位同学成绩时,自动检查输入数据的正确性,当输入有误时重新输入。
我们用do-while语句来编写这个程序。do-while语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为:
do
语句;
while(表达式);

先执行一次循环体,然后判断表达式,当表达式的值为真(非 0)时,返回重新执行循环体语句,如此反复,直到表达式的值为假(0)为止,此时循环结束。它的执行过程如图47.1所示。do-while语句常用于检验输入数据是否正确,以确保程序的正确运行。
上述问题程序的流程图如图:

#include <iostream>
using namespace std;
int main()
{
float x;
do
{
cout<<"请输入成绩(0~100):";
cin>>x;
}while(x<0||x>100);
cout<<"成绩:"<<x<<endl;
return 0;
}
练习:
(1)
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int i=1, n, ans=0;
cin>>n;
do
{
ans+=i;
i+=2;
}while(i<=n);
cout<<ans;
retum 0;
}
输入:10
i,n,ans输出:____________
(3)完程序。
求5+10+15+20-25+·+200的和是多少。
#include <iostream>
using namespace sid;
int main()
{
int i=5,___________;
do
{
sum+=i;
_______;
}while(i<=200);
cout << "5+10+15+·+200="<< sum<<endl;
returm 0;
}
二、各数位之和
问题:尼克与格莱尔很喜欢玩“加加乐”游戏,游戏规则是一方报出一个数,另一方说出该数的各个数位之和:如尼克说12,格莱尔就说3;尼克说567,格莱尔就说18。
试编一程序,输入一个整数,输出它的各个数位之和。
变量n保存输入的数,sum是累加器用于求各个数位之和,a保存个位上的数字,个位上的数字可用n%10求出。流程图如图:

#include <iostream>
using namespace std;
int main()
{
long long n;
int a,sum=0;
cout<<"n=";
cin>>n;
do
{
a=n%10;
sum+=a;
n=n/10;
}while(n!=0);
cout<<"各个数位之和:"<<sum<<endl;
return 0;
}
练习:
(1)华为推出了一款新手机,该手机标配存储容量为64。请问1GB容量可以存放( )个英文字母?
A.1024×1024×1024 B.1024×1024 C.1024×1024×1024/2 D.1024×1024×1024/8
(2)阅读程序写结果。
#include<iostream>
using namespace std;
int main()
{
long long n;
int sum=0,a;
cin>>n;
do
{
a=n%2;
sum+=a;
cout<<a;
n/=2;
}while(n!=0);
cout << endl;
cout << sum<< endl;
return 0;
}
输入:17
sum,a,n输出:______________
(3)完善程序
输入一个正整数,输出该数的位数。如输人789输出3,输人445566,出6。
#include<iostream>
using namespace std;
int main()
{
long long n, num=0;
__________________;
do
{
________;
n/=10;
}while(n>0);
cout <<num<<endl;
return 0;
}
三、纯小数变整数
问题:试编一程序,输入一个纯小数,把它变成整数后输出(设纯小数的小数位数不超过9)。
由于实数(浮点数)在内存中存放时是用有限的存储单元存储的,能提供的有效数字总是有限的。因此存储时可能会产生一些微小的误差。所以判断两个实数是否相等时,我们不能通过相等运算符(==)进行。而是通过判断两个实数相减后差的绝对值是否小于一个很小的数进行的。函数fabs()可以求浮点数的绝对值,函数abs()可以求整数的绝对值。流观图如图:

#include <iostream>
#include <cmath> //调用求浮点数的绝对值函数fabs()
using namespace std;
int main()
{
double x,y;
long long num;
cout<<"请输入一个纯小数"<<endl;
do
{
cout<<"x=";
cin>>x;
}while(x>=1||x<=0);
num=1;
do
{
num*=10;
y=x*num;
}while(fabs(y-(int)y)>1e-9);
cout<<int(y)<<endl;
return 0;
}
运用强制类型转换运算符(int)y或int(y),将结果转换成整开型。
练习:
(1)
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int n, i, ans=0;
cin>>n;
i=l;
do
{
if(n%i==0)ans++;
i++;
}while(i<=n);
cout << ans << endl;
return 0;
}
输入:10
n,i,ans输出:______________
(3)完善程序。
输入一个浮点数,输出其小数位数。如输入1.6,输出1;输入90.1234567890987654321,输出19。(字符输人函数getchar()的作用是从终端输入一个字符,字符输出函数putchar()的作用是向终端输出一个字符。)
#include <iostream>
#include <cstdio> //调用字符输入数getchar()
using namespace std;
int main()
{
___________;
bool flag=false;
int num=0;
while(ch=getchar())!='\n') //当读入的字符非换行符时,就重复读入
{ //换行符用'\n'表示
if(flag)
if(ch>='0'&&ch<='9')
______________;
else
{
num=0;
break;
}
if(____)flag=true:
}
if(num>0)
cout<<num<<endl;
else
cout<<"输人不正确!"<<endl;
returm 0:
四、数学计算
问题:风之巅小学的书香有312个座位,已知第一排有15个座位,以后排增加2个座位,最后一排有几个位?一共有几排?试编一程序算一算。
用变量p表示当前的排数,x表示当前排的座位数,sum表示当前的总座位数。当总座位数不等于312时,排数p+1,每排的座位数x+2,不停循环;当总座位数等于312时,退出循环,输出最后一排的座位数x、排数p。流程图如图

#include <iostream>
using namespace std;
int main()
{
int sum,p,x;
p=1;
x=15;
sum=x;
cout<<p<<" "<<x;
cout<<" "<<sum<<endl;
do
{
p++;
x+=2;
sum+=x;
cout<<p<<" "<<x<<" "<<sum<<endl;
}while(sum !=312);
cout<<"最后一排的座位数:"<<x<<endl;
cout<<"排数:"<<p<<endl;
return 0;
}
在do-while循环中输出变量p、x、sum的值,可以清楚地看到每排的座位数和到当前排的总座位数。
练习:
(1)操作系统是对()进行管理的系统软件。
A.软件 B.硬件 C.计算机资源 D.应用程序
(2)阅读程序写结果。
#include <iostream>
using namespace std;
int main()
{
int x, ans;
cin>>x;
ans=0;
do
{
ans+=x%8;
x/=8;
}while(x!=0);
cout << ans << endl;
return 0;
}
输入:100
x,ans输出:________________
(3)完善程序。
格莱尔有一箱积木,用它可以拼出赛车、青蛙、毛毛虫等作品。这箱木共有x块积木组件,已知x与6的和是13的倍数,与6的差是12的倍数,求这箱积本至少有多少块?
#include <iostream>
using namespace std;
int main()
{
int x;
x=0;
do
{
___________;
}while((x+6)%13!=0||(x-6)%12!=0);
cout<<______<<endl;
return 0;
}

浙公网安备 33010602011771号