第三章程序的流程控制_第1页
第三章程序的流程控制_第2页
第三章程序的流程控制_第3页
第三章程序的流程控制_第4页
第三章程序的流程控制_第5页
已阅读5页,还剩173页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章程序的流程控制第1页,课件共190页,创作于2023年2月3.1程序的概念程序是可以被计算机处理的指令序列。通常,程序是为完成一项任务、由汇编语言或高级语言编写的代码的集合。程序设计是根据所提出的任务,用某种程序设计语言编制一个能正确完成该任务的计算机程序。第2页,课件共190页,创作于2023年2月3.1.1程序的特性著名的计算机科学家沃思(NikiklausWirth)提出一个公式:程序=数据结构+算法。现在又有很多专家对这个公式加以扩充:程序=算法+数据结构+程序设计方法+语言工具和环境。第3页,课件共190页,创作于2023年2月所有程序(包括计算机程序)都有一些共同的性质,这些性质主要包括:(1)指令是顺序执行的。(2)程序的执行都有一个结果。(3)程序总是要对某些对象进行操作。(4)有的程序要加入对操作对象的说明。(5)有时指令要求执行者做出判断。(6)一条或一组指令可能需要执行多次。第4页,课件共190页,创作于2023年2月程序设计离不开算法,算法指导程序设计,算法是程序的灵魂。因此程序设计的大致步骤如下。(1)问题定义(2)算法设计(3)算法表示(4)程序编制(5)程序调试、测试及资料编制3.2算法第5页,课件共190页,创作于2023年2月精确地讲,算法是被精确定义的一系列规则,这些规则规定了解决特定问题的一系列操作顺序,以便在有限步骤内产生出所求问题的解答。3.2.1算法的特点第6页,课件共190页,创作于2023年2月

算法特性:(1)有效性。(2)确定性。(3)有穷性。(4)有零个或多个输入。(5)有一个或多个输出。有效性指算法所规定的操作都应当是能够有效执行的。确定性一是:所描述的操作应当具有明确的意义,不应当有歧义性。二是:操作作序列只有一个初始动作,序列中每一动作仅有一个后继动作;有穷性指算法所规定的操作序列必须在允许的时间内结束。第7页,课件共190页,创作于2023年2月【例3-1】从键盘输入三个数,找出其中最大的那个数。分析:从键盘输入的三个数值必须用三个变量来保存,假定这三个变量分别为a、b、c,另外,还需要一个变量max来装最大的那个数。先比较a和b的值,把数值大的放入max中,再将max与c比较,又把数值大的放入max中。经过两次比较,max中已存放的是a,b,c三个数中最大的数,把max的值输出就是所需结果。第8页,课件共190页,创作于2023年2月算法步骤:1.输入三个数,其值分别赋给三个变量a,b,c。2.把a与b中较大的那个数放入变量max中。3.把c与max中较大的那个数放入变量max中。4.输出最后结果max的值。第9页,课件共190页,创作于2023年2月三个数比较大小#include<stdio.h>voidmain(){ inta,b,c,max; printf("请输入三个数的值:"); scanf("%d%d%d",&a,&b,&c); if(a>b) max=a; else max=b; if(c>max) max=c; printf("最大的值是:%d\n",max);}第10页,课件共190页,创作于2023年2月1.流程图表示法流程图表示法常用图例

3.2.2算法的表示第11页,课件共190页,创作于2023年2月求三个数最大值问题的流程图表示第12页,课件共190页,创作于2023年2月2.N-S图描述灵活的流线是程序中隐藏错误的祸根。针对这一弊病,1973年美国学者I.Nassi和B.Shneiderman提出了一种无流线的流程图,称为N-S图。第13页,课件共190页,创作于2023年2月N-S图表示法求三个数中最大值问题的N-S图表示

第14页,课件共190页,创作于2023年2月常用的流程图符号一.顺序结构顺序结构是一种简单的线性结构,根据流程线所示的方向,各矩形框按顺序执行。如:右图语句的执行顺序为:A→B→CN-S图表示的顺序结构顺序结构流程图第15页,课件共190页,创作于2023年2月二.选择结构选择结构是对给定的条件进行判断,根据判断结果的真假而分别执行不同的框的内容。有两种选择(分支)结构的流程图:第16页,课件共190页,创作于2023年2月(a)的执行顺序为:先判断条件,当条件为真时,执行A,否则执行B。(b)的执行顺序为:先判断条件,当条件为真时,执行A,否则什么也不执行。第17页,课件共190页,创作于2023年2月三.循环结构循环结构是在某个条件为真的情况下,重复执行某个框中的内容。循环结构有两种基本形态:while型循环和do_while型循环。①while型(当型)循环的流程图while型循环的执行顺序为:重复判断条件、如果条件为真则执行A,一但条件为假,则跳出循环。②do-while(直到型)型循环的流程图do_while型循环的执行顺序为:先执行A,再判断条件,若条件为真则重复执行A,一但条件为假,则跳出循环。A被称为循环体,条件被称为循环控制条件。①while型循环的N-S图A被称为循环体,条件被称为循环控制条件。②do-while型循环的N-S图第18页,课件共190页,创作于2023年2月循环结构注意:1、在循环体中,必须对条件要烦判断的值进行修改,使得经过有限次循环后,循环一定能结束。2、while型循环中循环体可能一次都不执行,而do_while型循环则至少执行一次循体。3、do_while型循环可以很方便地转化为while型循环,而while型循环不一定能转化为do_while型循环。第19页,课件共190页,创作于2023年2月

