版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
西安交通大學(xué)計(jì)算機(jī)教學(xué)實(shí)驗(yàn)中心
20131第3章運(yùn)算的流程控制計(jì)算機(jī)程序設(shè)計(jì)(C++)內(nèi)容提要2程序的執(zhí)行順序循環(huán)分支3.1程序的執(zhí)行順序3C++程序從main函數(shù)開(kāi)始,按順序逐行執(zhí)行每一條語(yǔ)句。程序的執(zhí)行是有順序的從上到下,如果不是循環(huán),執(zhí)行過(guò)的不會(huì)反復(fù)??!兩類(lèi)語(yǔ)句可以控制方向循環(huán),可以有條件地重復(fù)執(zhí)行某些語(yǔ)句分支,可以有選擇地跨過(guò)某些語(yǔ)句3.2不同情況分別處理——分支不同情況,分別處理特殊情況,特殊處理3.3.1
特殊情況特殊處理(單路分支)...if
(<條件>){<if塊>}...條件語(yǔ)句塊truefalse語(yǔ)句塊語(yǔ)句塊分程序,局部變量4【例3-1】用戶用戶輸入量個(gè)數(shù),求它們的最大值?!舅惴ā吭O(shè)a,b表示輸入的兩個(gè)數(shù),max表示最大值①輸入a,b;②max=a③如果b>max,則max=b④max。問(wèn)題擴(kuò)展編程求三個(gè)數(shù)的最大數(shù)。編程計(jì)算下列分段函數(shù)的值53.3.2
不同情況分別處理(兩路分支)【例3-4】解一元二次方程。輸入一元二次方程的a,b,c三個(gè)系數(shù),解一元二次方程ax2+bx+c=0;輸出兩個(gè)根(含復(fù)根)?!締?wèn)題分析】a=0?6b=0?Δ>0?
Δ=0Δ<0?【算法】8輸入a,b,c;如果a=0,如果b=0,輸出“輸入的系數(shù)不構(gòu)成方程”;否則(即b≠0)計(jì)算單根x=-c/b輸出單根x否則(即a≠0)計(jì)算delta=b*b-4*a*c如果delta>=0delta=sqrt(delta)輸出x1=(-b+delta)/2a和x2=(-b-delta)/2a否則delta=sqrt(-delta)輸出f復(fù)根:x1=-b/2a+j*delta/2a;x2=-b/2a-j*delta/2a(注意j是虛數(shù)單位)結(jié)束9//例3-2解一元二次方程#include
<iostream>
//包含需要的頭文件#include<cmath>
//求根函數(shù)sqrt需要的頭文件using
namespace
std;
//名字空間int
main()//主函數(shù){double
a,b,c;//定義變量保存系數(shù)
double
delta;//表示根的判別式
double
x,x1,x2;//表示根cout<<"請(qǐng)輸入一元二次方程的三個(gè)系數(shù)a,b,c:";//顯示提示信息
cin>>a>>b>>c;//輸入一元二次方程的系數(shù)if(a==0)//二次項(xiàng)系數(shù)a等于0的情況{if(b==0)//一次項(xiàng)系數(shù)也等于0,不是方程{cout<<"輸入的系數(shù)不構(gòu)成方程"<<endl;}else//二次項(xiàng)系數(shù)等于0,一次項(xiàng)系數(shù)不為0,一元一次方程{x=-c/b;//計(jì)算單根cout<<"實(shí)際為一元一次方程,根為"<<x<<endl;//輸出}}else//二次項(xiàng)系數(shù)a不為0的情況{delta=b*b-4.0*a*c;//計(jì)算判別式的值
if(delta>=0)//判別式大于等于0,有實(shí)根{delta=sqrt(delta);//判別式開(kāi)方
x1=(-b+delta)/2.0/a;//根1x2=(-b-delta)/2.0/a;//根2cout<<"方程有實(shí)根,它們是:"<<endl;//顯示根
cout<<"x1="<<x1<<",x2="<<x2<<endl;//}else//判別式小于0,有復(fù)根【源程序】p6110【程序測(cè)試】11要檢驗(yàn)程序的正確性,還應(yīng)設(shè)計(jì)哪些測(cè)試用例?問(wèn)題擴(kuò)展算法的重要性算法與程序的關(guān)系復(fù)數(shù)的構(gòu)造if的嵌套,語(yǔ)句的嵌套3.2.3多種情況分類(lèi)處理(多重分支switch)12【例3-3】編程實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器功能,實(shí)現(xiàn)簡(jiǎn)單的加、減、乘、除表達(dá)式式的計(jì)算。設(shè)用戶輸入的表達(dá)式具有如下格式:<操作數(shù)1>
<運(yùn)算符>
<操作數(shù)2>其中的操作數(shù)是整數(shù)或?qū)崝?shù),運(yùn)算符是“+”、“-”、
“*”或“/”之一,三個(gè)量之間用空格隔開(kāi)。問(wèn)題分析輸入
3
+
5 輸出9輸入
3
*
5 輸出15如果 運(yùn)算符不同,操作就不同if語(yǔ)句可以實(shí)現(xiàn)嗎?switch語(yǔ)句的格式switch(<表達(dá)式>){case<常量表達(dá)式1>:<case塊1>case<常量表達(dá)式2>:<case塊2>...case<常量表達(dá)式n>:<case塊n>default:<默認(rèn)case塊>}13關(guān)鍵詞:<表達(dá)式>的數(shù)據(jù)類(lèi)型:整型、字符、邏輯、枚舉defaultbreak【算法描述】14用num1,num2,op分別表示輸入的表達(dá)式的兩個(gè)操作數(shù)和一個(gè)運(yùn)算符。如果op="+",則result=num1+num2,輸出result;如果op="-",則result=num1-num2,輸出result;如果op="*",則result=num1*num2,輸出result;如果op="/",則如果num2=0,顯示“除數(shù)為0”;否則,計(jì)算result=num1/num2,輸出result;其他,顯示“運(yùn)算符錯(cuò)誤”?!驹闯绦颉縫6315【源程序】p63–輸出信息用字符串表示(字符數(shù)組)–信息的表達(dá)–數(shù)據(jù)的輸入–信息處理–數(shù)據(jù)輸出測(cè)試指南3.3多次加工——循環(huán)程序設(shè)計(jì)163.3.1
已知次數(shù)的循環(huán)for(<變量>=<初始值表達(dá)式>;<循環(huán)條件>;<增量>){<循環(huán)體>}例如int
i=0,n=10,sum=0;for(i=0;i<n;i++){sum=sum+i;}
//結(jié)果?
分程序,局部變量for的一般形式for語(yǔ)句更一般的形式為:for(<表達(dá)式1>;<表達(dá)式2>;<表達(dá)式3>){<循環(huán)體>}表達(dá)式可以省略(不推薦)for(;;){<循環(huán)體>}17//example3-4
求n個(gè)數(shù)的和及平均值#include<iostream>//包含輸入輸出頭文件
using
namespace
std;//指定名字空間int
main()//主函數(shù){int
n;//聲明變量,表示元素個(gè)數(shù)double
x,sum,average;//聲明變量,表示輸入的數(shù),和,平均值
int
i;//循環(huán)變量sum=0;//和置初始值
average=0;//平均值置初始值
cout<<"請(qǐng)輸入元素個(gè)數(shù):";cin>>n;//輸入元數(shù)個(gè)數(shù)for(i=0;i<n;i++)//循環(huán),n次{cout<<"請(qǐng)輸入第"<<i+1<<"個(gè)元素:";//提示信息
cin>>x;//輸入一個(gè)數(shù)sum=sum+x;//求和}average=sum/n;//計(jì)算平均值
cout<<"The
sumis"<<sum<<endl;cout<<"The
average
is"<<average<<endl;return
0;//函數(shù)返回}【例3-4】編寫(xiě)程序,計(jì)算n個(gè)數(shù)的和及平均值。n的值和n個(gè)數(shù)由用戶輸入。【問(wèn)題分析】【算法描述】用n表示數(shù)據(jù)個(gè)數(shù),x表示某個(gè)元素,
sum表示和,average表示平均值。①n=0,sum=0;average=0;②輸入n③對(duì)i=1,...,n④⑤輸入x計(jì)算sum=sum+x⑥average=sum/n⑦輸出sum及average。18問(wèn)題擴(kuò)展①請(qǐng)編程計(jì)算1+2+3+...+n。②計(jì)算n!。③計(jì)算兩個(gè)n維向量的夾角。設(shè)是兩個(gè)n維向量,計(jì)算它們的夾角。要求程序循環(huán)提示用戶輸入向量并進(jìn)行計(jì)算。19【算法】計(jì)算向量的夾角。設(shè)向量用數(shù)組a[N]b[N]表示。①輸入兩個(gè)向量;②計(jì)算a,b的內(nèi)積innerproduct:innerproduct=0對(duì)i=0,...,n-1計(jì)算innerproduct=innerproduct+a[i]*b[i]③計(jì)算a,b的模modea,modeb;④計(jì)算cosinetheta=innerproduct/modea/modeb計(jì)算theta=arccosin(cosinetheta)⑥輸出theta⑦轉(zhuǎn)①20for(;;)
//循環(huán),不斷接受用戶輸入并計(jì)算向量的夾角{cout<<"請(qǐng)輸入向量的維數(shù)(n>0):";//提示cin>>n;
//輸入向量的實(shí)際維數(shù)cout<<"請(qǐng)輸入向量a:";
//提示for(i=0;i<n;i++)
//輸入向量a,逐個(gè)輸入其元{
cin>>a[i];cout<<"請(qǐng)輸入向量b:";for(i=0;i<n;i++)}//輸入向量b,逐個(gè)輸入其元{
cin>>b[i];
}22//變量賦初始值,開(kāi)始為innerproduct=0;modea=0;modeb=0;for(i=0;i<n;i++)//逐步求和,加n次{
innerproduct=innerproduct+a[i]*b[i];//內(nèi)積modea=modea+a[i]*a[i];modeb=modeb+b[i]*b[i];//向量a的模的平方//向量b的模的平方}modea=sqrt(modea);modeb=sqrt(modeb);//開(kāi)方,得a的模//開(kāi)方,得b的模cosinetheta=innerproduct/modea/modeb;
//夾角余theta=acos(cosinetheta);theta=theta/PAI*180;//夾角弧度//夾角度cout<<"它們的夾角為:"<<theta<<endl;
//顯示}return
0;
}//會(huì)進(jìn)入下一循環(huán)233.3.2依據(jù)條件進(jìn)行循環(huán)1.當(dāng)型循環(huán)while(<循環(huán)條件>){<循環(huán)體>}2.直到型循環(huán)do{<循環(huán)體>}while(<循環(huán)條件>);24【例3-5】計(jì)算e的近似值。數(shù)學(xué)上,證明的極限是存在的,記為e。對(duì)函數(shù)ex作泰勒展開(kāi),當(dāng)
x=1時(shí)編程計(jì)算e的近似值,當(dāng)最后一項(xiàng)小于10-15時(shí)停止計(jì)算。輸出保留到小數(shù)點(diǎn)后16位。25【問(wèn)題分析】階乘如何計(jì)算?通項(xiàng)如何計(jì)算?如何求和?如何保留小數(shù)點(diǎn)后16位?26【算法描述】27①用e表示“e”的近似值,u表示通項(xiàng),n表示項(xiàng)的序號(hào),初時(shí):e=1,u=1,n=1②計(jì)算新通項(xiàng)u=u/n;加到近似解e中:e=e+u;構(gòu)造下一項(xiàng)的分母n:n=n+1;③若u>=1.0e-15,轉(zhuǎn)②。(滿足某條件時(shí)轉(zhuǎn)到前面某步,就環(huán))④輸出e。【源程序】28#include
<iostream>using
namespace
std;//包含需要的頭文件//名字空間intmain()
//主函數(shù){double
e,u,n;//定義變量,表示e,通項(xiàng),通項(xiàng)分母e=1;u=1;n=1;//e的初始值//通項(xiàng)初始值//通項(xiàng)分母初始值cout.setf(ios::fixed);cout.precision(20);數(shù)位//定點(diǎn)顯示//精度,與上句結(jié)合,小數(shù)點(diǎn)后do{u=u/n;
//構(gòu)造新通項(xiàng)e=e+u;
//加到近似值中n++;
//新通項(xiàng)的分母cout<<e<<endl;
//顯示當(dāng)前的近似值}while(u>1.0E-15);//不滿足精度時(shí)循環(huán)return
0;}【思考題】上述循環(huán)可以用while,for嗎?如何用?29#
include
<iostream>using
namespace
std;int
main(){char
s[100]="abc";int
n=0;n=0;while(s[n]!=0){n++;};cout<<"length="<<n<<endl;n=0;do
{n++;}while(s[n]!=0);cout<<"length="<<n<<endl;return
0;}while{}和do{}while();--求字符串的長(zhǎng)度#
include
<iostream>using
namespace
std;int
main(){char
s[100]="";int
n=0;//
while(1){//cin>>s;n=0;while(s[n]!=0){
n++;
}cout<<"length="<<n<<endl;}return
0;}#
include
<iostream>using
namespace
std;int
main(){char
s[100]="b";int
n=0;n=0;do{n++;}while(s[n]!=0);cout<<"length="<<n<<endl;return
0;}303.3.3
終止循環(huán)和直接進(jìn)入下次循環(huán)31【3-6】編程計(jì)算一個(gè)實(shí)數(shù)的任意次方根。用戶輸入一個(gè)實(shí)數(shù)x和開(kāi)方的次數(shù)n,顯示方根,如用戶輸入23
,顯示2的三次方根1.25992。要求當(dāng)用戶輸入0
0時(shí)程序結(jié)束,用戶輸入x<0且n<=0時(shí)或x<=0且1/n不為整數(shù)時(shí)顯示“輸入錯(cuò)誤”的提示并繼續(xù)輸入?!驹闯绦颉?/example3-6
計(jì)算x的任意次方根
#include<iostream>//包含輸入輸出頭文件
#include<cmath>using
namespace
std;//指定名字空間
int
main()//主函數(shù){double
x;double
n;while(1)
//一直循環(huán){cin>>x>>n;if(x==0
&&
n==0)//終止條件{cout<<"Programterminated"<<endl;break;
//跳出最近循環(huán)}elseif((x<0
&&
n<=0)||(x<=0
&&
1/n!=int(1/n)))//錯(cuò)誤條件{cout<<"error
reinput"<<endl;continue;
//直接進(jìn)入下一個(gè)循環(huán)}cout<<x<<"\t"<<n<<"th
root
"<<pow(x,1.0/n)<<endl;}return
0;//函數(shù)返回}【算法描述】求x 的n次方根32循環(huán)進(jìn)行下列計(jì)算輸出提示信息“本程序計(jì)算x的n次方根,請(qǐng)輸入x,n”輸入x,n如果x==0并且n==0break如果(x<0并且n<=0)或(x<=0且1/n不為整數(shù))輸出錯(cuò)誤信息“輸入錯(cuò)誤,”直接進(jìn)入下一次循環(huán)y=pow(x,1/n);輸出y3.4綜合實(shí)例333.4.1數(shù)組的輸入、排序和輸出【例3-6】冒泡排序。用戶從鍵盤(pán)輸入N,然后輸入N個(gè)實(shí)數(shù),使用冒泡排序方法對(duì)這N個(gè)元素排序,輸出排序后的數(shù)據(jù)。【問(wèn)題分析】數(shù)組元素的輸入?冒泡排序?數(shù)組元素的輸出【算法描述】34設(shè)有N個(gè)元素,用數(shù)組a[i]表示,i=0,...,N①輸入N;②輸入a[i],i=0,...,N-1;③對(duì)i=1,...,n-2④⑤對(duì)j=0,...,n-2-i若a[j]>a[j+1],則交換它們的值。–⑥對(duì)i=0,...,N-1,輸出a[i]?!驹闯绦颉縫73問(wèn)題擴(kuò)展35用戶不提前輸入元素個(gè)數(shù),自動(dòng)判斷用戶的輸入結(jié)束?輸出數(shù)組元素,每行5個(gè)?3.4.2字符串的處理36輸入、輸出、文字編輯、搜索引擎【例3-7】文字信息統(tǒng)計(jì)。用戶輸入一段文本(英文),統(tǒng)計(jì)其字符總個(gè)數(shù),大寫(xiě)字母?jìng)€(gè)數(shù)、小寫(xiě)字母?jìng)€(gè)數(shù)、數(shù)字個(gè)數(shù)及其他字符個(gè)數(shù)。問(wèn)題分析字符串的輸入?統(tǒng)計(jì)結(jié)束?輸出算法描述37設(shè)字符串用str[100]表示,str[i]表示第i+1個(gè)字符(從1開(kāi)始)。用len表示字符串長(zhǎng)度,capital表示大寫(xiě)字母?jìng)€(gè)數(shù),smallletter表示小寫(xiě)字母?jìng)€(gè)數(shù),
digit表示數(shù)字個(gè)數(shù),others表示其他字母?jìng)€(gè)數(shù),初始時(shí)它們的值均為0。①輸入字符串;②i=0;③如果str[i]=’\0’,轉(zhuǎn)⑥;否則執(zhí)行④;④
len=len+1如果str[i]為大寫(xiě)字母capital++;否則如果str[i]為小寫(xiě)寫(xiě)字母smallletter++;否則如果str[i]為數(shù)字digit++;否則others++i=i+1,轉(zhuǎn)③;⑥輸出統(tǒng)計(jì)數(shù)據(jù)。38【例3-6】尋找自冪數(shù)。用戶輸入位數(shù)n,找出并顯示出所有n位的自冪數(shù)?!締?wèn)題分析】分離各位40//例3-8自冪數(shù)#include
<iostream>
//包含需要的頭文件#include<cmath>
//數(shù)學(xué)函數(shù)需要的頭文件using
namespace
std;
//名字空間int
main(){int
n;//表示數(shù)的位數(shù)int
start,end;//表示n位數(shù)的起始值和終止值
int
m;//待分解各位的數(shù),即待判斷的數(shù)
int
digit;//某個(gè)數(shù)位的值int
sum;//各位數(shù)的n次方的和,每個(gè)數(shù)在檢驗(yàn)開(kāi)始前要賦0int
i;//循環(huán)變量,待檢驗(yàn)的數(shù)cout<<"求n位自冪數(shù),請(qǐng)輸入位數(shù):";//提示信息
cin>>n;//輸入位數(shù)while(n>0)//大于0時(shí)計(jì)算{start=pow(10,n-1);//n位數(shù)的起始值
end=pow(10,n)-1;//n位數(shù)的終止值
cout<<n<<"位自冪數(shù):";//輸出說(shuō)明信息for(i=start;i<=end;i++)//從“起始值”到“終止值”逐個(gè)檢驗(yàn){m=i;//因?yàn)闄z驗(yàn)過(guò)程會(huì)破壞該數(shù),而后還要使用,所以將i賦給m//檢驗(yàn)過(guò)程中m的值會(huì)改變,而i的值不變。sum=0;//各位數(shù)的n次方和,檢驗(yàn)前賦0while(m!=0)//m不為0時(shí)檢驗(yàn),m開(kāi)始為待檢驗(yàn)的數(shù),隨著取各位數(shù)字,其值改變{digit=m%10;//取最低位數(shù)字,第1次是原數(shù)的各位,第2次為原數(shù)的十位
sum=sum+pow(digit,n);//n次方,再求和m=m/10;//去掉個(gè)位,剛才的十位成為新個(gè)位}//上面的循環(huán)結(jié)束時(shí)sum就是各位數(shù)字的n次方的和
if(sum==i)//邏輯表達(dá)式的值為true時(shí),表示是自冪數(shù){【算法分析】①輸入位數(shù)n。②計(jì)算n位數(shù)的起始值和終止值⑥d=m%10,sum=sum+dn,start=10n-1end=10n-1i=start⑦m=m/10轉(zhuǎn)⑤如果sum=i,顯示i。③如果i>end轉(zhuǎn)⑨。⑧i=i+1,轉(zhuǎn)③④
m=i,sum=0⑨結(jié)束。⑤如果m=0,轉(zhuǎn)⑦。41【源程序】42
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年電工技術(shù)服務(wù)合作合同范本版B版
- 數(shù)字化轉(zhuǎn)型對(duì)制造業(yè)成本核算的深遠(yuǎn)影響
- 2015年9月1日之前公司間的借貸合同
- 2025服裝經(jīng)銷(xiāo)商合同范文
- 餐飲廚房員工合同范例
- 對(duì)公勞務(wù)合同范例版
- 商丘工學(xué)院《遙感影像處理與分析實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 國(guó)家征收土地合同范例
- 業(yè)務(wù)信息合同范例
- 購(gòu)買(mǎi)合同和買(mǎi)賣(mài)合同范例
- 2023年秋季國(guó)家開(kāi)放大學(xué)-01467-土木工程力學(xué)(本)期末考試題帶答案
- 精品在線開(kāi)放課程建設(shè)與評(píng)價(jià)標(biāo)準(zhǔn)
- 自主研究開(kāi)發(fā)項(xiàng)目計(jì)劃書(shū)
- 第二十章曲線積分-ppt課件
- 3Q模板IQOQPQ驗(yàn)證方案模版
- T∕CCOA 24-2020 棕櫚仁餅(粕)
- 聚乙烯天然氣管道施工技術(shù)交底(完整版)
- 小學(xué)四年級(jí)奧數(shù)-變化規(guī)律(一)
- 萬(wàn)達(dá)集團(tuán)薪酬管理制度
- 試談車(chē)輛產(chǎn)品《公告》技術(shù)審查規(guī)范性要求
- 潔凈室內(nèi)潔凈度測(cè)試記錄填寫(xiě)范例
評(píng)論
0/150
提交評(píng)論