存储过程 while is null_12、do-while语句

c85f364942e78aff45d91bf8c44b2234.png

7bebef603e9e70c414ebb6fe70ac2ab3.png
#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;
}

运行结果:

6fe2a276a7114af9619bffc1492b8966.png

2c082aaa8d7f32297248d968d458f1b5.png

88d9bfa9226d3742e93b36811b6f3cef.png

do-while语句是C++ 语言中用于解决至少执行一次重复操作的循环语句。

定义格式:

格式1:

do

语句;

while(条件表达式);

格式2:

do

{

语句1;

语句2;

......

}

while(条件表达式);

功能:

重复执行循环体,直到条件表达式的值为0。与while循环相比,do-while循环是先执行循环体,后判断条件表达式的当型循环。

do-while循环语句的执行过程再和while执行过程做个对比:

5c13ffa8f788c526558cc103e74c46ce.png
do-while循环语句的执行过程

a396977ad12b34deff86e5cc56e5925f.png
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;
}

运行结果:

1b3d7e2db8e58fbbcb3e2a377de37651.png
//exam4.17-2
#include<iostream>
using namespace std;
int main()
{
  int i=1;
  while(i<1)
  {
    cout<<i;
    i++;
  }
  return 0;
}

运行结果:

243b85892e2d88b7e845b4a6b843b570.png

注意哦

do-while语句是在执行循环体之后检查条件表达式的值,所以至少要执行一次循环体。

而,while语句是在进入循环体之前,就检查条件表达式的值,于是可能造成while语句的循环体依次也不被执行。

再看一遍流程图,琢磨下上面这段话,更清晰~

6d778911f9470c707cd8896895d7c9b7.png

思考:如果希望使用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

运行结果:

b51d8754f22ca4b1d8d2f801ec483838.png
//exam4.18-2
#include<iostream>
using namespace std;
int main()
{
  int i=1;
  do
  {
    i++;
    cout<<i;
  }
  while(i<=5);
  return 0;
}

猜测:23456

运行结果:

8487471e5973f5c827587fb89e1b4aa7.png

注意哦

在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的,就是死循环了。

运行结果:

4f63ef8fe481091cc144bb0b8edc7c65.png

注意哦

为了使重复能终止,循环体中一定要有影响条件表达式值的操作,否则该循环是一个死循环。

应用:

示例4.20:

c433ca03df531e6821a30f92177f275a.png
//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;
}

运行结果:

fa42996f30996d9a9338c47165a89993.png

78df4a4a61f35436296c46836468520b.png

注意哦

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;
}

运行结果:

38b4d9bdfe81a78143ec9404440b5db3.png

934d2cb64714bc4bc9ad6807b245c6aa.png

修改这个条件,不管做对做错都直接退出循环,只会形成一次结果。

!n==x+y 和 n!=x+y 区别很大

前者 : 非的优先级仅次于括号,是第二高的,在这里除非n=0,否则!n就是假的

后者是判断n是否等于x+y

示例4.21:

7519ba7fe3e009795435c0398e8c9699.png
//practice4.21
#include<iostream>
using namespace std;
int main()
{
  int x;
  cin>>x;
  do
  {
    cout<<x%10;
    x/=10;
  }
   while(x!=0);  
   return 0;
}

运行结果:

d9a1dd308c966917ba3580b01654e41b.png

33f64a30340fe43972d9dc5c58d552c9.png

示例4.22:

de989cd07ce11cf4d9156134a4f8c9c5.png

十进制转二进制,即一个数字或商非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;
}

运行结果:

9a9c6a79dd5371b9ff0dc1da192ae2b6.png

0a297ccddfb0b2cad7453b45b9a46350.png

实验:

在程序上做哪些修改,可以输出一个十进制整数对应的二进制数形式?

//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;
}

bb8e2725f7e1bcaa67ca037f0c833297.png

69f88f23f9630ff475d7753be4dddab8.png

ffc204c2847e35b731cd42ed72672b40.png

作业:

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

运行结果:

74a313a210b7d836224e7c31c44c3f2d.png

e4ea29798175a30bdf1a28c45597b5db.png
//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

运行结果:

81583ea4aec1378932b4ead0147580c0.png

d91151f6d02b07acdf63c51185cb0dbc.png

b6be2f630687c7bbb87970f7ad819a4a.png

哦哦,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

运行结果:

3b5bb53e9eb1ba85bbaf60653cbbc23e.png

做错了,一起来看看每次循环都是怎样的吧:

#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;
}
is
第一次34
第二次47
第三次611
第四次817

2.

3984ae4a8ab790651d036b6290ee2c6d.png
//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;
}

运行结果:

76a95f271da9943649ea8a42005cef2d.png

啊,这道题我审题审错了,是问经过了多少路程,不是弹了多少次。。。

//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;
}

a2f26fe9ae918b962d6cb3e1f1d8365f.png

不对,数据类型不能是整数,得改下:

//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;
}

02a6da67312ed22a5ce92eb3c0eccc1e.png

3.

297dd9ba9489016c3763f77e0b2eaf6b.png
//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;
}

运行结果:

98dc9124e2f514683c0ba3fb18eda1d1.png

1705ff4088f10be91a49b99ad6cf28d1.png

a28cda4541d0d1320b97802ef251f564.png

错了错了,负数的话只有一个负号在前面,修改下:

//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;
}

de1d0ad7b7b15daf7df82ce308936a0d.png

0ced81b41675f4d582e43fc6ae8b0939.png

b190a553a763cd3e39d634e10f69b662.png

4.

9427872f7c07b7b48c1896b378fe87dd.png

输入样例:

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;
}

运行结果:

db0dc9bf65636ee6a3aa60b9f19dcc6a.png

cde5abee4ae330995d77ebe413a7405f.png

---------

好久没写了,看大家默默收藏,还是被激励到了,这周开始每天再写一点点吧~

也欢迎讨论呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值