C-第3章-运算的流程控制-2014年-下半年_第1页
C-第3章-运算的流程控制-2014年-下半年_第2页
C-第3章-运算的流程控制-2014年-下半年_第3页
C-第3章-运算的流程控制-2014年-下半年_第4页
C-第3章-运算的流程控制-2014年-下半年_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

计算机程序设计顾刚计算机教学实验中心授课提纲运算流程控制的概念三种根本控制结构假设干程序实例控制结构算法是求解问题的一系列操作步骤C++源程序由假设干函数构成函数是由语句构成,能完成独立功能的子程序运算的流程控制指程序执行流程的控制程序设计的核心问题如何用C++的语句和函数来实现算法换句话说如何组织C++程序的结构设计最正确的控制结构〔执行流程〕速度快空间省阅读理解容易模块的概念模块指完成一个特定功能的语句序列一个模块可以是一条语句、假设干条语句、一个函数模块的根本特征是其仅有一个入口和一个出口即执行模块,只能从该模块的入口处开始执行,执行完该模块的功能后,从模块的出口转而执行其他模块程序模块授课提纲控制结构的概念三种根本控制结构假设干程序实例三种根本控制结构三种控制结构是什么?三种根本控制结构:顺序、选择、循环任何算法都可以由三种根本控制结构组合实现换句话说用三种根本程序结构可以实现任何复杂的算法顺序结构所谓顺序结构是指位置处在前面的操作或模块执行完毕才能执行紧跟其后面的操作或模块。顺序结构执行流程图示如下:操作1操作2模块1模块2模块化三角形三条边长求其面积#include<iostream>usingnamespacestd;int

main(){doublea,b,c,s,area;cout<<"pleaseinputa,b,c=?";cin>>a>>b>>c;s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));cout<<“area=”<<area;return0;}//语句先后次序不能颠倒:变量定义→输入变量值→计算公式→输出结果值

选择结构所谓选择结构是指根据设定的条件来选择确定将要执行的语句或模块,这些语句或模块位置都处在条件的后面。选择结构又分三种形式:一路分支二路分支多路分支一路分支一路分支执行流程为当条件成立执行模块1,当条件不成立执行模块1后面的模块。一路分支结构图示如下:成立不成立条件模块1成立不成立条件模块1新模块语句格式:if(条件表达式)语句;或if(条件表达式){语句序列;}三角形面积程序改进#include<iostream>usingnamespacestd;int

main(){doublea,b,c,s,area;cout<<"pleaseinputa,b,c=?";cin>>a>>b>>c;if(a+b>c&&b+c>a&&c+a>b){s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));cout<<“三角形面积=”<<area;}return0;}//选择语句只用一条语句,节省空间的写法条件?成立不成立语句序列二路分支二路分支执行流程为当条件成立执行模块1,当条件不成立执行模块2。两路分支结构图示如下:成立不成立条件模块1模块2成立不成立条件模块1模块2语句格式:if(条件)

{语句序列}

else{语句序列}三角形面积程序再改进#include<iostream>usingnamespacestd;int

