程序设计基础A第4章基本控制结构马新娟2011.10程序对数据的处理流程:程序的主要功能就是对数据的处理,其整个流程主要包括数据的输入、数据的处理、数据的输出。数据处理数据输入数据输出C程序中如何实现数据输入?C程序中如何实现数据输出?32020/1/19第四章基本控制结构本章知识点4.1顺序结构4.2选择结构4.3循环结构4.4C语言控制结构应用举例42020/1/19第四章基本控制结构C语言提供了支持重复执行某一段程序的循环控制语句。主要有以下方式:(1)while语句;(2)do...while语句;(3)for语句;4.3循环结构52020/1/19第四章基本控制结构发现重复性动作到写好一个循环结构通常包括:循环中涉及哪些变量?循环开始前应该赋给它们什么初值?循环体中应该如何修改它们?在什么情况下应该继续(或应该终止)循环?循环终止后如何得到所需要的结果62020/1/19第四章基本控制结构4.3.1while循环while语句的一般形式:while(表达式)语句while语句的执行过程:只要表达式的值为非0,就重复执行语句,直到表达式值为0时止4.3循环结构72020/1/19第四章基本控制结构4.3.2do-while循环特点是先执行循环体一次,然后根据循环中“表达式”的值判断循环条件是否成立。一般形式为:do循环体while(表达式);执行过程:先执行一次指定的循环体语句,再计算“表达式”的值,当表达式的值为非0时,继续执行循环体语句,直到“表达式”的值等于0时循环结束。语句会被至少执行一次。4.3循环结构82020/1/19第四章基本控制结构4.3.2do-while循环do-whie语句和while语句的区别在于:do-while是先执行循环体后判断,因此do-while至少要执行一次循环体;而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。while语句和do-while语句一般可以相互替用。4.3循环结构92020/1/19第四章基本控制结构4.3.2do-while循环例4.19计算正整数n的各位上的数字的乘积。分析:对于一个正整数n,n%10可以求出n的个位数字,n/10%10可以得到n的十位数字,n/100%10可以得到n的百位数字,依次类推,可以使用一个循环得到正整数n的各位数字。4.3循环结构102020/1/19第四章基本控制结构#includestdio.hvoidmain(){longn,k=1;printf(Pleaseenteranumber:);scanf(%ld,&n);do{k=k*(n%10);/*n%10求出n上各位的数字,k用来求出数字之积*/n=n/10;}while(n);printf(\n%ld\n,k);}4.3循环结构112020/1/19第四章基本控制结构条件PA当型循环直到型循环真假假条件PA假真假条件P条件PA假当循环条件第一次就为假时122020/1/19第四章基本控制结构4.3.3for循环for语句的一般形式为:for(表达式1;表达式2;表达式3)语句for语句执行过程如下:(1)首先求解表达式1。表达式1一般用于给循环初始变量赋值。(2)求解表达式2,若其值为非0,则执行for语句中指定的循环体语句,然后执行下面的第(3)步,若为0(“假”),则结束循环,转到第(5步)。表达式2一般用于条件判断,并决定循环是否结束。(3)求解表达式3。表达式3一般用于改变控制循环的循环变量的值,使得循环趋向结束。(4)返回第(2)步执行下一次循环。(5)循环结束,执行for语句下面的一个语句。4.3循环结构132020/1/19第四章基本控制结构4.3.3for循环例4.20利用for语句求1+2+3+…+100的值。#includestdio.hvoidmain(){inti,sum;for(i=1,sum=0;i=100;i=i+1)sum+=i;printf(sum=%d,sum);}4.3循环结构142020/1/19第四章基本控制结构4.3.3for循环for语句的一般形式,可以表示成while语句的形式:表达式1;while(表达式2){语句表达式3;}3种循环形式可以互换4.3循环结构152020/1/19第四章基本控制结构4.3.3for循环例4.21斐波那契(Fibonacci数列)问题。该数列前2个数据项为1。从第3项开始,每项都是该项的前两项之和,输出该数列的前20项,每行5个数据项。分析:斐波那契数列:1,1,2,3,5,8,13,…。变量f1和f2表示数列的前两项,变量f3表示前两项的和。用递推法解:设用f1,f2,f3表示相邻的三个裴波那契数据项,据题意递推的初始条件为:f1=f2=1;递推的公式为:f3=f1+f2。为了反复使用迭代公式,可以在每一个数据项求出后将f1、f2和f3顺次向后移动一个数据项,即将f2的值赋给fl,f3的值赋给f2,从而构成如下的迭代语句序列:f3=f1+f2;f1=f2;f2=f3;反复使用该语句序列就能够求出所要求的斐波那契数列。4.3循环结构162020/1/19第四章基本控制结构4.3.3for循环例4.21Fibonacci数列,输出该数列前20项,每行5个数据项。#includestdio.hvoidmain(){intf1=1,f2=1,f3;inti;printf(\n%-10d%-10d,f1,f2);for(i=3;i=20;i++){f3=f1+f2;printf(%-10d,f3);if(i%5==0)printf(\n);f1=f2;f2=f3;}}4.3循环结构172020/1/19第四章基本控制结构国王的许诺。相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒)总粒数为:sum=1+2+22+23+…+263补充例题:182020/1/19第四章基本控制结构#defineCONST1.42e8/*定义符号常量CONST值为1.42e8*/#includestdio.hmain(){intn;doubleterm=1,sum=1;/*累乘求积、累加求和变量赋初值*/for(n=2;n=64;n++){term=term*2;/*根据后项总是前项的2倍计算累加项*/sum=sum+term;/*作累加运算*/}printf(sum=%e\n,sum);/*打印总麦粒数*/printf(volum=%e\n,sum/CONST);/*打印折合的总麦粒体积数*/}192020/1/19第四章基本控制结构for循环控制结构的灵活运用,常见的几种省略形式:(1)省略for控制结构中的表达式1:for(;表达式2;表达式3)循环体i=1;sum=0;for(;i=100;i++)sum+=i;(2)省略for控制结构中的表达式2for(表达式1;;表达式3)循环体则形成死循环,等价于:for(表达式1;1;表达式3)循环体4.3循环结构202020/1/19第四章基本控制结构for循环控制结构的灵活运用,常见的几种省略形式:(3)省略for控制结构中的表达式3:for(表达式1;表达式2;)循环体for(i=1,sum=0;i=100;){sum+=i;i++;}(4)省略for控制结构中的所有表达式:for(;;)构成了典型的for语句表示的死循环结构4.3循环结构212020/1/19第四章基本控制结构for循环的灵活运用示例例4.23在一行输出10个”*”。代码(1):#includestdio.hvoidmain(){inti;for(i=0;i10;i++)printf(*);printf(\n);}代码(2):#includestdio.hvoidmain(){inti=0;for(;i10;i++)printf(*);printf(\n);}4.3循环结构222020/1/19第四章基本控制结构例4.23在一行输出10个”*”。代码(3):#includestdio.hvoidmain(){inti;for(i=0;i10;){printf(*);i++;}printf(\n);}代码(4):#includestdio.hvoidmain(){inti=0;for(;i10;){printf(*);i++;}printf(\n);}4.3循环结构232020/1/19第四章基本控制结构例4.23在一行输出10个”*”。代码(5):#includestdio.hvoidmain(){inti;for(i=0;i10;printf(*),i++);printf(\n);}4.3循环结构242020/1/19第四章基本控制结构4.3.4循环嵌套在一个循环结构的循环体内又包含另外一个完整的循环结构,称为循环的嵌套。内嵌的循环还可以再嵌套循环,这就是多重循环,其中最常用的循环嵌套还是两重循环。外层的循环称为外循环,被嵌套的循环称为内循环。1.嵌套循环执行的过程是:每进入一次外层循环,内层循环要按照赋初值、判断循环条件、执行内层循环体这三个过程进行,直到内层循环条件不成立;接下来顺序地执行外层循环体中、内层循环后的其他运算,外层循环体执行结束后返回外层循环条件判断,依此类推,直至外层循环条件为假。4.3循环结构252020/1/19第四章基本控制结构注意在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)while(i100);i++;for(i=0;i100;i++);printf(%d,i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量262020/1/19第四章基本控制结构4.3.4循环嵌套2.循环嵌套应注意以下几个问题:(1)内、外层循环的循环控制变量不能同名。(2)内循环应完全置于外循环内,内、外循环不得交叉。(3)循环嵌套中,内、外层循环的执行次数是很重要的。(4)循环嵌套的层数没有限制,但通常使用二重或三重循环。3.常见的循环嵌套类型三种循环形式互相嵌套4.3循环结构272020/1/19第四章基本控制结构合法的嵌套循环外层循环内层循环内层循环内层循环合法的嵌套循环282020/1/19第四章基本控制结构4.3.4循环嵌套4.循环嵌套设计举例循环嵌套在程序设计,特别是比较复杂问题的程序设计中有非常广泛的应用。如果确定用二重循环解决问题,在设计中首先要做好如下几个细节:明确外循环要实现的目标,搞清楚外循环的循环次数;明确内循环要实现的目标,搞清楚内循环的循环次数;建立内外循环之间的联系,一般而言,内循环的循环次数都是与外循环变量有关的,要找到内循环变量与外循环变量的关系。4.3循环结构292020/1/19第四章基本控制结构4.循环嵌套设计举例例4.24输入打印行数n,按照图形如下的规律打印出n行图形:***************分析:这是一个n行图形的打印问题,可以用循环来控制输出的行数。由于每行的输出图形是不同的,可以用一个嵌套的内循环来控制一行图形中“*”的输出个数。通过观察可以发现不同行图形中“*”的输出个数之间是有规律的,这个规律即:“*”的输出个数与所在的行数存在关系,由此可以得到内循环控制范围与外循环变量值之间的关系。4.3循环结构302020/1/19第四章基本控制结构#inclu