C语言程序设计课件_第1页
C语言程序设计课件_第2页
C语言程序设计课件_第3页
C语言程序设计课件_第4页
C语言程序设计课件_第5页
已阅读5页,还剩1269页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C語言程式設計

第1章

C語言概述1.1C語言出現的歷史背景1.2C語言的特點1.3

簡單的C程式介紹1.4C程式的上機步驟1.5

習題1.1C語言出現的歷史背景C語言是國際上廣泛流行的電腦高級語言,既可用來寫系統軟體,也可用來寫應用軟體。以下軟體是使用C語言開發的:DOSWINDOWSMicrosoftVisualStudioUNIX應用軟體及遊戲

C語言的發展C語言的根源:ALGOL60(演算法語言,AlgorithmicLanguage)。1960年出現的ALGOL60是一種面向問題的高級語言,它離硬體比較遠,不宜用來編寫系統程式。1963年英國的劍橋大學推出了CPL(combinedprogramminglanguage)語言。CPL語言在ALGOL60的基礎上接近硬體一些,但規模比較大,難以實現。B語言:1967年英國劍橋大學的MatinRichards對CPL語言做了簡化,推出了BCPL(basiccombinedprogramminglanguage)語言。1970年美國貝爾實驗室的KenThompson以BCPL語言為基礎,又做了進一步簡化,設計出了很簡單的而且很接近硬體的B語言(取BCPL的第一個字母),並用B語言寫了第一個UNIX操作系統,在PDP

7上實現。1971年在PDP

11/20上實現了B語言,並寫了UNIX操作系統。但B語言過於簡單,功能有限。C語言:1972年至1973年間,貝爾實驗室的D.M.Ritchie在B語言的基礎上設計出了C語言(取BCPL的第二個字母)。C語言既保持了BCPL和B語言的優點(精練,接近硬體),又克服了它們的缺點(過於簡單,數據無類型等)。最初的C語言只是為描述和實現UNIX操作系統提供一種工作語言而設計的。1973年,K.Thompson和D.M.Ritchie兩人合作把UNIX的90%以上用C改寫,即UNIX第5版。原來的UNIX操作系統是1969年由美國的貝爾實驗室的K.Thompson和D.M.Ritchie開發成功的,是用組合語言寫的。C語言改進:C語言多次做了改進,但主要還是在貝爾實驗室內部使用。直到1975年UNIX第6版公佈後,C語言的突出優點才引起人們的普遍注意。1977年出現了不依賴於具體機器的C語言編譯文本《可移植C語言編譯程序》,使C移植到其他機器時所需做的工作大大簡化了,這也推動了UNIX操作系統迅速地在各種機器上實現。例如VAX、AT&T等電腦系統都相繼開發了UNIX。隨著UNIX的日益廣泛使用,C語言也迅速得到推廣。C語言和UNIX可以說是一對孿生兄弟,在發展過程中相輔相成。1978年以後,C語言已先後移植到大、中、小、微型機上,已獨立於UNIX和PDP了。現在C語言已風靡全世界,成為世界上應用最廣泛的幾種電腦語言之一。

以1978年發表的UNIX第7版中的C編譯程序為基礎,BrianW.Kernighan和DennisM.Ritchie(合稱K&R)合著了影響深遠的名著《TheCProgrammingLanguage》,這本書仲介紹的C語言成為後來廣泛使用的C語言版本的基礎,它被稱為標準C。1983年,美國國家標準化協會(ANSI)根據C語言問世以來各種版本對C的發展和擴充,制定了新的標準,稱為ANSIC。ANSIC比原來的標準C有了很大的發展。K&R在1988年修改了他們的經典著作《TheCProgrammingLanguage》,按照ANSIC標準重新寫了該書。1987年,ANSI又公佈了新標準—87ANSIC。1990年,國際標準化組織ISO(InternationalStandardOrganization)接受87ANSIC為ISOC的標準(ISO9899—1990)。目前流行的C編譯系統都是以它為基礎的。本書的敘述基本上以ANSIC為基礎。目前廣泛流行的各種版本C語言編譯系統雖然基本部分是相同的,但也有一些不同。在微型機上使用的有MicrosoftC、TurboC、QuickC、BORLANDC等,它們的不同版本又略有差異。1.2C語言的特點(1)語言簡潔緊湊,使用方便、靈活。C語言一共只有32個關鍵字,9種控制語句,程式書寫形式自由,主要用小寫字母表示,壓縮了一切不必要的成分。

(2)運算符豐富。C的運算符包含的範圍很廣泛,共有34種運算符。C把括弧、賦值、強制類型轉換等都作為運算符處理,從而使C的運算類型極其豐富,運算式類型多樣化。靈活使用各種運算符可以實現在其他高級語言中難以實現的運算。(3)數據結構豐富,具有現代化語言的各種數據結構。C的數據類型有整型、實型、字元型、數組類型、指針類型、結構體類型、共用體類型等。能用來實現各種複雜的數據結構(如鏈表、樹、棧等)的運算。尤其是指針類型數據,使用起來比PASCAL更為靈活、多樣。(4)具有結構化的控制語句(如if…else語句、while語句、do…while語句、switch語句、for語句)。用函數作為程式的模組單位,便於實現程式的模組化。C是良好的結構化語言,符合現代編程風格的要求。(5)語法限制不太嚴格,程式設計自由度大。例如對數組下標越界不做檢查,由程式編寫者自己保證程式的正確。對變數的類型使用比較靈活,例如整型數據與字元型數據可以通用。一般的高級語言語法檢查比較嚴,能檢查出幾乎所有的語法錯誤。而C語言允許程式編寫者有較大的自由度,因此,放寬了語法檢查。程式員應當仔細檢查程式,保證其正確,而不要過分依賴C編譯程序去查錯。編一個正確的C程式可能會比編一個其他高級語言程式難一些。(6)C語言能進行位(bit)操作,能實現組合語言的大部分功能,可以直接對硬體進行操作。因此C既具有高級語言的功能,又具有低級語言的許多功能,可用來寫系統軟體。C語言的這種雙重性,使它既是成功的系統描述語言,又是通用的程式設計語言。有人把C稱為“高級語言中的低級語言”或“中級語言”,意為兼有高級和低級語言的特點。按此觀點可將各語言分類如下:高級:BASIC,FORTRAN,COBOL(COmmonBusiness-OrientedLanguage面向商業的通用語言),PASCAL,Ada,Modula-2;中級:C,FORTH,宏彙編;低級:組合語言一般仍習慣將C語言稱為高級語言,因為C程式也要通過編譯、連接才能得到可執行的目標程式,這是和其他高級語言相同的。

