C語言程序設(shè)計案例教程課件_第1頁
C語言程序設(shè)計案例教程課件_第2頁
C語言程序設(shè)計案例教程課件_第3頁
C語言程序設(shè)計案例教程課件_第4頁
C語言程序設(shè)計案例教程課件_第5頁
已閱讀5頁,還剩230頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1高級語言程序設(shè)計第1頁,共235頁。第1章 C語言基礎(chǔ)知識1.3 數(shù)據(jù)類型、常量、變量、輸入輸出與基本運算 1.2 C程序的基本結(jié)構(gòu)和運行過程 1.1 計算機與程序設(shè)計語言1.4 標(biāo)準(zhǔn)函數(shù)和EasyX庫函數(shù) 第2頁,共235頁。1.1 計算機與程序設(shè)計語言計算機系統(tǒng)的基本組成包括計算機硬件和計算機軟件。硬件指構(gòu)成計算機系統(tǒng)的元器件、部件和設(shè)備,其中包括運算器、控制器、存儲器、輸入和輸出設(shè)備,運算器和控制器是計算機的核心部分,人們將它們稱為中央處理器(CPU)。軟件是用戶操縱計算機的接口界面,通常,按照應(yīng)用層次可以將軟件劃分成系統(tǒng)軟件、支撐軟件和應(yīng)用軟件三個層次。 第3頁,共235頁。程序設(shè)計

2、程序設(shè)計是指設(shè)計、編寫和調(diào)試程序的方法與過程,大致經(jīng)歷了以下幾個階段。1)面向計算機的程序設(shè)計2)面向過程的程序設(shè)計3)面向?qū)ο蟮某绦蛟O(shè)計第4頁,共235頁。程序設(shè)計語言程序設(shè)計語言是用于編寫計算機程序的語言。按照語言級別可以將它分為兩個類別:低級語言和高級語言。低級語言是一種與特定計算機體系結(jié)構(gòu)密切相關(guān)的程序設(shè)計語言,主要包括機器語言和匯編語言。 高級語言是一類采用接近數(shù)學(xué)語言,并力求與具體機器無關(guān)的程序設(shè)計語言形式,它具有描述能力強,便于閱讀理解,易于修改維護等特點。C語言支持結(jié)構(gòu)化程序設(shè)計,C+語言和Java語言支持面向?qū)ο蟪绦蛟O(shè)計。第5頁,共235頁。6CC+Java010010010

3、0110110 1000001110011010 00110001計算機程序員機器語言編譯器程序設(shè)計語言第6頁,共235頁。C語言發(fā)展過程及特點 C語言是應(yīng)用最廣的一種高級程序設(shè)計語言,由美國貝爾實驗室的D. Ritchie設(shè)計,最早用于書寫UNIX操作系統(tǒng)。C語言本身比較簡單,具有簡明的數(shù)據(jù)定義和流程控制機制。它提供的函數(shù)機制用于描述程序模塊,使得開發(fā)者可以通過模塊的組合來構(gòu)造結(jié)構(gòu)化的復(fù)雜程序,并且允許軟件系統(tǒng)不同程序模塊的分別開發(fā)。同時,C語言支持底層程序設(shè)計。利用C語言提供的指針等功能,可以面向計算機硬件,直接描述內(nèi)存單元的地址運算和二進制運算,從而編制出高性能的計算程序和控制程序。第7

4、頁,共235頁。1.2 C程序的基本結(jié)構(gòu)和運行過程 C程序是由若干個函數(shù)組成的,每個函數(shù)用于描述一項操作的具體實現(xiàn)過程。任何一個完整的C程序都必須有且僅有一個名為main的主函數(shù)。 當(dāng)程序運行后,系統(tǒng)將率先自動調(diào)用主函數(shù)。第8頁,共235頁。例1:文本行的輸出#include main( ) printf(“nThis is a C program.”);主函數(shù)(程序入口)標(biāo)準(zhǔn)函數(shù)(用于輸出)頭文件字符串換行符第9頁,共235頁。例2:計算1100的整數(shù)和 #include main() int i, sum; sum = 0; for (i=1; i=100; i+) /*循環(huán)*/ sum

5、= sum+i; printf(n1+2+3+.+99+100=%d, sum); 說明變量 i,sum 是整數(shù)類型賦值輸出格式控制注釋第10頁,共235頁。例3:通過鍵盤輸入兩個整數(shù),輸出其中較大的整數(shù) # include int maxValue(int x, int y) int max; if (xy) max=x; else max=y; return max; main( ) int x, y, z; printf(Enter 2 integers:); scanf(%d%d, &x, &y); z = maxValue(x,y); printf(The larger value

6、is %d.,z); 第11頁,共235頁。運行C程序的基本過程第12頁,共235頁。Visual Studio 2010集成環(huán)境1、用戶界面 第13頁,共235頁。2、創(chuàng)建工程 第14頁,共235頁。 3、創(chuàng)建文件 第15頁,共235頁。4、編譯、連接和運行 第16頁,共235頁。5、運行界面第17頁,共235頁。Dev-C+集成環(huán)境1、用戶界面 第18頁,共235頁。2、創(chuàng)建一個新文件或打開一個已經(jīng)存在的C源文件第19頁,共235頁。3、編譯、運行 第20頁,共235頁。4、運行界面第21頁,共235頁。1.3 數(shù)據(jù)類型、常量、變量、輸入輸出與基本運算 基本數(shù)據(jù)類型與數(shù)據(jù)的表示 1、整型:

