分享

循环结构

 长沙7喜 2018-04-16

Care and diligence bring luck.




Life is not lack of beauty, 

but lack of the eyes to find beauty.



接着上篇文章介绍第三种基本结构 —— 循环结构


    C++ 基础


循环结构


循环结构是一个条件判断语句和一个向回转向语句的组合,利用这个结构可以减少源程序重复书写的工作量。循环结构有三要素: 循环变量 、 循环体  循环终止条件 。一个循环结构也就是当初始条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。 C++ 循环类型有

   while 循环    for 循环
   do...while 循环    嵌套循环


while 循环 

while循环 语句格式

   while (循环控制条件表达式)    {        语句块;    }

注:

语句块如果只有一条语句可以省略外面的花括号


语句执行过程

1. 计算作为 循环控制条件表达式 的值,得到逻辑

2. 若为真,则执行一遍 循环体,否则离开 循环体,结束整个 循环

3.  循环体 的所有语句执行完,自动转向第 1 步执行

   i = 0;    while ( i<=5 )=""  =""  =""  ="">

注:

循环控制条件表达式还可以是以下情况,常用于 A+B 问题,输入 多组数据 问题

   while ( cin >> a >> b )
       while ( scanf('%d%d', &a, &b)==2 )

scanf() 函数比较容易理解,scanf() 函数返回值为正确按指定格式输入的变量个数,如果遇到错误或 end of file,则返回 EOF

   int a, b, c;    c = scanf('%d %d', &a, &b);    printf('%d', c);
       // 输入 1 1,正确输入,返回 2    // 输入 1 a,只输入了第一个,返回 1    // 输入 a 1,第一个就出错,退出,则返回 0

cin 的话较难理解,cin 本身是个对象,没有返回值,>> 操作符返回流对象的引用,cin >> x 返回 istream&(即返回了 cin 的引用,cout < x="" 返回="" ostream&),istream="" 定义了="" operator="" bool()="" 隐式转换,在其中判断="" cin="" 的状态,fail、bad、eof="" 时,返回="" false,只有="" good="" 才返回="" true,所以输入非法数据可以返回="" false,应用在="" while="" 循环中按="" ctrl+z="">

   if( cin )
       while( cin >> x )


例题:求两个 正整数 的 最大公约数

分析:

穷举法:

先获取两个数中较小的数,然后逐渐减小逐个去尝试,如果可以同时被两个数整除,那么这个数就是最大公约数,跳出循环

   #include    using namespace std;    int main()    {        int n, m, x;        cin >> n >> m;        x = n>m ? m : n;        for(int i=x; i>=1; i--)        {            if(n%i==0 && m%i==0)            {                cout < i="">

连续相减法:

两个数不停相减,直至相等,最后所得即为最大公约数

例如:22 和 4

22 - 4 = 18 

18 - 4 = 14 

14 - 4 = 10 

10 - 4 = 6 

6 - 4 = 2 

4 - 2 = 2

2 为 最大公约数

   #include    using namespace std;    int main()    {        int n, m, x;        cin >> n >> m;        if(nx)            {                n = m;                m = x;            }                    else            {                n = x;            }        }        cout <>

辗转相除法:

两个数不停相除求余,余数与被除数继续相除,直到最后余数为 0

例如:22 和 4

22 % 4 = 2

4 % 2 = 0

2 为最大公约数

   #include    using namespace std;    int main()    {        int n, m, x;        cin >> n >> m;        if(m>n)        {            x = n;            n = m;            m = x;        }        while(n%m)        {            x = n % m            if(x>m)            {                n = x;            }            else            {                n = m;                m = x;            }        }        cout < m;=""  ="">


for 循环

 for 循环 语句格式


   for(控制变量初始化表达式; 条件表达式; 增量表达式)    {        语句块;    }

注:

语句块如果只有一条语句可以省略外面的花括号


语句执行过程

1. 执行 控制变量初始化表达式,使 控制变量 获得一个初值

2. 判断 控制变量 是否满足 条件表达式 ,若满足条件则执行一遍 循环体,否则结束整个 for 语句,继续执行 for 循环下面的语句

3. 根据 增量表达式 ,计算出控制变量所得到的新值

4. 跳转至第 2 

注:

