程序设计基础第5章.ppt_第1页
程序设计基础第5章.ppt_第2页
程序设计基础第5章.ppt_第3页
程序设计基础第5章.ppt_第4页
程序设计基础第5章.ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

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种格式,格式1 if (表达式) 语句; 格式1的if语句执行过程: 1. 求表达式的值,若为真(即值为非0),则执行2,若为假(即值为0)则转到3; 2. 执行if语句中指定的内嵌语句A; 3. 整个if语句执行结束,继续执行后面的语句,格式2 if (表达式) 语句1; else 语句2; 格式2的if语句执行过程: 1. 求表达式的值,若为真(即值为非0

3、)则执行2,若为假(即值为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、 4. 输出score2; 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 (sco

5、re1 score2) 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.结束运行。,输入完成后,数据

6、分别存放在score1和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

7、; if (score1 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; else if (表达式) 语句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,继

10、续执行9,否则转到10; 9.按重根格式输出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);

11、if (d = 0) cout 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(); /生成随机整

12、数 3.定义2个变量 obj、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; e

13、lse cout 失败 endl; ,goto语句,goto语句为无条件转向语句,它的一般形式为 goto 语句标号; 语句标号是一个用户自定义的标识符,它可以处于goto语句的前面,也可以处于其后面,但是标号必须与goto语句处于同一个函数中。定义标号时,由一个标识符后面跟一冒号组成。 语句标号的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来作标号。 作用:与if语句一起构成循环结构或从循环体中跳转到循环体外(一般是从多层循环的内层循环跳到外层循环时)。,#include #include #include void main() int ob

14、j,k; int num=0; srand(time(NULL); obj=rand(); obj=obj%8+1; coutk; if (k=obj) coutobj) cout太大endl; else cout太小endl; cout,请再猜!; num+=1; if (num=3) cout失败!; exit(0); goto outer; ,使用if嵌套能解决多分支选择结构;C+还提供了swatch语句解决多分支选择结构,其可读性更好一些。 switch语句的一般格式如右:,前期知识 switch 语句,switch (表达式) case 常量1: 语句; case 常量2: 语句;

15、case 常量n: 语句; default: 语句; ,switch语句的执行过程:,1.求表达式的值 2.将求得的值依次与常量1、常量2、常量n比较, 如果找到一个相匹配的值,则从这个case语句后面开始,顺序执行各语句 如果找不到相匹配的值,则执行default后面的语句。 每种情况对应的语句可以不止一句;,switch (表达式) case 常量1: 语句; case 常量2: 语句; case 常量n: 语句; default: 语句; ,使用switch语句是为了针对不同情况执行不同的语句,在执行某一情况对应的语句后,一般说来不希望再去执行后面其他情况的对应语句,为此,可以在每种情况

16、的对应语句之后,加上一句break,结束switch语句的本次执行。 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) ca

17、se 1: /注意1是字符型 cout First;break;,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),然后根据这个数显示相应的英文单词

18、,对0、1、2、3、4、5、和6,分别显示:Sun、Mon、Tue、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.1while语句,特点:先判断表达式,后执行语句。,while语句(当型)的一般格式 while (表达式) 语句; while语句的执行过程: 1.求表达式的值,若为假(即值为0),则转到3 ; 2.执行while语句中指定的内嵌语

20、句(称为循环体),然后转回到1 ; 3.整个while语句执行结束,继续执行后面的语句。,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; whi

21、le (i = 100) sum = sum + i; i +; cout sum endl; ,注意:在while语句之前,循环变量i(用于控制重复次数的变量)应赋初值。未对循环变量赋初值的while语句,不能稳定实现预想的能,在程序各次运行时会产生无规律的不同结果。,循环体(在循环中反复执行的语句部分)若包含一个以上的语句,应用花括号括起来,以复合语句形式出现。若不加,则while语句的范围只到while后面第一个分号处。 本例while的复合语句包含2条语句。,应有使循环趋向于结束的语句(要求i100结束),该表达式起到了控制循环次数的作用。,如无i+ ,则成无穷循环,即死循环,i的值永

22、不改变,循环永不结束。,6.2do-while语句,do-while语句(直到型)一般格式: do 语句; while(表达式); 与while语句不同的是,do循环中的语句至少会执行一次,而while语句当条件第一次就不满足时,语句一次也不会被执行。,特点:先执行语句,后判断表达式。,有一个分号,do循环体语句 while ( 表达式 );,一般形式,流程图,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,#include void main() int sum=0; int i; i = 1; do sum = sum + i; i +;