伪码是用介于自然语言和计算机语言之间的文字和符号来描述算法,类似一篇短文,它把算法的思想表达清楚。3伪码表示法第20页,课件共190页,创作于2023年2月

关系运算关系运算是指对两个运算量之间的大小比较。C语言中提供的关系运算符有:>(大于)>=(大于或等于)<(小于)<=(小于或等于)==(等于)

!=(不等于)说明:(1)关系运算符的优先级低于纯算术类,

高于赋值类。(2)关系运算符的结合方式为自左至右。每个关系运算的操作数可以是任一表达式。例如:a+b<c+d应理解为(a+b)<(c+d)第21页,课件共190页,创作于2023年2月

关系运算(3)关系表达式的值只有两个:关系表达式成立,即为“真”,C语言中以“1”表示;关系表达式不成立,即为“假”,C语言中以“0”表示。例如:对于声明语句:intx=2,y=3;表达式x==y的值为0;表达式x<y的值为1。第22页,课件共190页,创作于2023年2月

关系运算表达式z=3-1>=x+1<=y+2中z的值为1。z=2>=3<=5“算术”优先z=0<=5“关系”优先z=1z的值为1“赋值”第23页,课件共190页,创作于2023年2月

关系运算注意:1.要说明x在区间[a,b]中,数学中使用表达式a≤x≤b。但C语言中的表达式“a<=x<=b”的含义与之不同。假设a=0;b=0.5。若x=0.3,则执行a<=x<=b时先求出“a<=x”的值得1,再进行“1<=b”得0(假)。因此,为了判断x是否在[a,b]范围内,应写成:

a<=x&&x<=b那么a<=x的值为1(真)且x<=b的值也为1(真),则整个表达式的值为1(真)。第24页,课件共190页,创作于2023年2月

关系运算2.表达式5>2>7>8在数学上是不允许的,而在C中是允许的。3.由于关系表达式的值是整型数0或1,故也可以将其看成是一种整型表达式。第25页,课件共190页,创作于2023年2月

关系运算例如:对于声明语句:intx=2,y=3;表达式x==y的值为0;表达式x<y的值为1。表达式z=3-1>=x+1<=y+2中z的值为1。z=2>=3<=5“算术”优先z=0<=5“关系”优先z=1z的值为1“赋值”第26页,课件共190页,创作于2023年2月

关系运算4.字符数据的比较按其ASCII码值进行。例如:’a’>0的值为1(真);’A’>100的值为0(假)。5.在判定两个浮点数是否相等时,由于存储上的误差,会得出错误的结果。例如:1.0/3.0*3.0==1.0的值为0(假)注:应避免对两个实数表达式作“相等”或“不相等”的判别。因此上式可改写为:fabs(1.0/3.0*3.0-1.0)<1e-5第27页,课件共190页,创作于2023年2月

逻辑运算C语言有三个逻辑运算符,它们是:&&(逻辑与)||(逻辑或)!(逻辑非)注:在进行判别时则把“非零”作为“真”,把0作为“假”。例如:if(8)printf(“true\n”);第28页,课件共190页,创作于2023年2月

逻辑运算&&和||是二元运算符,结合方向为自左至右;!为一元运算符,结合方向为自右至左。&&和||的优先级低于关系运算符,而!的优先级高于关系运算符。&&的优先级高于||。例如:!3>14>=3&&6<=33+9&&00||!53||4&&0第29页,课件共190页,创作于2023年2月

逻辑运算真值表数据a数据b!a!ba&&ba||b!(a&&b)TTFFTTFTFFTFTTFTTFFTTFFTTFFT0||a==aa||!a==1a||a==a!(a||b)==!a&&!b1&&a==a0&&!a==0a&&a==a!(a&&b)==!a||!b!(!a)==a第30页,课件共190页,创作于2023年2月选择型程序设计if语句(条件选择语句)if语句的三种形式形式一:格式:if(expression)statement执行过程:exprstatement非0=0例:if(x>y) printf(“%d”,x);第31页,课件共190页,创作于2023年2月#include<stdio.h>intmain(){intx,y;printf("Enteraninteger:");scanf("%d",&x);y=x;