7、整型指不帶小數(shù)點的數(shù)據(jù)類型。例如,123、-89、0。常用的整型是基本整型int。對于32位系統(tǒng),int類型的數(shù)據(jù)用4字節(jié)(32位二進制位)表示,字節(jié)(32位二進制位)表示,包括1位符號,有效位數(shù)為31位,取值范圍為-21474836482147483647。第22頁,共235頁。2、實型 實型是指帶小數(shù)點的數(shù)據(jù)類型。例如,78.34、0.0、-765.2、76.0。在C語言中,常用的實型是雙精度型,用double表示。double類型的數(shù)據(jù)用8字節(jié)(64位二進制位)表示,包括1位符號,11位指數(shù)和52位尾數(shù), 取值范圍為 -1.79769313486232E3081.797693134862

8、32E308。第23頁,共235頁。3、字符型字符型是指其值僅含有一個字符的數(shù)據(jù)類型。在C語言中,字符類型的名稱是char,字符值用一對單引號括起來,并且每個字符對應(yīng)一個ASCII編碼,用1個字節(jié)(8位二進制位)表示。例如,0、B、#對應(yīng)的ASCII編碼分別為48、66和35。 第24頁,共235頁。常量 常量是指在程序運行過程中始終不發(fā)生變化的量。 1、整型常量 在C語言中,整型常量常用十進制形式。例如,120、3270、-987、2、實型常量 在C語言中提供了兩種實型常量的書寫形式。一種是十進制小數(shù)形式,一種是指數(shù)形式。十進制小數(shù)形式 :123.45、509.0、-0.98、0.0指數(shù)形式

9、:1.87E+10表示1.871010第25頁,共235頁。3、字符常量 字符常量由一對單引號()括起來,其內(nèi)部存儲表示是相應(yīng)字符的ASCII編碼。普通字符:例如:P、9 轉(zhuǎn)義符是指用一個反斜杠()后跟一個特定字符或一個八進制或十六進制數(shù)值表示的字符。例如:n, 101 4、字符串常量 字符串常量用一對雙引號()括起來。例如:This is a C program. 、3871 和 K 都是字符串常量 。第26頁,共235頁。變量變量是指其值可以改變的量,每個變量代表了不同的存儲單元。C語言規(guī)定:程序中的每一個變量,必須先定義后使用定義變量的語法格式為: ,.;例如:int count;C語言

10、規(guī)定:變量名用標(biāo)識符表示。標(biāo)識符是由字母、數(shù)字和下劃線(_)組成的字符序列,其中第1個字符必須是字母,字母需要區(qū)分大小寫。第27頁,共235頁。變量的賦值變量定義之后并沒有一個確切的初始值,變量賦值就是將變量所屬數(shù)據(jù)類型的某個數(shù)值(介于取值范圍之中)放入系統(tǒng)為這個變量分配的存儲空間中的操作。在定義變量的同時為變量賦予一個初始值。 = ; 例如:int data = 100;通過賦值操作為變量賦值。 = 例如: x = 64;第28頁,共235頁。例4:根據(jù)圓半徑,計算圓的面積和周長。 #include main( ) double radius, area, perimeter; radius

11、 = 20; area = radius*radius*3.14159; perimeter = 2*radius*3.14159; printf(The radius of the circle is %lfn, radius); printf(The area of the circle is %lfn, area); printf(The perimeter of the circle is %lfn, perimeter); 第29頁,共235頁?;镜妮斎胼敵?1、字符的非格式化輸入 getchar( ) 基本執(zhí)行過程為:等待用戶從標(biāo)準(zhǔn)輸入設(shè)備鍵盤輸入一個字符。如果輸入成功,函數(shù)返回

12、這個字符的ASCII編碼。 例如: char ch; ch = getchar( );2、字符的非格式化輸出 putchar( ) putchar(ch),輸出參數(shù)ch代表的字符 。第30頁,共235頁。例5:通過鍵盤輸入兩個字符,分別在兩行上顯示這兩個字符,每行顯示2次。 #include main( ) char ch; /* 定義變量ch */ ch = getchar(); /* 從鍵盤讀取一個字符 */ putchar(ch); /* 在屏幕上顯示2次輸入的字符 */ putchar(ch); putchar(n); /* 在屏幕上顯示換行 */ ch = getchar();/*

13、從鍵盤讀取下一個字符 */ putchar(ch); /* 繼續(xù)在屏幕上顯示2次輸入的字符 */ putchar(ch); putchar(n); /* 在屏幕上顯示換行 */第31頁,共235頁。3、格式化輸入 scanf( )scanf(,. );例如:scanf(“%d%d%f%f”, &x, &y, &f1, &f2); 常用的格式控制說明符由“%”后跟一個特定字符或字符序列組成“%d”表示這個位置應(yīng)該輸入一個十進制整型數(shù)值;“%c”表示這個位置應(yīng)該輸入一個字符;“%f”表示這個位置應(yīng)該輸入一個實型數(shù)值,“%ld”表示這個位置應(yīng)該輸入一個長整型數(shù)值是準(zhǔn)備用來存放輸入數(shù)據(jù)的變量地址。例如

14、,&a、&value分別表示變量a、value的存儲地址第32頁,共235頁。例6:將輸入的角度轉(zhuǎn)換成弧度。 #include main( ) int degree; double radian; printf(Enter degree:); scanf(%d, °ree); radian = 3.14159*degree/180; printf(%d degrees equal to %lf radians., degree, radian);第33頁,共235頁。4、格式化輸出 printf( ) printf(,.);例如: printf(“This value is %dn”,

