1、程 序 设 计 基 础,主讲教师:崔莉莉,6 控制循环流程的编程,学习目标 循环流程 while、for语句 do-while语句 break、continue语句 掌握程序调试工具的基本使用断点的设置与应用技能,三种基本程序结构,顺序结构。A与B顺序操作,执行完A后,必定接着执行B。是最简单的基本结构。 选择结构。分支结构。必包含一个判断框,根据给定条件P是否成立而选择是执行A还是B,无论P成立否,只能执行A或B之一。,A,B,A,P,B,y,n,P,A,y,n,循环结构。重复结构,即反复执行某一部分操作 当型结构。如P成立,执行A,完后再判断P,如还是成立,再执行A,如此反复,当某一次P不
2、成立,脱离循环结构。特征:先判断后执行。 直到型结构。先执行A,再判P,不成立再执行A,再判断P,P还是不成立,再执行A,如此循环反复,直到某一次P成立脱离循环。特征:先执行后判断。,P,A,y,P,A,y,n,前期知识 if 语句的2种格式,格式1if (表达式)语句;格式1的if语句执行过程: 1. 求表达式的值,若为真(即值为非0),则执行2,若为假(即值为0)则转到3; 2. 执行if语句中指定的内嵌语句A; 3. 整个if语句执行结束,继续执行后面的语句,格式2if (表达式)语句1;else语句2; 格式2的if语句执行过程: 1. 求表达式的值,若为真(即值为非0)则执行2,若为
3、假(即值为0)则转到3; 2. 执行if语句中指定的内嵌语句1(A),然后转到4; 3. 执行if语句中指定的内嵌语句2(B); 4. 整个if语句执行结束,继续执行后面的语句。,注意:不要误认为格式2是两个语句(if语句和else语句),它们同属于同一个if语句。,例:从键盘输入一学生的2个成绩,然后输出两者中的高分。 确定算法: 定义2个变量score1、score2,保存输入的2个成绩。 程序处理过程: 1. 显示输入提示,从键盘接收2个成绩分别到score1、score2; 2. 判断条件:score1score2,成立执行3,否则转4; 3. 输出score1,转5; 4. 输出sc
4、ore2; 5. 结束运行。 分析:步骤3或4并不总是被执行的,这2步到底执行哪一步,取决于步骤2的控制,步骤2控制的依据是条件score1 score2,显示输入提示 从键盘接收2个成绩,分别存放到score1、score2 计算表达式:score1score2 结果值为非0 结果值为0输出score1 输出score2; 结束运行,这2步到底执行哪一步,取决于表达式的计算结果,/* 源文件名:ch4_01.cpp 功能:取高分 */ #include void main() float score1, score2; cout score1 score2; if (score1 score
5、2) cout score1; else cout score2; ,运行结果:,例:输入两个成绩给变量score1和score2,然后将高分存入变量score1,低分存入变量score2,最后依次输出变量score1、score2的值。 确定算法: 定义两个变量score1、score2,保存输入的两个成绩。 程序处理过程: 1.显示提示信息,从键盘输入两个成绩到score1、score2; 2.如果score1 score2那么继续执行3,否则转到4; 3.交换score1和score2的值; 4.依次输出score1和score2的值; 5.结束运行。,输入完成后,数据分别存放在scor
6、e1和score2,73.5,90,score1,score2,但不符题意,需要把2变量数值交换一下,必须定义中间变量t,任一随机数,t,t=score1;,73.5,90,score1,score2,73.5,t,score1=score2;,90,90,score1,score2,73.5,t,score2=t;,90,73.5,score1,score2,73.5,t,/* 源文件名:ch4_02.cpp 功能:取高分、低分 */ #include void main() float score1, score2; float t; cout score1 score2; if (sco
7、re1 score2) t = score1; score1 = score2; score2 = t; cout “高的在score1,是 “ score1 endl; cout “低的在score2,是 “ score2 endl; ,分析:步骤3(交换score1和score2的值)实际上需要3句语句才能完成,而if语句的格式规定,在此位置有一句语句,因此需要用一对花括号把3句语句组合在一起,成为一句复合语句。 注意:在外不需要再加分号。,运行结果1:,运行结果2(改变输入的次序):,if语句的嵌套,在if语句中又包含一个或多个if语句称为if语句的嵌套。 一般形式如下: if (表达式
8、)if (表达式) 语句1;else语句2; elseif (表达式)语句3;else语句4;,注意:if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的) if配对。,例: if (表达式)if (表达式)语句1; else if (表达式)语句2;else语句3;,编者把else写在第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是与第二个if配对,因为它们相距最近。因此,可以加花括号来确定配对关系。,if (表达式) if (表达式)语句1; else if (表达式)语句2;else语句3;,例:从键盘输入一元二次方程的系数,如果
9、这个方程没有实根,输出信息“无实数根”;如果有两个不同的实根,以“x1=”和“x2=”的格式输出;如果有重根,以“x1=x2=”的格式输出。 确定算法: 定义实型变量a、b、c,存放三个系数;定义实型变量d、s,存放中间结果;定义实型变量x1、x2存放两个根。,1.显示提示信息; 2.从键盘输入a、b、c的值; 3.计算b2-4ac,得到中间结果d; 4.如果d0,那么继续执行5,否则转到6; 5.输出无实根的信息,转到11 6.计算d的算术平方根s ; 7.计算(-b+s)/(2a)和(-b-s)/(2a),分别存入变量x1、x2; 8.如果d=0,继续执行9,否则转到10; 9.按重根格式
10、输出x1的值,转到11; 10.分别输出x1、x2的值; 11.结束运行。,程序处理过程:,/* 源文件名:ch4_04.cpp 功能:一元二次方程 */ #include #include void main() float a,b,c,d; double s,x1,x2; cout a b c; d = b * b - (4 * a * c); if (d 0) cout “无实数根“ endl; else s = sqrt(d); /sqrt是平方根函数 x1 = (-b + s) / (2 * a); x2 = (-b - s) / (2 * a); if (d = 0) cout “
11、x1=x2=“ x1 endl; else cout “x1=“ x1 “,x2=“ x2 endl; ,运行结果1:,运行结果2:,运行结果3:,例:编写一个猜数游戏程序:程序自动产生一个1到8之间的随机整数,让操作者猜这个数从键盘输入猜的数后,如果猜中,屏幕显示成功信息,否则显示“太大”或“太小”的提示信息,让操作者再次输入。3次不能猜中,则判为失败。 确定算法: 1.使用函数srand()、rand(),定义#include 。 2.使用函数time(),定义#include 。srand(time(NULL); /为生成随机数做准备 rand(); /生成随机整数 3.定义2个变量 o
12、bj、k, obj = obj % 8 +1; /得到1到8之间的随机整数,#include #include #include void main() int obj,k; srand(time(NULL); obj = rand(); obj = obj % 8 +1; cout k; if (k = obj) cout “成功“ endl; exit(0); else if (k obj) cout “太小“; else cout “太大“; cout “请再猜“; ,cin k; if (k = obj) cout k; if (k = obj) cout “成功“ endl; els
13、e cout “失败“ endl; ,goto语句,goto语句为无条件转向语句,它的一般形式为goto 语句标号;语句标号是一个用户自定义的标识符,它可以处于goto语句的前面,也可以处于其后面,但是标号必须与goto语句处于同一个函数中。定义标号时,由一个标识符后面跟一冒号组成。语句标号的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来作标号。 作用:与if语句一起构成循环结构或从循环体中跳转到循环体外(一般是从多层循环的内层循环跳到外层循环时)。,#include #include #include void main() int obj,k
14、;int num=0;srand(time(NULL);obj=rand();obj=obj%8+1;coutk;if (k=obj)coutobj)cout“太大“endl;elsecout“太小“endl;cout“,请再猜!“;num+=1;if (num=3)cout“失败!“;exit(0);goto outer; ,使用if嵌套能解决多分支选择结构;C+还提供了swatch语句解决多分支选择结构,其可读性更好一些。 switch语句的一般格式如右:,前期知识 switch 语句,switch (表达式) case 常量1:语句;case 常量2:语句; case 常量n:语句;de
15、fault:语句; ,switch语句的执行过程:,1.求表达式的值 2.将求得的值依次与常量1、常量2、常量n比较,如果找到一个相匹配的值,则从这个case语句后面开始,顺序执行各语句如果找不到相匹配的值,则执行default后面的语句。 每种情况对应的语句可以不止一句;,switch (表达式) case 常量1:语句;case 常量2:语句; case 常量n:语句;default:语句; ,使用switch语句是为了针对不同情况执行不同的语句,在执行某一情况对应的语句后,一般说来不希望再去执行后面其他情况的对应语句,为此,可以在每种情况的对应语句之后,加上一句break,结束switc
16、h语句的本次执行。 break语句的一般格式:break; break语句还可用于结束while、for等循环语句的执行,switch (表达式) case 常量1:语句;case 常量2:语句; case 常量n:语句;default:语句; ,例:从键盘读入1个整数,当数值为1时,在屏幕输出字符串“First”;当值为2时,输出“Second”; 当值为3时,输出“Third”;其它值时输出“Other”.,#include void main( ) char n; /注意不能是int型cin n;switch (n)case 1: /注意1是字符型cout “First“;break;,
17、case 2:cout “Second“;break;case 3:cout “Third“;break;default:cout “Other“; ,若把break;语句去掉,则运行结果如下: #include void main( ) char n;cin n;switch (n)case 1: cout “First“;case 2:cout “Second“;case 3:cout “Third“;default:cout “Other“; ,例: 用键盘输入代表星期几的一个数(0到6),然后根据这个数显示相应的英文单词,对0、1、2、3、4、5、和6,分别显示:Sun、Mon、Tue
18、、Wed、Thu、Fri、Sat,#include void main() char choice;cin choice;switch (choice)case 0:cout “Sunn“;break;case 1:cout “Monn“;break;case 2:cout “Tuen“;break;,case 3:cout “Wedn“;break;case 4:cout “Thun“;break;case 5:cout “Frin“;break;case 6:cout “Satn“;break;default:cout “输入错误“; ,新知识 循环结构,一般每一个实用程序都有循环,没有循
19、环的程序几乎是不可能的;循环结构的作用:使得若干条顺序执行代码 多次反复运行,达到预定的目的。从某种意义来说,程序设计就是组织循环组织循环是初学者的一个主要难点。 C语言提供下列循环设计形式:1. goto和if语句的组合;2. dowhile语句3. while语句4. for语句,6.1 while语句,特点:先判断表达式,后执行语句。,while语句(当型)的一般格式 while (表达式) 语句; while语句的执行过程: 1.求表达式的值,若为假(即值为0),则转到3 ; 2.执行while语句中指定的内嵌语句(称为循环体),然后转回到1 ; 3.整个while语句执行结束,继续执
20、行后面的语句。,while (表达式) 循环体语句;,流程图,一般形式,特点:先判断表达式,后执行循环体 几点说明: 循环体有可能一次也不执行如:while(i100) 循环体语句;输入i的值大于100 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto 无限循环如:while(1) 循环体语句;,例:求出1+2+3+4+ +100的值并显示结果 。#include void main() int sum=0; int i; i = 1; while (i = 100) sum = sum + i; i +; cout
21、sum endl; ,注意:在while语句之前,循环变量i(用于控制重复次数的变量)应赋初值。未对循环变量赋初值的while语句,不能稳定实现预想的能,在程序各次运行时会产生无规律的不同结果。,循环体(在循环中反复执行的语句部分)若包含一个以上的语句,应用花括号括起来,以复合语句形式出现。若不加,则while语句的范围只到while后面第一个分号处。 本例while的复合语句包含2条语句。,应有使循环趋向于结束的语句(要求i100结束),该表达式起到了控制循环次数的作用。,如无i+ ,则成无穷循环,即死循环,i的值永不改变,循环永不结束。,6.2 do-while语句,do-while语句(
22、直到型)一般格式:do语句;while(表达式); 与while语句不同的是,do循环中的语句至少会执行一次,而while语句当条件第一次就不满足时,语句一次也不会被执行。,特点:先执行语句,后判断表达式。,有一个分号,do 循环体语句 while ( 表达式 );,一般形式,流程图,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,#include void main() int sum=0; int i; i = 1; do sum = sum + i; i +; while (i = 100); cout sum endl; ,for 语
23、句的一般格式:for (表达式1; 表达式2; 表达式3)语句;for语句的执行过程: 1.求解表达式1; 2.求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句(循环体);若为假(为0)则转到5; 3.求解表达式3; 4.转回到2; 5.循环结束,执行for语句后面的语句。象if语句一样,while和for语句中的内嵌语句都是一句语句,如果一句简单的语句不能满足需要,就得使用复合语句。,6.3 for语句,#include void main() int sum=0;int i; for (i = 1; i = 100; i +) sum = sum + i; cout su
24、m endl; ,循环变量i:用于控制重复次数的变量,本例中它最初被赋值1,这个值称为初值,表达式i = 100,用于判断是否继续循环,它起到了控制循环次数的作用,i+增量运算,由它控制循环变量的变化,循环体:在循环中反复执行的语句部分,for(表达式1;表达式2;表达式3)语句;,for(i=1; i=100; i+)sum=sum+i;,计算表达式1,计算表达式2,执行循环体,结束循环,计算表达式3,执行下一语句,表达式1:循环变量赋初值(i=1;),真(非0),表达式2:循环条件判断,决定循环是否继续(i=100;),表达式3:循环变量增值(i+),假(0),以下写法可以使程序更简练,i
25、nt sum=0;int i=1;while (i = 100) sum = sum + i+;cout sum endl;,int sum=0;for(i=1; i=100; i+)sum += i; cout sumendl;,int sum=0;int i=1;while (i = 100) sum += i+;cout sum endl;,例:编写程序实现功能:求出1到100之间所有奇数的和,并显示结果,int sum=0;int i=1;while (i = 100) if(i%2!=0) sum = sum + i;i+;cout sum endl;,int sum=0;for(i
26、=1; i=100; i+)if(i%2!=0) sum = sum + i; cout sumendl;,例:编写程序实现功能:求出1到100之间所有偶数的和,并显示结果,int sum=0;int i=1;while (i = 100) if(i%2=0) sum = sum + i;i+;cout sum endl;,int sum=0;for(i=1; i=100; i+)if(i%2=0) sum = sum + i; cout sumendl;,for语句可以将变量初始化部分加入其中,for(i=1, sum=0; i=100; i+)if(i%2=0) sum = sum + i
27、; cout sumendl;,int sum=0;for(i=1; i=100; i+)if(i%2=0) sum = sum + i; cout sumendl;,表达式1与表达式3均可无,但分号不可少,sum=0;int i=1;for( ; i=100; )if(i%2=0) sum = sum + i;i+; cout sumendl;,sum=0;for(i=1; i=100; i+)if(i%2=0) sum = sum + i; cout sumendl;,for(表达式1;表达式2;表达式3) 语句;,表达式2可无,相当于循环条件永远为真 例: for( ; ; ) 并无语法
28、错误相当于 while(1)它们将引起无限循环,for(表达式1;表达式2;表达式3)语句;,编程:计算并输出1-3+5-7+-99+101的值,int s1=0,s2=0,i;for(i=1; i=-99; i+=-4)s2=s2+i;s1=s1+s2; cout s1endl;,int s=0, t=1, i;for(i=1; i=101; i+=2)s = s + i*t;t = -t ;cout sendl;,编程:计算并输出数列11/3+1/5-1/7+1/9-1/11+1/101的和,float s=0, t=1;int i;for(i=1; i=101; i+=2)s = s +
29、 1 /( t * i );t = -t ;cout sendl;,循环嵌套,一个循环体内又包含另一个完整的循环结构,称为循环嵌套,这样的循环也称二重循环 前一语句表示的循环称“外循环” 后一语句表示的循环称“内循环”内循环从属于外循环,while()while(),for(; ; )for(; ; ),编程:统计不同的2个数字构成的二位数有多少种,int i, j;int count = 0;for (i = 1; i = 9; i +)for (j = 0; j = 9; j +)if (i != j)count +; cout count endl;,分析: 二位数的范围:10 99 用
30、变量i从1变化到9,代表十位数字;变量j从0变化到9,代表个位数字。 “不同的2个数字”即个位数字与十位数字不等的那种情况( i != j ) 用变量count计数,编程:统计不同的3个数字构成的三位数有多少种,int i, j, k;int count = 0;for(i=1; i=9; i+)for(j=0; j=9; j+)if(i != j)for(k=0; k=9; k+)if(k!=i ,分析: 三位数范围: 100 999 “不同的3个数字”即个位数字与十位数字不等的那种情况 (i != j) 符合了这条件再考虑百位数百位数字也必须与它们都不等 ( k!=i & k!=j ),编
31、程:在1至100之间寻找并输出这样的数,各位数字之积大于各位数字之和,int n,x,y; for(n=10; n x+y)coutnt; ,int i, j;for(i=1; i i+j )cout10*i+jt;,if(ps)coutn t;cout endl;,int n, m, p, s; for(n=1;n=100;n+) m=n; /复制到mp=1; /p存放积s=0; /s存放和while(m!=0) p=p*(m%10);s=s+(m%10);m=m/10;,循环结束条件: 每循环一次,由于m/10, m降低一位,降至0结束,用除法运算来分解出一个整数的每一位数字。 对于整数m
32、, m%10能得到其个位数; m/10能排除其个位数,编程:输出“九九表”,格式如下:,s = a b a:左起第一列 b:顶端一行,int a,b;for(a=1;a=9;a+)for(b=1;b=9;b+)couta*bt;coutn;,int a,b;for(a=1;a=b) /行号大于列号 couta*bt;coutn;,输出全部ab的结果,只输出符合ab条件的一半结果,输出a的一行所有内容后换行,int a,b;cout=b)couta*bt;coutn;,添加了表头,使输出结果符合题意,添加列表头,添加行表头,int a,b;cout“t1t2t3t4t5t6t7t8t9n“;fo
33、r(a=1;a=9;a+)coutat;for(b=1;b=a;b+)couta*bt;coutn;,更为简练的方法,内循环可以少走一半,编程:输出如下三角形图形* 分析: 绝对不能用4句cout简单解决问题,要考虑到通用性,共 i 行,每行有 j 个*符号 共i行,则有外循环,每一次输出一行; 每一行的输出要考虑到它由2部分组成: 先是左边若干空格,每行变化规律3210 后接若干*符号,每行变化规律1357 则有2个内循环,1个打若干空格,另一个打若干*号,int i, j;for(i=1; i=4;i+)for(j=1; j=4-i ;j+)cout “ “ ;for(j=1; j=2*i
34、-1 ;j+)cout “*“ ; cout n;,每一行先打几个空格: 变化规律 i :1 2 3 4空格:3 2 1 0 结论:4 - i,* *,每一行后打几个符号*: 变化规律 i :1 2 3 4*:1 3 5 7 结论:2i - 1,编程:输出如下三角形图形* * * * * * * * * * * * * 分析: 第一行*号的左边有10个空格,其位置是左起11位 每个*号间有一个空格,int i, j;for(i=1; i=4;i+)for(j=1; j=12-2*i ; j+)cout “ “ ;for(j=1; j=2*i-1; j+)cout “* “ ; cout n;,
35、* * * * * * * * * * * * *,break语句在循环中的使用,break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。,功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中,例: 计算r=1到r=10时的圆面积,直到面积大于 100为止。,#include #define pi 3.14 void main() int r;float area;for(r=1;r100) break;coutareaendl; ,当计算值ar
36、ea100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环,功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,continue语句,例:把100200之间的不能被3整除的数输出,#include void main() int n;for(n=100;n=200;n+)if(n%3=0)continue;coutnendl; ,例:统计输入的字符串中,字符M的个数。,#include void main()char ch100;int i,sum=0;coutch;for(i=0;chi!=0;i+)if(chi!=M)cont
37、inue;sum=sum+1;cout“The number of M is “sumendl;,运行结果: input strings:Mum The number of M=1,课堂实例,例1: 说明:行列控制图案 功能:从键盘读入代表行数的正整数n,输出如下规律的图案(n3) 例2: 说明:行列控制图案 功能:从键盘读入代表行数的正整数n,输出如下规律的图案(n3),课堂实例,例3: 说明:行列控制 功能:九九表(左下角)例4: 说明:行列控制 功能:九九表(右上角),课堂实例,例5: 说明:拆数的个、十、百. 功能:从键盘读入一个三位数,然后拆分出该数的个、十、百。例6: 说明:拆数的
38、个、十、百. 功能:从键盘读入一个整数,然后拆分出该数的个、十、百,千. 。,课堂实例,例7: 说明:输出所有“水仙花数” 功能:将三位数拆分出个、十、百,并将各位求立方和,若和等该数本身,则为“水仙花数” 例:153=13+53+33,课程实例答案,例1: #include using namespace std;int main() int i,j,n;cinn; /输入打印图形的行数for(i=1;i=n;i+)for(j=1;j=i;j+) /行控制从1ncout*;coutendl; /每行结束进行换行 return 0; ,课程实例答案,例2:方法一 #include using
39、namespace std;int main() int i,j,n;cinn;for(i=1;i=n;i+)for(j=1;j=n+1-i;j+)cout*;coutendl;return 0; ,课程实例答案,例2:方法二 #include using namespace std;int main() int i,j,n;cinn;for(i=n;i=1;i-)for(j=1;j=i;j+)cout*;coutendl;return 0; ,课程实例答案,例3: #include using namespace std;int main() int i,j;for(i=1;i=9;i+)f
40、or(j=1;j=i;j+)couti*j“t“;coutendl;return 0; ,课程实例答案,例4: #include using namespace std;int main() int i,j,k;for(i=1;i=9;i+)for(k=1;k=i-1;k+)cout“t“;for(j=i;j=9;j+)couti*j“t“;coutendl;return 0; ,课程实例答案,例5: #include using namespace std;int main() int x,p,q;cinx;p=x/10; /取商q=x%10; /取余cout“p=“p“,q=“qendl;
41、x=p;if(p!=0) /若不为0,继续拆数p=x/10;q=x%10;cout“p=“p“,q=“qendl;return 0; ,课程实例答案,例6: #include using namespace std;int main() int x,p,q;cinx;while(p!=0)p=x/10;q=x%10;cout“p=“p“,q=“qendl;x=p;return 0; ,课程实例答案,例7: #include using namespace std; int main() int n,m,d,s;for(n=100;n=999;n+)m=n;s=0;while (m != 0) /当商不为0时,继续拆数d= m%10;s += d*d*d; /将拆出的每一位数进行累加m = m/10;if(s=n)coutn“t“;coutendl;return 0; ,掌握程序调试工具的基本使用 断点的设置与应用技能,断点的使用F9单步执行F10,练习,(一)教学与实验辅导(第3版)实验5,