1、2023-6-41第三章第三章 程序设计基础程序设计基础3.1 算法与流程算法与流程3.2 程序结构和语句程序结构和语句3.3 数据的输入和输出数据的输入和输出3.4 顺序结构的程序设计顺序结构的程序设计3.5 分支结构的程序设计分支结构的程序设计3.6 循环结构的程序设计循环结构的程序设计在第二章学习了构成程序的基本成分常量、变量、运在第二章学习了构成程序的基本成分常量、变量、运算符和表达式等,本章介绍算符和表达式等,本章介绍c语言程序设计的三种基本结语言程序设计的三种基本结构。构。2023-6-42算法与流程算法与流程3.1.1 算法的概念算法的概念 计算机解决问题所依据的步骤称为计算机算
2、法,简称算法。计算机解决问题所依据的步骤称为计算机算法,简称算法。解决同一个问题有时可以采取不同的步骤,即存在不同的解决同一个问题有时可以采取不同的步骤,即存在不同的算法。(举例)算法。(举例)算法是程序设计的灵魂。计算机语言只是一种用来描述算算法是程序设计的灵魂。计算机语言只是一种用来描述算法的工具。法的工具。算法有优劣之分,一般应选择简单、运算步骤少、运算速算法有优劣之分,一般应选择简单、运算步骤少、运算速度快、内存消耗小的算法。度快、内存消耗小的算法。3.1.2 算法的属性算法的属性1 有穷性有穷性2 确定性确定性 3 有零个或多个输入有零个或多个输入 4 有一个或多个输出有一个或多个输
3、出 5 有效性有效性2023-6-433.1.3 算法的表示形式算法的表示形式表示算法有多种方法,常用的表示方法有:表示算法有多种方法,常用的表示方法有:自然语言、传统流程图、结构化流程图自然语言、传统流程图、结构化流程图(N-S盒图盒图)、伪代码、伪代码、计算机语言等。计算机语言等。传统流程图传统流程图起止框起止框处理框处理框输入输出框输入输出框流程线流程线判断框判断框连接点连接点2023-6-44AB顺序结构顺序结构 条件条件成立成立 不成立不成立 A B 选择结构选择结构当条件成立时当条件成立时A当型循环结构当型循环结构 直到条件不成立直到条件不成立A直到型循环结构直到型循环结构这两种循
4、环的区别:这两种循环的区别:当型循环,当型循环,A语句可能一次语句可能一次都不做,直到型循环,都不做,直到型循环,A语语句至少要执行一次。句至少要执行一次。N-S图去掉了流程线,全部算法写在一个矩形框内。图去掉了流程线,全部算法写在一个矩形框内。用用N-S盒图表示算法盒图表示算法2023-6-453.2 程序结构和语句程序结构和语句程序是使用语言给计算机的一组指令序列。程序是使用语言给计算机的一组指令序列。C C语言提供三种结构化语句来控制程序的执行语言提供三种结构化语句来控制程序的执行流程:流程:顺序结构、选择结构和循环结构。顺序结构、选择结构和循环结构。顺序结构:顺序结构:是指每个程序都是
5、按照语句的书写顺序是指每个程序都是按照语句的书写顺序依次执行的,它是最简单的依次执行的,它是最简单的 结构。结构。分支结构:分支结构:根据一定的条件有选择地执行或不执行根据一定的条件有选择地执行或不执行某些语句。某些语句。循环结构:循环结构:在一定条件下重复执行相同的语句。可在一定条件下重复执行相同的语句。可分为当型循环和直到型循环两种。分为当型循环和直到型循环两种。三种基本结构的三种基本结构的N-S图如前所示。图如前所示。2023-6-463.2.2 C语句概述语句概述程序包括数据描述和数据操作。数据描述主要定义数据结构,程序包括数据描述和数据操作。数据描述主要定义数据结构,数据操作是对数据
6、进行加工。数据操作是对数据进行加工。C程序对数据的处理和加工是通过程序对数据的处理和加工是通过“语句语句”的执行来实现的。的执行来实现的。语句的分类语句的分类1 简单语句简单语句在一个表达式或函数调用在一个表达式或函数调用 结尾处加分号就构成了一个语句。分号是语句不结尾处加分号就构成了一个语句。分号是语句不可缺少的一部分。可缺少的一部分。赋值表达式:赋值表达式:a=6赋值语句:赋值语句:a=6;printf是系统函数,是系统函数,printf(“I love C programming language”);是一个语句。是一个语句。2 特殊语句特殊语句 空语句:只有一个分号的语句。空语句:只有
7、一个分号的语句。复合语句:用括起来的语句,又称为分程序。复合语句:用括起来的语句,又称为分程序。3 流程控制语句流程控制语句C语言有语言有9种控制语句种控制语句2023-6-473.3 数据的输入与输出数据的输入与输出C C语言本身不提供输入输出语句,输入和输出操作是由函数语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。在来实现的。在C C标准函数库中提供了一些输入输出函数,例标准函数库中提供了一些输入输出函数,例如,如,printfprintf函数和函数和scanfscanf函数。函数。3.3.1 格式输出函数格式输出函数printf()它的作用是输出若干个任意类型的数据。调用该
8、函数,在其后它的作用是输出若干个任意类型的数据。调用该函数,在其后加上分号加上分号;构成了格式输出语句。构成了格式输出语句。调用形式:调用形式:printf(“格式控制字符串格式控制字符串”,输出项表)或,输出项表)或printf(字符串)字符串)按照按照“格式控制字符串格式控制字符串”的要求,将输出项的值显示在屏幕上。的要求,将输出项的值显示在屏幕上。格式控制:格式控制:用双引号括起来的字符串,串中有两种字符。用双引号括起来的字符串,串中有两种字符。格式字符:格式字符:由、格式字符组成,将输出格式转换为指定由、格式字符组成,将输出格式转换为指定格式。格式。普通字符:普通字符:原样输出的字符。
9、原样输出的字符。2023-6-48格式字符:1 d格式符格式符 d 按整型数据的实际长度输出按整型数据的实际长度输出md m为指定的输出字段的宽度,如果输出数据的位数为指定的输出字段的宽度,如果输出数据的位数小于小于m,则左端补以空格,若大于,则左端补以空格,若大于m,则按实际位数输出。,则按实际位数输出。2 o格式符格式符以八进制数形式输出整数,由于是将内存单元的各位的值按以八进制数形式输出整数,由于是将内存单元的各位的值按八进制形式输出,因此输出的数值不带符号,符号位也一起八进制形式输出,因此输出的数值不带符号,符号位也一起作为八进制数的一部分输出。作为八进制数的一部分输出。3 x格式符格
10、式符以十六进制数形式输出整数,同样不会出现负的十六进制数。以十六进制数形式输出整数,同样不会出现负的十六进制数。4 u格式符格式符用来输出用来输出unsigned型数据,即无符号数,以十进制形式输出。型数据,即无符号数,以十进制形式输出。2023-6-495 C格式符格式符 c 用来输出一个字符。一个整数,只要它的值在用来输出一个字符。一个整数,只要它的值在0255范围范围内,也可以用字符形式输出,在输出前,系统会将该整数作为内,也可以用字符形式输出,在输出前,系统会将该整数作为ASCII码转换成相应的字符,反之,一个字符数据也可以用整码转换成相应的字符,反之,一个字符数据也可以用整数形式输出
11、。数形式输出。6 s格式符格式符 s 用来输出一个字符串。用来输出一个字符串。1%ms,输出的字符串占输出的字符串占m列,如字符串本身长度大于列,如字符串本身长度大于m,则全,则全部输出,若串长小于部输出,若串长小于m,则左补空格。,则左补空格。2-ms,如果串长小于,如果串长小于m,则在,则在m列范围内,字符串向左靠,列范围内,字符串向左靠,右补空格。右补空格。3 m.ns,输出占输出占m列列,只取字符串左端只取字符串左端n个字符个字符,这这n个字符输出个字符输出在在m列的右侧列的右侧,左补空格。左补空格。4-m.ns,m和和n含义同上,含义同上,n个字符输出在个字符输出在m列范围的左侧,列
12、范围的左侧,右补空格,如果右补空格,如果nm,则,则m自动取自动取n值,保证值,保证n个字符正常个字符正常输出。输出。2023-6-4107 f格式符格式符用来输出实数(包括单、双精度),以小数形式输出。用来输出实数(包括单、双精度),以小数形式输出。1 f,不指定字段宽度,由系统自动指定,使整数部分全部如不指定字段宽度,由系统自动指定,使整数部分全部如数输出,输出六位小数。输出的不一定全都是有效数字,数输出,输出六位小数。输出的不一定全都是有效数字,单精度实数的有效位数一般是单精度实数的有效位数一般是7位。位。2 m.nf,指定输出的数据共占指定输出的数据共占m列列,小数点占一位,其中有小数
13、点占一位,其中有n位位小数,如果数值长度小于小数,如果数值长度小于m,则左端补空格。如果数据长,则左端补空格。如果数据长于于m,只取左边,只取左边m位,小数部分进行四舍五入。位,小数部分进行四舍五入。3-m.nf,与上基本相同,输出的数值向左端靠,右端补空格。与上基本相同,输出的数值向左端靠,右端补空格。8 e格式符格式符以指数形式输出实数,可以采用以下方式:以指数形式输出实数,可以采用以下方式:1 e 不指定输出数据所占的宽度和数字部分的小数位数。数值不指定输出数据所占的宽度和数字部分的小数位数。数值 按规范化指数形式输出(指定给出按规范化指数形式输出(指定给出6位小数,指数部分占位小数,指
14、数部分占4位,输出的实数共占位,输出的实数共占13列宽度)(不同系统规定不同)列宽度)(不同系统规定不同)2 m.ne和和-m.ne 3 g格式符格式符 用来输出实数,它根据数值的大小,自动选用来输出实数,它根据数值的大小,自动选f格式或格式或e格式,(选择输出时占宽度较小的一种)且不输出无意义的零。格式,(选择输出时占宽度较小的一种)且不输出无意义的零。2023-6-411格式:格式:scanf(格式控制,地址表);(格式控制,地址表);功能:用来输入任何类型数据,可同时输入多个类型或不同类型数据。功能:用来输入任何类型数据,可同时输入多个类型或不同类型数据。格式控制格式控制:是由双括号括起
15、来字符串,主要是由是由双括号括起来字符串,主要是由“%”和格式符组成和格式符组成表表 1Scanf函数格式字符函数格式字符格式字符格式字符功能功能d输入十进制整数输入十进制整数o输入八进制整数输入八进制整数x输入十六进制整数输入十六进制整数c输入单个字符输入单个字符s输入字符串输入字符串f,e输入浮点数(小数或指数形式)输入浮点数(小数或指数形式)ld,lo,lx输入长整型数据输入长整型数据lf,le输入长浮点型数据(双精度)输入长浮点型数据(双精度)3.3.2 格式输入函数格式输入函数scanf2023-6-412使用使用scanf函数时应注意的问题函数时应注意的问题1 scanf函数中的函
16、数中的“格式控制格式控制”后面应当是变量地址,而不应后面应当是变量地址,而不应是变量名。是变量名。2 如果在如果在“格式控制格式控制”字符串中除了格式说明以外还有其它字字符串中除了格式说明以外还有其它字符,则在输入数据时在对应位置输入与这些字符相同的符,则在输入数据时在对应位置输入与这些字符相同的字符。字符。3 在用在用c格式输入字符时,空格字符和格式输入字符时,空格字符和“转义字符转义字符”都作为都作为有效字符的输入。故输入字符型数据时,数据之间不用有效字符的输入。故输入字符型数据时,数据之间不用分隔符。分隔符。4 输入数据分隔输入数据分隔 1 采用隐含的分隔符采用隐含的分隔符:空格、回车键
17、、:空格、回车键、Tab键键 2 根据格式中指定的域宽分隔数据项。(不提倡)根据格式中指定的域宽分隔数据项。(不提倡)3 采用用户指定的分隔符。采用用户指定的分隔符。5 在在scanf函数中不能使用函数中不能使用u说明符,对说明符,对unsigned 型数据只能型数据只能以以%d或或%o、%x格式输入。格式输入。6 在用在用scanf函数输入数据时,不能规定精度。函数输入数据时,不能规定精度。2023-6-4133.3.3 字符输入输出函数字符输入输出函数字符输入函数字符输入函数getchar格式:格式:getchar()()功能:从键盘上接收输入的一个字符。功能:从键盘上接收输入的一个字符。
18、例如:例如:char c;c=c=getchar()其中其中c是字符型或整型变量。是字符型或整型变量。例例1:从键盘输入一个字符,并将其存入字符型变量:从键盘输入一个字符,并将其存入字符型变量c 中。中。#include”stdio.h”Main()char c;c=getchar();2023-6-414字符输出函数字符输出函数putchar数据的输出一般是以终端显示器(屏幕)为处理对象。数据的输出一般是以终端显示器(屏幕)为处理对象。格式:向终端输出一个字符。格式:向终端输出一个字符。说明:变量说明:变量c可以是字符型,也可以是整型。可以是字符型,也可以是整型。从键盘输入一个字符,在屏幕上
19、显示出来。从键盘输入一个字符,在屏幕上显示出来。#include”stdio.h”main()char c;c=getchar();/*从键盘输入一个字符从键盘输入一个字符*/putchar(c);/*在屏幕上显示一个字符在屏幕上显示一个字符*/putchar函数也可以输出一些特殊字符(控制字符),如:函数也可以输出一些特殊字符(控制字符),如:putchar(n)作用是输出一个作用是输出一个“换行换行”字符。字符。2023-6-415注意:注意:getchar、getch、putchar都在名为都在名为“stdio.h”的头文件里。因的头文件里。因此若用到这些函数,必须在程序的开头用文件包含
20、编译预处此若用到这些函数,必须在程序的开头用文件包含编译预处理命令。即理命令。即 include“stdio.h”getchar()与与getch()功能都是接收自键盘上输入的一个字符,返回输入字符的功能都是接收自键盘上输入的一个字符,返回输入字符的ASCII码值。都是无参函数。码值。都是无参函数。getchar()当程序执行到此函数时,将等待输入,只有当用户当程序执行到此函数时,将等待输入,只有当用户输入字符并按输入字符并按Enter键后,才接收输入的第一个字符,并键后,才接收输入的第一个字符,并在屏幕上回显该字符。同时送到内存的缓冲区,准备赋给在屏幕上回显该字符。同时送到内存的缓冲区,准备
21、赋给指定的变量。空格符、制表符、和回车键都被当做有效字指定的变量。空格符、制表符、和回车键都被当做有效字符输入。符输入。getch()直接从键盘获取键值直接从键盘获取键值,不等待用户按回车不等待用户按回车,只要用户按只要用户按一个键一个键,getch就立刻返回就立刻返回,不把字符回显到屏幕上。不把字符回显到屏幕上。2023-6-4163.5分支结构程序设计分支结构程序设计在很多情况下需要根据条件选择所要执行的语句,在很多情况下需要根据条件选择所要执行的语句,C语言的分语言的分支语句有两类,支语句有两类,一类是一类是if语句,另一类是语句,另一类是switch语句语句。条件语句的作用是使程序按某
22、种条件有选择的执行一条或多条条件语句的作用是使程序按某种条件有选择的执行一条或多条语句。语句。选择结构中的语句是否执行,取决于某个选择结构中的语句是否执行,取决于某个“条件条件”是否成立。是否成立。选择结构的程序有三种形式:选择结构的程序有三种形式:单分支结构单分支结构、双分支双分支和和多分支多分支。分支与双分支结构:分支与双分支结构:单分支结构单分支结构程序:程序:if(表达式)(表达式)语句语句 1;双分支结构双分支结构程序:程序:if(表达式)(表达式)语句语句1;else 语句语句2;多分支结构多分支结构程序:程序:switch语句与语句与if-else嵌套嵌套Switch语句:语句:
23、Switch(表达式)(表达式)case 常量表达式常量表达式1:语句组:语句组 1;break;default:语句组语句组n+1;2023-6-417例:请输入两个整数例:请输入两个整数a,b,比较,比较a+b和和a*b哪个大,输出判哪个大,输出判断结果。断结果。#include stdio.h main()int a,b,s1,s2;printf(“please input two numbers a,b:);scanf(%d,%d,&a,&b);s1=a+b;s2=a*b;if(s1s2)printf(a+b)(a*b)n);else printf(a+b)=(a*b)n);2023-
24、6-418运行结果为:运行结果为:please input two numbers a,b:2,3 (a+b)s2,则执行语句,则执行语句A(跳过语句跳过语句B不执行不执行),否则,就跳过语句否则,就跳过语句A执行语句执行语句B。可见可见if语句在程序中起到了改变语句执行顺序的作用。语句在程序中起到了改变语句执行顺序的作用。2023-6-419例:求分段函数的值,如果例:求分段函数的值,如果x0,y=2x+1;否则;否则,y=0。#include stdio.hmain()int x,y;printf(“please input the value of x:);scanf(%d,&x);if
25、(x=0)y=2*x+1;else y=0;printf(“when x=%d,f(x)=%d,x,y);2023-6-420运行结果:运行结果:please input the value of x:3 when x=3,f(x)=7因为输入因为输入x=3,那么,那么x=0为真,所以输出为真,所以输出2*3+1=7。C语言中有一种特有的条件运算符语言中有一种特有的条件运算符“?:?:”,我们在前面章节,我们在前面章节已已作介绍,它在某种程序上可以起到逻辑判断的作用。作介绍,它在某种程序上可以起到逻辑判断的作用。本例中的本例中的if语句也可用条件运算符表达式实现如下:语句也可用条件运算符表达式
26、实现如下:y=x=0?2*x+1:0;2023-6-421如果两个分支中需要执行的语句不止一条,必须用如果两个分支中需要执行的语句不止一条,必须用“”括起来,作为一个复合语句使用。若只是一条语句,括起来,作为一个复合语句使用。若只是一条语句,“”可以省略。可以省略。【注意【注意】(1)if1)if后面的后面的 一定要有括号;一定要有括号;(2)if(2)if和和elseelse同属于一个同属于一个ifif语句,语句,elseelse不能作为语句单独使用,不能作为语句单独使用,它只是它只是ifif语句的一部分,与语句的一部分,与ifif配对使用,因此程序中不可配对使用,因此程序中不可以没有以没有
27、ifif而只有而只有elseelse;(3)(3)只能执行与只能执行与ifif有关的语句或者执行与有关的语句或者执行与elseelse有关的语句,而有关的语句,而不可能同时执行两者;不可能同时执行两者;2023-6-422例例4-1:从键盘输入两个整:从键盘输入两个整数数a和和b,如果,如果a大于大于b则交换则交换两数,最后输出两个数。两数,最后输出两个数。#include void main()int a,b,t;scanf(%d,%d,&a,&b);if(ab)t=a;a=b;b=t;printf(a=%d,b=%dn,a,b);输入输入x,yx,yxyxymax=xmax=x输出最大值输
28、出最大值结束结束真真假假max=ymax=y2023-6-423多分支结构多分支结构多分支结构可以用多分支结构可以用if-else语句嵌套结构或语句嵌套结构或switch语句来实现。语句来实现。vif-else 语句嵌套格式:语句嵌套格式:嵌套形式嵌套形式1 if(if(表达式表达式1)1)if(表达式表达式2)语句语句1;else 语句语句2;else else 语句语句3;3;假假(0)真真(非非0)语句语句3表达式表达式1表达式表达式2真真(非非0)假假(0)语句语句2语句语句12023-6-424嵌套形式嵌套形式2if(表达式表达式1)if(表达式表达式2)语句语句1 else 语句语
29、句2在在if-else语句中包含一个单分支结构复合语句,即语句中包含一个单分支结构复合语句,即else与第一与第一个个if结合。因为第二个结合。因为第二个if 在复合语句中,复合语句是一条语在复合语句中,复合语句是一条语句,不能与复合语句外的句,不能与复合语句外的else结合。结合。思考:若将去掉,会怎么样?思考:若将去掉,会怎么样?若去掉,则若去掉,则else与第二个与第二个if 结合。结合。2023-6-425嵌套形式嵌套形式3 if(表达式表达式 1)语句语句1 else if(表达式表达式2)语句语句2 else 语句语句3if(表达式表达式1)if(表达式表达式2)语句语句1 els
30、e 语句语句2if(if(表达式表达式1)1)if(表达式表达式2)语句语句1 else 语句语句2 else else 语句语句3 3表达式表达式1为真,执行语句为真,执行语句1,如果为,如果为假,判断表达式假,判断表达式2的值,若为真,的值,若为真,执行语句执行语句2,若为假,执行语句,若为假,执行语句3。2023-6-426switch语句语句n虽然用嵌套虽然用嵌套if语句可描述和实现多分支结构程序,但分支语句可描述和实现多分支结构程序,但分支较多时会很烦琐,可读性差,在编程时容易出错,当层次较多时会很烦琐,可读性差,在编程时容易出错,当层次太多时,编程者甚至自己也会对选择的关系混淆不清
31、。太多时,编程者甚至自己也会对选择的关系混淆不清。C语言专门提供了一种多重分支选择语句语言专门提供了一种多重分支选择语句switch语句。语句。switch语句格式如下:语句格式如下:switch(表达式表达式)case 常量表达式常量表达式1:语句组语句组1;break;case 常量表达式常量表达式2:语句组语句组2;break;case 常量表达式常量表达式n:语句组语句组n;break;default:语句语句组组n+1;记住不记住不能接能接;号号2023-6-427说明:说明:(1)当表达式的值与某一个当表达式的值与某一个case后面的常量表达式的值相等时,后面的常量表达式的值相等时
32、,就执行此就执行此case后面的语句,若所有的后面的语句,若所有的case中的常量表达式中的常量表达式的值都没有与表达式的值匹配的,就执行的值都没有与表达式的值匹配的,就执行default后面的语后面的语句。句。(2)每一个每一个case 的常量表达式值必须互不相同,的常量表达式值必须互不相同,否则就会出现否则就会出现相互矛盾的现象。相互矛盾的现象。(对表达式的同一个值,有两种或多种执行方案。)(对表达式的同一个值,有两种或多种执行方案。)(3)break语句的作用是退出语句的作用是退出switch语句,如果语句组语句,如果语句组i后面没后面没有安排有安排break语句,那么执行完语句,那么执
33、行完后,会继续往下执后,会继续往下执行行。(4)case和和default的出现次序不影响执行的结果。的出现次序不影响执行的结果。2023-6-428(5)执行完一个执行完一个case后面的语句后,流程控制转移到下一后面的语句后,流程控制转移到下一个个case继续执行,继续执行,(“case常量表达式常量表达式”只起语句标号作用,只起语句标号作用,并不是在该处进行条件判断。在执行并不是在该处进行条件判断。在执行switch语句时,根据语句时,根据switch后面的表达式的值找到匹配的入口标号,就从此标号开始执行后面的表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。)下去,不
34、再进行判断。)因此,应该在执行一个因此,应该在执行一个case分支后,使程序跳出分支后,使程序跳出switch结构,即结构,即终止终止switch语句的执行,可以用一个语句的执行,可以用一个break语句来达到此目的。语句来达到此目的。最后一个分支可以不加最后一个分支可以不加break语句。语句。(6)在在case后面虽然包含了一个以上的执行语句,但可以后面虽然包含了一个以上的执行语句,但可以不必用,会自动顺序执行本不必用,会自动顺序执行本case后面的所有的执后面的所有的执行语句。行语句。(当然加上也可。)(当然加上也可。)2023-6-429举例说明举例说明要求按照考试成绩的等级打印出百分
35、制分数段,可以用要求按照考试成绩的等级打印出百分制分数段,可以用switch语句语句实现:实现:switch(grade)case A:printf(“90100n”);case B:printf(“7089n”);case C:printf(“6069n”);case D:printf(“60n”);default:printf(“errorn”);若若grade的值等于的值等于A,则将连续输出:则将连续输出:901007089606960n”);break;grade 的值为的值为A、B或或C时都执行同一组时都执行同一组语句。语句。举例说明举例说明22023-6-431假设用假设用0 0、
36、1 1、2.62.6分别表示星期日星期一分别表示星期日星期一.星期六星期六。现输入一个数字,输出对应的星期几的英文单词。现输入一个数字,输出对应的星期几的英文单词。如果输如果输入入3 3,输出,输出“Wednesday”Wednesday”。#include stdio.hvoid main()int n;scanf(%d,&n);switch(n)case 0:printf(Sundayn);break;case 1:printf(Mondayn);break;case 2:printf(Tuesdayn);break;case 3:printf(Wednesdayn);break;case
37、 4:printf(Thursdayn);break;case 5:printf(Fridayn);break;case 6:printf(Saturdayn);break;default:printf(Error);程序运行情况如下:程序运行情况如下:33Wednesday Wednesday 举例说明举例说明32023-6-432循环结构循环结构在许多问题上需要用到循环控制。在许多问题上需要用到循环控制。例如:例如:要输入全校学生的成绩,求若干个数之和要输入全校学生的成绩,求若干个数之和,迭代求迭代求根根等。等。循环结构循环结构是是结构化程序设计结构化程序设计的基本结构之一,它和的基本结构
38、之一,它和顺序结顺序结构、选择结构构、选择结构作为复杂程序的作为复杂程序的基本构造单元基本构造单元。熟练掌握选择结构和循环结构的概念及使用是程序设计的熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。最基本的要求。循环结构的几种形式:循环结构的几种形式:(1)用用goto语句和语句和if语句构成循环。语句构成循环。(2)用用while语句。语句。(3)用用do-while语句。语句。(4)用用for语句。语句。(这种用法不符和结构(这种用法不符和结构化程序设计,一般化程序设计,一般不采用。)不采用。)2023-6-433while语句语句while语句实现语句实现“当型当型”循环
39、结构。一般形式如下:循环结构。一般形式如下:while(表达式)表达式)语句语句当表达式为非当表达式为非0时,执行时,执行while语句中的内嵌语句,流程图如下所示:语句中的内嵌语句,流程图如下所示:特点是先判断表达式的值,后执行语句。特点是先判断表达式的值,后执行语句。表达式表达式语句语句0非非02023-6-434程序实例程序实例i=1,sum=0i=100sum=sum+ii=i+1;假假真真sum=sum+i;i=i+1;i=1,sum=0当i=100计算计算1+2+3+99+1002023-6-435 程序如下程序如下:main()int i,sum=0;i=1;while(i=10
40、0)sum=sum+i;i+;printf(“%d”,sum);2023-6-436do while语句语句 do 循环体语句循环体语句 while(表达式表达式);先执行一次指定的循环体语句,然后判别先执行一次指定的循环体语句,然后判别 表达式,当表达式的表达式,当表达式的值为真值为真(非零非零),返回重新执行循环体语句,如此反复,直到,返回重新执行循环体语句,如此反复,直到表达式的值等于表达式的值等于0为止,此时循环结束。为止,此时循环结束。循环体语句循环体语句表达式表达式假假真真 直到条件不成立直到条件不成立A2023-6-437sum=0;i=1;sum=sum+i;i=i+1;i=1
41、00假假真真sum=0;i=1;sum=sum+i;i=i+1;当当i100用用do-while语句语句计算计算1+2+3+99+1002023-6-438使用使用do-while结构程序如下:结构程序如下:main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d”,sum);main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%d”,sum);使用使用While语句结构程序如下:语句结构程序如下:2023-6-439for 语句语句C语言中的语言中的for语句使用最为灵
42、活,完全可以替代语句使用最为灵活,完全可以替代while语句。语句。格式:格式:for(表达式(表达式1;表达式;表达式2;表达式;表达式3)语句)语句 执行过程:执行过程:(1)先计算表达式先计算表达式1的值;的值;(2)然后求解表达式然后求解表达式2 的值,若结果为真的值,若结果为真(非非0),则执行后面的循环体各语,则执行后面的循环体各语句句,若假,则结束循环。转第若假,则结束循环。转第(5)步。步。(3)求解表达式求解表达式3,至此完成一次循环。,至此完成一次循环。(4)转到第转到第(2)步,继续执行,开始再次的循环。步,继续执行,开始再次的循环。(5)循环结束,执行循环结束,执行fo
43、r语句下面的一个语句。语句下面的一个语句。循环变量赋初循环变量赋初值值循环条件循环条件循环变循环变量增量量增量循环体循环体部分部分2023-6-440流程图流程图求解表达式求解表达式1求解表达式求解表达式3for语句的语句的下一语句下一语句语句语句表达式表达式2假真2023-6-441 main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%d”,sum);main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“%d”,sum);显然,用显然,用for语句简单方便。对语句简单方便。对应应f
44、or语句的一般形式可以改写语句的一般形式可以改写为为while循环的形式。循环的形式。计算计算1+2+3+99+1002023-6-442关于关于for语句的几点说明语句的几点说明1for语句中条件测试总是在循环开始时进行,如语句中条件测试总是在循环开始时进行,如果循环体部分是由多个语句组成的,则必须用花果循环体部分是由多个语句组成的,则必须用花括号括起来,使其成为一个复合语句。括号括起来,使其成为一个复合语句。2在在for语句中,表达式语句中,表达式1通常是为循环变量赋初值通常是为循环变量赋初值的表达式;表达式的表达式;表达式2是控制循环的表达式,表达是控制循环的表达式,表达式式3通常是改变
45、循环变量值的表达式。表达式通常是改变循环变量值的表达式。表达式1和和表达式表达式3既可以是一个简单的表达式,也可以是既可以是一个简单的表达式,也可以是逗号表达式。逗号表达式。3for语句的表示形式相当灵活,可以部分或全部语句的表示形式相当灵活,可以部分或全部省略,但;不能省略省略,但;不能省略,如,如for(;)。2023-6-443 NOTEnfor语句的一般形式中的语句的一般形式中的“表达式表达式1”可以省略,此时应在可以省略,此时应在for语句之前给循环变量赋初值,省略表达式语句之前给循环变量赋初值,省略表达式1时,其后的分号时,其后的分号不能省略。不能省略。如如for(;i=100;i
46、+)sum=sum+i;跳过跳过“求解表达求解表达式式1”这一步,其它不变这一步,其它不变。n如果表达式如果表达式2省略,即不判断循环条件,循环无终止地进行省略,即不判断循环条件,循环无终止地进行下去,也就是认为表达式下去,也就是认为表达式2始终为真。始终为真。例如例如:for(i=1;i+)sum=sum+i;相当于相当于i=1;while(1)sum=sum+1;i+;(需要需要break终止循环终止循环)n表达式表达式3可以省略,但此时程序设计者应另外设法保证循环可以省略,但此时程序设计者应另外设法保证循环能正常结束。能正常结束。n可以省略表达式可以省略表达式1和表达式和表达式3,只有表
47、达式,只有表达式2,即只给循环条,即只给循环条件。完全等同于件。完全等同于while语句。语句。n3个表达式都可以省略。个表达式都可以省略。如如for(;)语句语句 相当于相当于while(1)语句语句即不设初值、不判断条件即不设初值、不判断条件(认为表达式认为表达式2为真为真)循环变量不增循环变量不增值。无终止的执行循环体。值。无终止的执行循环体。n表达式一般为关系表达式表达式一般为关系表达式(如如i=100)或逻辑表达式或逻辑表达式(如如ab&xy),但也可以是数值表达式或字符表达式,只要其但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。值为非零,就执行循环体。(如如:fo
48、r(k=1;k-4;k+)s=s+k;)2023-6-444几种循环的比较几种循环的比较1 这三种循环都可以用来处理同一问题,一般情况下可这三种循环都可以用来处理同一问题,一般情况下可以相互代替。以相互代替。(不提倡用不提倡用goto型循环型循环)2 while和和do-while循环,只在循环,只在while后面指定循环条件,后面指定循环条件,在循环体中应包含使循环趋于结束的语句。在循环体中应包含使循环趋于结束的语句。for循环可循环可以在表达式以在表达式3中包含使循环趋于结束的条件,甚至可以中包含使循环趋于结束的条件,甚至可以将循环体中的操作全部放到表达式将循环体中的操作全部放到表达式3中
49、,因此中,因此for语句语句的功能更强,凡用的功能更强,凡用while循环能完成的,用循环能完成的,用for循环都能循环都能实现。实现。3 用用while和和do-while循环时,循环变量初始化的操作应循环时,循环变量初始化的操作应在在while和和do-while语句之前完成。而语句之前完成。而for语句可以在表语句可以在表达式达式1中实现循环变量的初始化。中实现循环变量的初始化。4 while、do-while和和for循环,可以用循环,可以用break语句跳出循语句跳出循环,用环,用continue语句结束本此循环。语句结束本此循环。(对应对应goto语句和语句和if语句构成的循环,不
50、能用语句构成的循环,不能用break语句和语句和continue语句进语句进行控制行控制)2023-6-445break语句和语句和continue语句语句break语句语句break语句可以使流程跳出语句可以使流程跳出switch结构,继续执行结构,继续执行switch语句下语句下面的一个语句。面的一个语句。break语句还可以用来从循环体内跳出循环体,即提前结束循语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。环,接着执行循环下面的语句。break语句不能用于循环语句和语句不能用于循环语句和switch语句之外的任何其他语句语句之外的任何其他语句中。中。2023