zoukankan      html  css  js  c++  java
  • C语言--循环结构

    知识内容总结

    for循环语句

    使用该语句可以实现C语句的重复执行,一般形式为:

    	for ( 表达式1; 表达式2; 表达式3)
    	{
                 循环体语句;
    	}
    

    for语句的执行流程是:先计算表达式1,再判断表达式2,若为“真”,则执行循环体语句,并接着计算表达式3,然后继续循环,若值为“假”,则结束循环,继续执行for的下一条语句。

    • 表达式1:初值表达式,对循环变量赋初值,从而指定循环的起点。
    • 表达式2:条件表达式,给出循环继续的条件。
    • 表达式3:步长表达式,这个表达式是单次循环结束后需要执行的语句。
    • 循环体语句:每一次循环需要执行的语句。
      应用举例:

    while循环

    我们已经学习了for循环语句,现在我们学习的while语句也可以实现循环,而且使用范围更广泛。该语句的一般形式为

    while ( 表达式 )
    {
          循环体语句;
    }
    

    while语句的执行流程为:当表达式的值为“真”时,循环执行,直到表达式的值为“假”,循环中止并继续执行while的下一条语句。

    while循环的特点:

    1. while语句中的表达式可以是任意合法的表达式;
    2. while语句的构成简单,只有一个表达式和循环体语句,分别对应循环的两个核心要素:循环条件和循环体,可以直接把循环问題的分析设计转换为语句实现;
    3. while的循环体语句中必须包含能最终改变循环条件真假性的操作;
    4. while语句是在循环前先判断条件,只有条件为“真”才进入循环。
      应用举例:

    do-while循环

    for语句和while语句都是在循环前先判断条件,只有条件满足才会进人循环,如果一开始条件就不满足,则循环一次都不执行。do-while循环语句与上述两种循环语句略有不同,它先执行循环体,后判断循环条件。所以无论循环条件的值如何,至少会执行一次循环体。
    一般形式为:

    do
    {
          循环体语句;
    }while ( 表达式 );
    

    do-while语句的执行流程为:第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do-while的下一条语句。

    do-while循环的特点:

    1. 语句中的表达式可以是任意合法的表达式;
    2. 使用时要另加初始化部分,循环体语句必须包含能最终改变条件真假性的操作;
    3. 该语句先循环、后判断循环条件,一般在循环体的执行过程中明确循环控制条件;
    4. 它每执行一次循环体后,再判断条件,以决定是否进行下一次循环。
      应用举例:

    三种循环语句小结

    for循环与while循环的区别:

    循环的实现一般包括4个部分,即初始化、条件控制、重复的操作以及通过改变循环变量的值最终改变条件的真假性,使循环能正常结束。这4个部分可以直接和for语句中的4个成分(表达式1、表达式2、循环体语句和表达式3)相对应。当使用while语句时,由于它只有2个成分(表达式和循环体语句),这时就需要另加初始化部分,至于第4个部分,while语句的循环体语句可包含for语句的循环体语句和表达式3, 所以while的循环体语句中必须包含能最终改变循环条件真假性的操作。
    应用举例:

    for循环语句:

    while循环语句:

    while循环与do-while循环的异同:

    1. while循环是先判断后运行,do-while循环是先执行后判断,因此无论是否符合条件,do-while循环至少执行一次。
      例如:


      图二的代码由于变量i不符合(i <= 10)的条件,无法进入循环,但是图一的代码会先循环一次,再进行判断。
    2. 当循环需要执行两次以上时,两种循环的运行效果相同。
      例如:用代码求1+2+……+9+10的和


      图一的代码循环了10次,在第十次结束时,由于i=11,就此结束了循环,图二的代码也执行了10次,在第11次循环开始时,由于i=11,因此第11次循环没有被运行。

    循环语句的选择:

    • 循环有固定的次数,使用for循环语句;
    • 循环必须执行一次,使用do-while循环语句;
    • 其他情况,使用while循环语句。

    4.循环控制:break语句和continue语句


    当循环结构中出现多个循环条件时,可以由循环语句中的表达式和break语句共同控制。break语句强制循环结束,一旦执行了break语句,循环提前结束,不再执行循环体中位于其后的其他语句。break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环;否则,若break无条件执行,意味着永远不会执行循环体中break后面的其他语句。continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环,该语句一般也需要与if语句配合使用。
    两个语句的区别在于:break语句用于结束循环,而continue语句只是跳过后面的语句继续循环。break除了可以中止循环外,还应用与switch语句,而continue语句只能用于循环结构。

    • break语句只能跳出其所在的一个循环,在嵌套循环结构中,不能跳出所有循环。

    5.goto语句

    goto语句也称为无条件转移语句,其一般格式如下:goto 语句标号; 其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号。语句标号起标识语句的作用,与goto 语句配合使用。
    例如:输入一行字符串,用代码实现字符数量统计:

    编译器不限制程序中使用标号的次数,但各标号不得重名。goto语句能实现跳转功能,转去执行语句标号所标识的语句, goto语句通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。 但是,我们一般不主张使用goto语句,因为使用该语句容易造成程序流程的混乱,容易破坏程序的严谨性、结构性,使理解和调试程序都产生困难。

    6.嵌套循环结构

    通过对题目的分析,我们可以知道这道题的本质是求解二元一次方程“n = (98 * f - 199 * y)”,其中n为输入的支票原始面额。同时我们也知道,计算机并不是那么聪明,它没办法直接解出f,y这两个未知量的值,但是计算机擅长高速度的重复运算,因此我们就让计算机发挥它的特长,用穷举法来写这道题。
    代码实现:

    从这道例题中,我们就把在代码中的循环形式称为嵌套循环(或多重循环),简单的说就是在循环结构里面还有循环结构。对于我们初学者而言,嵌套循环的写法相对比较灵活,因此我们需要对内、外层循环有清晰的思路,特别是初始化语句,初学者容易因为混淆了内、外层循环的初始化,从而把循环的初始化语句放在了错误的位置上。

    7.循环结构实际应用——打印日历


    这段代码能实现1994~1999年的日历打印,运行效果:

    核心部分在于:

    这段代码控制着年份的准确输入和第一个日期打印的位置。但是这段代码只能打印区区6个年份的日历,现在我要拓宽可打印的日历年限,让这个程序能够成功地打印2019年。
    代码实现:

    我们利用了刚学习的for循环结构成功地找出了输入年份的第一个日期的位置,查询1900年的日历,1900年1月1日是星期一,接下来的年份的1月1日的position都会比上一年加上1,如果上一年是闰年就加上2,以7为最小正周期来变化。现在的代码打印的年份下限是1900年,上限是多少呢?——int类型的上限有多大,年份上限就有多大!我们甚至可以把int统统改为double类型。
    现在,我还想再加一段代码进去:

    运行效果:


    例题讲解

    单词长度

    算法分析

    定义变量ch存储每次读取的字符,定义变量sum存储单个单词的长度,定义变量flag用于使输出时末尾不输出空格。
    输入字符ch
    while ch != '.' do   //如果读取到“.”程序停止
        if ch != ' ' sum++   //过滤开头的空格,遇到非空格开始计数
        else if sum != 0
             if flag == 0   //输出第一个单词长度
                输出sum
                 flag = 1
                 sum = 0   //复位sum
              else   //输出其他单词长度
                  输出(空格)sum
                  sum = 0
              end if
           end if
        end if
        输入ch   //输入下一个字符,开始下一轮循环 
    end while
    if sum != 0   //单独输出最后一个单词
        if flag = 0
           输出sum
        else
           输出(空格)sum
        end if
    end if
    

    代码截图

    测试数据

    输入数据 输出数据 说明
    It's great to see you here. 4 5 2 3 3 4 sample
    I'm a vegetable chicken. 3 1 9 7 sample等价
    (空格)(空格)I'm a vegetable chicken(空格)(空格). 3 1 9 7 开头结尾多空格
    . 只有句号
    (空格)(空格)(空格)(空格)(空格). 空句子
    Yeah. 4 一个单词
    !@# $%^ &() _+}{ }":?> </- + . 3 3 4 4 5 4 1 一个神秘的句子

    求幂级数展开的部分和

    算法分析

    定义变量mol存放下一项的分子,定义变量den存放下一项的分母,定义变量x存放输入的数字,定义变量sum存放幂级数部分和,定义变量next存放下一项,用于结束循环
    输入x
    for i = 2;next >= 0.00001;i++
       sum = sum + mol * x / den
       next = mol * x / den
       mol = mol * x
       den = den * i
    end for
    输出sum
    

    代码截图

    测试数据

    输入数据 输出数据 说明
    1.2 3.3201 sample
    1.7 5.4739 sample等价
    0.5 1.6487 输入的x小于1大于0
    1 2.7183 输入的x等于1
    0 1.0000 输入的x取最小值
    5 148.4132 输入的x取最大值

    龟兔赛跑

    算法分析

    定义变量T为输入的时间,变量rabbit兔子跑过的路程,并初始化为0,变量tortoise乌龟跑过的路程,并初始化为0变量i经过的分钟,变量rest休息时间,并初始化为0,变量flag用于表示兔子处于休息状态,并初始化为0。
    输入变量T
    for  i = 0;i< T ;i++   //循环的次数表示经过的分钟数
        if flag == 1   //判断兔子是否在休息
           rest++   //休息一分钟
           if rest == 30   //判断兔子是否休息好了
              flag = 0   //兔子结束休息
           end if
        else
           rabbit = rabbit + 9
           if i % 10 == 0   //判断兔子是否回头看
              if rabbit > tortoise   //如果兔子跑得远,开始休息
              flag = 1
              rest = 0   //休息分钟数复位为0
              end if
           end if
        end if
        tortoise = tortoise + 3   //乌龟不休息
    end for
    if rabbit == tortoise 
       输出-_- 变量rabbit
    else if rabbit > tortoise
          输出@_@ 变量tortoise 
       else 输出^_^ 变量rabbit
       end if 
    end if
    

    代码截图

    测试数据

    输入数据 输出数据 说明
    242 @_@ 726 sample
    0 -_- 0 没出发
    9 ^_^ 81 兔子赢
    20 ^_^ 90 兔子躺赢
    29 ^_^ 90 兔子赢临界点
    30 -_- 90 并驾齐驱
    31 @_@ 93 乌龟赢临界点
    44 @_@ 132 乌龟赢临界点
    45 -_- 135 并驾齐驱
    46 ^_^ 144 兔子赢临界点
    59 ^_^ 180 兔子赢临界点
    60 -_- 180 并驾齐驱
    61 @_@ 183 乌龟赢临界点
    90 -_- 270 并驾齐驱
  • 相关阅读:
    MySQL——索引
    MySQL——逻辑分层与存储引擎
    APP测试总结
    如何提高测试的质量
    测试用例的基础
    opencv图像处理常用操作一
    【bug】【Cannot find reference 'imread' in '__init__.py | __init__.py'】
    Numpy学习笔记
    工业互联网
    Python基本的数据清洗
  • 原文地址:https://www.cnblogs.com/linfangnan/p/11682033.html
Copyright © 2011-2022 走看看