從掌握語言的難易程度來看,C語言比其他語言難一些。BASIC是初學者入門的較好的語言,FORTRAN也比較好掌握。對科學計算多用FORTRAN或PL/Ⅰ;對商業和管理等數據處理領域,用COBOL為宜。C語言雖然也可用於科學計算和管理領域,但並不理想,C的特長不在這裏。對操作系統和系統實用程式以及需要對硬體進行操作的場合,用C語言明顯地優越於其他高級語言,有的大型應用軟體也用C語言編寫。從教學角度,由於PASCAL是世界上第一個結構化語言,而曾被認為是電腦專業的比較理想的教學語言。目前在數據結構等課程中一般用PASCAL語言舉例。到目前為止基本上只是教學語言。C語言也是理想的結構化語言,且描述能力強,同樣適於教學。操作系統課程多結合UNIX講解,而UNIX與C不可分,因此,C語言已經成為被廣泛使用的教學語言。C除了能用於教學外,還有廣泛的應用領域,因此更有生命力。PASCAL和其他高級語言的設計目標是通過嚴格的語法定義和檢查來保證程式的正確性,而C則是強調靈活性,使程式設計人員能有較大的自由度,以適應寬廣的應用面。總之,C語言對程式員要求較高。程式員使用C語言編寫程式會感到限制少,靈活性大,功能強,可以編寫出任何類型的程式。C語言已不僅用來編寫系統軟體,也用來編寫應用軟體。1.3簡單的C程式介紹下麵先介紹幾個簡單的C程式,然後從中分析C程式的特性。例1.1main(){printf("ThisisaCprogram.\n");}

本程式的作用是輸出以下一行資訊:Thisisacprogram.

其中main表示“主函數”。每一個C程式都必須有一個main函數。函數體由大括弧{}括起來。本例中主函數內只有一個輸出語句,printf是C語言中的輸出函數(詳見第4章)。雙引號(雙括弧)內的字串原樣輸出。“\n”是換行符,即在輸出“Thisisacprogram.”後回車換行。語句最後有一分號。例1.2main()/*求兩數之和*/{inta,b,sum;/*這是定義變數*/a=123;b=456;/*以下3行為C語句*/sum=a+b;printf("sumis%d/n",sum);}

