C的基本结构程序设计程序的基本结构:复习提问:顺序结构选择结构循环结构C的基本结构程序设计程序的基本结构:复习提问:顺序结构选择结构循环结构C的基本结构程序设计程序的基本结构:复习提问:顺序结构选择结构循环结构顺序结构的特点:每一条语句按顺序执行;每一条语句只执行一遍,不重复执行;也没有语句不执行。命令序列2命令序列1命令序列……STARTEND复习提问:C的基本结构程序设计复习提问:分支结构的特点:每一条执行了的语句都只执行一遍。不重复执行;但有语句不执行。条件命令序列If语句后面的下一条语句NY命令序列……条件命令序列2…If语句后面的下一条语句命令序列1…YNC的基本结构程序设计C的基本结构程序设计循环结构程序设计主要内容:循环的概念、循环变量的概念等。(重点)while语句dowhile语句for语句(每一种语句的格式和使用都是重点)循环的嵌套(难点)scanf(%f,&a);s=s+a;scanf(%f,&a);s=s+a;………….这样重复一百次,然后输出s的值。这样写显然非常麻烦。我们注意到程序中的scanf(%f,&a);s=s+a;两句话是一直重复的,如果能用一种语句,使这两句话能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。编程解决这样的一个问题:从键盘输入一百个学生的成绩,求总成绩。从前面所学,有两种解决方法。1.设一百个变量,分别输入学生的成绩,然后求和。这种方法浪费内存空间,显然不实际。2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:循环的概念在循环条件的范围内反复执行相同的循环体,称循环程序设计。条件命令序列……命令序列break命令序列循环后面下一条语句NY循环结构的特点:循环体中的语句,在条件满足的情况下,可反复执行•5.2while语句构成的循环结构一般形式:循环变量的初始值;while(循环条件表达式)循环体语句;执行流程:条件循环体语句假(0)真(非0)语句循环体语句可以是一条,也可以是多条,多条的时候应用复合语句{}将多条语句括起来。循环变量的调整语句避免死循环表达式语句真假表达式1.计算表达式语句2.如果表达式的值为非零,执行语句表达式3.返回第一步,重新计算表达式4.如果表达式的值为零,则结束循环如果表达式的值一开始就为0,则语句一次也不会被执行。执行流程:while语句举例问题:求1-10的和。算法分析:1.定义变量n存储加数,定义s=0存储累加的和。2.输入第一个加数n3.若n=10,执行第4步,否则执行第6步4.s=s+n5.n++6.输出s.例:求S=1+2+3+……+10的值i=10s=s+i;i=i+1;输出s的值NYi=1;源程序:#includestdio.hvoidmain(){inti,s;i=1;while(i=10){s=s+i;i=i+1;}printf(pleaseoutputs=%d\n,s);}–实例,用while循环语句实现求#includestdio.hmain(){inti,sum=0;i=1;while(i=100){sum=sum+i;i++;}printf(%d,sum);}循环初值循环终值循环变量增值循环条件循环体While(i=100){i++;sum=sum+i;}i=10s=s+i;i=i+1;输出s的值NYi=1;源程序:#includestdio.hvoidmain(){inti,s,n;printf(pleaseinputn:);scanf(%d,&n);i=1;while(i=n){s=s+i;i=i+1;}printf(pleaseoutputs=%d\n,s);}例:求S=1+2+3+……+n的值n一般形式:循环变量的初始值;do循环体语句;while(循环条件表达式);执行流程:do循环体expr假(0)真(非0)whiledo—while语句1.执行语句3.表达式的值为非零,返回第1步4.表达式的值为零,结束循环语句至少被执行一次。2.计算表达式执行流程:注意:分号不能丢–实例,用do-while循环语句实现求#includestdio.hmain(){inti,sum=0;i=1;do{sum=sum+i;i=i+1;}while(i=100);printf(%d,sum);}由于do-while语句至少要被执行一次,特别要注意i和sum的取值问题!想想这样的一段循环语句的执行结果:i=1;while(i=100)putchar(‘*’);i++;这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i++;不属于循环体。应该改为:i=1;while(i=100){putchar(‘*’);i++;}循环语句中一定要注意表达式的值是否能在循环执行过程中被改变,以免造成死循环。–do-while同while语句的重要区别expr循环体假(0)真(非0)while循环控制在循环体之前,只有当while后的表达式为非0时,才可能执行循环体,循环体有可能一次都不执行。do循环体expr假(0)真(非0)while总是先执行一次循环体,然后再求表达式的值,因此,无论表达式的值是0还是非0,循环体至少执行一次。源程序:#includestdio.hvoidmain(){intsum=0,i;scanf(%d,&i);while(i=100){sum=sum+i;i=i+1;}printf(sum=%d\n,sum);}例:while和dowhile循环比较源程序:#includestdio.hvoidmain(){intsum=0,i;scanf(%d,&i);do{sum=sum+i;i=i+1;}while(i=100);printf(sum=%d\n,sum);}•5.4for语句–一般形式–执行流程for([expr1];[expr2];[expr3])循环体语句;expr2循环体假(0)真(非0)forexpr1expr3–for语句的一般应用形式for(循环变量赋初值;循环条件;循环变量增值){循环体语句;}#includestdio.hmain(){inti,sum=0;for(i=1;i=100;i++)sum+=i;printf(%d,sum);}例用for循环求–for语句的几点说明•for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省•无限循环:for(;;)•for语句可以转换成while结构语句i=1;for(;i=100;i++)sum=sum+i;for(i=1;;i++)sum=sum+i;for(sum=0,i=1;i=100;){sum=sum+i;i++;}i=1;for(;i=100;){sum=sum+i;i++;}for(;;)语句相当于while(1)语句expr1;while(expr2){循环体语句;expr3;}解1:#includestdio.hmain(){inti=0;for(i=0;i10;i++)putchar(‘a’+i);}运行结果:abcdefghij解2:#includestdio.hmain(){inti=0;for(;i10;i++)putchar(‘a’+i);}解3:#includestdio.hmain(){inti=0;for(;i10;)putchar(‘a’+(i++));}解4:#includestdio.hmain(){inti=0;for(;i10;putchar(‘a’+i),i++);}例从a显示到j。例:求,即计算!n1nmain(){inti,s,n;s=1;printf(Entern:);scanf(%d,&n);for(i=1;i=n;i++){s=s*i;}printf(s=%d\n,s);}注意此处的分号。;练习1:观察以下程序运行结果并分析。voidmain(){intn=0;while(n3)printf(nis%d\n,n);n++;printf(That'sallthisprgramdoes\n);}在使用while时,只有位于判断条件之后的单个语句(简单语句或复合语句)才是循环的部分。printf(nis%d\n,n);练习2:观察以下程序运行结果并分析。voidmain(){intn=0;while(n++3);printf(nis%d\n,n);printf(That'sallthisprogramdoes.\n);}循环在判断条件后的第一个简单或复合语句处就结束了。循环体是空语句!练习3:观察以下程序运行结果并分析。intmain(void){longnum;longsum=0l;intstatus;printf(Pleaseenteranintegertobesummed.);printf(Enterqtoquit.\n);status=scanf(%ld,&num);while(status=1){sum+=num;printf(Pleaseenternextintegertobesummed.);printf(Enterqtoquit.\n);status=scanf(%ld,&num);}printf(Thoseintegerssumto%ld.\n,num);return0;}分析:这个例子改变了while的判断条件,用status=1代替了status==1。前一个表达式是一个赋值表达式,它把status赋值为1。而且表达式的值就是其左侧的值,这样status=1的值也为1。因此,实际上这个while循环就等于使用了while(1),即无限循环。•5.5循环的嵌套–三种循环可互相嵌套,层数不限–外层循环可包含两个以上内循环,但不能相互交叉–嵌套循环的执行流程(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环main(){inti,j,k;for(i=0;i2;i++)for(j=0;j2;j++)for(k=0;k2;k++)printf(%d,%d,%d\n,i,j,k);}运行结果:例:循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281……………..#includestdio.hmain(){inti,j;for(i=1;i10;i++)printf(%4d,i);printf(\n---------------------------------------\n);for(i=1;i10;i++)for(j=1;j10;j++)printf((j==9)?%4d\n:%4d,i*j);}i10printf假(0)真(非0)i=1j++j=1j10真(非0)假(0)i++for(i=1;i10;i++)for(j=1;j10;j++)printf((j==9)?%4d\n:%4d,i*j);内循环外循环例:打印如图显示:#includestdio.hmain(){constintROWS=6;constintCHARS=6;introw;charch;for(row=0;rowROWS;row++){for(ch=('A'+row);ch('A'+CHARS);ch++)printf(%c,ch);printf(\n);}}•5.6break语句和continue语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体。说明:break只能终止并跳出最近一层的结构bre