循环

162 阅读5分钟

循环

while循环

语法形式:(表达式称为循环条件,语句称为循环体)

while ( 表达式 ) 语句;

循环体出现一条以上的语句应以复合语句形式出现

循环前必须给循环控制变量赋初值

循环体中必须要有改变循环控制变量的语句

判断最少进行了一遍

先计算表达式的值,在判断是否循环

一般来说循环语句都是关系表达式或者逻辑表达式

//求100以内整数和
#include <iostream> 
using namespace std;
int main()
{
    int n=1,sum=0;
    while(n<=100)//循环条件
    {
        sum+=n;
        n+=1;
    }//循环体
    cout<<"sum="<<sum<<endl;
    return 0;
}

do-while循环

语法形式:(表达式称为循环条件,语句称为循环体)

do 语句 while ( 表达式 );

do语句最后必须用分号(;)作为语句结束

循环最少进行了一遍

do-while循环和while循环可以互相转换

//求输入的值的乘积
#include <iostream>
using namespace std;
int main()
{
    int result=1,x=1;
    do{
        result*=x;
        cin>>x;
    }while(x!=0);
    cout<<result;
    return 0;
}

for循环

语法形式:(表达式1为初始化语句,2为循环条件,3为循环变量刷新,语句为循环体)

for (表达式1 ; 表达式2 ; 表达式3) 语句;

表达式1只进行1次,作用是给循环变量赋初值

表达式2相当于是for的循环条件

表达式3是重复执行的内容,通常是改变循环控制变量值的语句

可单独省略表达式1或3

也可以表达式1和3同时省略

//求100以内的整数和
#include <iostream>
using namespace std;
int main()
{
    int sum=0,i;
    for(i=1;i<=100;i++)
    {
        sum+=i;
    }
    cout<<sum;
    return 0;
}

循环附加语句

break语句

语法形式为:

break;

break语句的作用是结束switch语句和循环语句的运行,跳到后续语句

break语句只能用在switch语句和循环语句(while、do、for)中,不得单独使用

//判断一个数是否为素数
#include <iostream>
using namespace std;
int main()
{
    int i,x;
    cin>>x;
    for(i=2;i<x;i++)
    {
        if(x%i==0)
        {
            break;
        }
    }
    if(i==x)
    {
        cout<<"YES"<<endl;
    }else
    {
        cout<<"NO"<<endl;
    }
    return 0;
}

continue语句

语法形式为:

continue;

continue语句的作用是在循环体中结束本次循环,直接进入下一次循环

continue语句只能用在循环语句(while、do、for)中,不能单独使用

//求100以内的奇数和
#include <iostream>
using namespace std;
int main()
{
    int i,result=0;
    for(i=1;i<=100;i++)
    {
        if(i%2==0)
        {
            continue;
        }
        result+=i;
    }
    return 0;
}

循环的嵌套

一个循环体内包含有另一个循环语句时,就构成了循环的嵌套

循环语句(while、do、for)可以互相嵌套,嵌套层数没有限制,可以形成多重循环

使用多重循环时,嵌套的循环变量不能相同

//打印九九乘法表
#include <iostream>
using namespace std;
int main()
{
    int i,j;
    for(i=1;i<=9;i++)
    {
        for(j=1;j<=i;j++)
        {
            cout<<j<<"*"<<i<<"="<<i*j<<" ";
        }
        cout<<endl;
    }
    return 0;
}

循环语句的使用

计数型循环

计数型循环用于处理已知循环次数的循环过程

控制变量在每次循环时都要发生规律性变化(递增或递减),当控制变量达到预定的循环次数时,循环就结束

计数型循环常使用for语句

//求1到10的阶乘之和
#include <iostream>
using namespace std;
int main()
{
    int result=0,i,temp=1;
    for(i=1;i<=10;i++)
    {
        temp*=i;
        result+=temp;
    }
    cout<<result<<endl;
    return 0;
}

条件型循环

条件型循环就是用于处理循环次数未知的循环过程,称为不定次数循环"

在条件型循环中,由于事先不能准确知道循环的次数,因此循环控制是由条件来判定的。在每次循环时检测这个条件,当条件一旦满足,循环就结束

条件型循环常使用while语句和do-while语句

//求Π的近似值
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    double pi=0,flag=1,fenmu=1,temp=1;
    while(fabs(temp)>=1e-7)
    {
        pi+=temp;
        flag=-flag;
        fenmu+=2;
        temp=flag/fenmu;
    }
    pi+=temp;//加上最后一项
    cout<<pi*4<<endl;
    return 0;
}

枚举算法(穷举算法)

从可能的集合中一一枚举各个元素,用给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解

基本思路:1. 确定枚举对象、枚举范围和判定条件 2. 一一枚举可能的解,验证是否是问题的解

//百钱买百鸡问题(一百块钱买一百只鸡,公鸡一只5元,母鸡一只3元,小鸡三只1元,求各应买多少只)
#include <iostream>
using namespace std;
int main()
{
    int x,y,z;//x为公鸡数量,y为母鸡数量,z为小鸡数量
    for(x=0;x<=20;x++)
    {
        for(y=0;y<=33;y++)
        {
            for(z=0;z<=100;z++)
            {
                if((z%3==0)&&(x+y+z==100)&&(5*x+3*y+z/3==100))
                {
                    cout<<"公鸡="<<x<<",母鸡="<<y<<",小鸡="<<z<<endl;
                }
            }
        }
    }
    return 0;
}

//下面列举的做法只用了两层循环效率更高
#include <iostream>
using namespace std;
int main()
{
    int x,y,z;//x为公鸡数量,y为母鸡数量,z为小鸡数量
    for(x=0;x<=20;x++)
    {
        for(y=0;y<=33;y++)
        {
            z=100-x-y;
            if((z%3==0)&&(5*x+3*y+z/3==100))
            {
                cout<<"公鸡="<<x<<",母鸡="<<y<<",小鸡="<<z<<endl;
            }
        }
    }
    return 0;
}

迭代算法

迭代法是一种不断用变量的旧值递推新值的求解方法

基本思路:1. 确定迭代变量 2. 建立迭代关系式 3. 对迭代过程进行控制

//求斐波那契数列前40项
#include <iostream>
using namespace std;
int main()
{
    int i,f1=0,f2=1,fn;
    for(i=1;i<=40;i++)
    {
        fn=f1+f2;
        f1=f2;
        f2=fn;
        cout<<f1<<" "<<endl;
    }
    return 0;
}