《C入门经典第4版ch04循环》由会员分享,可在线阅读,更多相关《C入门经典第4版ch04循环(27页珍藏版)》请在金锄头文库上搜索。
1、C入门经典(第入门经典(第4版)版)第第04章章 循环循环 上一章学习了如何比较数据项,并根据其结果进行判断。我们可以根据程上一章学习了如何比较数据项,并根据其结果进行判断。我们可以根据程序的输入选择计算机如何做出反响。本章将介绍如何重复执行一个语句块,直序的输入选择计算机如何做出反响。本章将介绍如何重复执行一个语句块,直到满足某个条件为止,这称为循环。到满足某个条件为止,这称为循环。 语句块的执行次数可以简单地用一个计数器来控制,语句块重复执行指定语句块的执行次数可以简单地用一个计数器来控制,语句块重复执行指定的次数,或者还可以更复杂一些,重复执行一个语句块,直到满足某个条件为的次数,或者还
2、可以更复杂一些,重复执行一个语句块,直到满足某个条件为止,例如用户输入止,例如用户输入quitquit。后者可以编写上一章的计算器例如,使计算过程重复。后者可以编写上一章的计算器例如,使计算过程重复需要的次数,而不必使用需要的次数,而不必使用gotogoto语句语句 。C入门经典(第入门经典(第4版)版)4.1 循环循环 如前所述,使一系列语句重复执行指定的次数,或重复执行它们,直到满如前所述,使一系列语句重复执行指定的次数,或重复执行它们,直到满足某个条件为止的编程机制称为循环。循环和比较数据项是根本的编程工具。足某个条件为止的编程机制称为循环。循环和比较数据项是根本的编程工具。能比较数据值
3、和重复执行语句块后,就可以合并这两个功能,控制语句块的执能比较数据值和重复执行语句块后,就可以合并这两个功能,控制语句块的执行次数。例如,可以重复执行一个操作,直到比较的两个数据项相同为止。当行次数。例如,可以重复执行一个操作,直到比较的两个数据项相同为止。当它们相同时,就可以执行另一个操作它们相同时,就可以执行另一个操作 。C入门经典(第入门经典(第4版)版)4.2 递增和递减运算符递增和递减运算符 递增运算符递增运算符(+)(+)和递减运算符和递减运算符( )( )会将存储在整数变量中的值递增或递减会将存储在整数变量中的值递增或递减1 1。假设定义一个整数变量。假设定义一个整数变量numb
4、ernumber,它的当前值是,它的当前值是6 6。可以用下面的语句给它。可以用下面的语句给它加加1 1:+number; /* Increase the value by 1 */+number; /* Increase the value by 1 */C入门经典(第入门经典(第4版)版)4.3 for循环循环 使用使用forfor循环的根本形式可以使语句块重复执行指定的次数。假设要显示循环的根本形式可以使语句块重复执行指定的次数。假设要显示110 110 之间的数字,可以不用编写之间的数字,可以不用编写1010条条printf()printf()语句,而可以这么写:语句,而可以这么写:i
5、ntcount = 0; intcount = 0; for(count = 1; count = 10; +count)for(count = 1; count = 10; +count)printf(n%d, count); printf(n%d, count); C入门经典(第入门经典(第4版)版)4.4 for循环的一般语法循环的一般语法 forfor循环的一般形式如下:循环的一般形式如下: for(starting_condition; continuation_condition ; action_per_iteration) for(starting_condition; con
6、tinuation_condition ; action_per_iteration) Statement; Statement; Next_statement; Next_statement; 重复执行的语句由重复执行的语句由StatementStatement表示。通常这等价于包含在括号中的语句块表示。通常这等价于包含在括号中的语句块( (一组语句一组语句) )。C入门经典(第入门经典(第4版)版)4.5 再谈递增和递减运算符再谈递增和递减运算符 前面的例如使用了递增运算符,下面深入探讨递增和递减运算符的作用。前面的例如使用了递增运算符,下面深入探讨递增和递减运算符的作用。它们都是一元运算
7、符,只使用一个操作数,用来将存储在整数类型变量中的值它们都是一元运算符,只使用一个操作数,用来将存储在整数类型变量中的值加加1 1或减或减1 1 。 递增运算符递增运算符 递增运算符的前置和后置形式递增运算符的前置和后置形式 递减运算符递减运算符C入门经典(第入门经典(第4版)版)4.5.1 递增运算符递增运算符 先看看递增运算符。它的形式是先看看递增运算符。它的形式是+,给所操作的变量加,给所操作的变量加l l。例如,假设变。例如,假设变量的类型是量的类型是intint,下面的,下面的3 3条语句有相同的结果:条语句有相同的结果:count = count + 1;count = count
8、 + 1;count += 1;count += 1;+count;+count;C入门经典(第入门经典(第4版)版)4.5.2 递增运算符的前置和后置形式 前面将前面将+运算符放在变量前面,这叫做前置形式。这个运算符也可以写运算符放在变量前面,这叫做前置形式。这个运算符也可以写在变量的后面,这称为后置形式。在表达式中使用前置和后置形式的效果大不在变量的后面,这称为后置形式。在表达式中使用前置和后置形式的效果大不相同。如果在表达式中编写的是相同。如果在表达式中编写的是count+count+,那么变量,那么变量countcount的值在使用之后才递的值在使用之后才递增。这看起来有点复杂。修改前
9、面的例子:增。这看起来有点复杂。修改前面的例子:total = 6 + count+;total = 6 + count+;C入门经典(第入门经典(第4版)版)4.5.3 递减运算符递减运算符 递减运算符的操作和递增运算符完全相同。它的形式是递减运算符的操作和递增运算符完全相同。它的形式是 ,作用是给它,作用是给它操作的变量减操作的变量减1 1。它的使用方式和。它的使用方式和+完全相同。例如,假设变量完全相同。例如,假设变量countcount是是intint类类型,下面型,下面3 3条语句会有相同的结果:条语句会有相同的结果:count = count - 1;count = count -
10、 1;count -= 1;count -= 1;-count;-count;C入门经典(第入门经典(第4版)版)4.6 再论再论for循环循环 有了有了+和和 的更多了解,下面看看另一个使用循环的例子。的更多了解,下面看看另一个使用循环的例子。 试试看:数字汇总试试看:数字汇总 这个程序比用这个程序比用* *号画盒子要有用、有趣得多。假定想知道某条街上所有门号画盒子要有用、有趣得多。假定想知道某条街上所有门牌号的总和是多少,这需要读入一个整数值,再使用牌号的总和是多少,这需要读入一个整数值,再使用forfor循环汇总所有的整数,循环汇总所有的整数,从从1 1加到输入的那个数值为止。加到输入的
11、那个数值为止。uu 修改修改forfor循环变量循环变量 uu 没有参数的没有参数的forfor循环循环 uu 循环内的循环内的breakbreak语句语句 u 使用for循环限制输入 u 生成伪随机整数 u 再谈循环控制选项 u 浮点类型的循环控制变量 C入门经典(第入门经典(第4版)版)4.6.1 修改for循环变量 当然,递增循环控制变量不是只能加当然,递增循环控制变量不是只能加l l。可以用任意值改变循环控制变量,。可以用任意值改变循环控制变量,正数或负数均可。例如,可以逆向计算前正数或负数均可。例如,可以逆向计算前n n个整数的总和。个整数的总和。 C入门经典(第入门经典(第4版)版
12、)4.6.2 没有参数的for循环 如前所述,不必在如前所述,不必在forfor循环语句内放置任何参数。循环语句内放置任何参数。forfor循环的最简洁形式如循环的最简洁形式如下:下:for(;)for(;)statement; statement; 和前面一样,这里的和前面一样,这里的statementstatement也可以是放在括号中的语句块,且通常是也可以是放在括号中的语句块,且通常是语句块。因为没有循环继续条件、初始条件以及循环计数器,因此循环将永不语句块。因为没有循环继续条件、初始条件以及循环计数器,因此循环将永不停止。除非希望计算机总是什么都不做,否那么停止。除非希望计算机总是什
13、么都不做,否那么statementstatement必须包含退出循环必须包含退出循环的方式。要停止循环,循环体必须包含两条语句:判断结束循环的条件是否已的方式。要停止循环,循环体必须包含两条语句:判断结束循环的条件是否已满足的语句,以及终止当前循环迭代并继续执行循环后面语句的语句。满足的语句,以及终止当前循环迭代并继续执行循环后面语句的语句。C入门经典(第入门经典(第4版)版)4.6.3 循环内的break语句 第第3 3章在章在switchswitch语句里使用过语句里使用过breakbreak语句。它的作用是终止语句。它的作用是终止switchswitch块中代码块中代码的执行,并继续执行
14、跟在的执行,并继续执行跟在switchswitch后的第一行语句。后的第一行语句。breakbreak语句在循环体内的作语句在循环体内的作用和用和switchswitch根本相同。根本相同。 C入门经典(第入门经典(第4版)版)4.6.4 使用for循环限制输入 可可以以使使用用forfor循循环环限限制制用用户户输输入入的的次次数数。循循环环的的每每次次迭迭代代都都允允许许输输入入一一个个值值。当当循循环环完完成成指指定定的的重重复复次次数数后后,便便结结束束循循环环,不不允允许许再再输输入入数数据据。下下面面编编写写一一个个简单的程序来演示,这个程序实现了一个数字猜谜游戏。简单的程序来演示
15、,这个程序实现了一个数字猜谜游戏。C入门经典(第入门经典(第4版)版)4.6.5 生成伪随机整数 在前一个例子中,如果程序在每次执行时,可以生成要猜测的数字,该数在前一个例子中,如果程序在每次执行时,可以生成要猜测的数字,该数字每次都不同。为此,可以使用在头文件字每次都不同。为此,可以使用在头文件中声明的函数中声明的函数rand()rand():int chosen = 0;int chosen = 0;chosen = rand(); /* Set to a random integer */chosen = rand(); /* Set to a random integer */C入门经
16、典(第入门经典(第4版)版)4.6.6 再谈循环控制选项再谈循环控制选项 前面介绍了如何用前面介绍了如何用+和和 运算符递增或递减循环计数器。可以对循环计运算符递增或递减循环计数器。可以对循环计数器递增或递减任意数值。数器递增或递减任意数值。 C入门经典(第入门经典(第4版)版)4.6.7 浮点类型的循环控制变量浮点类型的循环控制变量 循环控制变量也可以是一个浮点类型的变量。下面的循环汇总从循环控制变量也可以是一个浮点类型的变量。下面的循环汇总从1/11/101/11/10的分数:的分数:double sum = 0.0;double sum = 0.0;for(double x = 1.0
17、; x11 ; x += 1.0)for(double x = 1.0 ; x11 ; x += 1.0)sum += 1.0/x;sum += 1.0/x;C入门经典(第入门经典(第4版)版)4. 7 while循环循环 forfor循环就介绍到这里。前面举了许多循环就介绍到这里。前面举了许多forfor循环的例子,现在探讨另一类循循环的例子,现在探讨另一类循环:环:whilewhile循环。在循环。在whilewhile循环中,只要某个逻辑表达式等于循环中,只要某个逻辑表达式等于truetrue,就重复执行,就重复执行一组语句。这可以表示为:一组语句。这可以表示为:While this c
18、ondition is trueWhile this condition is trueKeep on doing thisKeep on doing thisC入门经典(第入门经典(第4版)版)4. 8 嵌套循环嵌套循环 有时需要将一个循环放在另一个循环里面。例如计算某条街上每间房子有时需要将一个循环放在另一个循环里面。例如计算某条街上每间房子的居住的居住 人数。这需要进入每间房子,计算每间房子的居住人数。统计所有的人数。这需要进入每间房子,计算每间房子的居住人数。统计所有的房子是一个外部循环,在外部循环的每次迭代中,都要使用一个内部循环来计房子是一个外部循环,在外部循环的每次迭代中,都要使
19、用一个内部循环来计算居住人数。算居住人数。 C入门经典(第入门经典(第4版)版)4. 9 嵌套循环和嵌套循环和goto语句语句 前面学习了如何在一个循环内嵌套另一个循环,其实循环还可以嵌套任前面学习了如何在一个循环内嵌套另一个循环,其实循环还可以嵌套任意多层。例如:意多层。例如:for(int i = 0 ; i10 ; +i)for(int i = 0 ; i10 ; +i)for(int j = 0 ; j20 ; +k) for(int j = 0 ; j20 ; +k) /* Loop executed 10 times */* Loop executed 10 times */for
20、(int k = 0 ; k30 ; +k) for(int k = 0 ; k30 ; +k) /* Loop executed 10x20 times */* Loop executed 10x20 times */ /* Loop body executed 10x20x30 times */* Loop body executed 10x20x30 times */* Do something useful */* Do something useful */ 由由i i控制的外部循环每次迭代时,都会执行一次由控制的外部循环每次迭代时,都会执行一次由j j控制的内部循环。由控制的内部循
21、环。由j j控控制的循环每次迭代时,都会执行一次由制的循环每次迭代时,都会执行一次由k k控制的最内层循环。因此最内层的循控制的最内层循环。因此最内层的循环体会执行环体会执行6 0006 000次。次。 C入门经典(第入门经典(第4版)版)4. 10 do-while循环循环 第第3 3种循环类型是种循环类型是do-whiledo-while。既然已经有。既然已经有forfor循环和循环和whilewhile循环了,为什么还循环了,为什么还需要这个循环?需要这个循环?do-whiledo-while和这两个循环有非常微妙的区别。它是在循环结束时和这两个循环有非常微妙的区别。它是在循环结束时测试
22、循环是否继续,所以这个循环的语句或语句块至少会执行一次。测试循环是否继续,所以这个循环的语句或语句块至少会执行一次。 while while循环是在循环开始处进行测试。所以在任何动作发生之前,先检查循环是在循环开始处进行测试。所以在任何动作发生之前,先检查表达式表达式 。C入门经典(第入门经典(第4版)版)4. 11 continue语句语句 有时不希望结束循环,但要跳过目前的迭代,继续执行下一个迭代。循有时不希望结束循环,但要跳过目前的迭代,继续执行下一个迭代。循环体内的环体内的continuecontinue语句就有这个作用,它可以编写为:语句就有这个作用,它可以编写为: continue
23、; continue; 当然,当然,continuecontinue是一个关键字,不能将它用于其他目的。是一个关键字,不能将它用于其他目的。 C入门经典(第入门经典(第4版)版)4. 12 设计程序设计程序 现在,在一个比较大的编程问题上测试前面学习过的技巧,应用本章和前现在,在一个比较大的编程问题上测试前面学习过的技巧,应用本章和前一章学到的东西。本节还会介绍几个新的标准库函数,它们非常有用一章学到的东西。本节还会介绍几个新的标准库函数,它们非常有用 。 问题问题 分析分析 解决方案解决方案C入门经典(第入门经典(第4版)版)4.12.1 问题问题 本节要编写一个简单的本节要编写一个简单的S
24、imonSimon游戏,这是一个记忆测试游戏。计算时机在游戏,这是一个记忆测试游戏。计算时机在屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们,然后屏幕上将一串数字显示很短的时间。玩家必须在数字消失之前记住他们,然后输入这串数字。每次过关后,计算时机显示更长的一串数字,让玩家继续玩下输入这串数字。每次过关后,计算时机显示更长的一串数字,让玩家继续玩下去。玩家应尽可能使这个过程重复更多的次数。去。玩家应尽可能使这个过程重复更多的次数。C入门经典(第入门经典(第4版)版)4. 12.2 分析分析 程序必须产生一连串程序必须产生一连串0909的整数,使它们在屏幕上显示的整数,使它们在屏
25、幕上显示1 1秒钟,之后删除秒钟,之后删除它们。玩家试着输入这串数字。这串数字会一次比一次长,直到玩家输入错误它们。玩家试着输入这串数字。这串数字会一次比一次长,直到玩家输入错误为止。根据成功的次数和所花的时间来计分。然后程序会询问玩家,是否继续为止。根据成功的次数和所花的时间来计分。然后程序会询问玩家,是否继续玩玩 。C入门经典(第入门经典(第4版)版)4.12 .3 解决方案解决方案 本节列出解决该问题的步骤 。C入门经典(第入门经典(第4版)版)4.13 小结小结 本章介绍了使用循环重复执行动作的所有知识。使用前面所学的强大的编程工具,就可以创立相当复杂的程序了。我们可以使用3个不同的循环来重复执行语句块 。