15、x);的含義與scanf( ) 函數(shù)相同。但在這里,還可以包含一些直接顯示的字符串。printf( )函數(shù)的基本功能是將每個表達(dá)式的結(jié)果按照格式控制說明符的規(guī)則顯示到標(biāo)準(zhǔn)輸出設(shè)備顯示器上。格式控制說明符需要與將要輸出的表達(dá)式一一對應(yīng)。第34頁,共235頁。在很多情況下,人們希望能夠更加準(zhǔn)確地控制每個數(shù)值輸出時所占據(jù)的列數(shù),為此,C語言提供了相應(yīng)的功能。其格式為:%m 和 %m.n m表示數(shù)值輸出時在屏幕上占據(jù)的列數(shù),又稱為場寬,n表示輸出實型數(shù)值時小數(shù)點后的位數(shù)例如: int a = 365; char c = Z; double e = 7865.298; printf(%6d%3c%12.

16、6lf, a, c, e);第35頁,共235頁。算術(shù)運算符加(+)、減(-)、乘(*)、除(/)、取余(%)注意:* 不能省略% (求余) 運算對象只能是整型整型整型 相當(dāng)于取整,一個為實型即為除法C語言允許char類型的變量或常量參與各種算術(shù)運算,但在運算時,它將被看成一個整型數(shù)值,其值為字符對應(yīng)的ASCII編碼。例如:A+32等于用大寫字符A的ASCII編碼65與32相加結(jié)果為97 第36頁,共235頁。37/ 兩個整數(shù)相除,結(jié)果仍為整數(shù) 5 / 2 的結(jié)果為 2 5.0 / 2 的結(jié)果為 2.5 % 求余運算 判奇偶時用此運算符5 % 3 的結(jié)果為 2 3 % 5 的結(jié)果為 3第37頁

17、,共235頁。#include main( ) int d1, d2, d3, d4, value; printf(Enter 4 characters:); d1 = getchar()-0; /* 輸入數(shù)字字符,并轉(zhuǎn)換為個位數(shù) */ d2 = getchar()-0; d3 = getchar()-0; d4 = getchar()-0; value = d1*1000 + d2*100 + d3*10 + d4; printf(The value is %dn, value); /* 輸出結(jié)果 */例7:將連續(xù)輸入的4個數(shù)字字符拼成一個int類型的數(shù)值。第38頁,共235頁。自增、自減運

18、算符 + -+ - 可以實現(xiàn)變量的加1、減1操作。這兩個運算符既可以置于變量的前面,也可以置于變量的后面。也就是說,+i、-i、i+、i-、 都是正確的書寫形式,它們的區(qū)別只有在表達(dá)式中才能夠顯現(xiàn)出來。a = 10; b = +a; 表達(dá)式的值取修改后的值 a 為 11 ,b為11a=10; b=a+; 表達(dá)式的值取修改前的值 a 為 11 ,b為10第39頁,共235頁。算術(shù)表達(dá)式算術(shù)表達(dá)式是指僅包含算術(shù)運算符或自加(+)、自減(-)運算符的表達(dá)式。算術(shù)表達(dá)式的結(jié)果一定是數(shù)值類型的,即整型或?qū)嵭?C語言規(guī)定,在書寫表達(dá)式時,應(yīng)該遵循下列規(guī)則:(1)所有內(nèi)容都必須寫在一行上,例如:必須寫成7/

19、8(2)在表達(dá)式中只允許使用圓括號。為了確保表達(dá)式中的每個運算符能夠按照所期望的順序進行計算,應(yīng)該適當(dāng)?shù)靥砑永ㄌ?。?)表達(dá)式中的乘號(*)不允許省略,例如:(a+1)(a-1) 必須寫成 (a+1)*(a-2)第40頁,共235頁。C語言提供了大量標(biāo)準(zhǔn)函數(shù),包括前面介紹過的getchar、putchar、printf、scanf等輸入/輸出函數(shù),也包括各種數(shù)學(xué)計算函數(shù)。1.4 標(biāo)準(zhǔn)函數(shù)和EasyX庫函數(shù)第41頁,共235頁。數(shù)學(xué)標(biāo)準(zhǔn)函數(shù)函數(shù)原型功能描述int abs(int x);返回int型x的絕對值double fabs(double x);返回double型x的絕對值double si

20、n(double x);返回x的正弦,x是弧度double cos(double x);返回x的余弦,x是弧度double tan(double x);返回x的正切,x是弧度double exp(double x);返回exdouble pow(double x,double y);返回xydouble sqrt(double x);返回x的開平方double floor(double x);返回小于x的最大整數(shù)double ceil(double x);返回大于x的最小整數(shù)第42頁,共235頁。#include #include /*引入數(shù)學(xué)函數(shù)的聲明 */main( )int a, b,