main(){doublea,b,c,s,area;cout<<"pleaseinputa,b,c=?";cin>>a>>b>>c;if(a+b>c&&b+c>a&&c+a>b){s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));cout<<“area=”<<area;}elsecout<<“三条边不能构成三角形!\n”;return0;}条件语句序列1成立不成立语句序列2两路分支例题求解一元二次方程的根输入一元二次方程的a,b,c三个系数,解一元二次方程:ax2+bx+c=0;输出两个根〔含复根〕【问题分析】a=0?b=0?Δ>0?Δ=0Δ<0?二元一次方程求解算法输入a,b,c;如果a=0,如果b=0,输出“输入的系数不构成方程”;否那么〔即b≠0〕计算单根x=-c/b输出单根x否那么〔即a≠0〕计算delta=b*b-4*a*c如果delta>=0delta=sqrt(delta)输出x1=(-b+delta)/2a和x2=(-b-delta)/2a否那么delta=sqrt(-delta)输出f复根:x1=-b/2a+j*delta/2a;x2=-b/2a-j*delta/2a(注意j是虚数单位)结束#include<iostream> //包含需要的头文件#include<cmath>//求根函数sqrt需要的头文件usingnamespacestd; //名字空间intmain() //主函数{ doublea,b,c;//定义变量保存系数 doubledelta;//表示根的判别式 doublex,x1,x2;//表示根 cout<<"请输入一元二次方程的三个系数a,b,c:";//显示提示信息 cin>>a>>b>>c;//输入一元二次方程的系数 if(a==0)//二次项系数a等于0的情况 { if(b==0)//一次项系数也等于0,不是方程 { cout<<"输入的系数不构成方程"<<endl; } else//二次项系数等于0,一次项系数不为0,一元一次方程 { x=-c/b;//计算单根 cout<<"实际为一元一次方程,根为"<<x<<endl;//输出 } } else//二次项系数a不为0的情况 { delta=b*b-4.0*a*c;//计算判别式的值 if(delta>=0)//判别式大于等于0,有实根 { delta=sqrt(delta);//判别式开方 x1=(-b+delta)/2.0/a;//根1 x2=(-b-delta)/2.0/a;//根2 cout<<"方程有实根,它们是:"<<endl;//显示根 cout<<"x1="<<x1<<",x2="<<x2<<endl;// } else//判别式小于0,有复根 { delta=sqrt(-delta);//判别式变号开方 x1=-b/2.0/a;//实部 x2=delta/2.0/a;//虚部 cout<<"方程有复根,它们是:"<<endl;// cout<<"x1="<<x1<<"+j"<<x2<<",x2="<<x1<<"-j"<<x2<<endl;//打印复根 } } return0; }多路分支【例3-3】编程实现一个简单的计算器功能,实现简单的加、减、乘、除表达式式的计算。设用户输入的表达式具有如下格式:<操作数1><运算符><操作数2>其中的操作数是整数或实数,运算符是“+”、“-”、“*”或“/”之一,三个量之间用空格隔开。问题分析输入3+5输出9输入3*5输出15如果运算符不同,操作就不同if语句可以实现吗?switch语句格式switch(<表达式>){case<常量表达式1>:<case块1>case<常量表达式2>:<case块2>...case<常量表达式n>:<case块n>default:<默认case块>}关键词:<表达式>的数据类型:整型、字符、逻辑、枚举defaultbreak例题算法用num1,num2,op分别表示输入的表达式的两个操作数和一个运算符。如果op='+',那么result=num1+num2,输出result;如果op='-',那么result=num1-num2,输出result;如果op='*',那么result=num1*num2,输出result;如果op='/',那么如果num2=0,显示“除数为0”;否那么,计算result=num1/num2,输出result;其他,显示“运算符错误”。前两章习题中的问题不能直接简单的表达式计算第1章第7题:n≠0第1章第8题:x>=0第1章第9题:x2-3x+2>0第1章第10题:a>0,a≠1第2章第3题:(1-cos(x))≠0第2章第6题:输入>0用if语句进行控制计算循环结构在程序设计中,往往需要重复屡次执行某一段程序〔模块〕,这就是循环结构,根据设定的条件来确定一段程序〔模块〕重复执行的次数。循环结构又分两种形式:当型循环直到型循环当型循环当型循环执行流程为根据条件,假设成立反复执行模块,当条件不成立转到下一个模块。图示如下:条件?成立不成立模块条件?成立不成立模块新模块语句格式:while(条件表达式)语句序列求1+2+…+100#include<iostream>usingnamespacestd;intmain(){ intsum=0,i=1;

while(i<=100) { sum=sum+i; i=i+1; } cout<<“1+2+…100=”;cout<<sum<<endl; return0;}开始SUM=0,I=1SUM=SUM+II=I+1输出SUM结束I≤100成立不成立第2章第3题解题思路求上式当x→0时的极限X=0.1,0.01,0.001,0.0001……1E-10循环10次,每次x=x/10.0再计算#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublex=0.1,y; while(x>1e-10) { y=sin(x*x)/(1-cos(x)); cout<<"sin(x*x)="<<sin(x*x)<<'\t'; cout<<"cos(x)="<<cos(x)<<'\t'; cout<<"x="<<x<<'\t'<<"y="<<y<<endl; x=x/10.0; } return0;}第2章第3题源程序求E的值

设初值:e=0,u=1,n=1u>10–7?计算:u=u/n;e=e+u;n=n+1;是否输出结果e求e的近似值,利用公式:直到最后一项1/n!的值小于107为止//计算常数e的值#include<iostream>usingnamespacestd;intmain(){ doublee=1.0; doubleu=1.0; intn=1;