if(y<0)y=-y;printf("\ninteger:%d--->absolutevalue:%d\n",x,y);return0;}例求一个数的绝对值数的绝对值第32页,课件共190页,创作于2023年2月【例】从键盘任意输入两个实数,然后按其代数值从小到大输出这两个数。先制定算法的流程图,如图所示,虚线框为if结构。根据流程图写出解决这个问题的程序。第33页,课件共190页,创作于2023年2月/*按升序输出两个数*/#include<stdio.h>main(){ floata,b,t; scanf("%f%f",&a,&b); if(a>b) { t=a; a=b; b=t; } printf("%5.2f,%5.2f\n",a,b);}升序输出两个数第34页,课件共190页,创作于2023年2月选择型程序设计if语句(条件选择语句)exprstatement1statement2非0=0形式二:格式:if(expression)statement1elsestatement2执行过程:例:if(x>y)max=x;elsemax=y;第35页,课件共190页,创作于2023年2月#include<stdio.h>intmain(){inta,b;printf("Enterintegera:");scanf("%d",&a);printf("Enterintegerb:");scanf("%d",&b);

if(a==b)printf("a==b\n");

elseprintf("a!=b\n");return0;}例输入两个数并判断两数是否相等判断相等第36页,课件共190页,创作于2023年2月形式三:格式:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]第37页,课件共190页,创作于2023年2月expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0执行过程:

例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;第38页,课件共190页,创作于2023年2月#include<stdio.h>intmain(){charc;printf("Enteracharacter:");c=getchar();

if(c<0x20)printf("Thecharacterisacontrolcharacter\n");

elseif(c>='0'&&c<='9')printf("Thecharacterisadigit\n");

elseif(c>='A'&&c<='Z')printf("Thecharacterisacapitalletter\n");

elseif(c>='a'&&c<='z')printf("Thecharacterisalowerletter\n");

elseprintf("Thecharacterisothercharacter\n");}例判断输入字符种类判断输入字符种类第39页,课件共190页,创作于2023年2月【例】从键盘输入+、-、*、/中的任一个,输出对应的英文单词:plus、minus、mutiply、divide,若输入的不是这四个字符中的任一个,则输出“error”。算法的流程图如图所示,虚线框所示为if_else的规则嵌套:第40页,课件共190页,创作于2023年2月#include<stdio.h>intmain(){charch;ch=getchar();if(ch=='+')printf("plus\n");elseif(ch=='-')printf("minus\n");elseif(ch=='*') printf("multiply\n"); elseif(ch=='/') printf("divide\n"); else printf("error\n");return0;}

运算符号判断第41页,课件共190页,创作于2023年2月例根据百分制分数决定成绩的等级:·80分以上为A级;·70分及以上,80分以下,B级;·60分及以上,70分以下,C级;·60分以下,D级。第42页,课件共190页,创作于2023年2月真假score>=80score>=70等级A真假输入scorescore>=60等级B等级D等级C下次实验第43页,课件共190页,创作于2023年2月if语句嵌套:一般形式:if(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)if(expr2)statement1elsestatement3

内嵌if/*输入两数并判断其大小关系*/#include<stdio.h>main(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)

if(x>y)printf("X>Y\n");

elseprintf("X<Y\n");elseprintf("X==Y\n");}第44页,课件共190页,创作于2023年2月if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌if第45页,课件共190页,创作于2023年2月【例】计算阶跃函数y的值:第46页,课件共190页,创作于2023年2月/*

计算阶跃函数y的值*/#include<stdio.h>main(){ floatx,y; printf("inputx:\n"); scanf("%f",&x); if(x>=0) if(x>0) y=1;

else y=0; else y=-1; printf("y=%-4.0f\n",y);}对多重if,最容易犯的错误是if与else配对错误,else总是与离它最近的上一个if配对。

阶跃函数第47页,课件共190页,创作于2023年2月if~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对if(……)if(……)if(……)else…...else…...else…...第48页,课件共190页,创作于2023年2月例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}第49页,课件共190页,创作于2023年2月例考虑下面程序输出结果:intmain(){intx=100,a=10,b=20;intv1=5,v2=0;if(a<b)if(b!=15)if(!v1)x=1;elseif(v2)x=10;x=-1;printf("%d\n",x);return0;}结果:-1If_else配对第50页,课件共190页,创作于2023年2月

if语句适合两种分支情况进行选择。

如果多种分支的情况,可采用嵌套的if语句结构。