23、 while (i = 100); cout sum endl; ,for 语句的一般格式: for (表达式1; 表达式2; 表达式3) 语句; for语句的执行过程: 1.求解表达式1; 2.求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句(循环体);若为假(为0)则转到5; 3.求解表达式3; 4.转回到2; 5.循环结束,执行for语句后面的语句。 象if语句一样,while和for语句中的内嵌语句都是一句语句,如果一句简单的语句不能满足需要,就得使用复合语句。,6.3for语句,#include void main() int sum=0; int i; for (

24、i = 1; i = 100; i +) sum = sum + i; cout sum 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:循环条件判断,决定循环是否继

25、续(i=100;),表达式3:循环变量增值(i+),假(0),以下写法可以使程序更简练,int 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(

26、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;,例:编写程序实现功能:求出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语

27、句可以将变量初始化部分加入其中,for(i=1, sum=0; i=100; i+) if(i%2=0) sum = sum + i; 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; c

28、out sumendl;,for(表达式1;表达式2;表达式3) 语句;,表达式2可无,相当于循环条件永远为真 例: for( ; ; ) 并无语法错误 相当于 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;,编程:计算

29、并输出数列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 + 1 /( t * i ); t = -t ; cout sendl;,循环嵌套,一个循环体内又包含另一个完整的循环结构,称为循环嵌套,这样的循环也称二重循环 前一语句表示的循环称“外循环” 后一语句表示的循环称“内循环” 内循环从属于外循环,while() while() ,for(; ; ) for(; ; ) ,编程:统计不同的2个数字构成的二位数有多少种,int i, j; int count = 0; for (

30、i = 1; i = 9; i +) for (j = 0; j = 9; j +) if (i != j) count +; cout count endl;,分析: 二位数的范围:10 99 用变量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

31、(k!=i ,分析: 三位数范围: 100 999 “不同的3个数字” 即个位数字与十位数字不等的那种情况 (i != j) 符合了这条件再考虑百位数 百位数字也必须与它们都不等 ( k!=i 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; /复制到m p=1; /p存放积 s=0; /s存放和 while(m!=0) p=p*(m%10); s=s+(m%10); m=m/10;

32、 ,循环结束条件: 每循环一次,由于m/10, m降低一位,降至0结束,用除法运算来分解出一个整数的每一位数字。 对于整数m, 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;

33、 coutn; ,添加了表头,使输出结果符合题意,添加列表头,添加行表头,int a,b; coutt1t2t3t4t5t6t7t8t9n; for(a=1;a=9;a+) coutat; for(b=1;b=a;b+) couta*bt; coutn; ,更为简练的方法,内循环可以少走一半,编程:输出如下三角形图形 * * * * 分析: 绝对不能用4句cout简单解决问题,要考虑到通用性,共 i 行,每行有 j 个*符号 共i行,则有外循环,每一次输出一行; 每一行的输出要考虑到它由2部分组成: 先是左边若干空格,每行变化规律3210 后接若干*符号,每行变化规律1357 则有2个内循环,

34、1个打若干空格,另一个打若干*号,int i, j; for(i=1; i=4;i+) for(j=1; j=4-i ;j+) cout ; for(j=1; j=2*i-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位 每个*号间有一个空格,i

35、nt 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; ,* * * * * * * * * * * * * * * *,break语句在循环中的使用,break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。,功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明: break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的任何其它语句之中,例:计算r=1到r=10时的圆面积,直到面积大

36、于100为止。,#include #define pi 3.14 void main() int r; float area; for(r=1;r100) break; coutareaendl; ,当计算值area100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环,功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,continue语句,例:把100200之间的不能被3整除的数输出,#include void main() int n; for(n=100;n=200;n+) if(n%3=0) continue; cout

37、nendl; ,例:统计输入的字符串中,字符M的个数。,#include void main() char ch100; int i,sum=0; coutch; for(i=0;chi!=0;i+) if(chi!=M) continue; sum=sum+1; coutThe number of M is sumendl; ,运行结果: input strings:Mum The number of M=1,课堂实例,例1: 说明:行列控制图案 功能:从键盘读入代表行数的正整数n,输出如下规律的图案(n3) 例2: 说明:行列控制图案 功能:从键盘读入代表行数的正整数n,输出如下规律的图案(n3),课堂实例,例3: 说明:行列控制 功能:九九表(左下角) 例4: 说明:行列控制 功能:九九表(右上角),课堂实例,例5: 说明:拆数的个、十、百. 功能:从键盘读入一个三位数,然后拆分出该数的个、十、百。 例6: 说明:拆数的个、十、百. 功能:从键盘读入一个整数,然后拆分出该数的个、十、百,千. 。,课堂实例,例7: 说明:输出所有“水仙花数” 功能:将三位数拆分出个、十、百,并将各位求立方和,若和等该数本身,则为“水仙花数” 例:153=13+53+33,课程实例答案,例1:

温馨提示

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

评论

0/150

提交评论