循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。 特点是:当给定条件成立时,反复执行某段程序,直到条件不成立时为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C语言提供了以下形式的循环结构。 (1)用goto语句和if语句构成循环; (2)用for语句构成循环; (3)用while语句构成循环; (4)用do-while语句构成循环。
5.1 for语句 5.2 while语句 5.3 do…while语句 5.4 break和continue语句 5.5 程序综合举例
5.1 for语句 for(表达式1;表达式2;表达式3) 语句; 5.1.1 for语句的一般形式和执行过程 一般形式为: 表达式1:通常用来给循环变量赋初值,一般为赋值表达式。 表达式2:通常是循环结束条件,一般为关系表达式或逻辑表达式。 表达式3:通常用来修改循环变量的值,一般是赋值表达式。 循环体 注意:这三个表达式都可以是逗号表达式,都可以是任选项。
5.1 for语句 5.1.1 for语句的一般形式和执行过程 for语句的执行过程如下: 首先计算表达式1的值。 再计算表达式2的值,若值为真(非0)则执行循环体一次,然后执行下面的第3步;若值为假(值为0)则结束循环,转到第4步。 计算表达式3的值,转回第2步继续执行。 循环结束,执行for语句下面的一个语句。
5.1 for语句 5.1.2 for语句的各种形式 1.”表达式1”省略:但分号不能省略。 例如: i=1; for( ; i<=100;i++) sum=sum+i; 又如: #include"stdio.h" void main() { int n=0; printf("input a string:\n"); for( ; getchar()!=‘\n’ ; n++) ; printf("%d",n); }
5.1 for语句 5.1.2 for语句的各种形式 2.”表达式2”可以省略:这时循环体中必须加入条件判断语句来判断是否结束循环,否则循环会无终止地进行下去形成死循环。分号不能省略。 例如: for(i=1;;i++) { sum=sum+i; if(i>100)break; } 其中,break语句的意义是结束循环。如果循环体中去掉if语句,则上面的循环为死循环。
5.1 for语句 5.1.2 for语句的各种形式 3.“表达式3”可以省略:这时循环体内应加入使循环变量变化的语句,否则也会造成死循环。 例如: for( i=1;i<=100;) { sum=sum+i; i++; }
5.1 for语句 5.1.2 for语句的各种形式 4.循环体可以是空语句:可以把循环体要处理的内容放到表达式3中,效果是一样的。 例如: for(i=1;i<=100;sum=sum+i,i++);
5.1 for语句 5.1.3 for循环程序举例 【例5.1】用for循环语句计算s=1+2+3+…+9+10。
5.1 for语句 5.1.3 for循环程序举例 【例5.2】用for语句编写程序。从0开始,输出n个连续的偶数。
5.2 while语句 5.2.1 while语句的一般形式和执行过程 一般形式为: while(表达式) 语句; 其中:表达式是循环条件,语句为循环体。 执行过程:先计算表达式的值,当值为真(非0)时则执行循环体语句;当表达式为假(值为0)时,跳出循环,执行循环以外的下一个语句。 其执行过程如图5.3表示。 while循环的特点是:先判断表达式,后执行循环体语句。
5.2 while语句 5.2.1 while语句的一般形式和执行过程 【例5.3】统计从键盘输入一行字符的个数。 #include <stdio.h> void main() { int n=0; printf("input a string:\n"); while(getchar()!='\n') n++; printf("%d",n); } 说明:循环条件为getchar()!='\n',只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。
5.2 while语句 5.2.1 while语句的一般形式和执行过程 注意: (2)循环体为多个语句时必须用{ }括起来,组成复合语句。 (3)允许while语句的循环体又是while语句,从而形成循环嵌套。
5.2 while语句 5.2.1 while语句的一般形式和执行过程 例如: void main() { int a=0,n; printf("\n input n: "); scanf("%d",&n); while (n--) printf("%d ",a++*2); }
5.3 do-while语句 5.3.1 do-while语句的一般形式和执行过程 一般形式为: do{ 语句; }while(表达式); 其中:表达式是循环条件,语句为循环体。 执行过程: 先执行循环体语句一次,再判断表达式的值,若为真(非0)则继续循环,否则如果表达式为假(值为0),则结束循环。 其执行过程如图5.4所示。
5.3 do-while语句 5.3.1 do-while语句的一般形式和执行过程 注意:do-while语句和while语句的区别:
5.3 do-while语句 5.3.1 do-while语句的一般形式和执行过程 【例5.4】用do-while语句修改【例5.2】题:从0开始,输出n个连续的偶数。 void main() { int a=0,n; printf("\n input n: "); scanf("%d",&n); do{ printf("%d ",a++*2); }while (--n); } 试问:本例中循环条件继续用(n--)会出现什么问题? 答:将会多执行一次循环。 为什么:这是由于先执行后判断而造成的。
5.3 do-while语句 5.3.1 do-while语句的一般形式和执行过程 【例5.5】while和do-while循环的比较。
5.3 do-while语句 5.3.1 do-while语句的一般形式和执行过程 注意: (3)循环体为多个语句时,也必须用{}括起来组成一个复合语句。
5.3 do-while语句 【例5.6】循环的嵌套 一个循环结构的循环体内又包含另外一个完整的循环结构,称为循环的嵌套。循环的嵌套层数可以是多层,称为多重循环。构成循环的嵌套结构时应注意以下几点: ①三种循环结构(while循环结构、do…while循环结构、for循环结构)可以相互嵌套; ②循环嵌套时应注意内层循环结构必须完整地被嵌套在外层循环结构的循环体内,不得出现交叉的现象; ③一般情况下,嵌套结构中的外层循环和内层循环的循环控制变量不得同名。
* *** ***** ******* ********* 5.3 do-while语句 【例5.6】循环的嵌套,输出如下图形: 分析输出图形的规律: 第1行:先输出4个空格,再输出*(1个) 第2行:先输出3个空格,再输出*** (3个) 第3行:先输出2个空格,再输出***** (5个) 第4行:先输出1个空格,再输出******* (7个) 第5行:先输出0个空格,再输出********* (9个) * *** ***** ******* ********* 4 ① 3 ② 2 ③ 1 ④ ⑤ 哪么第i行应该怎样输出呢? 先输出5-i个空格 再输出2i-1个*
5.3 do-while语句 【例5.6】循环的嵌套
5.4 break语句和continue语句 5.4.1 break语句 一般格式: break; 使用范围:break语句只能用在switch 语句或循环语句中。 功能:作用是跳出switch语句或结束本层循环,转去执行后面的程序。 一般用法: { 语句序列1; if(表达式) break; 语句序列2; }
5.4 break语句和continue语句 5.4.1 break语句 【例5.7】从键盘输入任意一串字符并自动输出,统计字符个数,直到输入回车键或者Esc键结束。 void main() { int i=0; char c; while(1) { c='\0'; /*变量赋初值*/ if (c!=13&&c!=27) /*键盘接收字符直到输入回车或Esc键*/ { c=getch(); printf("%c\n", c); } if(c==27) break; /*判断若输入Esc键则退出循环*/ i++; printf("The No. is %d\n", i); } printf("The end"); 注意: break语句对if-else的条件语句不起作用。在多层循环中, 一个break语句只向外跳一层。
5.4 break语句和continue语句 5.4.2 continue语句 一般格式: continue; 一般用法: { 语句序列1; if(表达式) continue; 语句序列2; } 注意:本语句只结束本层中本次的循环,并不跳出循环体。而break语句则跳出循环体。
5.4 break语句和continue语句 5.4.2 continue语句 【例5.8】输出100以内能被7整除的数。 void main() { int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); }
5.4 break语句和continue语句 5.4.2 continue语句 【例5.9】检查输入的一行字中有无相邻两字符相同。 #include"stdio.h" void main() { char a,b; printf("input a string:\n"); b=getchar(); while((a=getchar())!='\n') { if(a==b) { printf("same character\n"); break; } b=a; 分析程序:把第一个读入的字符保存到变量b。然后进入循环,把下一个读入的字符保存到变量a,比较a,b是否相等,若相等则输出提示串并终止循环,若不相等则把a中的字符赋予b,进入下一次循环。
5.5 程序综合举例 【例5.10】要求判断输入学生的成绩是否合格。 void main() { int count,score,I; 5.5 程序综合举例 【例5.10】要求判断输入学生的成绩是否合格。 void main() { int count,score,I; printf(“请输入班级的人数:”); scanf(“%d”,&count); printf("\n"); for(int i=0;i<count;i++) { printf(“请输入学生的成绩:”); scanf(“%d”,&score); if(score>60) printf(“及格\n”); else printf(“不及格\n”); }
5.5 程序综合举例 【例5.11】有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 5.5 程序综合举例 【例5.11】有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
5.5 程序综合举例 void main() { int i,j,k; printf("\n"); 5.5 程序综合举例 void main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } 分析以下情况:并考虑如果不是1、2、3、4,而是任意四位数呢?有几种情况,如何修改程序。注意:组成的四位数中最高位不能为零。
5.5 程序综合举例 【例5.12】判断整数m是否为素数。 5.5 程序综合举例 【例5.12】判断整数m是否为素数。 程序分析:只能被1和它本身整除外,其它任何数都不能整除的数为素数。因此,判断数m是否为素数,只需用m去除以2到m-1之间的每一个整数,如果都不能整除,则m是素数;如果有一个数能整除,则m不是素数。 根据数学知识可知,不需要判断m能否被2到m-1之间的每一个数整除,只需判断m能否被从2到 之间的数整除就可以了。
5.5程序综合举例 程序如下: #includen <stdio.h> #include <math.h> void main() { int m,i,k; printf(“请输入一个整数:”); scanf(“%d”,&m); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>k) printf(“%d是一个素数。\n”,m); else printf(“%d不是一个素数。\n”,m); }
5.5程序综合举例 【例5.13】输出100到200之间的素数。 程序运行结果为: 101 103 107 109 113 #includen <stdio.h> #include <math.h> void main() { int m,i,k,n; n=0; for(m=101;m<=200;m=m+2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>k) { printf(“%d”,m); n=n+1; } if(n%5==0) printf(“\n”); } printf(“\n”); 程序运行结果为: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 这条语句的作用是什么?