存在的问题:

当嵌套的分支较多时,程序的效率和可读性降低。

解决方案:用switch结构处理多路分支的情形。第51页,课件共190页,创作于2023年2月Switch结构

当嵌套if分支较多时,程序变得复杂冗长,可读性降低。C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。switch语句的一般形式为:

switch(<表达式>){case<常量表达式1>:语句序列1;case<常量表达式2>:语句序列2;case<常量表达式n>:语句序列n;default:语句序列(n+1);}第52页,课件共190页,创作于2023年2月switch语句一般形式的流程图:先计算<表达式>的值,再从上到下地判断与哪一个<常量表达式>的值相等,如果<表达式>的值等于<常量表达式i>的值,则从语句序列i开始执行,直到语句序列(n+1)为止;若<表达式>的值不等于任何一个<常量表达式>的值,是执行default后面的语句序列(n+1)。

第53页,课件共190页,创作于2023年2月常量表达式:值必须是整型、字符型或者枚举类型语句序列:

允许有多条语句<表达式>:case表达式应当是整型常数表达式,不能含有变量与函数的常数表达式。第54页,课件共190页,创作于2023年2月例:某班级准备周末举行一个班级活动,但活动内容要根据表中所示的天气情况来决定:天气活动内容晴天登山有风无雨郊游下雪堆雪人下雨不举行班级活动其他天气参观博物馆分析:①分别用整数1、2、3、4代表晴天、有风无雨、下雪和下雨这4种天气情况。②通过输入天气情况weather的值,来确定活动场所。第55页,课件共190页,创作于2023年2月/*

根据天气情况决定活动场所*/#include<stdio.h>main(){intweather;scanf("%d",&weather);switch(weather){ case1:printf("rain----atpalaestra\n");case2:printf("snow----atplayground\n");case3:printf("fine----athill\n");case4:printf("wind----tooutskirt\n");default:printf("other----athome\n");}}活动确定第56页,课件共190页,创作于2023年2月使用switch结构须注意以下几点:(1)一个switch结构的执行部分是一个由一些case子结构与一个可缺省的default子结构组成的复合语句,它们位于一对花括号之中。(2)switch的判断表达式只能对整数求值,可以使用字符或整数,但不能使用浮点表达式。case表达式应当是整型常数表达式,不能含有变量与函数的常数表达式。例如可以是:case3+4:但不允许写为:intx=3,y=4;switch(z){ … casex+y: …}第57页,课件共190页,创作于2023年2月(3)一个switch结构中不可以出现两个具有相同值的常量表达式。case3+2:…case8-3:(4)switch的匹配测试,只能测试是否相等,不能测试关系或逻辑。(5)C89要求C编译系统应当实现∶一个switch最少可以包含257个case子结构,而C99要求最少支持1023个case子结构。第58页,课件共190页,创作于2023年2月

结论:①程序不完全正确;②不能正确表达每一种情况。存在的问题:程序不能正确分支;解决方案:

使用分支语句break。第59页,课件共190页,创作于2023年2月break语句在switch语句中的作用

break语句起中断和跳出的作用。可以用在switch分支语句和循环语句中。使用方法:

在switch语句中,在需要独立执行的<语句序列i>后面加上一条分支语句:break;第60页,课件共190页,创作于2023年2月switch(表达式){case常量表达式1:语句序列1break;case常量表达式2:语句序列2break;┇case常量表达式n:语句序列nbreak;default:语句序列n+1break;}第61页,课件共190页,创作于2023年2月【例】改写成具有独立分支的switch结构。#include<stdio.h>main(){intweather;scanf("%d",&weather);switch(weather) { case1:printf("rain----atpalaestra\n");

break; case2:printf("snow----atplayground\n");

break; case3:printf("fine----athill\n");

break; case4:printf("wind----tooutskirt\n");

break; default:printf("other----athome\n"); }

}

程序运行时,任何一种天气情况都只会对应出现一种运动场所.第62页,课件共190页,创作于2023年2月例下程序的输出结果:voidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“\na=%d,b=%d”,a,b);}运行结果:a=2,b=1第63页,课件共190页,创作于2023年2月【例】运输费用的计算问题。距离S越远,每公里的运费越低。设每公里每吨货物的基本运费为P,货物重量为W(吨),距离为S,折扣为d,则总运输费用f的计算公式为:f=P*W*S*(1-d)。其中折扣数d与距离有关,具体标准如下:0<S<250km没有折扣250

S<500折扣2%500

S<1000折扣5%1000

S<2000折扣8%2000

S<3000折扣10%3000

