




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C程序設計(第五版)1程序設計和C語言第章計算機程序可以被計算機理解并執行的基本操作命令。指令與計算機系統操作有關的計算機程序、規程、規則,以及可能有的文件、文檔及數據。軟件一組計算機能識別和執行的指令。一個特定的指令序列用來完成一定的功能。程序計算機語言機器語言計算機能直接識別和接受的二進制代碼稱為機器指令。機器指令的集合就是該計算機的機器語言。特點:難學,難記,難檢查,難修改,難以推廣使用。依賴具體機器難以移植。匯編語言機器語言的符號化。用英文字母和數字表示指令的符號語言。特點:相比機器語言簡單好記,但仍然難以普及。匯編指令需通過匯編程序轉換為機器指令才能被計算機執行。依賴具體機器難以移植
2、。高級語言高級語言更接近于人們習慣使用的自然語言和數學語言。特點:功能強大,不依賴于具體機器。用高級語言編寫的源程序需要通過編譯程序轉換為機器指令的目標程序。B8 7F 01BB 21 0203 D8B8 1F 042B C3MOV AX 383MOV BX 545ADD BX AXMOV AX 1055SUB AX BXS=1055-(383+545)高級語言的發展010203非結構化的語言規定:程序必須由具有良好特性的基本結構(順序結構、選擇結構、循環結構)構成,程序中的流程不允許隨意跳轉,程序總是由上而下順序執行各個基本結構。特點:程序結構清晰,易于編寫、閱讀和維護。面向對象的語言結構化
3、語言C語言的發展D.M.Ritchie19721973年間,美國貝爾實驗室的D.M.Ritchie 在B語言的基礎上設計出了C語言。最初的C語言只是為描述和實現UNIX操作系統提供一種工作語言而設計的。隨著UNIX的日益廣泛使用,C語言也迅速得到推廣。1978年以后,C語言先后移植到大、中、小和微型計算機上。C語言便很快風靡全世界,成為世界上應用最廣泛的程序設計高級語言。以UNIX第7版中的C語言編譯程序為基礎,1978年,Brian W.Kernighan和Dennis M.Ritchie 合著了影響深遠的名著The C Programming Language,這本書中介紹的C語言成為后來
4、廣泛使用的C語言版本的基礎,它是實際上第一個C語言標準。1983年,美國國家標準協會(ANSI),根據C語言問世以來各種版本對C語言的發展和擴充,制定了第一個C語言標準草案(83 ANSI C)。1989年,ANSI公布了一個完整的C語言標準ANSI X3.1591989(常稱為ANSI C或C 89)。1990年,國際標準化組織ISO(International Standard Organization)接受C 89作為國際標準ISO/IEC 9899: 1990,它和ANSI的C 89基本上是相同的。1999年,ISO又對C語言標準進行了修訂,在基本保留原來的C語言特征的基礎上,針對應用
5、的需要,增加了一些功能,尤其是C+中的一些功能,并在2001年和2004年先后進行了兩次技術修正,它被稱為C 99,C 99是C 89的擴充。目前由不同軟件公司所提供的一些C語言編譯系統并未完全實現C 99建議的功能,它們多以C 89為基礎開發。C語言的特點 語言簡潔、緊湊,使用方便、靈活0102030405060708C語法限制不太嚴格,程序設計自由度大運算符豐富 數據類型豐富具有結構化的控制語句用函數作為程序的模塊單位,便于實現程序的模塊化C語言是完全模塊化和結構化的語言生成目標代碼質量高,程序執行效率高程序可移植性好允許直接訪問物理地址能進行位(bit)操作能實現匯編語言的大部分功能可以
6、直接對硬件進行操作因此C語言既具有高級語言的功能,又具有低級語言的許多功能,可用來編寫系統軟件最簡單的C語言程序【例1.1】要求在屏幕上輸出:This is a C program.解題思路: 在主函數中用printf函數原樣輸出以上文字。#include /這是編譯預處理指令int main()/定義主函數 /函數開始的標志 printf(This is a C program.n);/輸出所指定的一行信息 return 0;/函數執行完畢時返回函數值0/函數結束的標志程序分析main是函數的名字,表示“主函數”;每一個C語言程序都必須有一個 main 函數。main前面的int表示此函數的
7、類型是int類型(整型),即在執行主函數后會得到一個值(即函數值),其值為整型。return 0;的作用是當main函數執行結束前將整數0作為函數值,返回到調用函數處。函數體由花括號括起來。printf是C編譯系統提供的函數庫中的輸出函數(詳見第4章)。printf函數中雙引號內的字符串This is a C program.按原樣輸出。n是換行符,即在輸出This is a C program.后,顯示屏上的光標位置移到下一行的開頭。每個語句最后都有一個分號,表示語句結束。最簡單的C語言程序【例1.1】要求在屏幕上輸出:This is a C program.解題思路: 在主函數中用prin
8、tf函數原樣輸出以上文字。#include /這是編譯預處理指令int main()/定義主函數 /函數開始的標志 printf(This is a C program.n);/輸出所指定的一行信息 return 0;/函數執行完畢時返回函數值0/函數結束的標志最簡單的C語言程序#include /這是編譯預處理指令int main()/定義主函數 /函數開始的標志 printf(This is a C program.n);/輸出所指定的一行信息 return 0;/函數執行完畢時返回函數值0/函數結束的標志程序分析main是函數的名字,表示“主函數”;每一個C語言程序都必須有一個 main
9、 函數。main前面的int表示此函數的類型是int類型(整型),即在執行主函數后會得到一個值(即函數值),其值為整型。return 0;的作用是當main函數執行結束前將整數0作為函數值,返回到調用函數處。函數體由花括號括起來。最簡單的C語言程序#include /這是編譯預處理指令int main()/定義主函數 /函數開始的標志 printf(This is a C program.n);/輸出所指定的一行信息 return 0;/函數執行完畢時返回函數值0/函數結束的標志程序分析printf是C編譯系統提供的函數庫中的輸出函數(詳見第4章)。printf函數中雙引號內的字符串This
10、is a C program.按原樣輸出。n是換行符,即在輸出This is a C program.后,顯示屏上的光標位置移到下一行的開頭。每個語句最后都有一個分號,表示語句結束。最簡單的C語言程序#include /這是編譯預處理指令int main()/定義主函數 /函數開始的標志 printf(This is a C program.n);/輸出所指定的一行信息 return 0;/函數執行完畢時返回函數值0/函數結束的標志程序分析在使用函數庫中的輸入輸出函數時,編譯系統要求程序提供有關此函數的信息,程序第1行“#include ”的作用就是用來提供這些信息的。stdio.h是系統提供
11、的一個文件名,stdio是standard input & output的縮寫,文件后綴.h的意思是頭文件(header file),因為這些文件都是放在程序各文件模塊的開頭的。輸入輸出函數的相關信息已事先放在stdio.h文件中。最簡單的C語言程序#include /這是編譯預處理指令int main()/定義主函數 /函數開始的標志 printf(This is a C program.n);/輸出所指定的一行信息 return 0;/函數執行完畢時返回函數值0/函數結束的標志程序分析/表示從此處到本行結束是“注釋”,用來對程序有關部分進行必要的說明。在寫C程序時應當多用注釋,以方便自己和
12、別人理解程序各部分的作用。在程序進行預編譯處理時將每個注釋替換為一個空格,因此在編譯時注釋部分不產生目標代碼,注釋對運行不起作用。注釋只是給人看的,而不是讓計算機執行的。注釋這種注釋可以單獨占一行,也可以出現在一行中其他內容的右側。此種注釋的范圍從/開始,以換行符結束。如果注釋內容一行內寫不下,可以用多個單行注釋。這種注釋可以包含多行內容。它可以單獨占一行(在行開頭以/*開始,行末以*/結束),也可以包含多行。編譯系統在發現一個/*后,會開始找注釋結束符*/,把二者間的內容作為注釋。以/開始的單行注釋以/*開始,以*/結束的塊式注釋注意:在字符串中的/和/*都不作為注釋的開始。而是作為字符串的
13、一部分。/第一行注釋/繼續注釋/*一整塊都是注釋*/注釋#include int main() printf(/how do you do!n); return 0;#include int main() printf(/*how do you do!*/n); return 0;最簡單的C語言程序【例1.2】求兩個整數之和解題思路: 設置3個變量,a和b用來存放兩個整數,sum用來存放和數。用賦值運算符“=”把相加的結果傳送給sum。#include /這是編譯預處理指令 int main( )/定義主函數 /函數開始 int a,b,sum; /本行是程序的聲明部分,定義a,b,sum為整
14、型變量 a=123;/對變量a賦值 b=456;/對變量b賦值 sum=a+b;/進行a+b的運算,并把結果存放在變量sum中 printf(sum is %dn,sum); /輸出結果 return 0;/使函數返回值為0/函數結束最簡單的C語言程序#include /這是編譯預處理指令 int main( )/定義主函數 /函數開始 int a,b,sum; /本行是程序的聲明部分,定義a,b,sum為整型變量 a=123;/對變量a賦值 b=456;/對變量b賦值 sum=a+b;/進行a+b的運算,并把結果存放在變量sum中 printf(sum is %dn,sum); /輸出結果
15、return 0;/使函數返回值為0/函數結束程序分析printf(sum is %dn,sum); printf函數圓括號內有兩個參數。第一個參數是雙引號中的內容sum is %dn,它是輸出格式字符串,作用是輸出用戶希望輸出的字符和輸出的格式。其中sum is是用戶希望輸出的字符,d是指定的輸出格式,d表示用“十進制整數”形式輸出。圓括號內第二個參數sum表示要輸出變量sum的值。在執行printf函數時,將sum變量的值(以十進制整數表示)取代雙引號中的%d。printf(sum is %dn, sum); 輸出時用sum的值取代%d最簡單的C語言程序【例1.3】求兩個整數中的較大者解題
16、思路: 用一個函數來實現求兩個整數中的較大者。在主函數中調用此函數并輸出結果。#include /主函數int main()/定義主函數/主函數體開始int max(int x,int y);/對被調用函數max的聲明int a,b,c;/定義變量a,b,cscanf(%d,%d,&a,&b); /輸入變量a和b的值c=max(a,b);/調用max函數,將得到的值賦給cprintf(max=%dn,c); /輸出c的值return 0;/返回函數值為0/主函數體結束/求兩個整數中的較大者的max函數int max(int x,int y)/定義max函數,函數值為整型, 形式參數x和y為整型
17、 int z;/max函數中的聲明部分,定義本函數中用到的變量z為整型if(xy)z=x;/若xy成立,將x的值賦給變量zelse z=y;/否則(即xy不成立),將y的值賦給變量zreturn(z); /將z的值作為max函數值,返回到調用max函數的位置最簡單的C語言程序#include /主函數int main()/定義主函數/主函數體開始int max(int x,int y);/對被調用函數max的聲明int a,b,c;/定義變量a,b,cscanf(%d,%d,&a,&b); /輸入變量a和b的值c=max(a,b);/調用max函數,將得到的值賦給cprintf(max=%dn
18、,c); /輸出c的值return 0;/返回函數值為0/主函數體結束/求兩個整數中的較大者的max函數int max(int x,int y)/定義max函數,函數值為整型, 形式參數x和y為整型 int z;/max函數中的聲明部分,定義本函數中用到的變量z為整型if(xy)z=x;/若xy成立,將x的值賦給變量zelse z=y;/否則(即xy不成立),將y的值賦給變量zreturn(z); /將z的值作為max函數值,返回到調用max函數的位置程序分析本程序包括兩個函數:主函數main;被調用的函數max。max函數的作用是將x和y中較大者的值賦給變量z,最后通過return語句將z的
19、值作為max的函數值返回給調用max函數的主函數。scanf是輸入函數的名字(scanf和printf都是C的標準輸入輸出函數)。該scanf函數的作用是輸入變量a和b的值。max(a,b)調用max函數。在調用時將a和b作為max函數的實際參數的值分別傳送給max函數中的形式參數x和y。最簡單的C語言程序#include /主函數int main()/定義主函數/主函數體開始int max(int x,int y);/對被調用函數max的聲明int a,b,c;/定義變量a,b,cscanf(%d,%d,&a,&b); /輸入變量a和b的值c=max(a,b);/調用max函數,將得到的值賦
20、給cprintf(max=%dn,c); /輸出c的值return 0;/返回函數值為0/主函數體結束/求兩個整數中的較大者的max函數int max(int x,int y)/定義max函數,函數值為整型, 形式參數x和y為整型 int z;/max函數中的聲明部分,定義本函數中用到的變量z為整型if(xy)z=x;/若xy成立,將x的值賦給變量zelse z=y;/否則(即xy不成立),將y的值賦給變量zreturn(z); /將z的值作為max函數值,返回到調用max函數的位置注意:本例程序中兩個函數都有return語句,請注意它們的異同。兩個函數都定義為整型,都有函數值,都需要用ret
21、urn語句為函數指定返回值。main函數中的return語句指定的返回值一般為0。max函數的返回值是max函數中求出的兩數中的最大值z,只有通過return語句才能把求出的z值作為函數的值并返回調用它的main函數中。C語言程序的結構一個程序由一個或多個源程序文件組成源程序文件包括:預處理指令、全局聲明、函數定義函數時C程序的主要組成部分一個C語言程序是由一個或多個函數組成的,其中必須包含唯一一個main函數程序中被調用的函數可以是系統提供的庫函數,也可以是用戶根據需要自己編制設計的函數一個函數包括兩個部分:函數首部和函數體,函數體一般包括聲明部分和執行部分程序總是從main函數開始執行程序
22、中的操作是由函數中的C語句完成的在每個數據聲明和語句的最后必須有一個分號C語言本身不提供輸入輸出語句,輸入輸出操作由函數完成程序應當包含注釋#include int main() int max(int x,int y);int a,b,c;scanf(%d,%d,&a,&b); c=max(a,b); printf(max=%dn,c); return 0;int max(int x,int y) int z;if(xy)z=x;else z=y; return(z);預處理指令main函數自定義函數庫函數調用自定義函數調用intmax(int x,int y) 函數類型函數名參數類型參數名
23、參數類型參數名函數首部函數體聲明部分執行部分執行部分執行部分運行C程序的步驟與方法開始編輯編譯有錯?連接執行 結果 正確?結束無正確有不正確可執行目標程序f.exe源程序f.c目標程序f.obj庫函數和其他目標程序程序設計的任務問題分析設計算法編寫程序對源程序進行編輯、編譯和連接運行程序分析結果編寫程序文檔2算法程序的靈魂第章數據結構對數據的描述。在程序中要指定用到哪些數據,以及這些數據的類型和數據的組織形式。算法對操作的描述。即要求計算機進行操作的步驟算法+數據結構=程序沃思算法程序員數據結構語言工具程序設計方法算法廣義地說,為解決一個問題而采取的方法和步驟,就稱為“算法”。對同一個問題,可
24、以有不同的解題方法和步驟。為了有效地進行解題,不僅需要保證算法正確,還要考慮算法的質量,選擇合適的算法。 非數值運算算法數值運算算法算法數值運算的目的是求數值解。由于數值運算往往有現成的模型,可以運用數值分析方法,因此對數值運算的算法的研究比較深入,算法比較成熟。計算機在非數值運算方面的應用遠超在數值運算方面的應用。非數值運算的種類繁多,要求各異,需要使用者參考已有的類似算法,重新設計解決特定問題的專門算法。簡單的算法舉例【例2.1】求12345S1: 先求1乘以2,得到結果2S2: 將步驟1得到的乘積2再乘以3,得到結果6S3: 將6再乘以4,得24S4: 將24再乘以5,得120算法步驟S
25、1: 令p=1,或寫成1=p(表示將1存放在變量p中)S2: 令i=2,或寫成2=i(表示將2存放在變量i中)S3: 使p與i相乘,乘積仍放在變量p中,可表示為: p*i=pS4: 使i的值加1,即i+1=iS5: 如果i不大于5,返回重新執行S3及其后的步驟S4和S5;否則,算法結束。最后得到p的值就是5!的值。算法步驟若題目改為: 求13579113=ii+2=i若i11,返回S3;否則,結束或者 若i11,結束;否則,返回S3i=32用這種方法表示的算法具有一般性、通用性和靈活性簡單的算法舉例【例2.2】有50個學生,要求輸出成績在80分以上的學生的學號和成績S1: 1=iS2: 如果g
26、i80,則輸出ni和gi,否則不輸出 S3: i+1=iS4: 如果i50,返回到S2,繼續執行,否則,算法結束算法步驟n:表示學生學號下標i:表示第幾個學生n1:表示第一個學生的學號ni:表示第i個學生的學號g:表示學生的成績g1:表示第一個學生的成績gi:表示第i個學生的成績簡單的算法舉例【例2.3】判定20002500年中的每一年是否為閏年,并將結果輸出S1: 2000=yearS2: 若year不能被4整除,則輸出year 的值和“不是閏年”。然后轉到S6,檢查下一個年份S3: 若year能被4整除,不能被100整除,則輸出year的值和“是閏年”。然后轉到S6S4: 若year能被4
27、00整除,輸出year的值和“是閏年” ,然后轉到S6S5: 輸出year的值和“不是閏年”S6: year+1=yearS7: 當year2500時,轉S2繼續執行,否則算法停止算法步驟Year被100整除,又能被400整除01030402Year被4整除,但不能被100整除Year不能被4整除其他非閏年非閏年閏年閏年簡單的算法舉例S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)signS5: term=sign(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否則算法結束算法步驟sign:表示
28、當前項的數值符號term:表示當前項的值sum:表示當前項的累加和deno:表示當前項的分母簡單的算法舉例【例2.5】給出一個大于或等于3的正整數,判斷它是不是一個素數S1: 輸入n的值S2: i=2(i作為除數)S3: n被i除,得余數rS4: 如果r=0,表示n能被i整除,則輸出n“不是素數”,算法結束;否則執行S5S5: i+1=iS6: 如果in-1,返回S3;否則輸出n的值以及“是素數”,然后結束算法步驟解題思路: 所謂素數(prime),是指除了1和該數本身之外,不能被其他任何整數整除的數。算法的特性12345有窮性 一個算法應包含有限的操作步驟,而不能是無限的確定性 算法中的每一
29、個步驟都應當是確定的,而不應當是含糊的、模棱兩可的 有零個或多個輸入所謂輸入是指在執行算法時需要從外界取得必要的信息有一個或多個輸出算法的目的是為了求解,“解” 就是輸出有效性算法中的每一個步驟都應當能有效地執行,并得到確定的結果算法的表示偽代碼結構化流程圖傳統流程圖自然語言用流程圖表示算法起止框輸入輸出框判斷框處理框流程線連接點注釋框算法的流程圖表示舉例【例2.6】將例2.1的算法用流程圖表示。 求12345。S1: 1=pS2: 2=iS3: p*i=pS4: i+1=iS5: 如果i5,則返回S3;否則結束算法步驟開始1=p2=ip*i=pi+1=i結束YN輸出pi5P: 表示被乘數i:
30、 表示乘數算法的流程圖表示舉例【例2.7】例2.2的算法用流程圖表示。 有50個學生,要求輸出成績在80分以上的學生的學號和成績。S1: 1=iS2: 如果gi80,則輸出ni和gi,否則不輸出 S3: i+1=iS4: 如果i50,返回到S2,繼續執行,否則,算法結束算法步驟開始1=ii+1=i1=ii+1=ii5結束YN輸入ni、gii50Ygi80Y輸出ni、giNn:表示學生學號下標i:表示第幾個學生n1:表示第一個學生的學號ni:表示第i個學生的學號g:表示學生的成績g1:表示第一個學生的成績gi:表示第i個學生的成績算法的流程圖表示舉例【例2.8】例2.3判定閏年的算法用流程圖表示
31、。 判定20002500年中的每一年是否為閏年,將結果輸出。開始2000=yearNYear不能被4整除Y輸出year“是閏年”NYear不能被100整除YYear不能被400整除輸出year“不是閏年”N輸出year“是閏年”輸出year“不是閏年”Year+1=yearYear2500YY結束算法的流程圖表示舉例S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)*signS5: term=sign*(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否則算法結束算法步驟sign:表示當前項的數值符
32、號term:表示當前項的值sum:表示當前項的累加和deno:表示當前項的分母開始1=sum1=sign結束輸入sumdeno100YN2=deno(-1)*sign=signsign*(1/deno)=termsum+term=sumdeno+1=deno簡單的算法舉例【例2.10】例2.5判斷素數的算法用流程圖表示。 對一個大于或等于3的正整數,判斷它是不是一個素數。算法步驟開始n/i的余數=r結束輸出n“是素數”YN2=ii+1=i輸入nr=0輸出n“不是素數”傳統流程圖的弊端傳統的流程圖用流程線指出各框的執行順序,對流程線的使用沒有嚴格限制。因此,使用者可以不受限制地使流程隨意地轉來轉
33、去,使流程圖變得毫無規律,閱讀時要花很大精力去追蹤流程,使人難以理解算法的邏輯。三種基本結構AB順序結構ABP真假選擇結構P假真循環結構A三種基本結構的特點1只有一個入口2只有一個出口3結構內的每一部分都有機會被執行到4結構內不存在“死循環”用N-S流程圖表示算法用偽代碼表示算法偽代碼是用介于自然語言和計算機語言之間的文字和符號來描述算法。它如同一篇文章一樣,自上而下地寫下來。每一行(或幾行)表示一個基本操作。它不用圖形符號,因此書寫方便,格式緊湊,修改方便,容易看懂,也便于向計算機語言算法(即程序)過渡。算法的流程圖表示舉例【例2.16】求5!,用偽代碼表示。S1: 1=pS2: 2=iS3
34、: p*i=pS4: i+1=iS5: 如果i5,則返回S3;否則結束算法步驟P: 表示被乘數i: 表示乘數begin(算法開始) 1=p 2=I while i5 p*i=p i+1=I print pend(算法結束)偽代碼算法的流程圖表示舉例begin(算法開始) 1=sign 1=sum 2=deno while deno100 (-1)*sign=sign sign*(1/deno)=term sum+term=sum deno+1=deno print sumend(算法結束)偽代碼S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)* signS5
35、: term=sign*(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否則算法結束算法步驟sign:表示當前項的數值符號term:表示當前項的值sum:表示當前項的累加和deno:表示當前項的分母用計算機語言表示算法【例2.18】將例2.16表示的算法(求5!)用C語言表示。S1: 1=pS2: 2=iS3: p*i=pS4: i+1=iS5: 如果i5,則返回S3;否則結束算法步驟P: 表示被乘數i: 表示乘數#include int main()int i,p;p=1;i=2;while(i=5)p=p*i;i=i+1;pr
36、intf(%dn,p);return 0;用計算機語言表示算法#include 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(%fn,sum);return 0;S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)* signS5: term=sign*(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否
37、則算法結束算法步驟sign:表示當前項的數值符號term:表示當前項的值sum:表示當前項的累加和deno:表示當前項的分母結構化程序設計方法3241模塊化設計自頂向下逐步細化結構化編碼3最簡單的C程序設計順序程序設計第章順序程序設計舉例【例3.2】有人用溫度計測量出用華氏法表示的溫度(如64F), 今要求把它轉換為以攝氏法表示的溫度(如17.8)。N-S流程圖輸入f的值輸出c的值#include int main()float f,c;/定義f和c為單精度浮點型變量f=64.0;/指定f的值c=(5.0/9)*(f-32);/利用公式計算c的值printf(f=%fnc=%fn,f,c);/
38、輸出c的值return 0; 順序程序設計舉例【例3.2】計算存款利息。有1000元,想存一年。有3種方法可選:(1)活期,年利率為r1;(2)一年期定期,年利率為r2;(3)存兩次半年定期,年利率為r3。請分別計算出一年后按3種方法所得到的本息和。N-S流程圖輸入p0,r1,r2,r3的值輸出p1,p2,p3#include int main ()float p0=1000, r1=0.0036, r2=0.0225, r3=0.0198, p1, p2, p3;/定義變量p1=p0*(1+r1);/計算活期本息和p2=p0*(1+r2);/計算一年定期本息和p3=p0*(1+r3/2)*(
39、1+r3/2);/計算存兩次半年定期的本息和printf(p1=%fnp2=%fnp3=%fn,p1, p2, p3);/輸出結果return 0;在定義實型變量的同時,對部分變量賦予初值在輸出p1,p2和p3的值之后,用n使輸出換行在計算機高級語言中,數據的兩種表現形式:常量A變量B常 量整型常量. 1000,12345,0,-3452實型常量. 小數形式123.456;指數形式12.34e3,-34.8E-233字符常量. 普通字符a,Z,#;轉義字符n,012,h1B4字符串常量. “123”,”boy”5符號常量.#define PI 3.1416 /注意行末沒有分號1轉義字符變 量變
40、量代表一個有名字的、具有特定屬性的一個存儲單元。變量用來存放數據,也就是存放變量的值。在程序運行期間,變量的值是可以改變的。變量必須先定義,后使用。a3變量名變量值存儲單元常 變 量Const int a=3常變量與常量的異同是: 常變量具有變量的基本屬性: 有類型,占存儲單元,只是不允許改變其值??梢哉f,常變量是有名字的不變量,而常量是沒有名字的不變量。有名字就便于在程序中被引用。#define Pi 3.1415926/定義符號常量const float pi=3.1415926;/定義常變量符號常量Pi和常變量pi都代表3.1415926,在程序中都能使用。但二者性質不同: 定義符號常量
41、用#define指令,它是預編譯指令,它只是用符號常量代表一個字符串,在預編譯時僅進行字符替換,在預編譯后,符號常量就不存在了(全置換成3.1415926了),對符號常量的名字是不分配存儲單元的。而常變量要占用存儲單元,有變量值,只是該值不改變而已。從使用的角度看,常變量具有符號常量的優點,而且使用更方便。有了常變量以后,可以不必多用符號常量。定義a為一個整型變量,指定其值為3,而且在變量存在期間其值不能改變說明: 有些編譯系統還未實現C 99的功能,因此不能使用常變量。標 識 符標識符就是一個對象的名字。用于標識變量、符號常量、函數、數組、類型等標識符只能由字母、數字和下劃線3種字符組成,且
42、第1個字符必須為字母或下劃線注意變量名中區分大小寫字母不能使用關鍵字作為變量名變量的名字應該盡量反映變量在程序中的作用與含義C語言中的關鍵字Autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile數據類型所謂類型,就是對數據分配存儲單元的安排,包括存儲單元的長度(占多少字節)以及數據的存儲形式。不同的類型分配不同的長度和存
43、儲形式。數據類型基本類型整型類型基本整型 int短整型 short int長整型 long int*雙長整型 long long int字符型 char*布爾型 bool浮點類型單精度浮點型 float雙精度浮點型 double復數浮點型 float_complex,double_complex,long long _complex枚舉類型 enum空類型 void派生類型指針類型 *數組類型 結構體類型 union函數類型計算機中帶符號整型數的表示:補碼0000000000000101正整數的補碼就是此數的二進制形式,5的補碼:負整數的補碼是將此數絕對值的二進制形式;除最高位符號位外其他數取
44、反;加1。-5的補碼:100000000000010111111111111110100111111111111011整型數據整型數據類型缺省形式的整型數據類型字節數取值范圍signed intint4-21474836482147483647(-231231-1)unsigned intUnsigned404294967295(0232-1)signed short intshort2-3276832767(-215215-1)unsigned short intunsigned short2065535(0216-1)signed long intlong4-214748364821474
45、83647(-231231-1)unsigned long intunsigned long404294967295(0232-1)signed long long intlong long8-92233720368547758089223372036854775807(-263263-1)unsigned long long intunsigned long long8018446744073709551615(0264-1)說明: C標準沒有具體規定各種類型數據所占用存儲單元的長度,只要求sizeof(short)sizeof(int)sizeof(long)sizeof(long lon
46、g),具體由各編譯系統自行決定的。sizeof是測量類型或變量長度的運算符。整型數據(1) 只有整型(包括字符型)數據可以加signed或unsigned修飾符,實型數據不能加。(2) 對無符號整型數據用“%u”格式輸出。%u表示用無符號十進制數的格式輸出。如:在將一個變量定義為無符號整型后,不應向它賦予一個負值,否則會得到錯誤的結果。如: unsigned short price=50;/定義price為無符號短整型變量printf(%un,price); /指定用無符號十進制數的格式輸出unsigned short price = -1;/不能把一個負整數存儲在無符號變量中printf(%
47、dn,price);字符型數據ASCII字符集包括:字母: 大寫英文字母AZ,小寫英文字母az數字: 09專門符號: 29個,包括! # & ( ) * + , - . / : ; ? _ | 空格符: 空格、水平制表符(tab)、垂直制表符、換行、換頁(form feed)不能顯示的字符: 空(null)字符(以0表示)、警告(以a表示)、退格(以b表示)、回車(以r表示)等ASCII碼表注意字符1和整數1是不同的概念。字符1只是代表一個形狀為1的符號,在需要時按原樣輸出,在內存中以ASCII碼形式存儲,占1個字節。而整數1是以整數存儲方式(二進制補碼方式)存儲的,占2個或4個字節。整數運算
48、1+1等于整數2,而字符1+1并不等于整數2或字符2。001100010000000000000001字符變量字符變量是用類型符char定義字符變量。char c=?;/定義c為字符型變量并使初值為字符?。?的ASCII代碼是63,系統把整數63賦給變量c。printf(%d %cn,c,c);/用“%d”格式輸出十進制整數63,用“%c”格式輸出字符?浮點型數據3.14159=3.14159*100=0.314159*101=314.159*10-2由于小數點位置可以浮動,所以實數的指數形式稱為浮點數。浮點數類型包括float(單精度浮點型)、double(雙精度浮點型)、long doub
49、le(長雙精度浮點型)。+.3141591數符小數部分 指數 +.314159 1013.14159注意由于用二進制形式表示一個實數以及存儲單元的長度是有限的,因此不可能得到完全精確的值,只能存儲成有限的精確度。小數部分占的位(bit)數愈多,數的有效數字愈多,精度也就愈高。指數部分占的位數愈多,則能表示的數值范圍愈大。實型數據類型字節數有效數字數值范圍(絕對值)float460以及1.2*10-383.4*1038double8150以及2.3*10-3081.7*10308long double8150以及2.3*10-3081.7*1030816190以及3.4*10-49321.1*1
50、04932常量的類型從常量的表示形式即可以判定其類型。不帶小數點的數值是整型常量,但應注意其有效范圍。在一個整數的末尾加大寫字母L或小寫字母l,表示它是長整型(long int)。凡以小數形式或指數形式出現的實數均是浮點型常量,在內存中都以指數形式存儲。C編譯系統把浮點型常量都按雙精度處理,分配8個字節。n字符常量23整型常量3.14159浮點型常量常量、變量與類型float a=3.14159;/3.14159為雙精度浮點常量,分配8個字節;a為float變量,分配4個字節編譯時系統會發出警告(warning: truncation from const double tofloat),提醒
51、用戶注意這種轉換可能損失精度一般不影響結果的正確性,但會影響結果的精度。可以在常量的末尾加專用字符,強制指定常量的類型:float a=3.14159f;/把此3.14159按單精度浮點常量處理,編譯時不出現“警告”long double a = 1.23L;/把此1.23作為long double型處理類型是變量的一個重要的屬性。變量是具體存在的實體,占用存儲單元,可以存放數據。而類型是變量的共性,是抽象的,不占用存儲單元,不能用來存放數據。int a; a=3; /正確。對整型變量a賦值 int=3;/錯誤。不能對類型賦值運算符和表達式運算符1算術運算符+ - * / % + -2關系運算
52、符 = = != 3邏輯運算符! & |4位運算符 | &5賦值運算符=及其擴展賦值運算符6條件運算符? : 7逗號運算符,8指針運算符* &9求字節數運算符sizeof10強制類型轉換運算符(類型)11成員運算符. -12下標運算符 13其他如函數調用運算符()常用的算數運算符運算符含義舉例結果+正號運算符(單目運算符)aa的值-負號運算符(單目運算符)-aa的算術負值*乘法運算符a*ba和b的乘積除法運算符aba除以b的商求余運算符aba除以b的余數加法運算符aba和b的和減法運算符a-ba和b的差兩個實數相除的結果是雙精度實數,兩個整數相除的結果為整數%運算符要求參加運算的運算對象(即操
53、作數)為整數,結果也是整數自增(+)自減(-)運算符+i,-i在使用之前,先使的值加/減1i+,i-在使用之后,使的值加/減1 +i是先執行i=i+1,再使用i的值;而i+是先使用i的值,再執行i=i+1。int i=3,j;j=+i;/i的值先變成4, 再賦給,j的值為int i=3,j;j=i+;/先將 i的值3賦給,的值為,然后變為int i=3;printf(“%d”,+i);/輸出int i=3;printf(“%d”,i+);/輸出3建議謹慎使用+和-運算符,只用最簡單的形式,即i+,i-,且把它們作為單獨的表達式。算術表達式和運算符的優先級與結合性用算術運算符和括號將運算對象(也
54、稱操作數)連接起來的、符合語法規則的式子稱為C算術表達式。運算對象包括常量、變量、函數等。C語言規定了運算符的優先級(例如先乘除后加減),還規定了運算符的結合性。在表達式求值時,先按運算符的優先級別順序執行,當在一個運算對象兩側的運算符的優先級別相同時,則按規定的“結合方向”處理。語言規定了各種運算符的結合方向(結合性), “自左至右的結合方向”又稱“左結合性”,即運算對象先與左面的運算符結合。相反“自右至左的結合方向”稱為“右結合性”。不同類型數據間的混合運算如果一個運算符兩側的數據類型不同,則先自動進行類型轉換,使二者成為同一種類型,然后進行運算。整型、實型、字符型數據間可以進行混合運算。
55、規律為: +、-、*、/運算的兩個數中有一個數為float或double型,結果是double型,因為系統將所有float型數據都先轉換為double型,然后進行運算。如果int型與float或double型數據進行運算,先把int型和float型數據轉換為double型,然后進行運算,結果是double型。字符(char)型數據與整型數據進行運算,就是把字符的ASCII代碼與整型數據進行運算。如果字符型數據與實型數據進行運算,則將字符的ASCII代碼轉換為double型數據,然后進行運算。不同類型數據間的混合運算int i=3,j;float f=2.5;double d=7.5;print
56、f(%lf,10+a+i*f-d/3);程序分析10+a+i*f-d/3 進行10+a的運算,a的值是整數97,運算結果為107。 由于“*”比“+”優先級高,先進行i*f的運算。先將i與f都轉成double型,運算結果為7.5,double型。 整數107與*的積相加。先將整數107轉換成雙精度數,相加結果為114.5,double型。 進行d/3的運算,先將3轉換成double型,d/3結果為2.5,double型。 將10+a+i*f的結果114.5與d/3的商2.5相減,結果為112.0,double型。不同類型數據間的混合運算【例3.3】給定一個大寫字母,要求用小寫字母輸出。解題思路
57、: 字符數據以ASCII碼存儲在內存中,形式與整數的存儲形式相同。 所以字符型數據和其他算術型數據之間可以互相賦值和運算。大小寫字母之間的關系是:同一個字母,用小寫表示的字符的ASCII代碼比用大寫表示的字符的ASCII代碼大32。#include int main()char c1,c2;c1=A; /將字符A的ASCII代碼放到c1變量中c2=c1+32;/得到字符a的ASCII代碼,放在c2變量中 printf(%cn,c2);/輸出c2的值,是一個字符printf(%dn,c2);/輸出c2的值,是字符a的ASCII代碼return 0;一個字符數據既可以以字符形式輸出,也可以以整數形
58、式輸出。01100001存儲(ASCII碼)%c %d輸出格式符 a 97顯示結果強制類型轉換自動類型轉換類型轉換在運算時不必用戶干預,系統自動進行的類型轉換。當自動類型轉換不能實現目的時,可以用強制類型轉換。強制類型轉換運算符(類型名)(表達式)(double)a將轉換成double型(int)(x+y)將x+y的值轉換成int型(float)(5%3)將5%3的值轉換成float型(int)x+y只將x轉換成整型,然后與y相加int a; float x,y;double b;a=(int)x進行強制類型運算(int)x后得到一個int類型的臨時值,它的值等于的整數部分,把它賦給a,注意x
59、的值和類型都未變化,仍為float型。該臨時值在賦值后就不再存在了。C 語 句C程序結構C程序源程序文件1源程序文件2預處理指令數據聲明函數1函數首部函數體數據聲明執行語句函數n源程序文件n表達式語句空語句函數調用語句復合語句C 語 句控制語句 if()else(條件語句) for()(循環語句) while()(循環語句) dowhile ()(循環語句) continue(結束本次循環語句) break(中止執行switch或循環語句) switch(多分支選擇語句) return(從函數返回語句) goto(轉向語句,在結構化程序中基本不用goto語句)()表示括號中是一個判別條件表示內
60、嵌的語句控制語句表達式語句空語句函數調用語句復合語句C 語 句函數調用語句由一個函數調用加一個分號構成。其中printf(This is a C statement. )是一個函數調用,加一個分號成為一個語句。控制語句表達式語句空語句函數調用語句復合語句C 語 句printf(This is a C statement. );函數調用語句表達式語句由一個表達式加一個分號構成,最典型的是由賦值表達式構成一個賦值語句。例如: a=3是一個賦值表達式,而a=3;是一個賦值語句??刂普Z句表達式語句空語句復合語句C 語 句表達式語句函數調用語句;只有一個分號的語句即為空語句。可以用來作為流程的轉向點(流
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動合同保險合同樣本
- 包回收合同樣本
- 加盟蛋糕店運營合同樣本
- 勞動合同樣本與簽訂指南
- 分階段付款合同樣本 英文
- 勞動外包合同標準文本
- 公交車刷卡合同樣本
- Module 10 (教學設計)-2023-2024學年外研版(一起)英語五年級下冊
- 寫融資租賃合同標準文本
- 出國旅游押金合同樣本
- 機械原理課程設計-自動蓋章機
- 長螺旋鉆樁施工記錄
- 中醫內科臨床診療指南-肺動脈高壓
- 三氯化硼-安全技術說明書MSDS
- 常用的飼料加工設備圖形符號
- GB∕T 28575-2020 YE3系列(IP55)三相異步電動機技術條件(機座號63~355)
- 《通過感官來發現》PPT
- 施工臨時便橋、便道安全要求內容
- 40篇短文搞定高考英語3500詞(共42頁)
- 輪式挖掘機的驅動橋殼工藝設計1
- 事業單位工作人員獎勵審批表--實用
評論
0/150
提交評論