21、c;double S, A, B, AB;printf(輸入兩個角度和一個邊長:);scanf(%d%d%d, &a, &b, &c); /* 輸入兩個角和一條邊*/A = 3.14159*a/180;/* 轉(zhuǎn)換為弧度 */B = 3.14159*b/180;AB = 3.14159*(a+b)/180;S = c*c*sin(A)*sin(B)/sin(AB)/2;/* 計算三角形面積 */printf(nS=%lfn, S);例8:三角形面積的計算。第43頁,共235頁。函 數(shù) 原 型功 能 描 述HWND initgraph(int width, int height, int flag

22、=0);初始化一個寬width高h(yuǎn)eight的繪圖環(huán)境,返回窗口句柄void cleardevice( );用當(dāng)前背景色清空屏幕void closegraph( );關(guān)閉繪圖環(huán)境void circle(int x, int y, int radius);繪制以(x,y)為圓心,半徑為radius的圓void ellipse(int left, int top, int right, int bottom);以(left,top)為左上角,(right,bottom)為右下角形成的矩形為外接矩形,繪制一個空心橢圓void rectangle(int left, int top, int righ

23、t, int bottom);以(left,top)為左上角,(right,bottom)為右下角,繪制一個空心矩形void polygon(const POINT pts , int num);以數(shù)組pts中的num個點作為頂點,繪制一個空心的橢圓void moveto(int x, int y);設(shè)置繪圖當(dāng)前點為(x,y)void lineto(int x, int y);在當(dāng)前點和(x,y)之間繪制直線,并設(shè)置(x,y)為當(dāng)前點void line(int x1, int y1, int x2, int y2);從繪圖點(x1,y1)到(x2,y2)繪制一條直線void putpixel(

24、int x, int y, COLORREF color);在指定點(x,y)繪制一個顏色為color的像素點void outtextxy(int x, int y, LPCTSTR text);在指定點(x,y)輸出text給定的字符串EasyX函數(shù)第44頁,共235頁。第2章 C語言的基本控制結(jié)構(gòu) 2.3 循環(huán)結(jié)構(gòu) 2.2 選擇結(jié)構(gòu) 2.1 順序結(jié)構(gòu)第45頁,共235頁。2.1 順序結(jié)構(gòu)順序結(jié)構(gòu)是指按照語句的書寫順序依次執(zhí)行每條語句的語句結(jié)構(gòu)。第46頁,共235頁。2.2 選擇結(jié)構(gòu) 選擇結(jié)構(gòu)是指根據(jù)某些數(shù)據(jù)的取值或計算結(jié)果選取不同操作的處理方式。選擇結(jié)構(gòu)的描述由兩個基本部分組成,一是對選擇

25、條件的描述;二是對處理分支的描述。 第47頁,共235頁。關(guān)系運算與邏輯運算 關(guān)系運算符 運算符=!=功能大于小于大于等于小于等于等于不等于 邏輯運算符 邏輯運算符&|!功能邏輯與邏輯或邏輯非第48頁,共235頁。注意:對于數(shù)學(xué)表示形式 0 a 10,不能直接地采用這種方式書寫,而需要將它分解成兩個關(guān)系運算,即分解成0小于a并且a小于10,并按照下列格式書寫: 0 a & a = 0 & y+ ,如果x小于0,將不計算y+。對于邏輯表達(dá)式 x=0|y+,如果x大于或等于0,將不計算y+第49頁,共235頁。if語句 if ( ) 第50頁,共235頁。if語句 if ( ) else 第51頁

26、,共235頁。if( num 0 ) value= -num; else value= num;value = num;if( num 0 ) value= -num;第52頁,共235頁。例1:北京地鐵票價的計算。 #include main( )double num;int price;printf(請輸入千米數(shù)(實數(shù)):);scanf(%lf, &num);if (num=0 & num6 & num12 & num22 & num32)price = (num-32)/20 + 7;if( num=0 ) printf(非法輸入!n);elseprintf(票價是 %d 元n,pric

27、e);第53頁,共235頁。多路選擇和switch語句 switch ( ) case : case : . case : default :執(zhí)行的基本過程:首先計算充當(dāng)開關(guān)角色的表達(dá)式;然后,根據(jù)計算結(jié)果進行控制的轉(zhuǎn)移,即用開關(guān)值與下面每個case語句中的常量進行比較;如果開關(guān)值等于某個常量,則執(zhí)行該case語句中的語句序列;如果不存在等于開關(guān)值的case常量,則執(zhí)行default語句中的語句序列。第54頁,共235頁。 在switch語句中,所有的case常量不允許重復(fù)。在實際應(yīng)用中,經(jīng)常將break語句作為每個case分支的語句序列的最后一條語句,以表示該分支的計算結(jié)束,并隨后跳出swi

28、tch語句,終止switch語句的繼續(xù)執(zhí)行。第55頁,共235頁。例2:通過鍵盤讀取兩個復(fù)數(shù)和運算符,完成復(fù)數(shù)運算的操作,并輸出計算的結(jié)果。#include int main( )double a, b, c, d, x, y, t;char op;/* 保存運算符 */printf( “nEnter the first complex number:” );scanf( “%lf%lf”, &a, &b );getchar(); printf( “nEnter a operator:” );scanf( “%c”, &op );/* 輸入運算符 */printf( “nEnter the s

29、econd complex number:” );scanf( “%lf%lf”, &c, &d );switch( op ) /* 檢查運算符 */見下頁 printf(The result is %lf + %lfin, x, y );第56頁,共235頁。case + :x = a + c; y = b + d;break;case - :x = a - c; y = b - d;break;case * :x = a*c - b*d; y = b*c + a*d;break;case / :t = c*c - d*d; if( t = 0 ) printf(The denominato

30、r is 0.n );return0;x = ( a*c + b*d) / t; y = ( b*c - a*d ) / t;break;default:printf(Invalidation operator .n );return0;第57頁,共235頁。2.3 循環(huán)結(jié)構(gòu) while 語句 語法格式:while ( ) 第58頁,共235頁。例3:從鍵盤輸入10個整數(shù),計算它們的平均值 #include main( )int sum = 0, i = 1; int x; /* 保存當(dāng)前輸入的數(shù)據(jù) */printf( “nEnter 10 integers:” );while( i = 10