S折扣15%分析:折扣点的变化处都发生在距离为250的倍数上,如表所示。第64页,课件共190页,创作于2023年2月流程图简图如左图第65页,课件共190页,创作于2023年2月#include<stdio.h>main(){ intc,s; floatp,w,d,f; printf("pleaseinputp,w,s:\n"); scanf("%f,%f,%d",&p,&w,&s); if(s>=3000) c=12; else c=s/250; switch(c) {

case0:d=0;break; case1:d=2;break; case2: case3:d=5;break; case4: case5: case6: case7:d=8;break; case8: case9: case10: case11:d=10;break; case12:d=15;break; } f=p*w*s*(1-d/100); printf("Totalfreightis:%10.2f\n",f);}第66页,课件共190页,创作于2023年2月

程序范例求解一元二次方程ax2+bx+c=0的根(a≠0),a、b、c均为实数,其值由键盘输入。分析:一元二次方程的一般解为:

方程的求解需要考虑以下3种情况:①b2−4ac>0,方程有两个不等的实根:其中a的值不能等于0,否则方程无解。第67页,课件共190页,创作于2023年2月

程序范例②b2−4ac=0方程有两个相等的实根:③b2−4ac<0方程有两个共轭复根:第68页,课件共190页,创作于2023年2月

程序范例第69页,课件共190页,创作于2023年2月

条件运算条件运算是一种在两个表达式的值中选择一个的操作。它的一般形式为:e1?e2:e3被称为“条件表达式”它的操作过程为:若e1为真(非0),则此条件表达式的值为e2;若e1为假(0),则表达式取e3的值。注:条件运算符“?:”共要求三个运算量,是C语言中唯一的三元运算符。第70页,课件共190页,创作于2023年2月

条件运算例1:计算a+|b|的值。main(){floata,b;printf(“input2realsplease:”);scanf(“%f%f”,&a,&b);printf(“\n%f+|%f|=%f”,a,b,b>=0?a+b:a-b);}第71页,课件共190页,创作于2023年2月

条件运算例2输入两数,输出大者。main(){floata,b,max;printf(“input2realsplease:”);scanf(“%f%f”,&a,&b);max=a>b?a:b;printf(“\nThemaxis%f\n”,max);}第72页,课件共190页,创作于2023年2月

条件运算说明:1.条件运算符的优先级很低,仅仅比赋值运算

符的级别高。2.条件运算符的结合方式与赋值运算符一样是

自右至左的。例如:a=3>5?6:4==7?1:0相当于a=(3>5?6:(4==7?1:0))第73页,课件共190页,创作于2023年2月

条件运算注意:1.C语言程序设计中,要求尽量避免使用“多余的临时变量”,尽量把程序表示得简洁。如上述程序中可以省去一个变量max,写为main(){floata,b;printf(“input2realsplease:”);scanf(“%f%f”,&a,&b);printf(“\nThemaxis%f\n”,a>b?a:b);}第74页,课件共190页,创作于2023年2月

条件运算2.在条件表达式e1?e2:e3中,e1应为算术表达式,e2,e3可以是任意类型的表达式。条件表达式的值的类型为e2与e3二者中类型较高的。如:表达式y<3?-1.0:1的值应为实型。第75页,课件共190页,创作于2023年2月小结:本节主要介绍了程序分支结构的几种形式,它包括有if语句,if_else语句,if嵌套语句和switch语句。共同特点是:先进行条件判断,再根据判断结果决定下一步做什么。switch是一种“多路开关”语句,用它可更好地完成多路选择任务,只是在使用中应注意break语句的正确使用,以使程序能正常地从switch分支中跳出。第76页,课件共190页,创作于2023年2月循环结构导入循环从键盘输入10个数,求10个数中的最大数?从键盘输入n个数,求n个数中的最大数?从键盘输入3个数,求3个数中的最大数?第77页,课件共190页,创作于2023年2月引例:编写程序,输入10个数,输出其中最大者。分析:输入第一个数,max=a,i=1i<=10输入一个数max>amax=ai=i+1输出maxTFTF循环条件循环体第78页,课件共190页,创作于2023年2月循环结构

循环就是重复地执行某些语句。

程序中的循环次数是有限的,由循环条件决定可以确定循环次数。

C语言提供了3种循环结构语句:①for语句②while语句③do_while语句第79页,课件共190页,创作于2023年2月while语句一般形式:while(表达式)

循环体语句;执行流程:expr循环体假(0)真(非0)while第80页,课件共190页,创作于2023年2月

while(<循环表达式>){循环语句;循环变量表达式;}