本程式的作用是求兩個整數a和b之和sum。/*……*/表示注釋部分,為便於理解,我們用漢字表示注釋,當然也可以用英語或漢字拼音作注釋。注釋只是給人看的,對編譯和運行不起作用。注釋可以加在程式中任何位置。第2行是聲明部分,定義變數a和b,指定a和b為整型(int)变量。第3行是兩個賦值語句,使a和b的值分別為123和456。第4行使sum的值為a+b,第5行中“%d”是輸入輸出的“格式字串”,用來指定輸入輸出時的數據類型和格式(詳見第4章),“%d”表示“以十進位整數形式輸出”。在執行輸出時,此位置上代以一個十進位整數值。printf函數中括弧內最右端sum是要輸出的變數,現在它的值為579(即123+456之值)。因此輸出一行資訊為sumis579.例1.3main()/*主函數*/{inta,b,c;/*声明部分,定义变量*/scanf("%d,%d“,&a,&b);/*输入变量a和b的值*/c=max(a,b);/*調用max函數,將得到的值賦給c*/printf("max=%d",c);/*輸出c的值*/}intmax(intx,inty)/*定義max函數,函數值為整型,形式參數x,y為整型*/{intz;/*max函数中的声明部分,定义本函数中用到的变量z為整型*/if(x>y)z=x;elsez=y;return(z);/*將z的值返回,通過max帶回調用處*/}

本程式包括兩個函數:主函數main和被調用的函數max。max函數的作用是將x和y中較大者的值賦給變數z。return語句將z的值返回給主調函數main。返回值是通過函數名max帶回到main函數的調用處。main函數中的scanf是“輸入函數”的名字(scanf和printf都是C系統提供的標準輸入輸出函數)。程式中scanf函數的作用是輸入a和b的值。&a和&b中的“&”的含義是“取地址”,此scanf函數的作用是將兩個數值分別輸入到變數a和b的地址所標誌的單元中,也就是輸入給變數a和b。這種形式是與其他語言不同的。它相當於BASIC語言中的INPUTa,b或PASCAL語言中的Read(a,b)。&a和&b前面的“%d,%d”的含義與前相同,只是現在用於“輸入”。它指定輸入的兩個數據按十進位整數形式輸入。main函數中第4行為調用max函數,在調用時將實際參數a和b的值分別傳送給max函數中的形式參數x和y。經過執行max函數得到一個返回值(即max函數中變數z的值),把這個值賦給變數c。然後輸出c的值。printf函數中雙引號內的“max=%d”,在輸出時,其中“%d”將由c的值取代之,“max=”原樣輸出。程式運行情況如下:8,5

(輸入8和5給a和b)max=8(輸出c的值)

本例用到了函數調用、實際參數和形式參數等概念,我們只做了很簡單的解釋。讀者如對此不大理解,可以先不予以深究,在學到以後有關章節時,問題自然迎刃而解。通過以上幾個例子,可以看到:(1)C程式是由函數構成的。一個C根源程式至少包含一個main函數,也可以包含一個main函數和若干個其他函數。因此,函數是C程式的基本單位。被調用的函數可以是系統提供的庫函數(例如printf和scanf函數),也可以是用戶根據需要自己編制設計的函數(例如,例1.3中的max函數)。C的函數相當於其他語言中的副程式,用函數來實現特定的功能。程式中的全部工作都是由各個函數分別完成的。

編寫C程式就是編寫一個個函數。C的函數庫十分豐富,ANSIC建議的標準庫函數中包括100多個函數,TurboC和MSC4.0提供300多個庫函數。C的這種特點使得容易實現程式的模組化。(2)一個函數由兩部分組成:①函數的首部,即函數的第一行。包括函數名、函數類型、函數屬性、函數參數(形參)名、參數類型。例如,例1.3中的max函數的首部為intmax(intx,

inty)↓↓↓↓

↓↓函數類型函數名函數參數類型函數參數名函數參數類型函數參數名

一個函數名後面必須跟一對圓括弧,函數參數可以沒有,如main()。②函數體,即函數首部下面的大括弧{……}內的部分。如果一個函數內有多個大括弧,則最外層的一對{}為函數體的範圍。函數體一般包括:聲明部分:在這部分中定義所用到的變數,如例1.3中main函數中的“inta,b,c;”。在第8章中還將會看到,在聲明部分中要對所調用的函數進行聲明。執行部分:由若干個語句組成。當然,在某些情況下也可以沒有聲明部分(例如,例1.1)。甚至可以既無聲明部分,也無執行部分。如:dump(){}它是一個空函數,什麼也不幹,但這是合法的。(3)一個C程式總是從main函數開始執行的,而不論main函數在整個程式中的位置如何(main函數可以放在程式最前頭,也可以放在程式最後,或在一些函數之前,在另一些函數之後)。(4)C程式書寫格式自由,一行內可以寫幾個語句,一個語句可以分寫在多行上。C程式沒有行號.(5)每個語句和數據定義的最後必須有一個分號。分號是C語句的必要組成部分。例如:c=a+b;分號不可少。即使是程式中最後一個語句也應包含分號(這是和PASCAL語言不同的)。(6)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數scanf和printf等函數來完成的。C對輸入輸出實行“函數化”。由於輸入輸出操作牽涉到具體的電腦設備,把輸入輸出操作放在函數中處理,就可以使C語言本身的規模較小,編譯程序簡單,很容易在各種機器上實現,程式具有可移植性。當然,不同的C語言系統需要對函數庫中的函數作不同的處理。不同的C系統除了提供函數庫中的標準函數外,還按照硬體的情況提供一些專門的函數。因此不同的系統所提供的函數個數和功能是有所不同的。(7)可以用/*……*/對C程式中的任何部分作注釋。一個好的、有使用價值的根源程式都應當加上必要的注釋,以增加程式的可讀性。1.4C程式的上機步驟

程式,就是一組電腦能識別和執行的指令。每一條指令使電腦執行特定的操作。程式可以用高級語言(例如QBASIC,FORTRAN,PASCAL,C等)編寫。用高級語言編寫的程式稱為“根源程式”(sourceprogram)。從根本上說,電腦只能識別和執行由0和1組成的二進位的指令,而不能識別和執行用高級語言寫的指令。為了使電腦能執行高級語言根源程式,必須先用一種稱為“編譯程序”的軟體,把根源程式翻譯成二進位形式的“目標程式”,然後將該目標程式與系統的函數庫和其他目標程式連接起來,形成可執行的目標程式。圖1.1下麵分別就三種不同的環境下運行C程式作一簡單介紹。1.用TurboC運行C程式的步驟TurboC是在微機上廣泛使用的編譯程序。它具有方便、直觀、易用的介面和豐富的庫函數。它向用戶提供一個集成環境,把程式的編輯、編譯、連接和運行等操作全部集中在一個介面上進行,使用十分方便。為了能使用TurboC,必須先將TurboC編譯程序裝入磁片的某一目錄下,例如放在C盤根目錄下一級TC子目錄下。圖1.2(1)調用TurboC程式。如果用戶的當前目錄是TurboC編譯程序所在的子目錄(例如TC子目錄),只需從鍵盤鍵入“tc”命令即可:C:\TC>tc

螢幕上出現TurboC集成環境,見圖1.2所示。從圖1.2可以看到在集成環境的上部,有一行“主菜單”,其中包括下麵8個菜單項:

FileEditRunCompileProjectOptionDebugbreak/watch

用戶可以通過以上菜單項來選擇使用TurboC集成環境所提供的TurboC的各項主要功能。以上8個菜單項分別代表:檔操作、編輯、運行、編譯、專案檔、選項、調試、中斷/觀察等功能。用鍵盤上的“←”和“→”鍵可以選擇菜單條中所需要的菜單項,被選中的項以“反相”圖1.3形式顯示

(例如主菜單中的各項原來以白底黑字顯示,被選中時改為以黑底白字顯示)。此時若按回車鍵,就會出現一個下拉菜單。例如在選中“File”菜單並按回車鍵後,螢幕上“File”下麵出現下拉菜單,見圖1.3所示。它是一個子菜單,提供多項選擇。可以用“↓”鍵選擇所需要的項。例如選擇“New”處,並按回車鍵,表示要建立一個新的C根源程式。

圖1.3

如果選擇“Load”,并按回车键,表示要调入一个已有的源文件,此时屏幕上出现一个对话框(見圖1.4)。要求你輸入該檔的名字。用戶可輸入該檔案名,例如:tc1.c,如果已存在此檔,則系統會將此檔調入記憶體並顯示在螢幕上。此時自動轉為編輯(Edit)狀態。如果原來不存在此檔案名,則系統會建立一個以指定的名字命名的新檔。圖1.4(2)編輯原始檔案。在編輯(Edit)狀態下可以根據需要輸入或修改根源程式。(3)編譯根源程式。選擇“Compile”菜單並在其下拉菜單中選擇“CompiletoOBJ”,則進行編譯,得到一個尾碼為.obj的目标程序(为方便起见,在一般书刊中,以上菜单的选择以“Compile/CompiletoOBJ”表示)。然後再選菜單“Compile/LinkEXEfile”,进行连接操作,可得到一个后缀为.exe的可執行檔。也可以將編譯和連接合為一個步驟進行。選菜單“Compile/MakeEXEfile”或按“F9”鍵,即可一次完成編譯和連接。在螢幕上會顯示編譯或連接時有無錯誤和有幾個錯誤,見圖1.5所示。此時按任何一個鍵,圖1.5所顯示的“編譯資訊框”會圖1.5

消失,螢幕上會恢復顯示根源程式,游標停留在出錯之處。在螢幕的下半部分顯示出有錯誤的行和錯誤的原因。根據此信息修改根源程式。修改完畢認為無錯後,再按“F9”,再次進行編譯和連接,如此反復進行到不顯示出錯為止。(4)執行程式。按“F10”鍵,在窗口上部的主菜單中某一項處出現“反相”顯示(黑色亮塊)。FileEditRunCompileProjectOptionDebugBreak/watch

用“→”鍵將亮塊移到“Run”,按回車鍵,在其下拉菜單中選擇“Run”項,或直接按Ctrl+F9鍵,系統就會執行已編譯好的目標檔。此時,TC集成環境窗口消失,螢幕上顯示出程式運行時輸出的結果。如果程式需要輸入數據(如例1.3),則應在此時,從鍵盤輸入所需數據,然後程式會接著執行,輸出結果。如果發現運行結果不對,要重新修改根源程式,可以再按“F10”鍵,並用“←”使亮塊移到“Edit”處,

按回車鍵,即進入編輯狀態,可以根據需要修改根源程式,並重複上述(2),(3),(4)步,直到得到正確結果為止。(5)可以用“Alt”和“X”鍵(同時按此兩鍵),脫離TurboC,回到DOS命令狀態。此時,可以用DOS命令顯示根源程式和運行程式:C>TYPEtc1.c

(列出根源程式清單)C>tc1

(執行目標程式tc1.exe)如果想再修改根源程式,可以重新執行步驟(1),並輸入根源程式檔案名即可。2.在UNIX操作系統下運行C程式的步驟(1)用編輯程式

(如UNIX系統的文本行編輯程式ed,或螢幕編輯程式vi)將根源程式輸入電腦,經修改認為無誤後,存入檔系統。設用戶將原始檔案定名為f.c(C根源程式的尾碼一般定為“.c”)。(2)編譯。調用C編譯程序cc對原始檔案進行編譯。可打入命令:ccf.c

如果在編譯過程中發現根源程式有語法錯誤,則系統會輸出“出錯資訊”,告訴用戶第幾行有什麼樣的錯誤。用戶應重新調用編輯程式,修改後再進行編譯。如此直到編譯通過為止。編譯時先生成一個組合語言程式(即將C根源程式翻譯成為一個組合語言程式),然後由編譯程序再將組合語言程式翻譯成機器指令程式,即目標程式。目標程式的檔案名與相應的根源程式同名,但尾碼為“.o”(表示它是目標檔),上述原始檔案f.c經編譯後得到目標程式f.o。(3)連接。將目標程式和庫函數或其他目標程式連接成可執行的目標程式。在UNIX系統下,連接是由cc自動完成的。最後得到可執行檔,檔案名由系統自動確定為a.out。如果不想用系統定的檔案名a.out,也可以在編譯時自己指定可執行檔案名。例如想指定為f.out,可以在編譯時打入以下命令:cc-of.outf.c

它的作用是將根源程式f.c編譯成可執行程式,檔案名為f.out。(4)執行程式。只需輸入可執行檔案名即可。例如:a.out

(系統指定的檔案名)

或f.out

(用戶指定的檔案名)3.在DOS下用MicrosoftC6.0編譯程序運行C程式步驟

MicrosoftC是微軟公司為IBM系列微機開發的C編譯系統。MSC6.0版本提供了多個庫函數。老版本的MSC採用基於DOS平臺的命令行方式。MSC6.0增加了基於滑鼠和窗口的“程式員工作臺”(programmer'sworkbench,缩写为PWB),它也是一个集成环境。MSC也是人們常用的C編譯系統之一。目前,大多數使用MSC的人習慣用命令行方式。因此我們在這裏只簡單地介紹命令行方式的用法。(1)編輯C根源程式。可以用任何全螢幕編輯系統輸入和編輯根源程式。假設已輸入和編輯好的原始檔案名為a1.c。(2)編譯和連接。MSC提供了一個功能很強的CL命令,可一次完成程式的編譯和連接。CL是Compile和Link的第一個字母。用法如下:

CLa1.c

(對根源程式a1.c進行編譯和連接)如果在編譯和連接時出現“出錯資訊”,則需要重新編輯(修改)根源程式。編譯和連接完成後,產生一個可執行檔a1.exe。

(3)執行程式。只需輸入可執行檔案名:a1

即可得到运行结果。以上步骤只需上机试一下,即可明白。例題1.讀入兩個整數,輸出它們的積

設兩個整數分別為x,y,積為m;程式首先調用printf()函數,輸出提示用戶輸入數據的提示資訊,然後調用scanf()函數,為變數x和y輸入值;接著求x與y的積m;最後輸出m。

用演算法描述如下:

讀入兩個整數,輸出它們的積

{

輸出提示用戶輸入數據的資訊;

輸入變數x和y的值;

m=x*y;

輸出m;

}

程式代碼如下:

#include<stdio.h>Main(){

intx,y,m;

/*定認變數x,y,m*/

printf("Inputxandy\n");

/*提示用戶輸入數據*/

scanf("%d%d",&x,&y);

/*输入x和y的值*/

m=x*y;

/*求m=x*y*/

printf("%d*%d=%d\n",x,y,m);

/*輸出結果x*y=m*/

}

程式執行結果如下:

Inputxandy

21

30

x*y=630

例題2從兩個浮點數中找出大數

設兩個派出點數分別為x,y,它們中的大數為c;程式首先調用printf()函數,輸出提示用戶輸入數據的提示資訊,然後調用scanf()函數,為就是x和y輸入值;接著求x與y的大值並存入變數c;最後輸出c。

演算法描述如下:

從兩個浮點數中求大數

{

輸出提示用戶回值為據的資訊;

輸入變數x和y的值;

if(x>y)c=x;

else

c=y;

輸出c;

}

2.1C的數據類型一個程式應包括以下兩方面內容:(1)對數據的描述。在程式中要指定數據的類型和數據的組織形式,即數據結構(datastructure)。(2)對操作的描述(操作步驟),也就是演算法(algorithm)。數據是操作的對象,操作的目的是對數據進行加工處理,以得到期望的結果。打個比方,廚師做菜肴,需要有菜譜。菜譜上一般應包括:

①配料,指出應使用哪些原料;

②操作步驟,指出如何使用這些原料按規定的步驟加工成所需的菜肴。面對同一些原料可以加工出不同風味的菜肴。

作為程式設計人員,必須認真考慮和設計數據結構和操作步驟(即演算法)。因此,著名電腦科學家沃思(nikiklausWirth)提出一个公式数据结构+演算法=程式實際上,一個程式除了以上兩個主要要素之外,還應當採用結構化程式設計方法進行程式設計,並且用某一種電腦語言表示。因此,可以這樣表示:

程式=演算法(algorithm)+數據結構(datastructure)+程式設計方法

+語言工具和環境

也就是說,以上4個方面是一個程式設計人員所應具備的知識。在設計一個程式時要綜合運用這幾方面的知識。在本書中不可能全面介紹這些內容,它們都屬於有關的專門課程範疇。在這4個方面中,演算法是靈魂,數據結構是加工對象,語言是工具,編程需要採用合適的方法。演算法是解決“做什麼”和“怎麼做”的問題。程式中的操作語句,實際上就是演算法的體現。演算法處理的對象是數據,而數據是以某種特定的形式存在的(例如整數、實數、字元等形式)。不同的數據之間往往還存在某些聯繫(例如由若干個整數組成一個整數數組)。所謂數據結構指的是數據的組織形式。例如,數組就是一種數據結構。不同的電腦語言所允許定義和使用的數據結構是不同的。例如,c語言提供了“結構體”這樣一種數據結構,而fortran語言就不提供這種數據結構。處理同一類問題,如果數據結構不同,演算法也會不同。例如,對10個整數排序和對由10個整數構成的數組排序的演算法是不同的。因此,在考慮演算法時,必須注意數據結構。實際上,應當綜合考慮演算法和數據結構,選擇最佳的數據結構和演算法。

C語言的數據結構是以數據類型形式出現的。c的數據類型如下:

基本類型:

整型,字元型,實型(浮點型,包括單精確度型,雙精度型),枚舉類型.

構造類型:

數組類型,結構體類型,共用體類型

指針類型

空類型

C語言中數據有常量與變數之分,它們分別屬於以上這些類型。由以上這些數據類型還可以構成更複雜的數據結構。例如利用指針和結構體類型可以構成表、樹、棧等複雜的數據結構。在程式中對用到的所有數據都必須指定其數據類型。在本章中主要介紹基本數據類型。2.2常量與變數2.2.1常量和符號常量在程式運行過程中,其值不能被改變的量稱為常量。常量區分為不同的類型,如12,0,-3為整型常量,4.6、-1.23為實型常量,‘a’,‘d’為字元常量。常量一般從其字面形式即可判別。這種常量稱為字面常量或直接常量。

也可以用一個識別字代表一個常量,如:例2.1符號常量的使用。

#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}

程式中用#define命令行定義PRICE代表常量30,此後凡在本文件中出現的PRICE都代表30,可以和常量一樣進行運算,程式運行結果為

total=300

有關#define命令行的詳細用法參見第8章。

這種用一個識別字代表一個常量的,稱為符號常量,即識別字形式的常量。請注意符號常量不同於變數,它的值在其作用域(在本例中為主函數)內不能改變,也不能再被賦值。如再用以下賦值語句給PRICE賦值是錯誤的。

PRICE=40;

習慣上,符號常量名用大寫,變數用小寫,以示區別。使用符號常量的好處是:(1)含義清楚。如上面的程式中,看程式時從price就可知道它代表價格。因此定義符號常量名時應考慮“見名知意”。在一個規範的程式中不提倡使用很多的常數,如:sum=15*30*23.5*43。在檢查程式時搞不清各個常數究竟代表什麼。應儘量使用“見名知意”的變數名和符號常量。

(2)在需要改變一個常量時能做到“一改全改”。例如在程式中多處用到某物品的價格,如果價格用常數表示,則在價格調整時,就需要在程式中作多處修改,若用符號常量PRICE代表價格,只需改動一處即可。如:

#definePRICE35

在程式中所有以PRICE代表的價格就會一律自動改為35。2.2.2變數其值可以改變的量稱為變數。一個變數應該有一個名字,在內存中佔據一定的存儲單元。在該存儲單元中存放變數的值。請注意區分變數名和變數值這兩個不同的概念,見圖2.1。變數名實際上是一個符號地址,在對程式編譯連接時由系統給每一個變數名分配一個記憶體地址。在程式中從變數中取值,實際上是通過變數名找到相應的記憶體地址,從其存儲單元中讀取數據。圖2.1和其他高級語言一樣,用來標識變數名、符號常量名、函數名、數組名、類型名、檔案名的有效字元序列稱為識別字(identifier)。簡單地說,識別字就是一個名字。

C語言規定識別字只能由字母、數字和下劃線三種字元組成,且第一個字元必須為字母或下劃線。下麵列出的是合法的識別字,也是合法的變數名:

sum,average,-total,class,day,month,

student-name,tan,lotus-1-2-3,basic,li-ling

下麵是不合法的識別字和變數名:M.d.John,y123,#33,3d64,a>b

注意,大寫字母和小寫字母被認為是兩個不同的字元。因此,sum和suM,class和class是兩個不同的變數名。一般,變數名用小寫字母表示,與人們日常習慣一致,以增加可讀性。

ANSIC標準沒有規定識別字的長度(字元個數),但各個c編譯系統都有自己的規定。有的系統(如IBMPC的MSC)取8個字元,假如程式中出現的變數名長度大於8個字元,則只有前面8個字元有效,後面的不被識別。例如,有兩個變數:student_name和student_number,由於二者的前8個字元相同,系統認為這兩個變數是一回事而不加區別。可以將它們改為stud_name和stud_num,以使之區別。

TurboC則允許32個字元。因此,在寫程式時應瞭解所用系統對識別字長度的規定,以免出現上面的混淆。這種錯誤並不反映在編譯過程中(即語法無錯誤),但運行結果顯然不對。為了程式的可移植性(即在甲機器上運行的程式可以基本上不加修改,就能移到乙機器上運行)以及閱讀程式的方便,建議變數名的長度不要超過8個字元。如前所述,在選擇變數名和其他識別字時,應注意做到“見名知意”,即選有含意的英文單詞(或其縮寫)作識別字,如count、name、day、month、total、country等,除了數值計算程式外,一般不要用代數符號(如a、b、c、x1、y1等)作變數名,以增加程式的可讀性。這是結構化程式的一個特徵。本書在一些簡單的舉例中,為方便起見,仍用單字符的變數?如a、b、c等),請讀者注意不要在其他所有程式中都如此。在c語言中,要求對所有用到的變數作強制定義,也就是“先定義,後使用”,如例1.2、例1.3那樣。這樣做的目的是:

(1)凡未被事先定義的,不作為變數名,這就能保證程式中變數名使用得正確。例如,如果在定義部分寫了

intstudent;

而在執行語句中錯寫成staent。如:

staent=30;在編譯時檢查出statent未經定義,不作為變數名。輸出“變數statent未經聲明”的資訊,便於用戶發現錯誤,避免變數名使用時出錯。(2)每一個變數被指定為一確定類型,在編譯時就能為其分配相應的存儲單元。如指定a、b為int型,turboc編譯系統為a和b各分配兩個位元組,並按整數方式存儲數據。(3)指定每一變數屬於一個類型,這就便於在編譯時,據此檢查該變數所進行的運算是否合法。例如,整型變數a和b,可以進行求餘運算:a%b

%是“求餘”(見2.8節),得到a/b的餘數。如果將a、b指定為實型變數,則不允許進行“求餘”運算,在編譯時會給出有關“出錯資訊”。2.3整型數據(integer)2.3.1整型常量的表示方法整型常量即整常數。c整常數可用以下三種形式表示:(1)十進位整數。如123,-456,0。(2)八進制整數。以0開頭的數是八進制數。如0123表示八進制數123,即(123)8,其值為:1×82+2×81+3×80,等於十進位數83。-011表示八進制-11,十進位數-9。(3)十六進制整數。以0x開頭的數是十六進制數。如0x123,代表十六進制數123,即(123)16=1×162+2×161+3×160=256+32+3=291。-0x12等於十進位數-18。2.3.2整型變數1.整型數據在內存中的存放形式數據在內存中是以二進位形式存放的。如果定義了一個整型變數i:

inti;/*定義為整型變數*/i=10;/*給i賦以整數10*/

十進位數10的二進位形式為1010,在微機上使用的c編譯系統,每一個整型變數在內存中占2個位元組。圖2.2(a)是數據存放示意圖。圖2.2(b)是數據在內存中實際存放情況。圖2.2

實際上,數值是以補數(complement)表示的。一個正數的補數和其原碼的形式相同。圖2.2(b)就是用補數形式表示的。如果數值是負的,在內存中如何用補數形式表示呢?求負數的補數的方法是:將該數的絕對值的二進位形式,按位取反再加1。例如求-10的補數:①取-10的絕對值10;②10的绝对值的二进制形式为1010;③對1010取反得1111111111110101(一個整數占16位);④再加1得1111111111110110,見圖2.3。圖2.3

可知整數的16位中,最左面的一位是表示符號的,該位為0,表示數值為正;為1則數值為負。關於補數的知識不屬於本書的範圍,但學習c語言的讀者應該比學習其他高級語言的讀者對數據在內存中的表示形式有更多的瞭解。這樣才能理解不同類型數據間轉換的規律。在本章稍後的敘述中還要接觸到這方面的問題。2.整型變數的分類整型變數的基本類型符為int。可以根據數值的範圍將變數定義為基本整型、短整型或長整型。在int之前可以根据需要分别加上修饰符(modifier):short(短型)或long(長型)。因此有以下三種整型變數:

(1)基本整型,以int表示。

(2)短整型,以shortint表示,或以short表示。

(3)長整型,以longint表示,或以long表示。在turboc中一個int型的變數的值範圍為-215~(215-1),即-32768~32767。在實際應用中,變數的值常常是正的(如學號、庫存量、年齡、存款額等)。為了充分利用變數的表數範圍,此時可以將變數定義為“無符號”類型。對以上三種都可以加上修飾符unsigned,以指定是“無符號數”。如果加上修飾符signed,則指定是“有符號數”。如果既不指定為signed,也不指定為unsigned,則隱含為有符號(signed)。實際上signed是完全可以不寫的。歸納起來,可以用以下6種整型變數。即:

有符號基本整型

[signed]int

無符號基本整型

unsignedint

有符號短整型

[signed]short[int]

無符號短整型

unsignedshort[int]

有符號長整型

[signed]long[int]

無符號長整型

unsignedlong[int]

如果不指定unsigned或指定signed,則存儲單元中最高位代表符號(0為正,1為負)。如果指定unsigned,為無符號型,存儲單元中全部二進位(bit)用作存放數本身,而不包括符號。無符號型變數只能存放不帶符號的整數,如123、4687等,而不能存放負數,如-123、-3。一個無符號整型變數中可以存放的正數的範圍比一般整型變數中正數的範圍擴大一倍。如果在程式中定義a和b兩個變數:

inta;

unsignedintb;

則變數a的數值範圍為-32768~32767。而變數b的數值範圍為0~65535。圖2.4(a)表示有符號整型變數a的最大值(32767)。圖2.4(b)表示無符號整型變數b的最大值(65535)。圖2.4

C標準沒有具體規定以上各類數據所占記憶體位元組數,只要求long型數據長度不短於int型,short型不長於int型。具體如何實現,由各電腦系統自行決定。如在微機上,int和short都是16位,而long是32位。在Vax750上,short是16位,而int和long都是32位,一般以一個機器字(word)存放一個int數據。前一階段,微機的字長一般為16位,故以16位存放一個整數,但整數的範圍太小,往往不夠用,故將long型定為32位。而Vax的字長為32位,以32位存放一個整數,範圍可達正負21億,已足夠用了,不必再將long型定為64位。所以將int和long都定為32位。通常的做法是:把long定為32位,把short定為16位,而int可以是16位,也可以是32位。這主要取決於機器字長。在微機上用long型可以得到大範圍的整數,但同時會降低運算速度,因此除非不得已,不要隨便使用long型。方括弧內的部分是可以省寫的。例如signedshortint與short等價,尤其是signed是完全多餘的,一般都不寫signed。一個整數(以13為例)在存儲單元中的存儲情況,見圖2.5所示(假設使用的是微機上的c編譯系統,如turboC、MsC)。圖2.53.整型變數的定義前面已提到,c規定在程式中所有用到的變數都必須在程式中定義,即“強制類型定義”。例如:

inta,b;(指定變數a、b為整型)

unsignedshortc,d;(指定變數c、d為無符號短整型)longe,f;(指定變數e、f為長整型)

對變數的定義,一般是放在一個函數的開頭部分的聲明部分(也可以放在函數中某一分程式內,但作用域只限它所在的分程式,這將在第6章介紹)。例2.2整型變數的定義與使用。

main(){inta,b,c,d;/*指定a、b、c、d為整型變數*/unsignedu;/*指定u為無符號整型變數*/a=12;b=-24;u=10;

c=a+u;d=b+u;

printf("a+u=%d,b+u=%d\n",c,d);

}运行结果为

a+u=22,b+u=-14

可以看到不同種類的整型數據可以進行算術運算。在本例中是int型數據與unsignedint型數據進行相加相減運算(有關運算的規則在本章2.7節仲介紹)。4.整型數據的溢出在turboc中一個int型變數的最大允許值為32767,如果再加1,會出現什麼情況?例2.3整型數據的溢出。

main()

{inta,b;

a=32767;b=a+1;printf("%d,%d",a,b);}運行結果為32767,-32768圖2.6

從圖2.6可以看到:變數a的最高位為0,後15位全為1。加1後變成第1位為1,後面15位全為0。而它是-32768的補數形式,所以輸出變數b的值為-32768。請注意:一個整型變數只能容納-32768~32767範圍內的數,無法表示大於32767的數。遇此情況就發生“溢出”,但運行時並不報錯。它好像汽車的里程表一樣,達到最大值以後,又從最小值開始計數。所以,32767加1得不到32768,而得到-32768,這可能與程式編制者的原意不同。從這裏可以看到:c的用法比較靈活,往往出現副作用,而系統又不給出“出錯資訊”,要靠程式員的細心和經驗來保證結果的正確。將變數b改成long型就可得到預期的結果32768。2.3.3整型常量的類型我們已知整型變數可分為int、shortint、longint和unsignedint、unsignedshort、unsignedlong等類別。那麼常量是否也有這些類別?在將一個整型常量賦值給上述幾種類別的整型變數時如何做到類型匹配?請注意以下幾點:

(1)一個整數,如果其值在-32768~+32767範圍內,認為它是int型,它可以賦值給int型和longint型變數。

(2)一個整數,如果其值超過了上述範圍,而在-2147483648~+2147483647範圍內,則認為它是長整型,可以將它賦值給一個longint型變數。(3)如果某一電腦系統的c版本(例如turboc)確定shortint與int型數據在內存中佔據的長度相同,則它的表數範圍與int型相同。因此,一個int型的常量也同時是一個shortint型常量,可以賦給int型或shortint型變數。(4)一個整常量後面加一個字母u,認為是unsignedint型,如12345u,在內存中按unsignedint规定的方式存放(存儲單元中最高位不作為符號位,而用來存儲數據,見圖2.4(b)。如果寫成-12345u,則先將-12345轉換成其補數53191,然後按無符號數存儲。(5)在一個整常量後面加一個字母l或l,則認為是longint型常量。

例如123l、432l、0l等,這往往用於函數調用中。如果函數的形參為longint型,則要求實參也為longint型,此時用123作實參不行,而要用123l作實參。2.4實型數據(floatingpointnumbers)2.4.1實型常量的表示方法實數(realnumber)又稱浮點數(floating-pointnumber)。實數有兩種表示形式:

(1)十進位小數形式。它由數字和小數點組成(注意必須有小數點)。.123、123.、123.0、0.0都是十進位小數形式。

(2)指數形式。如123e3或123e3都代表123×103。但注意字母e(或e)之前必須有數字,且e後面的指數必須為整數,如e3、2.1e3.5、.e3、e等都不是合法的指數形式。

一個實數可以有多種指數表示形式。例如123.456可以表示為123.456e0,12.3456e1、1.23456e2、0.123456e3、0.0123456e4、0.00123456e5等。把其中的1.23456e2稱為“規範化的指數形式”,即在字母e(或e)之前的小數部分中,小數點左邊應有一位(且只能有一位)非零的數字。例如2.3478e2、3.0999e5、6.46832e12都屬於規範化的指數形式,而12.908e10、0.4578e3、756e0則不屬於規範化的指數形式。一個實數在用指數形式輸出時,是按規範化的指數形式輸出的。例如,指定將實數5689.65按指數形式輸出,必然輸出5.68965e+003,而不会是0.568965e+004或56.8965e+002。1.實型數據在內存中的存放形式

在常用的微機系統中,一個實型數據在內存中占4個位元組(32位)。與整型數據的存圖2.7儲方式不同,實型數據是按照指數形式存儲的。系統把一個實型數據分成小數部分和指數部分,分別存放。指數部分採用規範化的指數形式。實數3.14159在內存中的存放形式可以用圖2.7示意。2.4.2

實型變數圖2.7

圖中是用十進位數來示意的,實際上在電腦中是用二進位數來表示小數部分以及用2的冪次來表示指數部分的。在4個位元組(32位)中,究竟用多少位來表示小數部分,多少位來表示指數部分,標準C並無具體規定,由各C編譯系統自定。不少c編譯系統以24位表示小數部分(包括符號),以8位表示指數部分(包括指數的符號)。小數部分占的位(bit)數愈多,數的有效數字愈多,精度愈高。指數部分占的位數愈多,則能表示的數值範圍愈大。2.實型變數的分類

C實型變數分為單精確度(float型)、雙精度(double型)和長雙精度型(longdouble)三類。ANSIC並未具體規定每種類型數據的長度、精度和數值範圍。有的系統將double型所增加的32位全用於存放小數部分,這樣可以增加數值的有效位數,減少舍入誤差。有的系統則將所增加的位(bit)用於存放指數部分,這樣可以擴大數值的範圍。表2.2列出的是微機上常用的c編譯系統(如turboc,Msc,borlandc)的情况。应当了解,不同的系统会有差异。對每一個實型變數都應在使用前加以定義。如:

float

x,y,(指定x、y為單精確度實數)

doublez;(指定z為雙精度實數)

longdoublet;(指定t為長雙精度實數)

在初學階段,對longdouble型用得較少,因此我們不准備作詳細介紹。讀者只要知道有此類型即可。3.實型數據的舍入誤差由於實型變數是由有限的存儲單元組成的,因此能提供的有效數字總是有限的,在有效位以外的數字將被舍去。由此可能會產生一些誤差。例如,a加20的結果顯然應該比a大。請分析下麵的程式:例2.4實型數據的舍入誤差。

main()

{floata,b;

a=123456,789e5;

b=a+20;

printf("%f",b);

}

程式內printf函數中的“%f”是輸出一個實數時的格式符。程式運行時,輸出b的值與a相等。原因是:a的值比20大很多,a+20的理論值應是12345678920,而一個實型變數只能保證的有效數字是7位有效數字,後面的數字是無意義的,並不準確地表示該數。

運行程式得到的a和b的值是12345678848.000000,可以看到前8位是準確的,後幾位是不准確的,把20加在後幾位上,是無意義的。應當避免將一個很大的數和一個很小的數直接相加或相減,否則就會“丟失”小的數。與此類似,用程式計算1.0/3*3的結果並不等於1。2.4.3實型常量的類型

C編譯系統將實型常量作為雙精度來處理。例如已定義一個實型變數f,有如下語句:f=2.45678*4523.65

系統將2.45678和4523.65按雙精度數據存儲(占64位)和運算,得到一個雙精度的乘積,然後取前7位賦給實型變數f。這樣做可以保證計算結果更精確,但是運算速度降低了。可以在數的後面加字母f或f(如1.65f,654.87f),這樣編譯系統就會按單精確度(32位)處理。一個實型常量可以賦給一個float型、double型或longdouble變數。根據變數的類型截取實型常量中相應的有效位數字。假如a已指定為單精確度實型變數:

floata;

a=111111.111;由於float型變數只能接收7位有效數字,因此最後兩位小數不起作用。如果a改為double型,則能全部接收上述9位數字並存儲在變數a中。2.5字元型數據(Character,Char-字元)

2.5.1字元常量

C的字元常量是用單引號(即撇號)括起來的一個字元。如‘a’,‘x’,‘d’,‘?’,‘’等都是字符常量。注意,‘a’和‘a’是不同的字元常量。除了以上形式的字元常量外,C還允許用一種特殊形式的字元常量,就是以一個“\”開頭的字元序列。例如,前面已經遇到過的,在printf函數中的‘\n’,它代表一個“換行”符。這是一種“控制字元”,在螢幕上是不能顯示的。在程式中也無法用一個一般形式的字元表示,只能採用特殊形式來表示。例2.5轉義字元的使用。

main()

{printf("abc\tde\rf\tg\n");printf("h\ti\b\bjk");

}程式中沒有設字元變數,用printf函數直接輸出雙引號內的各個字元。請注意其中的“轉義字元”。第一個printf函數先在第一行左端開始輸出“abc”,然後遇到“\t”,它的作用是“跳格”,即跳到下一個“製錶位置”,在我們所用系統中一個“製錶區”占8列。“下一製錶位置”從第9列開始,故在第9~11列上輸出“de”。

下麵遇到“\r”,它代表“回車”(不換行),返回到本行最左端(第1列),輸出字元“f”,然後遇“\t”再使當前輸出位置移到第9列,輸出“g”。下麵是“\n”,作用是“使當前位置移到下一行的開頭”。第二個printf函數先在第1列輸出字元“h”,後面的“\t”使當前位置跳到第9列,輸出字母“i”,然後當前位置應移到下一列(第10列)準備輸出下一個字元。下麵遇到兩個“\b”,“\b”的作用是“退一格”,因此“\b\b”的作用是使當前位置回退到第8列,接著輸出字元“jk”。程式運行時在印表機上得到以下結果:

fab_c___gdeh______jik

注意在顯示幕上看到的結果與上述列印結果不同,是:

f_______gdeh______j_k

這是由於“\r”使當前位置回到本行開頭,自此輸出的字元(包括空格和跳格所經過的位置)將取代原來螢幕上該位置上顯示的字元。所以原有的“abc”被新的字元“fg”代替,其後的“de”未被新字元取代。換行後先輸出“hi”,退兩格后再输出“jk”,j后面的“”将原有的字符“i”取而代之。因此屏幕上看不到“i”。

_ab_c____de(新一Tab)

f______g

實際上,螢幕上完全按程式要求輸出了全部的字元,只是因為在輸出前面的字元後很快又輸出後面的字元,在人們還未看清楚之前,新的已取代了舊的,所以誤以為未輸出應輸出的字元。而在印表機輸出時,不像顯示幕那樣會“抹掉”原字元,留下了不可磨滅的痕跡,它能真正反映輸出的過程和結果。2.5.2字元變數字元型變數用來存放字元常量,請注意只能放一個字元,不要以為在一個字元變數中可以放一個字串(包括若干字元)。字元變數的定義形式如下:

char

c1,c2;它表示c1和c2為字元型變數,各可以放一個字元,因此在本函數中可以用下麵語句對c1、c2賦值:

c1='a';c2='b';在所有的編譯系統中都規定以一個位元組來存放一個字元,或者說一個字元變數在內存中占一個位元組。2.5.3字元數據在內存中的存儲形式及其使用方法將一個字元常量放到一個字元變數中,實際上並不是把該字元本身放到記憶體單元中去,而是將該字元的相應的ASCII代碼放到存儲單元中。例如字元‘a’的ASCII代碼為97,‘b’為98,在內存中變數c1、c2的值如圖2.8(a)所示。實際上是以二進位形式存放的,如圖2.8(b)所示。圖2.8

既然在內存中,字元數據以ASCII碼存儲,它的存儲形式就與整數的存儲形式類似。這樣,在字元型數據和整型數據之間的轉換就比較方便了。一個字元數據既可以以字元形式輸出,也可以以整數形式輸出。以字元形式輸出時,需要先將存儲單元中的ASCII碼轉換成相應字元,然後輸出。以整數形式輸出時,直接將ASCII碼作為整數輸出。也可以對字元數據進行算術運算,此時相當於對它們的ASCII碼進行算術運算,只是將其一個位元組轉化為29位元組,然後參加運算。例2.6

向字元變數賦以整數。main(){charc1,c2;c1=97;c2=98;printf("%c%c\n",c1,c2);/*以字元形式輸出*/printf("%d%d\n",c1,c2);/*轉換為整數形式輸出*/

c1、c2被指定為字元變數。但在第3和第4行中,將整數97和98分別賦給c1和c2,它的作用相當於以下兩個賦值語句:

c1='a';c2='b';

因為‘a’和‘b’的ASCII碼為97和98。在程式的第3和第4行是把97和98兩個整數直接存放到c1和c2的記憶體單元中。而c1=‘a’和c2=‘b’則是先將字元‘a’和‘b’化成ASCII碼97和98,然後放到記憶體單元中。二者的作用和結果是相同的。第5行輸出兩個字元a和b。“%c”是輸出字元時必須使用的格式符。程式第6行輸出兩個整數97和98。圖2.9程式運行時輸出如下:

ab9798

可以看到:字元型數據和整型數據是通用的。它們既可以用字符形式輸出(用%c),也可以用整數形式輸出(用%d),見圖2.9。但是應注意字元數據只占一個位元組,它只能存放0~255範圍內的整數。例2.7

大小寫字母的轉換。main(){charc1,c2;

c1='a';

c2='b';c1=c1-32;c2=c2-32;printf("%c

%c",c1,c2);}運行結果為

AB

程式的作用是將兩個小寫字母a和b轉換成大寫字母a和b。‘a’的ascii碼為97,而‘a’為65,‘b’為98,‘b’為66。從

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论