31、 ) scanf( “%d”, &x ); /* 讀入整數(shù)x */i+; /* 累加已輸入的數(shù)據(jù)個數(shù) */sum=sum + x; /* 累加輸入的數(shù)據(jù)總和 */printf( “The average value is %lfn”, sum*1.0/(i-1); 第59頁,共235頁。for 語句 語法格式:for ( ; ; ) 第60頁,共235頁。例4:從鍵盤讀入5個字符,找出其中ASCII值最大的字符,并將該字符輸出10次。#include main( )int i, x, max = 0;for( i=0; i max ) max= x;for( i=0; i10; i+ ) pu

32、tchar( max ); 第61頁,共235頁。do while 語句 語法格式:do while ( ) ; 第62頁,共235頁。例int ch, num = 0;do ch= getchar( ); if (ch=0 & ch=9) num+; while( ch != n );第63頁,共235頁。#include #include #include #include int main( )double A, w, q, k;int x, y;printf(請輸入正弦曲線的振幅、角速度、初相和偏距: n);scanf(%lf%lf%lf%lf, &A, &w, &q, &k);ini

33、tgraph(640, 480);setorigin(40, 240);line(-40, 0, 600, 0);line(0, 240, 0, -240);setaspectratio(1.0, -1.0);for (x=0; x640; x+=10) y = A * sin(w*x + q) + k;if (x=0) moveto(x, y);elselineto(x, y);_getch( );closegraph( );return 0;第64頁,共235頁。第3章 計算機算法初步 3.3 遞推與迭代法 3.2 窮舉法 3.1 算法的概念 第65頁,共235頁。3.1 算法的概念利用計

34、算機求解問題的一般過程(1)問題分析階段 (2)數(shù)據(jù)結(jié)構(gòu)設(shè)計階段 (3)算法設(shè)計階段 (4)編碼與調(diào)試階段 第66頁,共235頁。 算法描述在計算機科學(xué)的發(fā)展過程中,人們已經(jīng)提出了很多種類的算法描述方法。一種是自然語言的描述方法。鑒于自然語言本身過于靈活且又缺乏嚴(yán)謹(jǐn)性,所以容易產(chǎn)生理解上的歧義。還有一種算法的圖形描述方式流程圖。它采用一些標(biāo)準(zhǔn)的圖形符號描述算法的操作過程,從而避免了人們對非形式化語言的理解差異。 第67頁,共235頁。起止框I/O框處理框判斷框調(diào)用框連接框有向邊 常用流程圖符號第68頁,共235頁。例1:求解一元二次方程問題分析假設(shè)一元二次方程可以書寫成ax2+bx+c=0???/p>

35、以看出,任何一個一元二次方程都由三個系數(shù)a、b、c惟一確定,所以,首先需要用戶輸入三個系數(shù),然后再根據(jù)一元二次方程的求解規(guī)則計算最終的結(jié)果,并將結(jié)果顯示輸出。 第69頁,共235頁。算法描述 第70頁,共235頁。#include #include main( )int a, b, c, t;printf( “Input a,b,c: ” );scanf( “%d%d%d”, &a, &b, &c );t = b*b 4*a*c;if (t0)printf( “No solutionn” ); else if ( t=0 )printf( “X = %lfn”, -b/(2.0*a) ); e

36、lse double t0;t0 = sqrt( (double)t );printf( “X1 = %lf, X2= %lfn”, (-b+t0)/(2*a), (-b-t0)/(2*a) ); 程序代碼 第71頁,共235頁。3.2 窮舉法概述窮舉法,又稱為枚舉法,是人們?nèi)粘I钪谐S玫囊环N求解問題的方法。窮舉法的核心在于明確問題的所有可能性,并針對每種可能情況逐個進行判斷,最終找出正確問題的答案。 第72頁,共235頁。窮舉法應(yīng)用實例1:素數(shù)的判斷 所謂素數(shù)是指僅能被1和自身整除,且大于等于2的數(shù)值。判斷一個給定的數(shù)值是否是素數(shù)是窮舉法的典型實例。 第73頁,共235頁。例2:判斷給定整

37、數(shù)是否是素數(shù) 。 問題分析為了檢查一個整數(shù)是不是素數(shù),可以采用窮舉法。假設(shè)給定的整數(shù)用x表示,則判斷過程就是確認(rèn)x不能整除以2x-1之間的任何整數(shù)。這就需要一一列舉出2x-1之間的每個整數(shù)進行排查。 第74頁,共235頁。NY開始輸入x2 tt xt 加1x%t=0結(jié)束輸出“不是素數(shù)”輸出“是素數(shù)”YNt = xYN算法描述 第75頁,共235頁。#include main( )int x, t;printf( “Enter an integer: ” );scanf( “%d”, &x );for (t = 2; tx; t+ ) /* 列舉小于x大于1的所有整數(shù) */ if ( x%t =