关于while语句的几点说明。1.循环变量表达式不可缺少,其作用是更新计算循环变量的值,使循环能正常结束。2.若没有循环变量表达式,则有可能会使程序出现无限循环而发生错误。3.由于while循环是先判断<循环表达式>的值,后决定是否执行循环体语句,因此,循环体语句有可能一次也没有执行。第81页,课件共190页,创作于2023年2月特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)循环体;第82页,课件共190页,创作于2023年2月#include"stdio.h"voidmain(){ inta,max,i; printf("请输入第1个值"); scanf("%d",&a); max=a; i=2; while(i<=10) { printf("请输入第%d个值",i); scanf("%d",&a); if(a>max)max=a; i++; } printf(“最大的值是%d\n",max);}?试用while语句编写程序:求输入十个数中的最大值。十个数最大值第83页,课件共190页,创作于2023年2月例用while循环求

#include<stdio.h>main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体求100个整数的和第84页,课件共190页,创作于2023年2月计算10年后人口增长的C程序。/******计算人口增长******/#include<stdio.h>intmain(void){doublem=13;inti=1;

while(i<=10){ m=m*(1+0.002); i++;}printf("Populationafter10yersis:%f\n",m);return0;}人口增长第85页,课件共190页,创作于2023年2月将输入的字符原样输出/******测试字符结束符******/#include<stdio.h>intmain(void){ intc; while((c=getchar())!=EOF) putchar(c); return0;}程序中的“EOF”是一个符号常数,称为文件结束标志,它是在文件stdio.h中定义的: #defineEOF-1当从键盘输入(Ctrl+Shift+z)或遇文件结束标记,c的值得到-1,等于EOF。字符输入输出第86页,课件共190页,创作于2023年2月求阶乘n!求p=1×2×3×4×……×n(n≤10)初始值:p=1;i=1;p=p*i;i++;第87页,课件共190页,创作于2023年2月思考即:s=1+3+5+……+n求1~n的奇数累加和s=s+i;i=i+2;s=0;i=1;初始值:第88页,课件共190页,创作于2023年2月思考即:s=2+4+6+……+n求1~n的偶数累加和s=s+i;i=i+2;s=0;i=2;初始值:第89页,课件共190页,创作于2023年2月do~while语句一般形式:do

循环体语句;

while(表达式);执行流程:do循环体expr假(0)真(非0)while第90页,课件共190页,创作于2023年2月特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构expr循环体假(0)真(非0)循环体While循环第91页,课件共190页,创作于2023年2月用do~while循环求

#include<stdio.h>main(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);printf("%d",sum);}第92页,课件共190页,创作于2023年2月while和do~while比较#include<stdio.h>main(){inti,sum=0;scanf("%d",&i);

do{sum+=i; i++;}while(i<=10);printf("%d",sum);}#include<stdio.h>main(){inti,sum=0;

scanf("%d",&i);while(i<=10){sum+=i; i++;}printf("%d",sum);}写法不同实现的功能相同第93页,课件共190页,创作于2023年2月第一次运行:1↙再运行一次:11↙sum=55sum=11第一次运行:1↙再运行一次:11↙sum=55sum=0While结构运行情况:do~while结构运行情况:结论:while和do…while结构何时相同?何时不同?第94页,课件共190页,创作于2023年2月例显示1~10的平方#include<stdio.h>main(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}平方第95页,课件共190页,创作于2023年2月找出100到200之间能被3整除的自然数#include<stdio.h>main(){intn;n=100;do{ if(n%3==0) printf(“%d\t",n); n++;}while(n<=200);}被3整除的自然数第96页,课件共190页,创作于2023年2月/******测试字符结束符******/#include〈stdio.h〉intmain(void){intc;do{c=getchar();putchar(c);}while(c!=EOF);return0;}第97页,课件共190页,创作于2023年2月一般形式:while(表达式)

循环体语句;执行流程:expr循环体假(0)真(非0)whileWhile小结第98页,课件共190页,创作于2023年2月一般形式:do

循环体语句;

while(表达式);执行流程:do循环体expr假(0)真(非0)whileDoWhile小结第99页,课件共190页,创作于2023年2月特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构expr循环体假(0)真(非0)循环体While循环第100页,课件共190页,创作于2023年2月循环结构的三个基本要素循环变量初始化,如:i=1;s=0;循环条件,如:i<=100循环趋向结束语句,如:i++;第101页,课件共190页,创作于2023年2月for语句一般形式:for([expr1];[expr2];[expr3])

循环体语句;第102页,课件共190页,创作于2023年2月for语句执行流程:expr2循环体假(0)真(非0)forexpr1expr3expr1;while(expr2){ 循环体语句; expr3;}第103页,课件共190页,创作于2023年2月for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){ 循环体语句;}第104页,课件共190页,创作于2023年2月说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)for语句可以转换成while结构第105页,课件共190页,创作于2023年2月while(){循环体语句;

}for(expr1;

expr2;expr3){

循环体语句;}do{循环体语句;

}while();expr1;expr2expr3;expr1;expr2expr3;第106页,课件共190页,创作于2023年2月例用for循环求

