《程序设计种基本结构PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《程序设计种基本结构PPT讲稿.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序设计种基本结构程序设计种基本结构第1页,共51页,编辑于2022年,星期日3.1 顺序结构 为了提高程序设计的质量和效率,为了提高程序设计的质量和效率,C C语言中经常采用结构化语言中经常采用结构化程序设计方法。当然,面向对象程序设计方法在程序设计方法。当然,面向对象程序设计方法在C+C+中用得更为常见。中用得更为常见。不过两者并不矛盾,因为在面向对象程序设计方法中也一定包不过两者并不矛盾,因为在面向对象程序设计方法中也一定包含了结构化程序设计方法,因此,作为基础,必须熟练掌握结含了结构化程序设计方法,因此,作为基础,必须熟练掌握结构化程序设计的方法。构化程序设计的方法。结构化程序由若干个
2、基本结构组成。每一个基本结构可以结构化程序由若干个基本结构组成。每一个基本结构可以包含包含 一个或若干个语句。有三种基本结构一个或若干个语句。有三种基本结构.采用流程图可以较好地描述算法的思路。采用流程图可以较好地描述算法的思路。当语句之间是顺序执行的关系时,就是当语句之间是顺序执行的关系时,就是顺序结构顺序结构顺序结构顺序结构,这也是最简,这也是最简单的结构。单的结构。第2页,共51页,编辑于2022年,星期日3.2 分支结构又称选择结构,典型的流程图如下:第3页,共51页,编辑于2022年,星期日分支结构的相关知识分支结构的相关知识3.2.1关系运算符和关系表达式3.2.2逻辑运算符和逻辑
3、表达式3.2.3if语句3.2.4switch语句3.2.5 条件运算符第4页,共51页,编辑于2022年,星期日1 1)关系运算符及其优先次序)关系运算符及其优先次序)关系运算符及其优先次序)关系运算符及其优先次序 关系运算是逻辑运算中比较简单的一种。所谓关系运算是逻辑运算中比较简单的一种。所谓“关系运算关系运算”实际上是实际上是“比较运算比较运算”。将两个值进行比较,判断其比。将两个值进行比较,判断其比较的结果是否符合给定的条件。比较的结果是一个逻辑值较的结果是否符合给定的条件。比较的结果是一个逻辑值(true,falsetrue,false)。)。6 6种关系运算符的优先次序如下:种关系
4、运算符的优先次序如下:、=、=,=、!=!=其中,前其中,前4 4个优先级相同,后个优先级相同,后2 2个优先级相同,前个优先级相同,前4 4种高于后种高于后2 2种。种。关系运算符的优先级低于算术运算符,高于赋值运算符。关系运算符的优先级低于算术运算符,高于赋值运算符。2 2)关系表达式:)关系表达式:)关系表达式:)关系表达式:用关系运算符将两个表达式连接的表达式。关系表达式的值用关系运算符将两个表达式连接的表达式。关系表达式的值也是一个逻辑值(也是一个逻辑值(true,falsetrue,false)。)。一般形式为:表达式一般形式为:表达式 关系运算符关系运算符 表达式表达式3.2.1
5、3.2.1关系运算符和关系表达式关系运算符和关系表达式 第5页,共51页,编辑于2022年,星期日3.2.2逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式1 1)3 3种逻辑运算符及其优先次序种逻辑运算符及其优先次序 !,&,|&、|为双目运算符,左结合;为双目运算符,左结合;!为单目运算符,右结合。为单目运算符,右结合。优先级如右图:优先级如右图:2 2)逻辑表达式)逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。表达式的值也是一个逻辑值(辑表达式。表达式的值也是一个逻辑值(
6、true,falsetrue,false)。)。逻辑表达式的一般形式为:逻辑表达式的一般形式为:表达式表达式 逻辑运算符逻辑运算符 表达式表达式第6页,共51页,编辑于2022年,星期日3.2.3if 语句共有共有共有共有3 3种形式的种形式的if if语句语句1 1)if(if(表达式表达式表达式表达式)语句语句语句语句例如:例如:if(xif(xy)y)cout“hello”cout“hello”;这种这种if if语句的执行过程见图。语句的执行过程见图。第7页,共51页,编辑于2022年,星期日example第8页,共51页,编辑于2022年,星期日2 2)if(if(表达式表达式表达式
7、表达式)语句语句语句语句1 1 elseelse语句语句语句语句2 2例如:例如:if(xif(xy)y)cout“first condition”cout“first condition”;elseelse cout“second condition”cout500)cost=0.15;else if(number300)cost=0.10;else if(number100)cost=0.075;else if(number50)cost=0.05;elsecost=0;第10页,共51页,编辑于2022年,星期日4)在使用在使用在使用在使用if语句应注意的问题语句应注意的问题:n nif
8、 if之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。n n在在if if语句中,条件判断表达式必须用括号括起来,在语句语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。之后必须加分号。n n在if语句中的内嵌语句为多个语句时,必须把这多个语句用括起来组成一个复合语句。但要注意的是在括起来组成一个复合语句。但要注意的是在之后之后不能再加分号。不能再加分号。n nif语句可以嵌套,流程图见后页。第11页,共51页,编辑于2022年,星期日第12页,共51页,编辑于2022年,星期日例:输入三角形的例:输入三角形的3 3
9、个边长,判断能否构成三角形个边长,判断能否构成三角形#includeinclude#includeinclude using namespaceusing namespace std;std;intint main()main()floatfloat a,b,c;a,b,c;cincinabc;abc;if if(a+bc&a+cb&b+ca)(a+bc&a+cb&b+ca)/&(fabs(a-b)c&fabs(a-c)b&fabs(b-c)a)/&(fabs(a-b)c&fabs(a-c)b&fabs(b-c)a)coutYes“endl;coutYes“endl;elseelse cout
10、No“endl;coutNo“endl;returnreturn 0;0;第13页,共51页,编辑于2022年,星期日例:输入例:输入3 3个各不相同的数,输出最大、最小值个各不相同的数,输出最大、最小值#include#include using namespace std;using namespace std;intint main()main()floatfloat a,b,c,maxVal,minVal;a,b,c,maxVal,minVal;cincinabc;abc;if if(ab&ac)maxVal=a;(ab&ac)maxVal=a;else ifelse if(ba&bc
11、)maxVal=b(ba&bc)maxVal=b;else ifelse if(ca&cb)maxVal=c;(ca&cb)maxVal=c;if if(ab&ac)minVal=a;(ab&ac)minVal=a;else ifelse if (ba&bc)minVal=b;(ba&bc)minVal=b;else ifelse if (ca&cb)minVal=c;(ca&cb)minVal=c;coutcout“Max,Min:”maxVal“,”minValendl;“Max,Min:”maxVal“,”minValendl;returnreturn 0;0;第14页,共51页,编辑于
12、2022年,星期日3.2.43.2.4switch语句语句 switchswitch语句是多分支选择语句。用来实现多分支选择结构。语句是多分支选择语句。用来实现多分支选择结构。if if语语句只有两个分支可供选择,而实际问题中常常需要用到多分支句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。的选择。例如,学生成绩分类例如,学生成绩分类(90(90分以上为分以上为 aa等,等,80808989分为分为 bb等,等,70707979分为分为 cc等等);人口统计分类;人口统计分类(按年龄分为老、中、青、少、儿童按年龄分为老、中、青、少、儿童);工资统计分类;银行存款分类;工资统计分类
13、;银行存款分类。语法格式如下:语法格式如下:switchswitch(表达式表达式)casecase常量表达式常量表达式1 1:语句:语句1 1 casecase常量表达式常量表达式2 2:语句:语句2 2 casecase常量表达式常量表达式n n:语句:语句n n defaultdefault :语句:语句n n1 1 第15页,共51页,编辑于2022年,星期日例如,要求按照考试成绩的等级打印出百分制分数段,可以用Switch语句实现:switchswitch(grade)(grade)casecase AA cout85 cout85100100nn;breakbreak;caseca
14、se BB cout70 cout708484nn;breakbreak;casecase CC cout60 cout606969nn;breakbreak;casecase DD cout cout 6060nn;breakbreak;defaultdefault couterror couterrornn;第16页,共51页,编辑于2022年,星期日说明 (1)有无break语句的区别。语句的区别。(2)在casecase后的各常量表达式的值不能相同,否则会出错。后的各常量表达式的值不能相同,否则会出错。(3 3)各)各casecase和和defaultdefault子句的先后顺序可以调
15、换。子句的先后顺序可以调换。(4 4)在casecase后,允许有多个语句,可以不用括起来。(5 5)default子句可以省略不用。子句可以省略不用。(6)多个)多个case可以共用一组执行语句。可以共用一组执行语句。(7)表达式允许为任何类型。)表达式允许为任何类型。第17页,共51页,编辑于2022年,星期日流程图:第18页,共51页,编辑于2022年,星期日3.2.5 3.2.5 条件运算符(了解即可了解即可)若if语句中,在表达式为语句中,在表达式为“真真”和和“假假”时,且都只执行时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运一个赋值语句给同一个变量赋值时,可以用
16、简单的条件运算符来处理。例如,若有以下算符来处理。例如,若有以下if语句:if if(ab)b)max=amax=a;elsemax=bmax=b;可以用下面的条件运算符来处理:max=(ab)?a a b b;其中其中“(a(ab)b)?ab”是一个是一个“条件表达式条件表达式”。它是这样执行。它是这样执行的:如果的:如果(ab)条件为真,则条件表达式取值a a,否则取,否则取值值b b。第19页,共51页,编辑于2022年,星期日n n3.3.1 whilen n3.3.2 do whilen n3.3.3 forn n3.3.4 break和continue n n3.3.5 示例3.3
17、 循环结构第20页,共51页,编辑于2022年,星期日3.3.1 while while语句用来实现“当型”循环结构。其一般形式如下:while(表达式表达式)语句语句第21页,共51页,编辑于2022年,星期日例:求求sum=1+2+3+100int int main()main()intint i=1,sum=0;i=1,sum=0;whilewhile(i=100)sum=sum+i;i+;coutcoutsumendl;returnreturn 0;第22页,共51页,编辑于2022年,星期日3.3.2 do while do while语句的特点是先执行循环体,然后判断循环条件是否成
18、立。一般形式为do 循环体语句循环体语句while(表达式表达式);第23页,共51页,编辑于2022年,星期日例例:求sum=1+2+3+100int main()int main()int i=1,sum=0;int i=1,sum=0;dodo sum=sum+i;i+;whilewhile(i=100)(i=100);coutsumendl;coutsumendl;return 0;第24页,共51页,编辑于2022年,星期日3.3.3 for for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句
19、。一般形式为:for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句 第25页,共51页,编辑于2022年,星期日它的执行过程如下:它的执行过程如下:(1)(1)先求解表达式先求解表达式1 1。(2)(2)求解表达式2 2,若其值为真,则执行forfor语句中指定的内嵌语句,然后执语句中指定的内嵌语句,然后执行下面第行下面第(3)步。若为假,则结束循环。(3)(3)求解表达式求解表达式3。(4)转回上面第转回上面第(2)(2)步骤继续执行。步骤继续执行。for语句最简单的应用形式形式:for(循环变量赋初值;循环条件;循环变量增值)语句 例如:for(int i=1;i=100;
20、i+)sum=sum+i;第26页,共51页,编辑于2022年,星期日例:求sum=1+2+3+100int main()int main()int sum=0;for(int i=1;i=100;i+)sum=sum+i;coutsumendl;return 0;int main()int i,sum=0;int i,sum=0;for(i=1;i=100;i+)sum=sum+i;coutsumendl;return 0;第27页,共51页,编辑于2022年,星期日3.3.4 break和continuebreak语句在前面已经介绍过,可以使流程跳出Switch结构,继续执行Switch语
21、句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。continue的作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。第28页,共51页,编辑于2022年,星期日continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。注意:A A、breakbreak语句对语句对if-elseif-else的条件语句不起作用。的条件语句不起作用。B、在多层循环中,一个一个break语句只向外
22、跳一层。语句只向外跳一层。第29页,共51页,编辑于2022年,星期日3.3.5 3.3.5 示例:示例:例:多项式如下:例:多项式如下:/4=1-1/3+1/5-1/7+1/9 ./4=1-1/3+1/5-1/7+1/9 .计算的项数计算的项数n n由键盘输入,求由键盘输入,求。结果保留。结果保留2 2位小数。位小数。#include#include int main()int main()int n,sign=1;int n,sign=1;double sum=0.0;double sum=0.0;cinn;cinn;for(int i=1;i=n;i+=2)for(int i=1;i=n
23、;i+=2)sum=sum+sign*1.0/i;sum=sum+sign*1.0/i;sign=-sign;sign=-sign;/设置浮点数的小数个数设置浮点数的小数个数2 2位位coutfixedsetprecision(2)4*sumendl;coutfixedsetprecision(2)4*sumendl;return 0;return 0;第30页,共51页,编辑于2022年,星期日例:统计给定的例:统计给定的n n个整数中,负数、零和正数的个数。个整数中,负数、零和正数的个数。输入第一个数是整数输入第一个数是整数n n(n100nn;cinn;int zero=0,positi
24、ve=0,negative=0;int zero=0,positive=0,negative=0;for(int i=0;in;i+)for(int i=0;ix;cinx;if(x0)if(x0)positive+;positive+;else if(x0)else if(x0)negative+;negative+;elseelsezero+;zero+;coutnegative zero positiveendl;coutnegative zero positiveab;ab;for for(int i=1;ia;i+)(int i=1;ia;i+)if if(a%i=0)sumA+=i
25、;(a%i=0)sumA+=i;forfor(int j=1;jsumb;j+)(int j=1;jsumb;j+)if if(b%j=0)sumB+=j;(b%j=0)sumB+=j;if if(sumA=b&sumB=a)(sumA=b&sumB=a)coutcoutYESn;YESn;elseelsecoutcoutNOn;NOn;returnreturn 0;0;第33页,共51页,编辑于2022年,星期日3.4.1 基本运算3.4.2 示例3.4 使用string第34页,共51页,编辑于2022年,星期日#include#include/包含头文件包含头文件声明变量及初始化:声明变
26、量及初始化:string s1,s2,s3=Hello;string s1,s2,s3=Hello;赋值:赋值:s2=“World”;s2=“World”;串加法运算串加法运算 s1=s2+s3;s1=s2+s3;串比较运算串比较运算if(s2s3)cout“Bigger”s3)cout“Bigger”endl;输出输出 couts3endl;couts3cin的读入方式总是将前导的空格(所谓空格,即包括空格、的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入时结束本次输入
27、n ngetlinegetline总是将行末的回车符滤掉,将其整行输入总是将行末的回车符滤掉,将其整行输入对字串对字串”Hello,How are you?”Hello,How are you?”的两种输入方式的两种输入方式/方法方法1 1string s;string s;while(while(cins)cins)couts”“;couts”“;coutendl;coutendl;/方法方法2 2(优先考虑本方法)(优先考虑本方法)string s;string s;getline(cin,s);getline(cin,s);coutsendl;coutstotal;cintotal;fo
28、r(int i=1;i=total;i+)for(int i=1;is;cins;bool flag=true;bool flag=true;/存放结果存放结果len=s.size();len=s.size();/s.size()/s.size()表示串表示串s s的长度的长度for(int j=0;jlen/2;j+)for(int j=0;jlen/2;j+)if(sj!=slen-1-j)if(sj!=slen-1-j)/判断字符的范围判断字符的范围 flag=false;flag=false;break;break;if(flag=true)if(flag=true)cout“YES”
29、endl;cout“YES”endl;elseelsecout“NO”endl;cout“NO”s)=NULL)break;if(cins)=NULL)break;/离开测试的条件(必要)离开测试的条件(必要)/或者或者 if(!(cins)break;if(!(cins)break;/也可使用本方法也可使用本方法 char maxchar=s0;char maxchar=s0;for(int for(int i=1i=1;is.size();i+);imaxchar)maxchar=si;if(simaxchar)maxchar=si;for(int j=0;js.size();j+)for
30、(int j=0;js.size();j+)/按要求输出按要求输出 coutsj;coutsj;if(sj=maxchar)cout(max);if(sj=maxchar)cout(max);coutendl;couts)!=NULL)while(cins)!=NULL)/离开测试的条件(必要)离开测试的条件(必要)/或者或者while(cins)while(cins)char maxchar=s0;char maxchar=s0;for(int i=1;is.size();i+)for(int i=1;imaxchar)maxchar=si;if(simaxchar)maxchar=si;f
31、or(int j=0;js.size();j+)for(int j=0;js.size();j+)/按要求输出按要求输出 coutsj;coutsj;if(sj=maxchar)cout(max);if(sj=maxchar)cout(max);coutendl;coutendl;return 0;return 0;第39页,共51页,编辑于2022年,星期日例:输入一个只包含空格和小写字母的英文句子,将每个单词的第一例:输入一个只包含空格和小写字母的英文句子,将每个单词的第一例:输入一个只包含空格和小写字母的英文句子,将每个单词的第一例:输入一个只包含空格和小写字母的英文句子,将每个单词的第
32、一个字母改成大写首字母。个字母改成大写首字母。个字母改成大写首字母。个字母改成大写首字母。(HDOJ2026HDOJ2026)int main()int main()while(true)while(true)string s;string s;if(!getline(cin,s)if(!getline(cin,s)break;break;/离开测试的条件离开测试的条件s0=s0-a+A;s0=s0-a+A;/处理首字母处理首字母for(int for(int i=1i=1;is.size();i+);is.size();i+)/小写转大写小写转大写if(si-1=)si=si-a+A;if(
33、si-1=)si=si-a+A;coutsendl;coutsendl;return 0;return 0;第40页,共51页,编辑于2022年,星期日(HDOJ2026HDOJ2026)的另一种方式:)的另一种方式:int main()int main()string s;string s;while(getline(cin,s)while(getline(cin,s)/离开测试的条件离开测试的条件s0=s0-a+A;s0=s0-a+A;/处理首字母处理首字母for(int i=1;is.size();i+)for(int i=1;is.size();i+)/小写转大写小写转大写if(si-
34、1=)si=si-a+A;if(si-1=)si=si-a+A;coutsendl;coutsendl;return 0;return 0;第41页,共51页,编辑于2022年,星期日3.5.1 简单字符图形的双重循环3.5.2 3.5.2 判断素数3.5.3 3.5.3 百鸡问题3.5.4 3.5.4 最大公约数最大公约数3.5 其他应用第42页,共51页,编辑于2022年,星期日3.5.1 3.5.1 简单字符图形的双重循环简单字符图形的双重循环MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
35、MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM分析方法:分析方法:该图形一共该图形一共1010行,每一行增加一行,每一行增加一个字符,所以,应循环个字符,所以,应循环1010次,每次,每次输出一行,其循环模式为:次输出一行,其循环模式为:forfor(intint i=1;i=10;+i)i=1;i=10;+i)输出第输出第i i行行(循环循环)换行换行 n n行行 i M i M的个数的个数n n 1 1 1 1 1 1n n 2 2 2 2 2 2n n 3 3 3 3 3 3n n 4 4 4 4 4 4n n.n n10 10 1010 10 10forfo
36、r(intint i=1;i=10;+i)i=1;i=10;+i)forfor(intint j=1;j=i;+j)j=1;j=i;+j)cout”M”;cout”M”;coutendl;coutm;cinm;bool isPrime=true;bool isPrime=true;intint sqm=(int)sqrt(m*1.0);sqm=(int)sqrt(m*1.0);forfor(intint i=2;i=sqm;i+)i=2;i=sqm;i+)if if(m%i=0)(m%i=0)isPrime=isPrime=falsefalse;break;break;第44页,共51页,编辑
37、于2022年,星期日3.5.3 百鸡问题 本问题记载于中国古代约56世纪成书的张邱建算经中,是原书卷下第38题,也是全书的最后一题:今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵(雏)三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?答曰:鸡翁四,值钱二十;鸡母十八,值钱五十四;鸡鶵七十八,值钱二十六。又答:鸡翁八,值钱四十;鸡 母十一,值钱三十三,鸡鶵八十一,值钱二十七。又答:鸡翁十二,值钱六十;鸡母四、值钱十二;鸡鶵八十 四,值钱二十八。该问题导致三元不定方程组,其重要之处在于开创一问多答的先例,这是过去中国古算书中所没有的。100100元钱买元钱买100100只鸡,只鸡,大公鸡大公鸡5 5元元
38、1 1只,母鸡只,母鸡3 3元元1 1只,小鸡只,小鸡1 1元元3 3只。只。问公鸡,母鸡,小鸡各多少只?问公鸡,母鸡,小鸡各多少只?第45页,共51页,编辑于2022年,星期日分析:把三种鸡的只数分别设为未知数x、y、z,然后利用总只数、总钱数两个条件,列出两个方程,根据鸡的只数必须取整数的要求,一步一步推出各种鸡的只数。解:设大公鸡x只,母鸡y只,小鸡z只。根据题意,得第46页,共51页,编辑于2022年,星期日方法一:方法一:方法一:方法一:int x,y,z;int x,y,z;/cock,hen,chick;/cock,hen,chick;forfor(x=1;x=100/5;x+)
39、(x=1;x=100/5;x+)forfor(y=1;y=100/3;y+)(y=1;y=100/3;y+)forfor(z=1;z=100;z+)(z=1;z=100;z+)if if(x+y+z=100&5*x+3*y+z/3=100&z%3=0)(x+y+z=100&5*x+3*y+z/3=100&z%3=0)coutx“,”y“,”zendl;coutx“,”y“,”zendl;第47页,共51页,编辑于2022年,星期日方法二:方法二:方法二:方法二:int x,y,z;int x,y,z;/cock,hen,chick;/cock,hen,chick;forfor(x=1;x=100/5;x+)(x=1;x=100/5;x+)forfor(y=1;y=100/3;y+)(y=1;y=100/3;y+)z=100-x-y;z=100-x-y;if if(5*x+3*y+z/3=100&z%3=0)(5*x+3*y+z/3=100&z%3=0)coutx“,”y“,”zendl;coutx“,”y“,”zmn;while(n0)int t=m%n;m=n;n=t;gcd=m;课后思考:怎么求最小公倍课后思考:怎么求最小公倍数数?第51页,共51页,编辑于2022年,星期日
限制150内