38、 0 ) break;if ( t = x )/* 是否通過循環(huán)條件出口 */ printf( “%d is primen”, x );else printf( “%d isnt primen”, x ); 程序代碼 第76頁,共235頁。窮舉法應(yīng)用實例2:百錢買百雞 “百錢買百雞”是我國古代數(shù)學(xué)家張丘建提出的一個著名的數(shù)學(xué)問題。假設(shè)某人有錢百枚,希望買一百只雞;不同的雞價格不同,公雞5枚錢一只,母雞3枚錢一只,而小雞3只1枚錢。試問:如果用百枚錢買百只雞,可以包含幾只公雞、幾只母雞和幾只小雞。 第77頁,共235頁。例3:百錢買百雞。 問題分析從題目要求可知:公雞、母雞和小雞的數(shù)量是有限的,

39、都不會超過100。通過對不同數(shù)量的公雞、母雞和小雞進行組合,可以計算出購買這些雞所用的花費,但這個題目要求找出那些花費正好100枚且雞的總數(shù)也為100只的情況。因此,可以采用窮舉法,將不同的公雞、母雞和小雞的數(shù)量枚舉一遍,找出那些符合題目要求的解。 第78頁,共235頁。算法描述 第79頁,共235頁。#include #include main( ) int x, y, z; for( x=0; x=100/5; x+ ) for( y=0; y=100/3; y+ ) for( z=0; z=100; z+ ) if (x+y+z =100 &15*x+9*y+z=300) printf(

40、 “x=%d, y=%d, z=%dn”, x, y, z ); 程序代碼 第80頁,共235頁。3.3 遞推與迭代法 概述遞推常用于序列數(shù)據(jù)的計算。其基本策略是用已知結(jié)果和特定關(guān)系(遞推公式)計算中間值。采用遞推法進行問題求解的關(guān)鍵在于找出遞推公式和邊界條件。迭代也是計算機數(shù)值計算的一種基本算法,其基本策略是從初值出發(fā),不斷計算問題的近似解。第81頁,共235頁。遞推與迭代法應(yīng)用實例1:等比數(shù)列求和 所謂等比數(shù)列是指在一組數(shù)據(jù)中,后項和前項之前存在著一個固定的比例關(guān)系。例如:整數(shù)序列3、15、75、375的初值是3,后項與前項是5倍的關(guān)系,即前項乘以5得到后項。本題要求給定等比序列的首項和比

41、例,計算這個數(shù)列的前10項之和。第82頁,共235頁。例4:等比數(shù)列求和。 問題分析等比數(shù)列的遞推公式為: itemi= itemi-1 * ratio后項等于前項乘以比例值sumi= sumi-1 + itemi前i項之和等于前i-1項之和加當(dāng)前項由于在重復(fù)上述遞推計算之前,需要將第1項的值累加到sum中,所以,需要先將item存入sum中。 第83頁,共235頁。算法描述 第84頁,共235頁。#include main( )int item, ratio, sum,i;printf( “nEnter the first item and ratio: ” );scanf( “%d%d”,

42、 &item, &ratio );sum=item;for ( i=1; i10; i+ ) item *= ratio; sum += item; printf( “Sum of 10 items is %dn”, sum );程序代碼 第85頁,共235頁。遞推與迭代法應(yīng)用實例2:求圓周率圓周率的計算公式為: = 4 4/3 + 4/5 4/7 +4/9 4/11 + 第86頁,共235頁。例5:求圓周率。問題分析圓周率的計算公式為: = 4 4/3 + 4/5 4/7 +4/9 4/11 + 圓周率是通過將數(shù)列4、-4/3、4/5求和得到的。在這個數(shù)列中,每個數(shù)據(jù)項的取值與前一項及該項的

43、序號存在著一定的關(guān)系??梢酝ㄟ^迭代,逐個計算出每一個數(shù)據(jù)項,再將它們累加起來。為了滿足要求的精度,可以通過檢查數(shù)據(jù)項的大小來控制循環(huán)的終止。由于數(shù)據(jù)項的絕對值是遞減的,且相鄰項的符號不同,如果第n個數(shù)據(jù)項的絕對值已經(jīng)小于精度值,則前n項之和一定已經(jīng)滿足精度要求了。第87頁,共235頁。算法描述 第88頁,共235頁。#include #include main( )int i = 1, sign = 1; double PI= 0.0, item;do item= sign * 4.0 / (2 * i+ -1);sign= -sign;PI+= item; while (fabs( item

44、 ) 1e-4 ); /* 數(shù)據(jù)項精度控制循環(huán) */ printf( “PI = %lfn”, PI ); 程序代碼 第89頁,共235頁。第4章 數(shù)據(jù)的組織結(jié)構(gòu)(一) 4.3 字符串的組織 4.2 使用一維數(shù)組組織數(shù)據(jù)的應(yīng)用實例 4.1 數(shù)組類型 4.4 字符串處理函數(shù)及應(yīng)用實例 4.5 二維數(shù)組 第90頁,共235頁。4.1 數(shù)組類型數(shù)組類型的應(yīng)用背景(1)同時存在若干個用來描述同一性質(zhì)且不同個體的數(shù)據(jù)。(2)只有將這些數(shù)據(jù)組織在一起形成批量數(shù)據(jù),共同參與處理,很多操作才具有實際意義。例如:要將表示每個學(xué)生考試成績的所有整型數(shù)據(jù)組織在一起,以便共同參與諸如統(tǒng)計考試成績的分布情況、按照考試成