#include<stdio.h>main(){inti,sum=0;

for(i=1;i<=100;i++) sum+=i;printf("%d",sum);}#include<stdio.h>voidmain(){inti,s=0;i=1;

while(i<=100){s=s+i; i++;}printf("%d\n",s);}第107页,课件共190页,创作于2023年2月#include<stdio.h>main(){inti=0;for(;i<10;i++) putchar(‘a’+i);}#include<stdio.h>main(){inti=0;for(i=0;i<10;i++) putchar(‘a’+i);}例:从a开始输出十个字符。输出十个字符#include<stdio.h>main(){inti=0;for(;i<10;putchar(‘a’+i),i++)

;}missing';'before'}'第108页,课件共190页,创作于2023年2月main(){inti,j,k;

for(i=0,j=100;i<=j;i++,j--){k=i+j; printf("%d+%d=%d\n",i,j,k);}}#include<stdio.h>main(){charc;

for(;(c=getchar())!='\n';)printf("%c",c);}#include<stdio.h>main(){inti,c;

for(i=0;(c=getchar())!='\n';i+=3) printf("%c",i+c);}第109页,课件共190页,创作于2023年2月关于for循环的说明:(1)expr1可以省略,但是其后的分号不能省略。如:for(i=1;i<=100;i++)sum+=i;i=1;for(;i<=100;i++)sum+=i;等价于第110页,课件共190页,创作于2023年2月(2)expr3可以省略,但是其前的分号不能省略。如:for(i=1;i<=100;){sum+=i;

i++;}关于for循环的说明:for(i=1;i<=100;i++)sum+=i;等价于第111页,课件共190页,创作于2023年2月(3)

可以同时省略expr1和expr3。如:求1~100的和i=1;for(;i<=100;){sum+=i;

i++;}关于for循环的说明:for(i=1;i<=100;i++)sum+=i;等价于第112页,课件共190页,创作于2023年2月关于for循环的说明:(4)若expr2省略,会导致死循环。如:for(i=1;;i++)sum+=i;等价于i=1;while(1){sum+=i;i++;}所以,从功能上讲:expr2不能省略第113页,课件共190页,创作于2023年2月(5)expr1,expr2,expr3也可以包含其他功能的表达式。关于for循环的说明://求1~100的和s=0;for(i=1;i<=100;i++)s=s+i;//求1~100的和for(s=0,i=1;i<=100;s=s+i,i++);第114页,课件共190页,创作于2023年2月expr2一般是循环条件表达式,也可以包含其他功能的表达式。#include<stdio.h>voidmain(){charch;printf("输入一串字符,回车键结束:");ch=getchar();for(;ch!='\n';){printf("%c\n",ch);ch=getchar();}}在获取值的同时进行判断for(;(ch=getchar())!='\n';)printf("%c\n",ch);第115页,课件共190页,创作于2023年2月while的循环条件中也可以包含其他表达式#include<stdio.h>voidmain(){charch;printf("输入一串字符,回车键结束:");for(;(ch=getchar())!='\n';)printf("%c\n",ch);}在获取值的同时进行判断while((ch=getchar())!='\n')第116页,课件共190页,创作于2023年2月循环的嵌套定义:一个循环体内又包含另一个完整的循环结构。一般形式:…while(条件表达式){

循环体语句组;}……do{循环体语句组;}while(条件表达式);…外层内层…for(expr1;expr2;expr3){循环体语句组;}……while(条件表达式){循环体语句组;}…第117页,课件共190页,创作于2023年2月执行过程:执行一次外层循环时:内层循环要执行到条件不满足时(内层循环是多个小循环,外层循环是一个大循环)第118页,课件共190页,创作于2023年2月基本原则:1、外层循环的“变量初始化”在外层循环之前;2、内层循环的“变量初始化”在外层循环之内(适当位置)——内层循环之前;内层循环可以尽量使用for结构第119页,课件共190页,创作于2023年2月#include<stdio.h>voidmain(){inti,j;longs,p;//s存放和值,p存放阶乘

//i外层循环变量,j内层循环变量

for(s=0,i=1;i<=10;i++)

{

for(j=1,p=1;j<=i;j++)p=p*j;

s=s+p;

}

printf("result=%ld",s);}第120页,课件共190页,创作于2023年2月循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转第121页,课件共190页,创作于2023年2月例循环嵌套,输出九九乘法表1234567891234567892468101214161836912151821242791827364554637281……………..ij第122页,课件共190页,创作于2023年2月i<10printf假(0)真(非0)i=1j++j=1j<10真(非0)假(0)i++for(i=1;i<10;i++)

