#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int x,ans = 0;
do{
cin >> x;
if(x > 0)
ans++;
}while(x != 0);
cout << ans;
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int x,ans = 0;
cin >> x;
while(x != 0){
if(x > 0 )
ans ++;
cin >> x
}
cout << ans;
return 0;
}
示例4.16:(体验一下)
对于给定的自然数n,求使1+2+3+4+5+...i≥n成立的最小i值。
//exam 4.16
#include <iostream>
using namespace std;
int main()
{
int i=1,n,sum=0;
cin>>n;
do
{
sum+=i;
i++;
}
while (sum<n);
cout<<i-1<<endl;
return 0;
}
运行结果:
do-while语句是C++ 语言中用于解决至少执行一次重复操作的循环语句。
定义格式:
格式1:
do
语句;
while(条件表达式);
格式2:
do
{
语句1;
语句2;
......
}
while(条件表达式);
功能:
重复执行循环体,直到条件表达式的值为0。与while循环相比,do-while循环是先执行循环体,后判断条件表达式的当型循环。
do-while循环语句的执行过程再和while执行过程做个对比:
示例4.17:
比较下面程序,并写出它们的运行结果:
//exam4.17-1
#include<iostream>
using namespace std;
int main()
{
int i=1;
do
{
cout<<i;
i++;
}
while(i<1);
return 0;
}
运行结果:
//exam4.17-2
#include<iostream>
using namespace std;
int main()
{
int i=1;
while(i<1)
{
cout<<i;
i++;
}
return 0;
}
运行结果:
注意哦
do-while语句是在执行循环体之后检查条件表达式的值,所以至少要执行一次循环体。
而,while语句是在进入循环体之前,就检查条件表达式的值,于是可能造成while语句的循环体依次也不被执行。
再看一遍流程图,琢磨下上面这段话,更清晰~
思考:如果希望使用do-while语句和while语句解决相同的循环问题,你能说出一般规律么?
示例4.18:
比较下面程序,并写出它们的运行结果:
//exam4.18-1
#include<iostream>
using namespace std;
int main()
{
int i=1;
do
{
cout<<i;
i++;
}
while(i<=5);
return 0;
}
猜测:12345
运行结果:
//exam4.18-2
#include<iostream>
using namespace std;
int main()
{
int i=1;
do
{
i++;
cout<<i;
}
while(i<=5);
return 0;
}
猜测:23456
运行结果:
注意哦
在do-while语句的条件一样的情况下,循环体中语句的不同顺序,也将影响执行结果。
上面4.18-1和2的区别是一个先输出再自增,一个先自增再输出
示例4.19:
写出下列程序的运行结果:
//exam4.19
#include<iostream>
using namespace std;
int main()
{
int i=1;
do
cout<<i;
while(i<=5);
return 0;
}
猜测:应该一直输出1吧。。。因为i=1,一直是≤5的,就是死循环了。
运行结果:
注意哦
为了使重复能终止,循环体中一定要有影响条件表达式值的操作,否则该循环是一个死循环。
应用:
示例4.20:
//practice4.20
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
int x,y,n,num=0;
srand(time(NULL)); //随机数种子
x=100+rand()%(999-100+1); //产生第一个三位随机数
y=100+rand()%(999-100+1); //产生第二个三位随机数
do
{
cout<<x<<"+"<<y<<"=?n";
cin>>n;
num++;
}
while(n!=x+y); //输入数字不对,重复操作
cout<<num<<endl; //输出次数
return 0;
}
运行结果:
注意哦
srand()是随机种子函数,rand()是产生随机数函数。
实验:
修改do-while语句的条件,检验程序的正确性:
//exam4.20
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
int x,y,n,num=0;
srand(time(NULL)); //随机数种子
x=100+rand()%(999-100+1); //产生第一个三位随机数
y=100+rand()%(999-100+1); //产生第二个三位随机数
do
{
cout<<x<<"+"<<y<<"=?n";
cin>>n;
num++;
}
while(!n==x+y);
cout<<num<<endl; //输出次数
return 0;
}
运行结果:
修改这个条件,不管做对做错都直接退出循环,只会形成一次结果。
!n==x+y 和 n!=x+y 区别很大
前者 : 非的优先级仅次于括号,是第二高的,在这里除非n=0,否则!n就是假的
后者是判断n是否等于x+y
示例4.21:
//practice4.21
#include<iostream>
using namespace std;
int main()
{
int x;
cin>>x;
do
{
cout<<x%10;
x/=10;
}
while(x!=0);
return 0;
}
运行结果:
示例4.22:
十进制转二进制,即一个数字或商非0时,反复除以2的操作。
//practice4.22
#include<iostream>
using namespace std;
int main()
{
int x,num=0;
cin>>x;
do
{
num++;
x/=2;
}
while(x!=0);
cout<<num;
return 0;
}
运行结果:
实验:
在程序上做哪些修改,可以输出一个十进制整数对应的二进制数形式?
//practice4.22-1
#include<iostream>
using namespace std;
int main()
{
int x;
cin>>x;
do
{
x/=2;
cout<<x%2;
}
while(x!=0);
return 0;
}
作业:
1、读程序写结果:
//test1-1
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
do
{
cout<<n%2;
n/=2;
}
while(n!=0);
return 0;
}
分别输入:4 0
猜测结果:
001 0
运行结果:
//test1-2
#include<iostream>
using namespace std;
int main()
{
int i,n;
cin>>n;
i=n-1;
do
i--;
while(i>1 && n%i!=0);
cout<<i;
return 0;
}
分别输入:100 79 2
猜测结果:
50 0 0
运行结果:
哦哦,79 确实是1,想错了
//test1-3
#include<iostream>
using namespace std;
int main()
{
int i=1,s=3;
do
{
s+=i++;
if (s%7!=0)
++i;
}
while(s<15);
cout<<i;
return 0;
}
猜测结果:
6
运行结果:
做错了,一起来看看每次循环都是怎样的吧:
#include<iostream>
using namespace std;
int main()
{
int i=1,s=3;
do
{
s+=i++;
if (s%7!=0)
++i;
cout<<i<<endl;
cout<<s<<endl;
}
while(s<15);
return 0;
}
i | s | |
第一次 | 3 | 4 |
第二次 | 4 | 7 |
第三次 | 6 | 11 |
第四次 | 8 | 17 |
2.
//test2
#include<iostream>
using namespace std;
int main()
{
int i=200,num=0;
do
{
num++;
i/=2;
}
while(i>0.5);
cout<<num;
return 0;
}
运行结果:
啊,这道题我审题审错了,是问经过了多少路程,不是弹了多少次。。。
//test2-1
#include<iostream>
using namespace std;
int main()
{
int i=200,sum=200;
do
{
i/=2;
sum=sum+2*i;
}
while(i>0.5);
cout<<sum;
return 0;
}
不对,数据类型不能是整数,得改下:
//test2-2
#include<iostream>
using namespace std;
int main()
{
double i=200,sum=200;
do
{
i/=2;
sum=sum+2*i;
}
while(i>0.5);
cout<<sum;
return 0;
}
3.
//test3
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
do
{
if (n%10!=0) cout<<n%10;
n/=10;
}
while(n!=0);
return 0;
}
运行结果:
错了错了,负数的话只有一个负号在前面,修改下:
//test3
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n<0) cout<<'-';
do
{
if (abs(n)%10!=0) cout<<abs(n%10);
abs(n/=10);
}
while(n!=0);
return 0;
}
4.
输入样例:
7
输出样例:
1/4
这题感觉就是数学题啊。。。
先找到第n项所处的斜线,也就是第几斜线。
while (sum<n) sum+=++i; 代码结束,i就是第n项所在的斜线,sum就是1~i行所有个数之和。
接下来,注意观察,以奇数行为例:奇数行分母递增,分子递减(偶数行反之),那么就是要找到第n项所在这一行的分子分母就OK了。
sum把第i行都加了,sum-n就是i行末至第n项中间有几个数,分子在此基础上+1,也就是sum-n+1,分母分子之和为i+1,所以分母为i+1-(sum-n+1)--->i-(sum-n);
//test4
#include<iostream>
using namespace std;
int main()
{
int n,i=0,sum=0;
cin>>n;
while (sum<n) sum+=++i;
if (i%2) cout<<sum-n+1<<"/"<<i-(sum-n)<<endl;
else cout<<i-(sum-n)<<"/"<<sum-n+1<<endl;
return 0;
}
运行结果:
---------
好久没写了,看大家默默收藏,还是被激励到了,这周开始每天再写一点点吧~
也欢迎讨论呀~