程序设计种基本结构_第1页
程序设计种基本结构_第2页
程序设计种基本结构_第3页
程序设计种基本结构_第4页
程序设计种基本结构_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

程序设计种基本结构第一页,共五十一页,2022年,8月28日3.1顺序结构

为了提高程序设计的质量和效率,C语言中经常采用结构化程序设计方法。当然,面向对象程序设计方法在C++中用得更为常见。不过两者并不矛盾,因为在面向对象程序设计方法中也一定包含了结构化程序设计方法,因此,作为基础,必须熟练掌握结构化程序设计的方法。结构化程序由若干个基本结构组成。每一个基本结构可以包含一个或若干个语句。有三种基本结构.

采用流程图可以较好地描述算法的思路。

当语句之间是顺序执行的关系时,就是顺序结构,这也是最简单的结构。第二页,共五十一页,2022年,8月28日3.2分支结构

又称选择结构,典型的流程图如下:第三页,共五十一页,2022年,8月28日分支结构的相关知识关系运算符和关系表达式逻辑运算符和逻辑表达式

if语句

switch语句3.2.5条件运算符第四页,共五十一页,2022年,8月28日1)关系运算符及其优先次序关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。比较的结果是一个逻辑值(true,false)。

6种关系运算符的优先次序如下:<、<=、>、>=,==、!=

其中,前4个优先级相同,后2个优先级相同,前4种高于后2种。关系运算符的优先级低于算术运算符,高于赋值运算符。2)关系表达式:用关系运算符将两个表达式连接的表达式。关系表达式的值也是一个逻辑值(true,false)。 一般形式为:表达式关系运算符表达式3.2.1关系运算符和关系表达式

第五页,共五十一页,2022年,8月28日逻辑运算符和逻辑表达式

1)3种逻辑运算符及其优先次序

!,&&,||&&、||为双目运算符,左结合;

!为单目运算符,右结合。优先级如右图:

2)逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。表达式的值也是一个逻辑值(true,false)。 逻辑表达式的一般形式为: 表达式逻辑运算符表达式第六页,共五十一页,2022年,8月28日

if语句 共有3种形式的if语句1)if(表达式)语句例如:

if(x>y){ cout<<“hello”;

}这种if语句的执行过程见图。第七页,共五十一页,2022年,8月28日example第八页,共五十一页,2022年,8月28日2)

if(表达式) 语句1 else 语句2例如: if(x>y){ cout<<“firstcondition”; } else{ cout<<“secondcondition”;}第九页,共五十一页,2022年,8月28日3) if(表达式1) 语句1 elseif(表达式2) 语句2 elseif(表达式3) 语句3 … elseif(表达式m) 语句m else 语句n

例如:if(number>500){ cost=0.15;}elseif(number>300){ cost=0.10;}elseif(number>100){ cost=0.075;}else

if(number>50){ cost=0.05;}else{ cost=0;}第十页,共五十一页,2022年,8月28日4)在使用if语句应注意的问题:if之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。在if语句中的内嵌语句为多个语句时,必须把这多个语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。if语句可以嵌套,流程图见后页。第十一页,共五十一页,2022年,8月28日第十二页,共五十一页,2022年,8月28日例:输入三角形的3个边长,判断能否构成三角形#include<iostream>#include<cmath>usingnamespacestd;intmain(){

floata,b,c;

cin>>a>>b>>c;

if(a+b>c&&a+c>b&&b+c>a)

//&&(fabs(a-b)<c&&fabs(a-c)<b&&fabs(b-c)<a)) { cout<<"Yes“<<endl; }

else { cout<<"No“<<endl; }

return0;}第十三页,共五十一页,2022年,8月28日例:输入3个各不相同的数,输出最大、最小值#include<iostream>usingnamespacestd;intmain(){

floata,b,c,maxVal,minVal;

cin>>a>>b>>c;

if(a>b&&a>c)maxVal=a;