while(u>=1.0e-7) { u=u/n; e=e+u; n=n+1; } cout<<"e="<<e<<endl; cout<<"n="<<n<<endl; return0;}u>1e-7

u=u/ne=e+un=n+1直到型循环直到型循环执行流程为根据条件,假设成立反复执行模块,当条件不成立转到下一个模块。图示如下:条件?模块成立不成立条件?模块成立不成立新模块语句格式:do{语句序列}while(条件表达式);//计算常数e的值#include<iostream>usingnamespacestd;intmain(){ doublee=1.0; doubleu=1.0; intn=1;

do { u=u/n; e=e+u; n=n+1; }while(u>=1.0e-7); cout<<"e="<<e<<endl; cout<<"n="<<n<<endl; return0;}//do语句与while语句的区别是什么?u>=1e-7u=u/n;e=e+u;n=n+1;求x的n次方根【3-6】编程计算一个实数的任意次方根用户输入一个实数x和开方的次数n输出显示方根值如用户输入23,显示2的三次方根1.25992要求当用户输入00时程序结束用户输入x<0且n<=0时或x<=0且1/n不为整数时显示“输入错误”的提示并继续输入。求解算法循环进行以下计算输出提示信息“计算x的n次方根,请输入x,n”输入x,n如果x==0并且n==0break如果(x<0并且n<=0)或(x<=0且1/n不为整数)输出错误信息“输入错误,”直接进入下一次循环y=pow(x,1/n);输出y//example3-6计算x的任意次方根#include<iostream> //包含输入输出头文件#include<cmath>usingnamespacestd; //指定名字空间intmain() //主函数{ doublex; doublen; while(1)//一直循环 { cin>>x>>n; if(x==0&&n==0)//终止条件 { cout<<"Programterminated"<<endl; break;//跳出最近循环 } else if((x<0&&n<=0)||(x<=0&&1/n!=int(1/n)))//错误条件 { cout<<"errorreinput"<<endl; continue;//直接进入下一个循环 } cout<<x<<"\t"<<n<<"throot"<<pow(x,1.0/n)<<endl; } return0; //函数返回}For循环语句For语句格式:

for(表达式1;表达式2;表达式3){

语句序列}For语句执行功能表达式2成立不成立语句序列计算表达式1计算表达式3For语句是直到型还是当型使用梯形法计算定积分使用梯形法计算定积分∫f(x)dx,其中a=0,b=1,被积函数为sin(x),取积分区间等分数为1000。abxyf〔x〕xixi+1h梯型面积=〔上底+下低〕x高2#include<iostream>//用梯形法计算定积分#include<cmath> //包含标准数学函数的math.h函数库usingnamespacestd;intmain(){ doublea=0,b=1.0;

//双精度类型变量:积分上下限 doubleh; //双精度类型变量:积分步长 doublesum=0;//双精度类型变量:存放最后为积分值 intn=1000; //整型变量:积分区间等分数 inti; //整型变量:循环工作变量 h=(b-a)/n; //计算小区间长度

for(i=0;i<n;i++)

//循环计算公式中的Σ和式

sum=sum+(sin(a+i*h)+sin(a+(i+1)*h))*h/2; //输出计算结果 cout<<"Theresultis"<<sum<<endl; return0;}For语句应用举例编写程序,计算n个数的和及平均值。n的值和n个数由用户输入。【问题分析】必须采用循环控制,因为n是随机输入【算法描述】用n表示数据个数,x表示某个元素,sum表示和,average表示平均值。①n=0,sum=0;average=0;②输入n③对i=1,...,n④

输入x⑤

计算sum=sum+x⑥average=sum/n⑦输出sum及average。#include<iostream> //包含输入输出头文件usingnamespacestd; //指定名字空间intmain() //主函数{ intn; //声明变量,表示元素个数 doublex,sum,average; //声明变量,表示输入的数,和,平均值 inti; //循环变量 sum=0; //和置初始值 average=0; //平均值置初始值 cout<<"请输入元素个数:"; cin>>n; //输入元数个数 for(i=0;i<n;i++) //循环,n次 { cout<<"请输入第"<<i+1<<"个元素:";//提示信息 cin>>x; //输入一个数 sum=sum+x; //求和 } average=sum/n; //计算平均值 cout<<"Thesumis"<<sum<<endl; cout<<"Theaverageis"<<average<<endl; return0; //函数返回}例题讲解计算两个n维向量的夹角。设