可以在 for 循环 控制变量初始表达式 中声明变量,这些变量只在 for 循环结构中有效,离开 for 循环就无效

   for ( int i=1; i<=5; i++="">
       // 输出 100 内的 偶数,增量为 2    for ( int i=2; i<=100; i+="2">
           // 输出 100 内的 偶数 i,奇数 j    for ( int i=2, j=1; i<=100; i+="2," j+="2">


例题:利用 for 循环计算 n! 的值

分析:

此类问题最重要的是注意 数值 的 范围

n! = 1*2*3*4...*n

当 n > 13 时,n! 的值就超出了 int 型的表示范围,所以这里就可以使用 long long 型来存储 n! 的值

输入输出 long long 型的值可以用 printf 和 scanf,效率上更优秀

   #include    using namespace std;    int main()    {        long long s;        // n 不能定义为 long long,否则 for 循环会成为 死循环        int n;        s = 1;        scanf('%d', &n);        // 当 n > 13,int 型就会溢出,所以使用 long long 型        for ( int i=1; i<=n; i++="" )=""  =""  =""  =""  =""  =""  s="" *="i"  =""  =""  =""  ="" printf(="" '%lld',="" s="" );=""  =""  =""  =""  ="" return="" 0;=""  ="">


do...while 循环

 do...while 循环 语句格式

   do    {
       语句块;    }while (条件表达式);

注:

语句块如果只有一条语句可以省略外面的花括号


语句执行过程

1. 执行一遍 循环体

2. 求出作为 循环条件 的 条件表达式 的值,如果逻辑值为  则转向第 1 步,否则结束do循环的执行过程,执行循环后面的语句


与 while 循环 的区别

do...while 循环 无论条件表达式是否成立都会先执行一次循环体,而 while 循环 则先判断条件表达式,不成立则跳过循环结构( for 循环 也类似)


嵌套循环

for 循环嵌套  语句格式

   for(控制变量初始化表达式; 条件表达式; 增量表达式)    {        for(控制变量初始化表达式; 条件表达式; 增量表达式)        {            语句块;        }        语句块;    }



while 循环嵌套  语句格式

   while (循环控制条件表达式)    {        while (循环控制条件表达式)        {            语句块;        }        语句块;    }



do...while 循环嵌套  语句格式


   do    {        do        {            语句块;        }while (条件表达式);        语句块;    }while (条件表达式);

注:

嵌套循环外面一层的语句块可以写在内部循环的上面也可以下面

除了上面列出的相同类型语句嵌套外,也可以相互嵌套


例题:求 100 ~ 200 内的 质数

分析:

质数只能被它自己本身和1整除,所以只要出现有被其他的数整除,那么肯定不是质数

   #include    using namespace std;    int main()    {        int n, m;        for (n=100; n<=200; n++)=""  =""  =""  =""  {=""  =""  =""  =""  =""  =""  for="" (m="2;"><=n; m++)=""  =""  =""  =""  =""  =""  =""  =""  //="" 如果可以被整除,则跳出,判断是否为自身=""  =""  =""  =""  =""  =""  =""  =""  if(n%m="=0)"  =""  =""  =""  =""  =""  =""  =""  =""  =""  break;=""  =""  =""  =""  =""  =""  if(n="=m)"  =""  =""  =""  =""  =""  =""  =""  //="" 如果="" n="" 和="" m="" 相等,说明只能被自身整除,为质数=""  =""  =""  =""  =""  =""  =""  =""  cout="">< n="">< endl;=""  =""  =""  =""  }=""  ="">


循环控制

continue

continue 只能用于循环结构中,意为继续循环,当循环体执行到 continue 时,程序会返回值循环头部重新开始新一轮循环,continue 后面的语句不会被执行,嵌套循环中,continue 也只能返回至当前循环的头部重新开始当前循环


break

break 除了可以用在循环中,也可以用于 switch 选择结构中,break 在循环中出现则跳出当前循环,执行循环外的语句,如果是嵌套循环,那么跳出当前层次的循环,执行当前循环外的语句


注:

break 会出现在 if 中,如上面的例题,但是需要注意的是此时的 break 作用的是循环结构,而非 if 选择结构,break 是不能直接用于 if 选择结构的,同理 continue 也能出现在循环结构中的 if 内,而无法直接应用于单独的 if 选择结构


习题

在线OJ —— 1.5 编程基础之循环控制


   http://noi./





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多