elseif(b>a&&b>c)maxVal=b;

elseif(c>a&&c>b)maxVal=c;

if(a<b&&a<c)minVal=a;

elseif(b<a&&b<c)minVal=b;

elseif(c<a&&c<b)minVal=c;

cout<<“Max,Min:”<<maxVal<<“,”<<minVal<<endl;

return0;}第十四页,共五十一页,2022年,8月28日

switch语句

switch语句是多分支选择语句。用来实现多分支选择结构。if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。 例如,学生成绩分类(90分以上为‘a’等,80~89分为‘b’等,70~79分为‘c’等……);人口统计分类(按年龄分为老、中、青、少、儿童);工资统计分类;银行存款分类……。 语法格式如下:

switch(表达式){

case常量表达式1:语句1

case常量表达式2:语句2…

case常量表达式n:语句n

default

:语句n+1

}第十五页,共五十一页,2022年,8月28日例如,要求按照考试成绩的等级打印出百分制分数段,可以用Switch语句实现:

switch(grade)

case‘A'∶cout<<"85~100\n";break;

case‘B'∶cout<<"70~84\n";break;

case‘C'∶cout<<"60~69\n";break;

case‘D'∶cout<<"<60\n";break;

default∶cout<<"error\n";}第十六页,共五十一页,2022年,8月28日说明(1)有无break语句的区别。(2)在case后的各常量表达式的值不能相同,否则会出错。(3)各case和default子句的先后顺序可以调换。(4)在case后,允许有多个语句,可以不用{}括起来。(5)default子句可以省略不用。(6)多个case可以共用一组执行语句。(7)表达式允许为任何类型。第十七页,共五十一页,2022年,8月28日流程图:第十八页,共五十一页,2022年,8月28日3.2.5条件运算符(了解即可)若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如,若有以下if语句:

if

(a>b)

max=a;

else

max=b;可以用下面的条件运算符来处理:

max=(a>b)?a∶b;其中“(a>b)?a∶b”是一个“条件表达式”。它是这样执行的:如果(a>b)条件为真,则条件表达式取值a,否则取值b。第十九页,共五十一页,2022年,8月28日3.3.1while3.3.2dowhile3.3.3for3.3.4break和continue3.3.5示例3.3循环结构第二十页,共五十一页,2022年,8月28日3.3.1whilewhile语句用来实现“当型”循环结构。其一般形式如下:while(表达式)

语句第二十一页,共五十一页,2022年,8月28日例:求sum=1+2+3+…+100intmain(){ inti=1,sum=0;

while

(i<=100)

{ sum=sum+i; i++;

}

cout<<sum<<endl;

return0;}第二十二页,共五十一页,2022年,8月28日3.3.2dowhiledowhile语句的特点是先执行循环体,然后判断循环条件是否成立。一般形式为do

循环体语句while(表达式);第二十三页,共五十一页,2022年,8月28日例:求sum=1+2+3+…+100intmain(){ inti=1,sum=0;

do{ sum=sum+i; i++;

}while(i<=100);

cout<<sum<<endl; return0;}第二十四页,共五十一页,2022年,8月28日3.3.3for

for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。一般形式为:

for(表达式1;表达式2;表达式3)语句

第二十五页,共五十一页,2022年,8月28日它的执行过程如下:

(1)先求解表达式1。

(2)求解表达式2,若其值为真,则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假,则结束循环。

(3)求解表达式3。

(4)转回上面第(2)步骤继续执行。for语句最简单的应用形式形式:for(循环变量赋初值;循环条件;循环变量增值)语句例如:for(inti=1;i<=100;i++)sum=sum+i;第二十六页,共五十一页,2022年,8月28日例:求sum=1+2+3+…+100intmain(){intsum=0;

for(inti=1;i<=100;i++){sum=sum+i;}cout<<sum<<endl;return0;}intmain(){inti,sum=0;

for(i=1;i<=100;i++){sum=sum+i;}cout<<sum<<endl;return0;}第二十七页,共五十一页,2022年,8月28日3.3.4break和continuebreak语句在前面已经介绍过,可以使流程跳出Switch结构,继续执行Switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。continue的作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。第二十八页,共五十一页,2022年,8月28日continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。注意:

A、break语句对if-else的条件语句不起作用。

B、在多层循环中,一个break语句只向外跳一层。第二十九页,共五十一页,2022年,8月28日3.3.5示例:例:多项式如下:π/4=1-1/3+1/5-1/7+1/9...

计算的项数n由键盘输入,求π。结果保留2位小数。#include<iomanip>intmain(){ intn,sign=1; doublesum=0.0;cin>>n; for(inti=1;i<=n;i+=2){ sum=sum+sign*1.0/i; sign=-sign; } //设置浮点数的小数个数2位 cout<<fixed<<setprecision(2)<<4*sum<<endl; return0;}第三十页,共五十一页,2022年,8月28日例:统计给定的n个整数中,负数、零和正数的个数。

输入第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个整数,分别输出给定的数据中负数、零和正数的个数。intmain(){ intn,x; cin>>n; intzero=0,positive=0,negative=0; for(inti=0;i<n;i++){ cin>>x; if(x>0) positive++; elseif(x<0) negative++; else zero++; } cout<<negative<<""<<zero<<""<<positive<<endl; return0;}第三十一页,共五十一页,2022年,8月28日例:古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。而284的所有真约数为1、2、4、71、142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。编程,判断给定的两个数是否是亲和数。Input输入数据包含两个整数A,B;

Output如果A和B是亲和数的话输出YES,否则输出NO。第三十二页,共五十一页,2022年,8月28日intmain(){

inta,b,sumA=0,sumB=0;

cin>>a>>b;

for(inti=1;i<a;i++){

if(a%i==0)sumA+=i; }

for(intj=1;j<sumb;j++){

if(b%j==0)sumB+=j; }

if(sumA==b&&sumB==a)

cout<<"YES\n";

else

cout<<"NO\n";

return0;}第三十三页,共五十一页,2022年,8月28日3.4.1基本运算3.4.2示例3.4使用string第三十四页,共五十一页,2022年,8月28日

#include<string> //包含头文件 声明变量及初始化:

strings1,s2,s3="Hello";

赋值:

s2=“World”;

串加法运算

s1=s2+s3;

串比较运算

if(s2>s3)cout<<“Bigger”<<endl;

输出

cout<<s3<<endl;处理串成员(字符)的方法

s[序号] (其中,序号的范围,0~length-1)3.4.1基本运算第三十五页,共五十一页,2022年,8月28日输入string的方式:cin>>的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入getline总是将行末的回车符滤掉,将其整行输入对字串”Hello,Howareyou?”的两种输入方式//方法1strings;while(

cin>>s)cout<<s<<”“;cout<<endl;//方法2(优先考虑本方法)strings;getline(cin,s);cout<<s<<endl;第三十六页,共五十一页,2022年,8月28日例:判断回文串(HLOJ1111)intmain(){ inttotal; //表示测试总数