是两个n维向量,计算它们的夹角。要求程序循环提示用户输入向量并进行计算求解算法计算向量的夹角。设向量用数组a[N]b[N]表示。①输入两个向量;②计算a,b的内积innerproduct:innerproduct=0

对i=0,...,n-1

计算innerproduct=innerproduct+a[i]*b[i]③计算a,b的模modea,modeb;④计算cosinetheta=innerproduct/modea/modeb⑤计算theta=arccosin(cosinetheta)⑥输出theta⑦转①#include<iostream> //包含需要的头文件#include<cmath>//求数学需要的头文件usingnamespacestd; //名字空间intmain() //主函数{ constintN=100;//定义常量,表示数组能容纳的最大元素数 constdoublePAI=3.1415926; //定义常量,表示圆周率doublea[N],b[N]; //定义数组,存放两个向量 doublemodea,modeb;//定义变量,分别表示两个向量的模 doubleinnerproduct,cosinetheta,theta;//定义变量,分别表示内积、余弦,夹角 intn,i; //n表示向量的实际维数,i是循环变量for(;;) //循环,不断接受用户输入并计算向量的夹角 { cout<<"请输入向量的维数(n>0):";//提示 cin>>n; //输入向量的实际维数 cout<<"请输入向量a:"; //提示 for(i=0;i<n;i++) //输入向量a,逐个输入其元素 { cin>>a[i]; } cout<<"请输入向量b:"; for(i=0;i<n;i++) //输入向量b,逐个输入其元素 { cin>>b[i]; }innerproduct=0; //变量赋初始值,开始为0 modea=0; modeb=0; for(i=0;i<n;i++) //逐步求和,加n次 { innerproduct=innerproduct+a[i]*b[i];//内积 modea=modea+a[i]*a[i]; //向量a的模的平方 modeb=modeb+b[i]*b[i]; //向量b的模的平方 } modea=sqrt(modea); //开方,得a的模 modeb=sqrt(modeb); //开方,得b的模 cosinetheta=innerproduct/modea/modeb; //夹角余弦 theta=acos(cosinetheta); //夹角弧度 theta=theta/PAI*180; //夹角度 cout<<"它们的夹角为:"<<theta<<endl; //显示 } //会进入下一循环 return0;}授课提纲控制结构的概念三种根本控制结构假设干程序实例求水仙花数水仙花数定义:一个数的个十百位数字立方和等于原数算法分析用穷举法对100~999之间的每个数进行如下验证:验证公式:hdn=h3+d3+n3关键是如何分解一个3位数的百位、十位和个位?百位=(n%1000)/100十位=(n/10)%10个位=n%10例:371h=371/100=3d=〔371/10〕%10=37%10=7n=371%10=1求水仙花数流程图n=100n<999?i=n/100;j=〔n/10〕%10;k=n%10;h=I^3+j^3+k^3h=n?打印该水仙花数

n=n+1是否是否求水仙花数源程序//打印所有的水仙花数#include<iostream>usingnamespacestd;intmain(){ intn,i,j,k;

for(n=100;n<=999;n=n+1) { i=n/100;//取出n的百位数

j=(n/10)%10;//取数n的十位数

k=n%10;//取出n的个位数

if(n==i*i*i+j*j*j+k*k*k) cout<<n<<"="<<i<<"^3+"<<j<<"^3+"<<k<<"^3"<<endl; }

return0;}输出:153=1^3+5^3+3^3370=3^3+7^3+0^3371=3^3+7^3+1^3407=4^3+0^3+7^3任意位数自幂数算法①输入位数n。②计算n位数的起始值和终止值start=10n-1,end=10n-1i=start③如果i>end转⑨。④m=i,sum=0⑤如果m=0,转⑦。⑥d=m%10,sum=sum+dn,m=m/10

转⑤⑦如果sum=i,显示i。⑧i=i+1,转③⑨结束。#include<iostream> //包含需要的头文件#include<cmath>//数学函数需要的头文件usingnamespacestd;//名字空间intmai

温馨提示

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

评论

0/150

提交评论