算法競賽入門經(jīng)典授課教案第1章 算法概述_第1頁
算法競賽入門經(jīng)典授課教案第1章 算法概述_第2頁
算法競賽入門經(jīng)典授課教案第1章 算法概述_第3頁
算法競賽入門經(jīng)典授課教案第1章 算法概述_第4頁
算法競賽入門經(jīng)典授課教案第1章 算法概述_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第1部分語言篇第1章程序設計入門【教學內(nèi)容相關章節(jié)】1.1算術表達式1.2變量及其輸入1.3順序結構程序設計1.4分支結構程序設計1.5C/C++編碼規(guī)范【教學目標】(1)熟悉C語言程序的編譯和運行;(2)學會編程計算并輸出常見的算術表達式的結果;(3)掌握整數(shù)和浮點數(shù)的含義和輸出方法;(4)掌握數(shù)學函數(shù)的使用方法;(5)初步了解變量的含義;(6)掌握整數(shù)和浮點數(shù)變量的聲明方法;(7)掌握整數(shù)和浮點數(shù)變量的讀入方法;(8)掌握變量交換的三變量法;(9)理解算法競賽中的程序三步曲:輸入、計算、輸出;(10)記住算法競賽的目標及其對程序的要求?!窘虒W要求】掌握算術表達式的書寫格式、整數(shù)和浮點數(shù)的聲明、輸入和輸出方法,C語言中scanf的輸入格式和printf的輸出格式?!窘虒W內(nèi)容提要】計算機速度快,很適合做計算和邏輯判斷工作。本章首先介紹順序結構程序設計,其基本思路是:把需要計算機完成的工作分成若個步驟,然后依次讓計算機執(zhí)行。這部分的重點是計算,所以要求掌握算述表達式的書寫格式,整數(shù)和浮點數(shù)的輸入和輸出方法。由于是競賽,所以還要掌握C語言中scanf的輸入格式和printf的輸出格式中的一些特殊的格式。接下來介紹分支結構程序設計,用到了邏輯判斷,根據(jù)不同情況執(zhí)行不同語句?!窘虒W重點、難點】教學重點:(1)掌握算術表達式的書寫格式;(2)整數(shù)和浮點數(shù)的聲明、輸入和輸出方法;(3)C語言中scanf的輸入格式和printf的輸出格式。教學難點:整數(shù)和浮點數(shù)的聲明、輸入和輸出方法,scanf的輸入格式和printf的輸出格式?!菊n時安排(共2學時)】1.1算術表達式(0.25學時)1.2變量及其輸入(0.25學時)1.3順序結構程序設計(0.5學時)1.4分支結構程序設計(0.5學時)1.5C/C++編碼規(guī)范(自學)1.6小結與習題1.1算術表達式計算機的“本職”工作是計算,從算術表達式入手,分析計算機是如何進行復雜的計算。下面來看一個完整的程序1-1。程序1-1計算并輸出1+2的值#include<stdio.h>intmain(){printf("%d\n",1+2);return0;}程序1-1的功能是計算1+2的值,并把結果3輸出到屏幕。下面做4個實驗:(1)實驗1:修改程序1-1,輸出3-4的結果解答:用3-4代替程序1-1的背景為灰色的部分,輸出結果為-1。(2)實驗2:修改程序1-1,輸出5×6的結果解答:用5*6代替程序1-1的背景為灰色的部分,輸出結果為30。(3)實驗3:修改程序1-1,輸出8÷4的結果解答:用8/4代替程序1-1的背景為灰色的部分,輸出結果為2。(4)實驗4:修改程序1-1,輸出8÷5的結果解答:用8/5代替程序1-1的背景為灰色的部分,輸出結果為1。注意:在C語言中,8/5的確切的含義是8除以5所得的商值的整數(shù)部分。下面來看一個完整的程序1-2。程序1-2計算并輸出8/5的值,并保留小數(shù)點后1位#include<stdio.h>intmain(){printf("%.1lf\n",8.0/5.0);return0;}程序1-2的功能是計算8.0/5.0的值,并把結果1.6輸出到屏幕。注意:在程序1-2的背景為灰色部分中,百分號后面是小數(shù)點,然后是數(shù)字1,再然后是小寫字母l,最后是小寫它f。下面再來做3個實驗:(5)實驗5:把%.1lf中的數(shù)字1改為2,結果如何?能猜想出“1”的確切意思嗎?如果把小數(shù)點和1都刪除,%1lf的含義是什么?解答:%lf表示輸出double浮點數(shù),如果程序1-2中的printf語句改為printf("%lf\n",8.0/5.0);,則輸出結果為1.600000。%.llf表示輸出double浮點數(shù),并且小數(shù)點后面保留一位數(shù)字,所以程序1-2的輸出結果為1.6。%.2lf表示輸出double浮點數(shù),并且小數(shù)點后面保留二位數(shù)字。(6)實驗6:字符串%.llf不變,把8.0/5.0改成原來的8/5,結果如何?解答:在VC中調(diào)試的輸出結果為0.000000。在TC中調(diào)試,會出現(xiàn)一個提示“printf:floatingpointformatsnotlinked。Abnormalprogramtermination”。(7)實驗7:字符串%.1lf改為原來的%d,8.0/5.0不變,結果如何?解答:在VC中調(diào)試的輸出結果為-1717986918。在TC中調(diào)試的輸出結果為-26214。對于上面的實驗6和實驗7的答案很難簡單的解釋,真正的原因是涉及整數(shù)和浮點編碼。提示1-1:整數(shù)值用%d,實數(shù)用%lf輸出。提示1-2:整數(shù)/整數(shù)=整數(shù),浮點數(shù)/浮點數(shù)=浮點數(shù)。算術表達式可以和數(shù)學表達式一樣復雜,例如計算數(shù)學表達式的值:程序1-3復雜的表達式計算#include<stdio.h>#include<math.h>intmain(){printf("%.8lf\n",1+2*sqrt(3)/(5-0.1));return0;}說明:(1)整數(shù)-浮點數(shù)是整數(shù)先“變”成浮點數(shù),然點浮點數(shù)-浮點數(shù)=浮點數(shù)。(2)在程序1-3中用到數(shù)學函數(shù)sqrt。數(shù)學函數(shù)sqrt(x)的作用是計算x的算術平方根。一般來說,只要在程序中用到了數(shù)學函數(shù),就需要在程序最開始的地方包含文件math.h1.2變量及其輸入在程序中可以通過鍵盤輸入,然后根據(jù)輸入內(nèi)容來計算結果。程序如下:程序1-4#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&b);printf("%d\n",a+b);return0;}說明:(1)變量用來存儲可變的數(shù)據(jù),它像一個筐,什么都往里面裝。它只能用來存儲事先指定的數(shù)據(jù)結構。(2)在scanf語句中,變量a和b前面的&(取地址)符號,不能丟掉。提示1-3:scanf中的占位符和變量的數(shù)據(jù)類型應一一對應,且每個變量前需要&符號。下面來看一個復雜一點的例子。例1-1圓柱體的表面積。輸入底面積半徑r和高h,輸出圓柱體的表面積,保留3位小數(shù),格式見樣例。樣例輸入:3.59樣例輸出:Area=274.889【分析】圓柱體的表面積=底面積×2+側面積。根據(jù)平面幾何知識,底面積=πr2,側面積=2πrh。完整的程序如下:程序1-5圓柱體的表面積#include<stdio.h>#include<math.h>intmain(){constdoublepi=4.0*atan(1.0);doubler,h,s1,s2,s;scanf("%lf%lf",&r,&h);s1=pi*r*r;s2=2*pi*r*h;s=s1*2.0+s2;printf("Area=%.3lf\n",s);return0;}說明:(1)在程序1-5的語句“constdoublepi=4.0*atan(1.0);”中,const類型限定修飾符表示把一個對象轉換成一個常量(constant),在程序中任何改變這個值的企圖都導致編譯錯誤,因此它被稱為是只讀的(read-only)。由于常量在定義后就不能修改,所以它必須初始化,未初始化的常量定義將導致編譯錯誤。函數(shù)atan()計算數(shù)的反正切值,返回角度以弧度表示,也就是就是數(shù)學中的反正切函數(shù)arctg,由于tg(arctg(1))=1,即arctg(1)=π/4,所以atan(1.0)=0.785398(弧度)≈π/4。語句“constdoublepi=4.0*atan(1.0);”就是將常量pi賦值為4.0*0.785398=3.141593(π的近似值)。(2)const與#define的比較。在C/C++語言中,存在兩種符號常量:用#define定義的宏常量和用const定義的常量。但后者比前者具有更多的優(yōu)點:①#define是預編譯偽指令,它定義的宏常量在進入編譯階段前就已經(jīng)替換為所代表的字面常量,因此宏常量在本質(zhì)上是字面常量。const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對它進靜態(tài)類型安全檢查;而對#define常量只進行字符替換,沒有類型安全檢查,并且在字符替換時可能會產(chǎn)生意料不到的錯誤(邊際效應)。所以在C++程序中應盡量使用const來定義符號常量,包括字符串常量。②有些集成化的調(diào)試工具可以const常量進行調(diào)試,但是不能對宏常量進行調(diào)試。(3)在正規(guī)比賽中,題目包含著輸入輸出格式規(guī)定,還有樣例數(shù)據(jù)。(4)在比賽時,選手程序的執(zhí)行是自動完成的,沒有人工干預。不要在用戶輸入之前打印提示信息,否則會讓程序丟掉大量的分數(shù),因為這些提示信息會被當作輸出的數(shù)據(jù)的一部分。(5)不會讓程序“按任意鍵退出”(例如在DevC++中調(diào)用system(“pause”),或者加一個多余的getchar())。所以千萬不要在算法競賽中這樣做。提示1-4:在算法競賽中,輸入前不要打印提示信息。輸出完畢后應立即終止程序,不要等待用戶按鍵,因為輸入輸出過程都是自動的,沒有人工干預。提示1-5:在算法競賽中不要使用頭文件conio.h,包括getch(),clrscr()。提示1-6:在算法競賽中,每行輸出均應以回車符結束,包括最后一行。除非特別說明,每行的行首不應空格,但行末通常可以有多余空格。另外,輸出的每兩個數(shù)或者字符串之間應以單個空格隔開。提示1-7:盡量用const關鍵字聲明常數(shù)。提示1-8:賦值是個動作,先計算右邊的值,再賦給左邊的變量,覆蓋它原來的值。提示1-9:printf的格式字符串中可以包含其他可打印符號,打印時原樣輸出。1.3順序結構程序設計例1-2三位數(shù)反轉。輸入一個三位數(shù),分離出它的百位、十位和個位,反轉后輸出。樣例輸入:127樣例輸出:721【分析】首先將三位數(shù)讀入變量n,然后進行分離。百位等于n/100(注意這里取的是商的整數(shù)部分),十位數(shù)等于n/10%10(這里的%是取余數(shù)操作),個位數(shù)等于n%10。完整的程序如下:程序1-6三位數(shù)反轉(1)#include<stdio.h>intmain(){intn;scanf("%d",&n);printf("%d%d%d\n",n%10,n/10%10,n/100);return0;}注意:程序1-6的輸出結果是025。如果一個數(shù)的個位是0,例如輸入是520,輸出結果是025,還是25,在算法競賽中如果遇到這個問題,可向監(jiān)考老師詢問。提示1-10:算法競賽的題目應當嚴密的,各種情況下的輸出均應有嚴格規(guī)定。如果在比賽中發(fā)現(xiàn)題目有漏洞,應當向相關人員詢問,而盡量不要自己隨意假定。對程序1-6,如果要輸出25,解決辦法是在輸出結果前把結果存在變量m中,直接用%d格式輸出m,這樣可以輸出25;如果要輸出025,把輸出格式變?yōu)?03d即可。程序1-7三位數(shù)反轉(2)#include<stdio.h>intmain(){intn,m;scanf("%d",&n);m=(n%10)*100+(n/10%10)*10+(n/100);printf("%03d\n",m);return0;}例1-3交換變量。輸入兩個整數(shù)a和b,交換二者的值,然后輸出。樣例輸入:82416樣例輸出:16824【分析】按題目的所說,先把變量存入變量a和b,然后交換。最經(jīng)典的方法是三變量法:程序1-8變量交換(1)#include<stdio.h>intmain(){inta,b,t;scanf("%d%d",&a,&b);t=a;a=b;b=t;printf("%d%d\n",a,b);return0;}提示1-11:賦值a=b之后,變量a原來的值被覆蓋,而b的值不變。另一個方法沒有借助任何變量,但較難理解:程序1-9變量交換(2)#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&b);a=a+b;b=a-b;a=a-b;printf("%d%d\n",a,b);return0;}說明:程序1-9的功能也是交換兩個變量的值(少用了一個中間變量來實現(xiàn)),但實際上很少使用,因為它的適用范圍很窄:只有定義了加減法的數(shù)據(jù)類型才能這么做。提示1-12:交換兩個變量的三變量法適用范圍廣,推薦使用。多數(shù)算法競賽采用黑盒測試,即只考查程序解決問題的能力,而不關心它采用的方法,所以三變量法不是解決變量交換的最佳途徑,對于本題而言,最合適程序如下:程序1-10變量交換(3)#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&b);printf("%d%d\n",b,a);return0;}換句話說,我們的目標是解決問題,而不是為了寫程序而寫程序,同時應保持簡單(KeepItSimpleandStupid,KISS),而不是自己創(chuàng)造條件去展示編程序技巧。提示1-13:算法競賽是在比誰更好地解決問題,而不是在比誰寫的程序看上去更高級。1.4分支結構程序設計例1-4雞兔同籠。已知雞和兔的總數(shù)量為n,總腿數(shù)為m。輸入m和n,依次輸出雞的數(shù)目和兔的數(shù)目。如果無解,則輸出“Noanswer”(不要引號)。樣例輸入:1432樣例輸入:122樣例輸出:106樣例輸出:Noanswer【分析】設雞有a只,兔有b只,則a+b=n,2a+4b=m,聯(lián)立解得a=(4n-m)/2,b=n-a。在本題中,首先,a和b都是整數(shù);其次,a和b必須是非負的??梢酝ㄟ^下面的程序判斷:程序1-11雞兔同籠#include<stdio.h>intmain(){inta,b,n,m;scanf("%d%d",&n,&m);a=(4*n-m)/2;b=n-a;if(m%2==1||a<0||b<0)printf("Noanswer\n");elseprintf("%d%d\n",a,b);return0;}在本程序中,用到if語句,其基本格式如提示1-14所示。提示1-14:if語句的基本格式為:if(條件)語句1;else語句2。在程序1-11中,m%2==1||a<0||b<0是一個邏輯表達式。和算術表達式類似,邏輯表達式也由運符符和值構成,例如“||”運算符稱為“邏輯或”,a||b表示a和b只要有一個為真,a||b就為真;如果a和b都為真,則a||b也為真。提示1-15:if語句的條件是一個邏輯表達式,它的值可能為真,也可能為假。在邏輯表達式a||b中,只要a為真,無論b的取值為真或假,a||b均為真。換句話說,只要a真,不必計算b的值。C語言正是采取了這樣的策略,稱為短路(short-circuit)。類似地,邏輯表達式a&&b,也存在這種短路現(xiàn)象,只要a為假,不必計算b的值,結果必為假。提示1-16:C語言中的邏輯運算符都是短路運算符。一旦能夠確定整個表達式的值,就在再繼續(xù)計算。課堂小練習1寫出下列各邏輯表達式的值(真為1,假為0),設a=3,b=4,c=5。(1)a+b>c&&b==c答案:由于b==c為假,所以剩下的就不用計算了。(2)a||b+c&&b-c答案:1,由于a為真,所以剩下的就不用計算了。(3)!(a>b)&&!c||1答案:1,由于1為真,所以剩下的就不用計算了。(4)!(x=a)&&(y=b)&&0答案:0,由于0為假,所以剩下的就不用計算了。(5)!(a+b)+c-1&&b+c/2答案:0,!(a+b)+c-1為假,所以剩下的就不用計算了。例1-5三整數(shù)排序。輸入3個整數(shù),從小到大排序后輸出。樣例輸入:20733樣例輸入:72033【分析】a、b、c3個數(shù)一共只有6種可能的順序:abc、acb、bac、bca、cab、cba,所以最簡單的思路是使用6條if語句。程序1-12三整數(shù)排序(1)(錯誤)#include<stdio.h>intmain(){inta,b,c;scanf("%d%d%d",&a,&b,&c);if(a<b&&b<c)printf("%d%d%d\n",a,b,c);if(a<c&&c<b)printf("%d%d%d\n",a,c,b);if(b<a&&a<c)printf("%d%d%d\n",b,a,c);if(b<c&&c<a)printf("%d%d%d\n",b,c,a);if(c<a&&a<b)printf("%d%d%d\n",c,a,b);if(c<b&&b<a)printf("%d%d%d\n",c,b,a);return0;}注意:在程序1-12中,如果輸入111將得不到任何輸出。所以編寫出來的程序,即使通過了題目中給出的樣例,程序仍然可能存在問題。提示1-17:算法競賽的目標是編程對任意輸入均得到正確的結果,而不僅是樣例數(shù)據(jù)。對于上面出現(xiàn)的錯誤,它的解決方案是人為地讓6種情況沒有交叉:把所有的if改成elseif。程序1-13三整數(shù)排序(2)#include<stdio.h>intmain(){inta,b,c;scanf("%d%d%d",&a,&b,&c);if(a<=b&&b<=c)printf("%d%d%d\n",a,b,c);elseif(a<=c&&c<=b)printf("%d%d%d\n",a,c,b);elseif(b<=a&&a<=c)printf("%d%d%d\n",b,a,c);elseif(b<=c&&c<=a)printf("%d%d%d\n",b,c,a);elseif(c<=a&&a<=b)printf("%d%d%d\n",c,a,b);elseif(c<=b&&b<=a)printf("%d%d%d\n",c,b,a);return0;}提示1-18:如果有多個并列、情況不交叉的條件需要一一處理,可以用elseif語句。另一種思路是把a、b、c這3個變量本身改成a≤b≤c的形式。首先檢查a和b的值,如果a>b,則交換a和b(利用前面進過的三變量交換法);接下來檢果a和c,最后檢查b和c,程序如下:程序1-14三整數(shù)排序(3)#include<stdio.h>intmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d%d%d\n",a,b,c);return0;}注意:程序1-14的檢查順序不可顛倒。例如,先判斷a>b,然后b>c,最后a>c是不可以的。假如輸入321,則結果為213。提示1-19:可以用花括號把若干條語句組成一個整體(復合語句)。這些語句仍然按順序執(zhí)行。最后一種思路再次利用了“問題求解”這一目標——它實際上并沒有真的進行排序:求出了最小值和最大值,中間值是可以計算出來的。程序1-15三整數(shù)排序(4)#include<stdio.h>intmain(){inta,b,c,x,y,z;scanf("%d%d%d",&a,&b,&c);x=a<?b<?c;x=a;if(b<x)x=b;if(c<x)x=c;z=a;if(b>z)z=b;if(c>z)z=c;y=a+b+c-x-z;printf("%d%d%d\n",x,y,z);return0;}注意:程序1-15中包含了的“當前最小值”x和“當前最大值”z。它們初始化為a,但是隨著“比較”操作的進行而慢慢更新,最后變成真正的最小值和最大值。這個技巧極為實用。提示1-20:在難以一次性求出最后結果時,可以用變量儲存“臨時結果”,從而逐步更新。1.5C一個好的程序,不僅要算法正確,效率高,而且還應該可讀性好。所謂程序的可讀性,就是程序是否能讓人容易讀懂。在開發(fā)實踐中,許多情況下可讀性與代碼效率同等重要。軟件開發(fā)是團隊工作,接手別人編碼的程序并在此基礎上進行改進是必不可少的,因此可讀性在工程實踐中非常重要。即使是自己編寫的程序,如果可讀性不好,過一段時間需要改進時自己再看,也常會看不懂。如何提高程序的可讀性呢?在標識符、書寫格式、注釋三個方面加以培養(yǎng),再養(yǎng)成一些好的習慣,就能夠有效增強程序的可讀性。1.5.1應該對變量、常量以及函數(shù)等標識進行適當?shù)拿?。好的命名方法使標識符易于記憶且使程序可讀性大大提高。對標識符命名的基本要求是,看到標識符就能想起或猜出它是做什么用的。如果名字能體現(xiàn)變量的類型或作用域等性質(zhì),當然更好。標識符命名應注意以下幾點:(1)標識符號應能提供足夠信息以說明其用途。一定不要怕麻煩而懶得起足夠長的變量名,少按幾個鍵省下的時間,和日后自己讀程序或別人讀你的程序揣摩該變量的作用所花的時間相比,實在微不足道。在沒有國標合作的項目中編寫程序,如果英語實在不好,可以使用拼音,但不要使用拼音縮寫。(2)為全局變理取長的、描述信息多的名字,為局部變量限稍短的名字。(3)名字太長時可以適當采用單詞的縮寫。但要注意縮寫方式一致,要縮寫就全部縮寫。比如單詞Number,如果在某個變量里縮寫成了:intnDoorNum;那么最好包含Number單詞的變量都縮寫成Num。(4)注意使用單詞的復數(shù)形式。如intnTotalStudents,nStudents;nStudents容易讓人理解成代表學生數(shù)目,而nStudent含義就不十分明顯。(5)對于返回值為真或假的函數(shù),加“IS”前綴如:intIsCanceled();intisalpha();//C語言標準庫函數(shù)BOOLIsButtonPushed();1.5.書寫格式好的程序,看起來才有好心情,誰也不愿意看下面這樣的程序:voidmain(){intt,x,y;cin>>t;while(t>0){min=60000;cin>>N>>x>>y>>max;plat[0].x1=x;plat[0].x2=x;plat[0].h=y;for(inti=1;i<=N;i++){cin>>plat[i].x1>>plat[i].x2>>plat[i].h;plat[i].t1=-1;plat[i].t2=-1;if(plat[i].h>y){i--;N--;}}plat[0].t1=0;plat[0].t2=0;qsort((void*)(&plat[1]),N,sizeof(plat[0]),compare);tryway(0);t--;cout<<min<<endl;}}因此,如果想要讓你的程序看起來賞心悅目,應該注意以下幾點:(1)正確使用縮進首先,一定要有縮進,否則代碼的層次不明顯??s進應為4個空格較好。需要縮進時一律按Tab鍵,或一律按空格鍵,不要有時用Tab鍵縮進,有時用空格鍵縮進。一般開發(fā)環(huán)境都能設置一個Tab鍵相當于多少個空格,此時就都用Tab鍵。(2)行寬與折行一行不要太長,不能超過顯示區(qū)域,以免閱讀不便。太長則應折行,折行最好發(fā)生在運算符前面,不要發(fā)生在運算符后面。如if(Condition1()&&Condition2()&&Condition3()){}3)‘{’,‘}’位置不可隨意放置。建議將‘{’放在一行的右邊,而將‘}’單獨放置一行。如:if(condition1()){DoSomething();}比較if(condition1()){DoSomething();}這種寫法,前者既不影響可讀性,又能節(jié)省一行。但是對于函數(shù)體或結構定義的的第一個‘{’,還是單獨一行更為清晰。(4)變量和運算符之間最好加1個空格,如:intnAge=5;nAge=4;if(nAge>=4)printf(“%d”,nAge);for(i=0;i<100;i++);1.5.3在工程實踐中,文件開頭,全局變量定義處,函數(shù)開頭,都應該有注釋。文件開頭的注釋模板如下:/********************************************************************文件名:**Copyright(c)1998-1999*********公司技術開發(fā)部**創(chuàng)建人:**日期:**修改人:**日期:**描述:****版本:**---------------------------------------------------------------------------******************************************************************/函數(shù)開頭的注釋模板如下:/*******************************************************************函數(shù)名:**輸入:a,b,c**a---**b---**c---**輸出:x---**x為1,表示...**x為0,表示...**功能描述:**用到的全局變量:**調(diào)用模塊:**作者:**日期:**修改:**日期:**版本****************************************************************/本書由于篇幅所限,書中程序略去了文件開始處和函數(shù)開始處的注釋。1.5.(1)盡量不要用立即數(shù),而用#define定義成常量,以便以后修改。例如:#defineMAX_STUDENTS20structSStudentaStudents[MAX_STUDENTS];比structSStudentaStudents[20];好。再例如:#defineTOTAL_ELEMENTS100for(i=0;i<TOTAL_ELEMENTS;i++){}(2)使用sizeof(),不直接使用變量所占字節(jié)數(shù)的數(shù)值。如應該寫成:intnAge;for(j=0;j<100;j++)fwrite(fpFile,&nAge,1,sizeof(int));不應該寫:for(j=0;j<100;j++)fwrite(fpFile,&nAge,1,4);(3)稍復雜的表達式中要積極使用括號,以免優(yōu)先級理解上的混亂以及二義性。n=k+++j;//不好n=(k++)+j;//好一點(4)不很容易理解的表達式應分幾行寫:n=(k++)+j;應該寫成:n=k+j;k++;(5)嵌套的ifelse語句要多使用{}if(Condition1())if(condition2())DoSomething();elseNoCondition2();不夠好,應該:if(Condition1()){if(condition2())DoSomething();elseNoCondition2();}(6)單個函數(shù)的程序行數(shù)最好不要超過100行(兩個屏幕高)。(7)盡量使用標準庫函數(shù)。(8)不要隨意定義全局變量,盡量使用局部變量。(9)保持注釋與代碼完全一致,改了代碼別忘改注釋。(10)循環(huán)、分支層次最好不要超過5層。(11)注釋可以與語句在同一行,也可以在上行。(12)一目了然的語句不加注釋。1.6小結與習題通過前幾個小節(jié)的學習,對順序結構程序設計和分支程序設計的核心概念和方法,然而對這些進行知識進行總結,并且完成適當?shù)木毩暿呛苡斜匾摹?.6.實驗A1:表達式11111*11111的值是多少?把5個1改為6個1呢?9個1呢?解答:(1)計算表達式11111*11111的值#include<stdio.h>intmain(){printf("11111*11111=%ld",11111*11111);return0;}程序的運行結果為11111*11111=123454321。(2)計算表達式111111*111111的值只須將(1)中的printf語句改為printf("111111*111111=%ld",111111*111111);,程序的運行結果為111111*111111=-539247567。正確的結果應為12345654321,由于這個數(shù)比較大,所以產(chǎn)生了溢出。(3)計算表達式111111111*111111111的值只須將(1)中的printf改為printf("111111111*111111111=%ld",111111111*111111111);,程序的運行結果為111111111*111111111=1653732529。正確的結果應為12345678987654321,由于這個數(shù)比較大,所以產(chǎn)生了溢出。實驗A2:把實驗A1中的所有數(shù)換成浮點數(shù),結果如何?解答:(1)計算表達式11111.0*11111.0的值#include<stdio.h>intmain(){printf("11111.0*11111.0=%lf",11111.0*11111.0);return0;}程序的運行結果為11111*11111=123454321.000000。(2)計算表達式111111.0*111111.0的值只須將(1)中的printf語句改為printf("11111*11111=%lf",11111*11111);,程序的運行結果為111111.0*111111.0=12345654321.000000。(3)計算表達式111111111.0*111111111.0的值只須將(1)中的printf改為printf("111111111.0*111111111.0=%lf",111111111.0*111111111.0);,程序的運行結果為111111111.0*111111111.0=12345678987654320.000000。實驗A3:表達式sqrt(-10)的值是多少?嘗試用種方法輸出。在計算過程中系統(tǒng)會報錯嗎?解答:#include<stdio.h>#include<math.h>intmain(){printf("sqrt(-10)=%lf",sqrt(-10));return0;}程序的運行結果為sqrt(-10)=-1.#IND,沒有報錯,但結果異常。實驗A4:表達式1.0/0.0、0.0/0.0的值是多少?嘗試用種方法輸出。在計算過程中系統(tǒng)會報錯嗎?解答:#include<stdio.h>intmain(){printf("1.0/0.0=%lf0.0/0.0=%lf",1.0/0.0,0.0/0.0);return0;}輸出結果為1.0/0.0=1.#INF0.0/0.0=-1.#IND。在計算過程中系統(tǒng)會報錯,提示信息為“divdideormodbyzero”。實驗A5:表達式1/0的值是多少?在計算過程中系統(tǒng)會報錯嗎?解答:表達式1/0的值無結果。在計算過程中系統(tǒng)會報錯,提示信息為“divdideormodbyzero”。1.6.scanf("%d%",&a,%b);語句用來輸入兩個數(shù),可用Tab、空格、回車,作為分隔符。實驗B1:在同一行中輸入12和2,并以空格分隔,是否得到了預期的效果?解答:#include<stdio.h>voidmain(){ inta,b; scanf("%d%d",&a,&b); printf("%d,%d\n",a,b); return;}從鍵盤上輸入:122↙,可以達到輸入兩個數(shù)給變量a和b的效果。實驗B2:在不同的兩行中輸入12和2,是否得到了預期的效果?解答:從鍵盤上輸入:12↙2↙,也可以達到輸入兩個數(shù)給變量a和b的效果。。實驗B3:在實驗B1和B2中,在12和2的前面和后面加入大量的空格或水平制表符(TAB),甚至插入一些空行。解答:從鍵盤上輸入的12和2,也可以前面和后面加入大量的空格或水平制表符(TAB),甚至插入一些空行,達到輸入兩個數(shù)給變量a和b的效果。實驗B4:把2換成字符s,重復實驗B1~B3。解答:從鍵盤上輸入:122↙,而輸出的結果為12-85899360。1.6在printf語句中的格式字符串,決定了數(shù)據(jù)的輸入/輸出格式。實驗C1:僅用一條printf語句,打印1+2和3+4,用兩個空行隔開。解答:#include<stdio.h>voidmain(){ printf("%d\n\n%d",1+2,3+4); return;}實驗C2:試著把%d中的兩個字符(百分號和小寫字)。解答:#include<stdio.h>voidmain(){ printf("%%d\n"); return;}實驗C3:試著把\n中的兩個字符(反斜線和小寫字母n)輸出到屏幕。解答:#include<stdio.h>voidmain(){ printf("\\n"); return;}實驗C4:像C2、C3那樣也需要“特殊方法”才能輸出的東西還有哪些?哪些是printf函數(shù)引起的問題,哪些不是?解答:輸出單引號和雙引號需要用\’和\"。1.6.問題1:int型整數(shù)的最小值和最大值是多少?(需要精確度)。解答:(1)方法一#include<stdio.h>#include<math.h>intmain(){ inta,b; a=-pow(2,31); b=pow(2,31)-1; printf("%d%d\n",a,b); return0;}注意:在TC中int型整數(shù)(2字節(jié))的最小值和最大值分別為-32768和32767;在VC6.0中int型整數(shù)(4字節(jié))的最小值和最大值分別為-2147483648和2147483647,所以不同的編譯系統(tǒng)為整型數(shù)據(jù)分配的字節(jié)數(shù)是不相同的。本題程序是在VC6.0中調(diào)試的。(2)方法二#include<stdio.h>#include<limits.h>intmain(){ inta,b; a=INT_MAX; b=INT_MIN; printf("%d%d\n",a,b); return0;}說明:頭文件limits.h中定義了用于表示整數(shù)類型大小的常量(宏定義)。(1)如果在C:盤上有TC,就可以在“c:\TC”用記事本打開頭文件limits.h,可以找到“#defineINT_MAX0x7FFF”和“#defineINT_MIN((int)0x8000)”。INT_MAX表示在TC中表示最大整數(shù),0x7FFF就是32767;INT_MIN表示在TC中表示最小整數(shù),(int)0x8000就是-32768。(2)如果在C:盤裝有VC6.0,就可以在“C:\ProgramFiles\MicrosoftVisualStudio\VC98\Include”用記事本打開頭文件limits.h,可以找到“#defineINT_MIN(-2147483647-1)/*minimum(signed)intvalue*/”和“#defineINT_MAX2147483647/*maximum(signed)intvalue*/”。INT_MAX表示在VC6.0中表示最大整數(shù)是2147483647;INT_MIN表示在TC中表示最小整數(shù)是-2147483648。問題2:double型浮點數(shù)能精確到多少位小數(shù)?或者,這個問本身值得商榷?解答:#include<stdio.h>intmain(){ doublea; a=123.0; printf("%lf\n",a); return0;}double型浮點數(shù)隱含輸出小數(shù)位數(shù)為6位,不過還可以通printf("%.20lf\n",a);來重新設置,.20中的20也可以換成其它的數(shù)值。問題3:double型浮點數(shù)最大正數(shù)值和最小正數(shù)值分別是多少?解答:#include<iostream.h>intmain(){inty=1030;for(doublex=0.999999999;y--;x*=2)cout<<x<<'\t';cout<<endl;y=1030;for(x=0.000000001;y--;x/=2)cout<<x<<'\t';cout<<endl;return0;}由程序可得,double型浮點數(shù)最大正數(shù)值和最小正數(shù)值分別是1.79769e+308、1.73832e-319。問題4:邏輯運算符號&&、||和!(它表示邏輯非)的相對優(yōu)先級是怎樣的?也就是說,a&&b||c應理解成(a&&b)||c還是a&&(b||c),或者隨便怎么理解都可以?解答:邏輯運算符號&&、||和!(它表示邏輯非)的相對優(yōu)先級(由高到低)是!→&&→||。a&&b||c應理解為(a&&b)||c。問題5:if(a)if(b)x++;elsey++;的確切含義是什么?這個else應和哪個if配套?有沒有辦法明確表達出配套方法,以避免初學者之困惑?解答:if(a)if(b)x++;elsey++;可以換成以下的形式:if(a) if(b)x++; elsey++;else與if的配對的原則是else一般與最近沒有配對的if進行配對。實際上,如果else與第一個if進行配對,可以采取加{}的方式進行:if(a) {if(b)x++;}elsey++;如果else與第二個if進行配對,可以采取加{}的方式進行:if(a){ if(b)x++; elsey++;}以上這種加{}的方式,就不會引起歧義。1.6.(1)本章介紹了常見的各種數(shù)據(jù)類型,以及他們所能表達的范圍;(2)本章介紹了scanf和printf語句的使用;(3)本章介紹了邏輯判斷的使用,理解并描述復雜的邏輯判斷。(4)程序設計是一門實踐性很強學科,所以在學習時,給出兩點建議:重視實驗、學會模仿。1.6.程序設計是一門實踐性很強的學科,所以給出下面的練習。習題1-1平均數(shù)(average)輸入3個整數(shù),輸出它們的平均值,保留3位小數(shù)。解答:#include<stdio.h>intmain(){inta,b,c;doubled;scanf("%d%d%d",&a,&b,&c);d=(double)(a+b+c);printf("%.3lf\n",d/3.0);return0;}習題1-2溫度(temperature)輸入華式溫度f,輸出對應的攝氏溫度c,保留3位小數(shù)。提示:c=5(f-32)/9。解答:#include<stdio.h>intmain(){intf;doublec;scanf("%d",&f);c=5*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論