cin>>total; for(inti=1;i<=total;i++){

strings; cin>>s; boolflag=true; //存放结果

len=s.size(); //s.size()表示串s的长度

for(intj=0;j<len/2;j++){ if(s[j]!=s[len-1-j]){ //判断字符的范围

flag=false; break; } } if(flag==true) cout<<“YES”<<endl; else cout<<“NO”<<endl; } return0;}第三十七页,共五十一页,2022年,8月28日例:对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。(HLOJ1139)intmain(){

while(true){ strings; if((cin>>s)==NULL)break; //离开测试的条件(必要)

//或者if(!(cin>>s))break; //也可使用本方法

charmaxchar=s[0]; for(inti=1;i<s.size();i++){ //寻找最大字符

if(s[i]>maxchar)maxchar=s[i]; } for(intj=0;j<s.size();j++){ //按要求输出

cout<<s[j]; if(s[j]==maxchar)cout<<"(max)"; } cout<<endl; } return0;}第三十八页,共五十一页,2022年,8月28日(HLOJ1139)的另一种方式:intmain(){ strings; while((cin>>s)!=NULL){ //离开测试的条件(必要)

//或者while(cin>>s){ charmaxchar=s[0]; for(inti=1;i<s.size();i++){ //寻找最大字符

if(s[i]>maxchar)maxchar=s[i]; } for(intj=0;j<s.size();j++){ //按要求输出

cout<<s[j]; if(s[j]==maxchar)cout<<"(max)"; } cout<<endl; } return0;}第三十九页,共五十一页,2022年,8月28日例:输入一个只包含空格和小写字母的英文句子,将每个单词的第一个字母改成大写首字母。(HDOJ2026)intmain(){

while(true){ strings; if(!getline(cin,s))break; //离开测试的条件s[0]=s[0]-‘a’+‘A’; //处理首字母for(inti=1;i<s.size();i++){ //小写转大写

if(s[i-1]=='')s[i]=s[i]-'a'+'A';}cout<<s<<endl; }

return0;}第四十页,共五十一页,2022年,8月28日(HDOJ2026)的另一种方式:intmain(){ strings; while(getline(cin,s)){ //离开测试的条件s[0]=s[0]-‘a’+‘A’; //处理首字母for(inti=1;i<s.size();i++){ //小写转大写

if(s[i-1]=='')s[i]=s[i]-'a'+'A';}cout<<s<<endl; } return0;}第四十一页,共五十一页,2022年,8月28日3.5.1简单字符图形的双重循环3.5.2判断素数3.5.3百鸡问题3.5.4最大公约数3.5其他应用第四十二页,共五十一页,2022年,8月28日3.5.1简单字符图形的双重循环MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM分析方法:该图形一共10行,每一行增加一个字符,所以,应循环10次,每次输出一行,其循环模式为:for(inti=1;i<=10;++i){输出第i行(循环)换行}行iM的个数111222333444...101010for(inti=1;i<=10;++i){

for(intj=1;j<=i;++j)cout<<”M”;cout<<endl;}第四十三页,共五十一页,2022年,8月28日3.5.2判断素数:(利用数学定律)m=i×j假定i≤j,则i2≤i×j=m≤j2

即i2≤m≤j2

即i≤√m≤j

intm;cin>>m;boolisPrime=true;

intsqm=(int)sqrt(m*1.0);

for(inti=2;i<=sqm;i++){

if(m%i==0) { isPrime=false; break; }}第四十四页,共五十一页,2022年,8月28日3.5.3百鸡问题本问题记载于中国古代约5-6世纪成书的《张邱建算经》中,是原书卷下第38题,也是全书的最后一题:「今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵(雏)三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?答曰:鸡翁四,值钱二十;鸡母十八,值钱五十四;鸡鶵七十八,值钱二十六。又答:鸡翁八,值钱四十;鸡母十一,值钱三十三,鸡鶵八十一,值钱二十七。又答:鸡翁十二,值钱六十;鸡母四、值钱十二;鸡鶵八十四,值钱二十八。」该问题导致三元不定方程组,其重要之处在于开创「一问多答」的先例,这是过去中国古算书中所没有的。100元钱买100只鸡,大公鸡5元1只,母鸡3元1只,小鸡1元3只。问公鸡,母鸡,小鸡各多少只?第四十五页,共五十一页,2022年,8月28日分析:把三种鸡的只数分别设为未知数x、y、z,然后利用总只数、总钱数两个条件,列出两个方程,根据鸡的只数必须取整数的要求,一步一步推出各种鸡的只数。解:设大公鸡x只,母鸡y只,小鸡z只。根据题意,得第四十六页,

温馨提示

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

评论

0/150

提交评论