45、績由高到低排名等一系列的操作。第91頁,共235頁。一維數(shù)組類型的定義 定義格式: ;例如: int vote10; C語言規(guī)定:數(shù)組的下標(biāo)從0開始,因此,表示這10個數(shù)據(jù)的下標(biāo)為09 在C程序中,系統(tǒng)將會為每個數(shù)組型變量分配一片連續(xù)的存儲空間,所需要分配的存儲空間總數(shù)將取決于包含的元素個數(shù)和每個元素需要的存儲空間。 第92頁,共235頁。 一維數(shù)組的初始化基本格式為: =,.,;例如:double score5 = 9.2, 9.1, 8.7, 9.1, 8.5; 第93頁,共235頁。說明:1)為數(shù)組型變量中的每一個元素都提供了一個初始值。此時,可以省略方括號內(nèi)的數(shù)組元素數(shù)量。系統(tǒng)將根據(jù)花

46、括號中包含的初值數(shù)目推測出數(shù)組含有的元素數(shù)量。 float score = 9.2, 9.1, 8.7, 9.1, 8.5; 2)對數(shù)組型變量的前面若干個元素賦予初值。此時可以使用下面這種書寫形式: int letter26 = 10, 9, 8, 7; 它的執(zhí)行結(jié)果是:將10、9、8、7分別賦予letter數(shù)組中下標(biāo)為0、1、2、3的元素,后面的所有元素賦予初值0。 3)將數(shù)組型變量中的每一個元素賦予初值0。此時,可以使用下面這種簡化的書寫形式: int vote10 = 0;第94頁,共235頁。一維數(shù)組元素的引用及基本操作數(shù)組元素的引用 數(shù)組的賦值利用賦值語句為數(shù)組賦值 for (i=0

47、; i10; i+) votei = 0; 調(diào)用標(biāo)準(zhǔn)輸入函數(shù)為數(shù)組賦值 for (i=0; i13; i+) scanf(“%f”, &scorei); 數(shù)組的輸出 for (i=0; i10; i+) printf(“%5d”, votei); 第95頁,共235頁。查找問題 查找是指根據(jù)某個給定的條件,在一組數(shù)據(jù)中搜索是否存在滿足該條件的數(shù)據(jù)的過程。4.2 使用一維數(shù)組組織數(shù)據(jù)的應(yīng)用實例第96頁,共235頁。例1:已知某個班級35名學(xué)生的某門課程的考試成績。請編寫一個程序,查看在這個班級中是否存在不及格的學(xué)生。 問題分析用一維數(shù)組記錄每位學(xué)生的考試成績,下標(biāo)表示每個學(xué)生的編號,元素內(nèi)容表示

48、考試成績。 查找可以通過從前往后依次查看每個元素內(nèi)容的過程實現(xiàn)。第97頁,共235頁。算法描述 第98頁,共235頁。#include #include #include #define NUM 35 /*學(xué)生人數(shù)*/main( ) int scoreNUM; int i; /* 隨機產(chǎn)生35個考試成績 */ srand(time(0); for (i=0; iNUM; i+) scorei = rand()%100; /*顯示35名學(xué)生的考試成績*/ for (i=0; iNUM; i+) printf(nNo.%d: %d, i+1, scorei); 程序代碼第99頁,共235頁。/*順

49、序查找是否存在不及格的學(xué)生*/ for (i=0; iNUM; i+) if (scorei60) break; /*輸出查找結(jié)果*/ if (iNUM) printf(nNot all pass.); else printf(All pass.); 第100頁,共235頁。例2:已知一個按非遞減有序排列的整型數(shù)列(12,23,30,45,48,50,67,82,91,103)。請編寫一個程序,查找其中是否存在與給定key相等的數(shù)值。 第101頁,共235頁。算法描述 第102頁,共235頁。#include #define NUM 10main( ) int valueNUM = 12, 2

50、3, 30, 45, 48, 50, 67, 82, 91, 103; /* 非遞減整型數(shù)列 */ int low, high, mid, key; printf(nEnter a key:); /* 輸入查找的數(shù)值 */ scanf(%d, &key); low = 0;high = NUM-1; while (low=high) mid = (low+high)/2; if (valuemid=key)break; if (valuemidkey) low = mid+1; else high = mid-1; if (low=high) printf(n%d is found at %d

51、., key, mid);/* 確認(rèn)break出口 */ else printf(n%d is not found., key);/* 確認(rèn)循環(huán)正常出口 */程序代碼第103頁,共235頁。 排序問題 將一組無序的數(shù)列重新排列成非遞減或非遞增的順序是一種經(jīng)常需要的操作。例如,在管理學(xué)生成績的應(yīng)用程序中,可以用一個數(shù)列表示一個班級的學(xué)生成績,并按照從高到低的順序重新排列,以便確定獲得獎學(xué)金的學(xué)生。 第104頁,共235頁。例3:假設(shè)用戶通過鍵盤輸入一個整型數(shù)列。請編寫一個程序,將其按照從小到大的順序重新排列。 問題分析(選擇排序)首先從n個數(shù)據(jù)中選擇一個最小的數(shù)據(jù),并將它交換到第1個位置;然后再

52、從后面n-1個數(shù)據(jù)中選擇一個最小的數(shù)據(jù),并將它交換到第2個位置;以此類推,直至最后從兩個數(shù)據(jù)中選擇一個最小的數(shù)據(jù),并將它交換到第n-1個位置為止,整個排序操作結(jié)束。 第105頁,共235頁。算法描述 第106頁,共235頁。#include #define NUM 10 /* 參與排序的數(shù)據(jù)個數(shù) */main() int dataNUM; /* 存放參與排序的所有整數(shù) */ int i, j, min, temp; /* 通過鍵盤輸入待排序的整型數(shù)列 */ printf(nEnter %d integers., NUM); for (i=0; iNUM; i+) scanf(%d, &data