for(j=1;j<10;j++)printf((j==9)?"%4d\n":"%4d",i*j);外循环内循环#include<stdio.h>main(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf("\n---------------------------------------\n");

for(i=1;i<10;i++)for(j=1;j<10;j++) printf((j==9)?"%4d\n":"%4d",i*j);}九九乘法表第123页,课件共190页,创作于2023年2月break语句作用:从循环体内跳出循环体外,强制性提前结束循环。一般形式:break;特点:①通常与if语句搭配使用;②只能用于循环结构和switch结构。不能用于其他语句中第124页,课件共190页,创作于2023年2月while(循环条件表达式){……

if(表达式x)

break;……}break执行示意for(表达式1;表达式2;表达式3){……

if(表达式x)

break;……}第125页,课件共190页,创作于2023年2月例break举例:输出圆面积,面积大于100时停止#definePI3.14159main(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;

if(area>100) break;printf("r=%d,area=%.2f\n",r,area);}}九九乘法表第126页,课件共190页,创作于2023年2月例break举例:小写字母转换成大写字母,直至输入非小写字母#include<stdio.h>main(){inti,j;charc;while(1){c=getchar(); if(c>='a'&&c<='z') putchar(c-'a'+'A'); else

break;}}小写字母转成大写字母第127页,课件共190页,创作于2023年2月作用:提前结束本次循环,判断<循环条件表达式>是否成立。continue语句一般形式:continue;特点:①通常与if语句搭配使用;②与break的区别:不是终止整个循环的执行,只是提前结束本次循环;第128页,课件共190页,创作于2023年2月while(循环条件表达式){……

if(表达式y)

continue;……}continue执行示意for(表达式1;表达式2;表达式3){……

if(表达式y)

continue;……}第129页,课件共190页,创作于2023年2月例求输入的十个整数中正数的个数及其平均值main(){inti,num=0,a;floatsum=0;do{scanf("%d",&a); if(a>0) {num++; sum+=a;} i++;}while(i<=10);printf("%dplusinteger'ssum:%6.0f\n",num,sum);printf("Meanvalue:%6.2f\n",sum/num);}十个正数的和main(){inti,num=0,a;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)continue; num++; sum+=a;}printf("%dplusinteger'ssum:%6.0f\n",num,sum);printf("Meanvalue:%6.2f\n",sum/num);}第130页,课件共190页,创作于2023年2月找出100到200之间能被3整除的自然数#include<stdio.h>main(){intn;for(n=100;n<=200;n++){if(n%3!=0)continue;

printf("%d,",n);}}#include<stdio.h>main(){intn;n=100;do{ if(n%3==0) printf(“%d\t",n); n++;}while(n<=200);}continue_3整除第131页,课件共190页,创作于2023年2月*132/44break语句和continue语句在程序中的区别/*break的作用*/main(){ intx; for(x=1;x<=10;++x) { if(x==5) break; printf("%d",x); }}运行结果:1,2,3,4,/*continue的作用*/main(){ intx; for(x=1;x<=10;++x) { if(x==5) continue; printf("%d,",x); }}运行结果:1,2,3,4,6,7,8,9,10,第132页,课件共190页,创作于2023年2月*133/44三种循环结构:for、while和do_while循环。当循环次数是肯定的情况下,用for循环比较方便。while循环和for循环都要先判断条件再执行循环语句体,因此,有可能一次也不执行循环语句体。do_while循环不论怎样都会先执行一次循环语句体。注意避免以下几个方面的问题:1.循环语句体为复合语句,但没有使用花括号。2.使程序发生无限循环。3.混淆break语句与continue语句的功能。小结第133页,课件共190页,创作于2023年2月案例分析九九乘法表——仅输出for(i=1;i<10;i++)for(j=1;j<10;j++) printf((j==9)?"%4d\n":"%4d",i*j);if(j!=9) printf("%4d",i*j);else printf("%4d\n",i*j);第134页,课件共190页,创作于2023年2月i=1→j=1to9i=2→j=2to9↓i=9→j=9第1行→从第1个位置输出%4d→无空第2行→从第2个位置输出%4d→空1个空第3行→从第3个位置输出%4d→空2个空↓第9行→从第9个位置输出%4d→空8个空第135页,课件共190页,创作于2023年2月九九乘法表——右下方for(i=1;i<10;i++){ if(i!=1) { for(k=1;k<i;k++) printf("%4c",''); } for(j=i;j<10;j++) printf((j==9)?"%4d\n":"%4d",i*j);}注意:有个空格第136页,课件共190页,创作于2023年2月前6行:第1行1个*→空5个空第2行3个*→空4个空第3行5个*→空3个空↓第6行11个*→

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论