




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章基本控制結構哈爾濱工業大學3.1算法的概念和描述方法3.1.1算法的概念3.1.2算法的描述方法3.1.1算法的概念算法(Algorithm)為解決一個具體問題而采取的確定的有限的操作步驟,僅指計算機能執行的算法計算機中的問題求解計劃通過程序員按照某種算法編寫的計算機程序(ComputerProgram)來實現的設計出正確的算法是編寫正確的計算機程序的前提條件程序設計是一門藝術,主要體現在算法設計結構設計揭示面向過程的程序本質的公式算法+數據結構=程序N.Wirth(圖靈獎1984)Pascal創始人定義待操作的數據在計算機內存中是如何存儲和組織的,選擇恰當的數據結構可以提高程序的運行或存儲效率對在數據上的操作的描述,不同的算法可能有不同的時間或空間效率3.1.1算法的概念算法的特性有窮性(Finiteness)在合理的時間內完成確定性(Definiteness)無歧義,能有效執行,且能得到確定的結果有效性(Effectiveness)允許沒有輸入或有多個輸入(Input)必須有一個或多個輸出(Output)3.1.1算法的概念常用的算法描述方法自然語言(NaturalLanguage)偽碼(Pseudocode)表示傳統的流程圖(Flowchart)N-S結構化流程圖3.1.2算法的描述方法3.1.2算法的描述方法以買蘋果為例,已知單價每斤y元,問買x斤蘋果,需多少錢?step1:輸入x和y;step2:根據公式t=x*y計算總價;step3:輸出總價t。BeginInputx,yt=x*yOutputtEnd
自然語言描述偽碼描述通俗易懂,符合人的日常思維習慣,但不易直接轉化為程序書寫無固定格式和規范,靈活,介于自然語言和計算機語言之間,易于轉換為計算機程序3.1.2算法的描述方法3.2順序結構順序結構:最簡單、最常用的程序結構復合語句:以兩數交換為例3.3選擇結構3.3.1選擇結構的控制方式3.3.2條件語句3.3.3開關語句3.3.1選擇結構的控制方式選擇結構根據給定的判定條件,判斷結果,并根據判斷的結果來控制程序的流程選擇結構(分支結構)單分支選擇結構(SingleSelection)雙分支選擇結構(DoubleSelection)多分支選擇結構(MultipleSelection)單分支選擇結構(SingleSelection)面臨的選擇是:要么執行一個操作,要么跳過它3.3.1選擇結構的控制方式雙分支選擇結構(DoubleSelection)面臨的選擇是:在兩個不同的操作中選擇其中的一個來執行多分支選擇結構(MultipleSelection)3.3.1選擇結構的控制方式if-else單分支雙分支多分支ifelse-if3.3.2條件語句【例3.1】計算最大值。從鍵盤輸入兩個整型數,編程計算并輸出其最大值確定問題的輸入和輸出建立問題的數學模型算法描述3.3.2條件語句【例3.1】3.3.2條件語句#include<stdio.h>intmain(void){ inta,b,max; scanf("%d,%d",&a,&b); if(a>=b) { max=a; } else { max=b; } printf("max=%d\n",max);return0;}#include<stdio.h>intmain(void){ inta,b; scanf("%d,%d",&a,&b); if(a>=b) { printf("max=%d\n",a); } else { printf("max=%d\n",b); }return0;}【例3.1】3.3.2條件語句#include<stdio.h>intmain(void){ inta,b,max; scanf("%d,%d",&a,&b); max=a>=b?a:b;
printf("max=%d\n",max);return0;}#include<stdio.h>intmain(void){ inta,b; scanf("%d,%d",&a,&b); printf("max=%d\n",a>=b?a:b);//直接打印條件表達式的值
return0;}3.3.2條件語句如何表示真假值?真
1假
0如何判斷真假值?非0
真0
假3.3.2條件語句3.3.2條件語句邏輯非
算術
關系
邏輯與
邏輯或
賦值圓括號優先級最高【例3.2】從鍵盤任意輸入一個年份year,編程判斷其是否為閏年,如果是閏年,則輸出“Yes!”,否則輸出“No!”。閏年需要滿足下列兩個條件中的任意一個。(1)能被4整除,但不能被100整除。(2)能被400整除。3.3.2條件語句#include<stdio.h>intmain(void){ intyear,leap; scanf("%d",&year); leap=((year%4==0)&&(year%100!=0))||(year%400==0); if(leap)//若leap的值為非0,即為真
{
printf("Yes!\n"); } else { printf("No!\n"); }return0;}【例3.2】從鍵盤任意輸入一個年份year,編程判斷其是否為閏年,如果是閏年,則輸出“Yes!”,否則輸出“No!”。3.3.2條件語句#include<stdio.h>intmain(void){ intyear; scanf("%d",&year); if(((year%4==0)&&(year%100!=0))||(year%400==0)) { printf("Yes!\n"); } else { printf("No!\n"); }return0;}【例3.3】簡單的計算器。要求用戶按如下格式從鍵盤輸入算式:操作數1運算符op操作數2編程輸出其計算結果值,算術運算符包括:加(+)、減(-)、乘(*)、除(/)。3.3.3開關語句3.3.3開關語句#include<stdio.h>intmain(void){ intdata1,data2; charop; scanf("%d%c%d",&data1,&op,&data2);//輸入算式,運算符兩側不加空格
if(op=='+') //加法運算
{
printf("%d+%d=%d\n",data1,data2,data1+data2); } elseif(op=='-') //減法運算
{
printf("%d-%d=%d\n",data1,data2,data1-data2); } elseif(op=='*') //乘法運算
{
printf("%d*%d=%d\n",data1,data2,data1*data2); } elseif(op=='/') //除法運算
{
if(data2==0)//為避免除0錯誤,檢驗除數是否為0 {
printf("Divisionbyzero!\n"); } else { printf("%d/%d=%d\n",data1,data2,data1/data2); } } else { printf("Invalidoperator!\n"); } return0;}3.3.3開關語句1.每個case后的常量的類型應與switch后括號內表達式的類型一致,并且switch后括號內表達式的值只能為整型、字符型或枚舉類型的常量。2.switch語句與break語句配合使用,才能形成真正意義上的多分支3.改變case標號出現的次序,不會影響程序的運行結果3.3.3開關語句#include<stdio.h>intmain(void){ intdata1,data2; charop; scanf("%d%c%d",&data1,&op,&data2);//輸入算式,運算符兩側不加空格
switch(op) //根據輸入的運算符確定執行的運算
{
case'+'://加法運算
printf("%d+%d=%d\n",data1,data2,data1+data2); break; case'-'://減法運算
printf("%d-%d=%d\n",data1,data2,data1-data2); break; case'*'://乘法運算
printf("%d*%d=%d\n",data1,data2,data1*data2); break; case'/'://除法運算
if(data2==0)//為避免除0錯誤,檢驗除數是否為0{
printf("Divisionbyzero!\n"); } else { printf("%d/%d=%d\n",data1,data2,data1/data2); } break; default://處理非法運算符
printf("Invalidoperator!\n"); } return0;}3.4循環結構3.4.1循環控制方式3.4.2計數控制的循環和for語句3.4.3條件控制的循環以及while和do-while語句3.4.4嵌套循環3.4.1循環的控制方式當型循環是先測試循環條件,后執行循環體直到型循環是先執行循環體,然后測試循環條件3.4.2計數控制的循環實現計數控制的for語句
3.4.2計數控制的循環#include<stdio.h>intmain(void){intn;intsum=0;//累加和變量初始化為0
scanf("%d",&n);for(inti=1;i<=n;i++){sum=sum+i;//做累加運算
}
printf("sum=%d\n",sum);return0;}【例3.4】從鍵盤輸入整型變量n的值,然后計算并輸出1+2+3+…+n的值。3.4.2計數控制的循環#include<stdio.h>intmain(void){ intn; scanf("%d",&n); intsum=(n%2==0)?0:(n+1)/2; for(inti=1,j=n;i<j;i++,j--) { sum=sum+i+j; } printf("%d\n",sum); return0;}【例3.5】累加求和計算的加速。4.5.2計數控制的循環#include<stdio.h>intmain(void){intn;longp=1;//因是累乘計算,故初始化為1
scanf("%d",&n);for(inti=1;i<=n;i++){p=p*i;//做累乘運算
}
printf("%d!=%ld\n",n,p);
return0;}【例3.6】從鍵盤輸入整型變量n的值,然后計算并輸出1×2×3×…×n(即n!)的值。4.5.2計數控制的循環#include<stdio.h>intmain(void){intn;longsum=0;//累加求和變量初始化為0
longp=1;//累乘求積變量初始化為1
scanf("%d",&n);for(inti=1;i<=n;i++){p=p*i;//計算累加項(即通項)
sum=sum+p;//將累乘后p的值即i!進行累加求和
}
printf("sum=%ld\n",n,p);
return0;}【例3.7】編程從鍵盤輸入整型變量n的值,然后計算并輸出1~n所有數的階乘值(1!,2!,3!,…,n!)的累加和,即1!+2!+3!+…+n!。4.5.2計數控制的循環【例3.7】編程從鍵盤輸入整型變量n的值,然后計算并輸出1~n所有數的階乘值(1!,2!,3!,…,n!)的累加和,即1!+2!+3!+…+n!。3.3.3條件控制的循環循環次數未知、由條件或標記值控制的循環結構,通常用while語句或do-while語句來實現。自底向上的程序設計——只猜一次intmain(void){intmagic;
intguess;
srand(time(NULL));
magic=rand()%100+1;
printf("Guessanumber:");scanf("%d",&guess);
if(guess>magic)
{printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else
{printf("Right!\n");}return0;}【例3.8】猜數游戲V1.0:先由計算機“想”一個數,然后請用戶猜,若用戶猜對了,則計算機給出提示“正確!”,否則提示“錯誤!”,并告訴用戶所猜的數是大還是小。自底向上的程序設計——只猜一次intmain(void){...
scanf("%d",&guess);
if(guess>magic) {printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else { printf("Right!\n");}
return0;}do{
}while(guess!=magic);
counter++;printf("counter=%d\n",counter);intcounter=0;
printf("Try%d:",counter+1);【例3.9】猜數游戲V2.0:在例3.7的基礎上,將游戲升級為:直到猜對為止,同時記錄用戶猜的次數,以此來反映用戶“猜”數的水平。自底向上的程序設計——只猜一次intmain(void){...
scanf("%d",&guess);
if(guess>magic) {printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("Wrong!Toosmall!\n");}else { printf("Right!\n");}
return0;}do{
}while(guess!=magic);
counter++;printf("counter=%d\n",counter);intcounter=0;
printf("Try%d:",counter+1);&&counter<10);
【例3.10】猜數游戲3.0:在例3.8的基礎上,將游戲升級為:每次猜數只允許用戶最多猜10次,即用戶猜對了或者猜了10次仍未猜對,都結束游戲。自底向上的程序設計——只猜一次intmain(void){……intcounter=0;
return0;}【例3.11】猜數游戲V4.0:猜多個數charreply;do{
counter=0;magic=rand()%100+1;...//輸出magic和counterprintf("Doyouwanttocontinue(Y/Nory/n)?");
scanf("%c",&reply);}while(reply=='Y'||reply=='y');3.4.4嵌套循環4.5.2計數控制的循環【例4.8】利用單獨計算累加通項的方法,編程計算1!+2!+3!+…+n!。#include<stdio.h>intmain(void){intn;longsum=0;//累加求和變量初始化為0
longp=1;scanf("%d",&n);for(inti=1;i<=n;i++)//外層循環
{
p=1;//每次循環之前都要將累乘求積變量p重新初始化為1
for(intj=1;j<=i;j++)//內層循環
{
p=p*j;//累乘求積
}
sum=sum+p;//將累乘后p的值即i!進行累加求和
}
printf("sum=%ld\n",sum); //以長整型格式輸出n的階乘值
return0;}3.5結構化程序設計與流程轉移控制一個比較流行的定義是:結構化程序設計(StructuredProgramming)是一種程序設計的原則和方法它限制和避免使用goto語句,采用“自頂向下、逐步求精”方法進行程序設計按照這種原則和方法設計出的程序的特點為:結構清晰容易閱讀容易修改容易驗證按照結構化程序設計的要求設計出的語言——結構化程序設計語言按照結構化程序設計語言(或結構化程序設計思想)設計的程序——結構化程序結構化程序設計的目標為了得到一個好結構的程序有無goto語句,并不是程序結構好壞的標志3.5結構化程序設計與流程轉移控制結構化程序設計Structured
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業廢棄物處理技術探索
- 工業大數據驅動制造業升級的引擎
- 工業安全管理的智能化發展
- 工業機器人技術及其優勢
- 工業機器人技術的現狀與趨勢
- 工業污染防治技術與設備介紹
- 工業自動化中的質量控制與檢測技術
- 工業級機房設計與環境控制技術
- 工業自動化與智能工藝技術發展
- 工業遺址保護與城市空間的整合
- 壓實瀝青混合料密度 表干法 自動計算
- 中建三局商務策劃與簽證索賠
- 旅游管理專業申報匯報
- 軍隊院校招收普通高中畢業生面試表
- 電力有限公司檢修公司B級檢修基地建設項目可行性研究報告
- 氣象學與氣候學電子教材
- 神木市小保當二號煤礦礦山地質環境保護與土地復墾方案
- 中國玉石及玉文化鑒賞知到章節答案智慧樹2023年同濟大學
- 家庭園藝營養土產品技術標準2022
- 美容院入股協議書
- 淺談歌曲《小路》的情感表達
評論
0/150
提交評論