谭浩强 《C程序设计》(第五版)第二章
這一部分學習的是算法,在我看來算法是一個非常重要的東西,他可以幫助我們在寫程序的時候理清思路,如果我們熟悉算法,那么我們在那道題目的時候就會迅速的把握住題目的核心,找到求解問題的方法和步驟。在算法中,有四種方式可以使用,我最常用的是偽代碼。
簡單的算法舉例
1.求1*2*3*4*5
算法步驟:
S1:先求1*2,得到結果2
S2:將步驟1得到的乘積2再乘以3,得到結果6
S3:將6再乘以4,得24
S4:將24再乘以5,得120
———————————————————————————————————————————
算法步驟:
S1:令p=1,或寫成1=>p(表示將1存放在變量p中)
S2:令i=2,或寫成2=>i(表示將2存放在變量i中)
S3:使p和i相乘,乘積仍存放在變量p中,可表示為p*i=>p
S4:使i的值增加1,即i+1=>i
S5:如果i不大于5,返回重新執行S3及其后的步驟S4和S5;否則算法結束。最后得到p的值就是5!的值
———————————————————————————————————————————
以上方式屬于偽代碼的表示方式一種,用這種方式表示的算法具有一般性,通用性和靈活性
2.有50個學生,要求輸出成績在80以上的學生的學號和成績
變量說明:
n:表示學生學號
下標i:表示第幾個學生
n1:表示第一個學生的學號
ni:表示第i個學生的學號
g:表示學生的成績
g1:表示第一個學生的成績
gi:表示第i個學生的成績
———————————————————————————————————————————
算法步驟:
S1:1=>i
S2:如果gi≥80,則輸出ni和gi,否則不輸出
S3:i+1=>i
S4:如果i≤50,返回到S2繼續執行,否則,算法結束
3.判定2000-2500年中的每一年是否為閏年,并將結果輸出
判定條件:
如果year不能被4整除,則為非閏年
如果year能被4整除但是不能被100整除,則為閏年
如果year能被100整除,同時可以被4整除,則為閏年
如果year為其他條件,則為非閏年
以上是自然語言敘述,通過自然語言的敘述可以幫助我們理解題目并寫出偽代碼或者畫出流程圖進一步向程序轉化,優點是容易理解,缺點是容易出現二義性,并且通常很冗長
———————————————————————————————————————————
算法步驟:
S1:2000=>year
S2:如果year不能被4整除,則輸出year的值和“不是閏年”。然后轉到S6,檢查下一年份
S3:如果year能被4整除但是不能被100整除,則輸出year的值和“是閏年”。然后轉到S6
S4:如果year能被:400整除則輸出year的值和“是閏年”,然后轉到S6
S5:輸出year的值和不是閏年
S6:year+1=>year
S7:當year≤2500時,轉S2繼續執行,否則算法停止
4.求1-1/2+1/3-1/4+……+1/99-1/100
變量說明:
sign:表示當前項的數值符號
term:表示當前項的值
sum:表示當前項的累加和
deno:表示當前項的分母
———————————————————————————————————————————
算法步驟:
S1:sign=1
S2:sum=1
S3:deno=2
S4:sign=(-1)*sign
S5:term=sign*(1/deno)
S6:sum=sum+term
S7:deno=deno+1
S8:若deno≤100,返回S4,否則算法結束
5.給出一個大于或等于3的正整數,判斷它是不是一個素數
解題思路:
所謂素數(prime),是指除了1和該數本身之外,不能被任何整數整除的數
算法步驟:
S1:輸入n的值
S2:i=2(i作為除數)
S3:n被i除,得余數r
S4:如果r=0,表示n能被i整除,則輸出n“不是素數”,算法結束,否則執行S5
S5:i+1=>i
S6:如果i≤n-1,返回S3;否則輸出n的值以及“是素數”,然后結束
算法的特性
有窮性
一個算法應包含有限的操作步驟,而不能是無限的
確定性
算法中的每一個步驟都應該是確定的,而不應當是含糊的、模棱兩可的
有零個或多個輸入
所謂輸入是指在執行算法時需要從外界取得必要的信息
有一個或多個輸出
算法的目的是為了求解,“解”就是輸出
有效性
算法中的每一個步驟都應當能有效地執行,并得到確定的結果
算法的表示
自然語言,傳統流程圖,結構化流程圖,偽代碼
算法的流程圖表示舉例
6.將1的算法求1*2*3*4*5用流程圖表示
7.將2的算法有50個學生,要求輸出成績在80以上的學生的學號和成績用流程圖表示
?8.將3判定閏年的算法用流程圖表示
9.將4的算法求1-1/2+1/3-1/4+……+1/99-1/100用流程圖表示
?10.將5判斷素數的算法用流程圖表示
通過上面的舉例我們可以發現如果使用流程圖,那么程序每一步的運行都會顯得非常直觀
?傳統流程圖的弊端
傳統流程圖用流程線指出各框的執行順序,對流程線的使用沒有嚴格限制。因此使用者可以不受限制地使流程圖隨意地轉來轉去,使流程圖變得毫無規律,閱讀時要花很大力氣去追蹤流程,使人難以理解算法的邏輯。
三種基本結構及其特點
三種基本結構:
?從左到右分別是順序結構,選擇結構和循環結構
特點:
只有一個入口,只有一個出口,結構內每一部分都有機會被執行到,結構內不存在死循環
用N-S流程圖表示算法
?用偽代碼表示算法
偽代碼是用介于自然語言和計算機語言之間的文字和符號來描述算法。每一行或每幾行表示一個基本操作。因為偽代碼不用圖形符號,因此書寫方便,格式緊湊,修改方便,容易看懂,也便于向計算機語言算法(即程序)過渡。
算法的偽代碼舉例
16.求5!
begin(算法開始)i=>p2=>iwhile i≤5{p*i=>pi+1=>i}print p end(算法結束)7.將9的算法求1-1/2+1/3-1/4+……+1/99-1/100用偽代碼表示
begin(算法開始)1=>sign1=>sum2=>denowhile?deno≤100{? ? ? ? ? ?(-1)*sign=>signtsign*(1/deno)=>termsum+term=>sumdeno+1=>deno}print sum end(算法結束)用計算機語言表示算法
18.將16的算法求5!用C語言表示
#include <stdio.h> int main(){int i,p;p=1;i=2;while(i<=5){p=p*i;i=i+1;}printf("%d\n",p);return 0; }19.將17的算法求1-1/2+1/3-1/4+……+1/99-1/100用C表示
#include <stido.h> int main(){int sign=1;double deno=2.0,sum=1.0,term;while(deno<=100){sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;}printf("%f\n",sum);return 0; }結構化程序設計方法
自頂而下,逐步細化,模塊化設計,結構化編碼
為了有效的利用計算機解決實際問題,在保證算法的前提下,還要考慮時間和空間的效率,一個好的算法應該具有較短的執行時間并占用較少的輔助存儲空間。算法的復雜性是對算法所需時空資源的一種度量,當給定問題有多種算法的時候,設計和選擇出復雜性盡可能低的算法是一個重要準則。
總結
以上是生活随笔為你收集整理的谭浩强 《C程序设计》(第五版)第二章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-10-18血压计方案|血压计模
- 下一篇: LC并联谐振电路设计