53、i); /* 顯示原始整型數(shù)列 */ printf(n%d integers are:, NUM); for (i=0; iNUM; i+) printf(%5d, datai); 程序代碼第107頁,共235頁。 for (i=0; iNUM-1; i+) min = i; for (j=i+1; jNUM; j+) if (datajdataminValue) minValue = j; if (min!=i) /* 交換 */ temp = datai; datai = datamin; datamin = temp; /* 輸出排序后的結(jié)果 */ printf(nOrdering li

54、st is:n); for (i=0; iNUM; i+) printf(%5d, datai); 第108頁,共235頁。字符串的組織形式 字符串是指一個有限長度的字符序列 ,字符串常量用一對雙引號(“”)括起來。 字符串中所包含的字符個數(shù)被稱為字符串長度。 4.3 字符串的組織 第109頁,共235頁。字符串的初始化char str = “C program”; char str = C, , p, r, o, g, r, a, m, 0; 對于這種初始化形式,系統(tǒng)將其視為字符操作,而不是字符串操作,因此不會在尾部添加結(jié)束符0。 “C program”的存儲狀態(tài) 0123456789Cpr

55、ogram0第110頁,共235頁。字符串的輸入輸出 1、gets(str); 2、scanf(“%s”, str);gets 以換行符作為輸入結(jié)束標(biāo)記,但不保存換行符。scanf 以空格、換行符或制表符作為結(jié)尾。第111頁,共235頁。字符串的輸出 1、puts(str); 2、printf(%s”, str);puts將字符串的內(nèi)容顯示到標(biāo)準(zhǔn)輸出設(shè)備屏幕上,并換行。 第112頁,共235頁。字符串標(biāo)準(zhǔn)函數(shù) 在C語言的標(biāo)準(zhǔn)函數(shù)庫中,提供了30余種與字符串處理有關(guān)的標(biāo)準(zhǔn)函數(shù),從而大大地提高了字符串處理的能力,降低了字符串處理的復(fù)雜程度。 4.4 字符串處理函數(shù)及應(yīng)用實例 第113頁,共235頁

56、。計算字符串長度 strlen(str);這個函數(shù)的功能是返回字符串中所包含的字符個數(shù),即字符串長度。字符串結(jié)束標(biāo)志0不計算在內(nèi)。 字符串比較 strcmp(str1, str2);兩個字符串進行比較時將依據(jù)每個字符對應(yīng)的ASCII編碼決定其大小。 例4:用戶注冊程序。第114頁,共235頁。#include #include main( )char userid32; char password116, password216;do puts(請輸入用戶名:);gets(userid);if ( userid0!=0 )break; puts(用戶名不能為空); while ( 1 );do

57、 puts(請輸入密碼(六位以上):); gets(password1); if ( strlen(password1)6 ) puts(密碼長度不足);continue;puts(請再次輸入同一密碼);gets(password2);if ( 0=strcmp(password1, password2) )break;puts(兩次輸入密碼不同,請重新輸入); while ( 1 );puts(祝賀您成功注冊我們的網(wǎng)站); 程序代碼第115頁,共235頁。字符串拷貝 strcpy(str1, str2);其中str2是將要被拷貝的字符串,str1是用于存放拷貝結(jié)果的存儲區(qū)域。 字符串連接 s

58、trcat(str1, str2);其中str1和str2是兩個字符串。這個函數(shù)的功能是:將str2連接在str1之后,并在結(jié)束處添加一個字符串結(jié)束符0第116頁,共235頁。字符串轉(zhuǎn)換成數(shù)值類型 atof(str); atoi(str); atol(str);其中str是一個字符串。atof() 的返回類型是double,它可以將字符串str轉(zhuǎn)換成一個雙精度數(shù)值;atoi() 的返回類型是int,它可以將字符串str轉(zhuǎn)換成普通整型;atol() 的返回類型是long,它可以將字符串str轉(zhuǎn)換成長整型(long)。 第117頁,共235頁。#include #include main( ) c

59、har num120, num220; double d1, d2, sum; printf(nEnter the first number:); gets(num1); /* 輸入第1個用字符串表示的實型數(shù)值 */ printf(Enter ths second number:); gets(num2); /* 輸入第2個用字符串表示的實型數(shù)值 */ d1 = atof(num1); /* 將第1個字符串轉(zhuǎn)換成double類型 */ d2 = atof(num2); /* 將第2個字符串轉(zhuǎn)換成double類型 */ sum = d1+d2; /* 將2個double類型數(shù)值相加 */ pri

60、ntf(n%s+%s=%.3lf, num1, num2, sum); /* 顯示結(jié)果 */程序代碼第118頁,共235頁。大小寫轉(zhuǎn)換 strlwr(str); strupr(str);str是一個字符串。標(biāo)準(zhǔn)函數(shù)strlwr( ) 可以將字符串str中出現(xiàn)的所有大寫字母轉(zhuǎn)換成小寫字母;標(biāo)準(zhǔn)函數(shù)strupr( ) 可以將字符串str中出現(xiàn)的所有小寫字母轉(zhuǎn)換成大寫字母。 第119頁,共235頁。4.5 二維數(shù)組 二維數(shù)組的定義 定義格式: ; 例如: int value54; value數(shù)組的每個元素類型為int,包含5行4列共20個元素 一旦定義了一個二維數(shù)組型變量,系統(tǒng)就會立即為其分配相應(yīng)的

溫馨提示

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

評論

0/150

提交評論