《C語(yǔ)言程序設(shè)計(jì)》全套教學(xué)課件_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》全套教學(xué)課件_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》全套教學(xué)課件_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》全套教學(xué)課件_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》全套教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩581頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

全套可編輯PPT課件全套可編輯PPT課件1.1程序設(shè)計(jì)語(yǔ)言的發(fā)展計(jì)算機(jī)程序是一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令,運(yùn)行于電子計(jì)算機(jī)上,滿足人們某種需求的信息化工具。人與計(jì)算機(jī)之間的信息交流也需要一種語(yǔ)言,這就是計(jì)算機(jī)語(yǔ)言。從計(jì)算機(jī)誕生至今,計(jì)算機(jī)語(yǔ)言的發(fā)展總體分三個(gè)階段。1.機(jī)器語(yǔ)言2.匯編語(yǔ)言3.高級(jí)語(yǔ)言1.2

C語(yǔ)言的發(fā)展和特點(diǎn)C語(yǔ)言的很多概念來(lái)源于Martin

Richards開(kāi)發(fā)的BCPL語(yǔ)言。BCPL對(duì)C語(yǔ)言的影響間接地來(lái)自B語(yǔ)言。1972年,美國(guó)貝爾實(shí)驗(yàn)室的DennisRitchie在B語(yǔ)言基礎(chǔ)上為UNIX操作系統(tǒng)設(shè)計(jì)了C語(yǔ)言,并用C語(yǔ)言重寫(xiě)了UNIX操作系統(tǒng),推出了UNIXV5。以UNIXV7中的C語(yǔ)言編譯程序?yàn)榛A(chǔ),1978年BrainW.Kernighan和DennisRitchie合著出版了《TheCProgrammingLanguage》,這本書(shū)中介紹的C語(yǔ)言就是第一個(gè)C語(yǔ)言標(biāo)準(zhǔn)。1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)成立了一個(gè)委員會(huì)以制定一個(gè)現(xiàn)代的、全面的C語(yǔ)言定義,于1988年完成的ANSI標(biāo)準(zhǔn),即ANSIC。1990年,國(guó)際標(biāo)準(zhǔn)化組織(InternationalStandardOrganization,ISO)又對(duì)C語(yǔ)言標(biāo)準(zhǔn)進(jìn)行了修訂,在基本保留原來(lái)C語(yǔ)言特征的基礎(chǔ)上,針對(duì)應(yīng)用的需要,增加了一些新功能,ISO官方給予的名稱為:ISO/IEC9899,所以ISO/IEC9899:1990也通常被簡(jiǎn)稱為“C90”。1999年,在做了一些必要的修正和完善后,ISO發(fā)布了新的C語(yǔ)言標(biāo)準(zhǔn),命名為ISO/IEC9899:1999,簡(jiǎn)稱“C99”。在2011年12月8日,ISO又正式發(fā)布了新的標(biāo)準(zhǔn),稱為ISO/IEC9899:2011,簡(jiǎn)稱為“C11”。1.2.1

C語(yǔ)言的發(fā)展1.2

C語(yǔ)言的發(fā)展和特點(diǎn)C++是BjarneStroustrup于20世紀(jì)80年代在貝爾實(shí)驗(yàn)室開(kāi)發(fā)的一門語(yǔ)言,用他自己的話來(lái)說(shuō):C++主要是為了我的朋友和我不必再使用匯編語(yǔ)言、C語(yǔ)言或其他現(xiàn)代高級(jí)語(yǔ)言來(lái)編程而設(shè)計(jì)的。它的主要特點(diǎn)是可以更方便地編寫(xiě)程序,讓每個(gè)程序員更加快樂(lè)。C++語(yǔ)言是在C語(yǔ)言的基礎(chǔ)上添加了對(duì)面向?qū)ο缶幊毯头盒途幊痰闹С?。C++繼承了C語(yǔ)言的高效、簡(jiǎn)潔、快速和可移植性。C++面向?qū)ο蟮奶匦詭?lái)了全新的編程方法。1.2

C語(yǔ)言的發(fā)展和特點(diǎn)C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言,它有著清晰的層次,可按照模塊的方式對(duì)程序進(jìn)行編寫(xiě),十分有利于程序的調(diào)試,且C語(yǔ)言的處理和表現(xiàn)能力都非常強(qiáng)大,依靠非常全面的運(yùn)算符和多樣的數(shù)據(jù)類型,可以輕易完成各種數(shù)據(jù)結(jié)構(gòu)的構(gòu)建,通過(guò)指針類型更可對(duì)內(nèi)存直接尋址以及對(duì)硬件進(jìn)行直接操作,因此既能夠用于開(kāi)發(fā)系統(tǒng)程序,也可用于開(kāi)發(fā)應(yīng)用軟件。1.2.2

C語(yǔ)言的特點(diǎn)具有結(jié)構(gòu)化的控制語(yǔ)句簡(jiǎn)潔的語(yǔ)言豐富的運(yùn)算符豐富的數(shù)據(jù)類型代碼具有較好的可移植性可對(duì)物理地址進(jìn)行直接操作可生成高質(zhì)量、高效率的程序1.3

C程序基本結(jié)構(gòu)在開(kāi)始學(xué)習(xí)C語(yǔ)言編程之前,應(yīng)該了解一下C源程序的基本結(jié)構(gòu),下面是一個(gè)簡(jiǎn)單的C語(yǔ)言程序?!纠?-1】輸出“Hello,world”。#include<stdio.h>intmain(){printf("Hello,world\n");//輸出一個(gè)字符串

return0;}1.3

C程序基本結(jié)構(gòu)一個(gè)簡(jiǎn)單的C程序的基本格式有以下幾點(diǎn)規(guī)定:(1)C程序是無(wú)格式的純文本文件,可以用任何文本編輯器(例如,記事本、寫(xiě)字板)來(lái)編寫(xiě)C程序。(2)C程序(源代碼)保存為文件時(shí),建議使用默認(rèn)擴(kuò)展名.c(也可以保存為.cpp文件,因?yàn)镃是C++的子集,絕大部分編譯器同時(shí)支持C和C++)。文件名最好有一定提示作用,能使人聯(lián)想到程序內(nèi)容或功能。(3)每個(gè)C程序都由一個(gè)或多個(gè)函數(shù)組成,函數(shù)則是具有特定功能的程序模塊。對(duì)于一個(gè)應(yīng)用程序來(lái)講,還必須有一個(gè)main()函數(shù),且只能有一個(gè)main()函數(shù)。該函數(shù)標(biāo)志著執(zhí)行應(yīng)用程序時(shí)的起始點(diǎn)。其中,關(guān)鍵字int表示main()函數(shù)類型為int(整數(shù))類型。在執(zhí)行主函數(shù)后會(huì)得到一個(gè)值(函數(shù)值),其值為整型。程序第5行的“return0;”的作用就是當(dāng)main()函數(shù)執(zhí)行結(jié)束前將整數(shù)0作為函數(shù)值返回到調(diào)用函數(shù)處。1.3

C程序基本結(jié)構(gòu)(4)函數(shù)中可以有多條語(yǔ)句。本例的main()函數(shù)中,有兩條語(yǔ)句:printf("Hello,world\n");該語(yǔ)句用來(lái)在屏幕上輸出“Hello,world”字符串。\n是換行符,即在輸出“Hello,world”后,顯示終端上的光標(biāo)位置移動(dòng)到下一行的開(kāi)頭。return0;是返回語(yǔ)句,將函數(shù)值返回到調(diào)用函數(shù)處。在使用函數(shù)庫(kù)中的輸入輸出函數(shù)時(shí),編譯系統(tǒng)要求程序提供有關(guān)此函數(shù)的信息,程序中第一行“#include<stdio.h>”的作用就是用來(lái)提供這些信息的。stdio.h是系統(tǒng)提供的一個(gè)標(biāo)準(zhǔn)輸入輸出函數(shù)頭文件,用#include指令把這些信息調(diào)入使用。(5)C程序中的每條語(yǔ)句都要以分號(hào)“;”結(jié)束。(6)為了增加程序的可讀性,程序可以加入一些注釋行,例如,用“//”開(kāi)頭的為單行注釋。1.3

C程序基本結(jié)構(gòu)以/*開(kāi)始,以*/結(jié)束的為塊注釋,該注釋可以包含多行內(nèi)容,也可以單獨(dú)占一行。多行注釋如:/*----------------------------HelloWorld.c------------------------------*/(7)在C程序中,字母的大小寫(xiě)是有區(qū)分意義的,因此main、Main、MAIN都是不同的名稱。作為程序的入口只能是main()函數(shù)。(8)C程序書(shū)寫(xiě)格式比較自由,一行內(nèi)可以寫(xiě)多條語(yǔ)句,一個(gè)語(yǔ)句可以分寫(xiě)在多行上,但為了程序的可讀性,建議每行只寫(xiě)一條語(yǔ)句。1.4程序設(shè)計(jì)基本過(guò)程用C語(yǔ)言編寫(xiě)程序,到最后得到結(jié)果,具體的步驟取決于計(jì)算機(jī)環(huán)境和使用的C編譯器,但大體需要經(jīng)過(guò)4個(gè)過(guò)程,即編寫(xiě)源程序、編譯源代碼、將目標(biāo)代碼與其他代碼鏈接起來(lái)和運(yùn)行。其過(guò)程如圖所示。1.4.1

C程序的編寫(xiě)過(guò)程C程序運(yùn)行過(guò)程1.4程序設(shè)計(jì)基本過(guò)程1.編寫(xiě)源程序編寫(xiě)源程序代碼可以采用任何文本編輯器,如記事本。但用記事本書(shū)寫(xiě)程序效率較低,一般借助集成開(kāi)發(fā)工具(IDE)編寫(xiě)程序代碼。程序編寫(xiě)完成后,將代碼文件保存為源程序文件(擴(kuò)展名為.c文件)。2.編譯源代碼計(jì)算機(jī)不能直接理解任何除機(jī)器代碼以外的語(yǔ)言,所以必須把編寫(xiě)好的程序翻譯成機(jī)器語(yǔ)言,計(jì)算機(jī)才能執(zhí)行程序。將其他語(yǔ)言翻譯成機(jī)器語(yǔ)言的工具被稱為編譯器。編譯器翻譯的方式有兩種:編譯和解釋。編譯型語(yǔ)言:程序在執(zhí)行之前需要一個(gè)專門的編譯過(guò)程,把程序編譯成機(jī)器語(yǔ)言的文件,運(yùn)行時(shí)不需要重新翻譯,直接使用編譯的結(jié)果就行了。程序執(zhí)行效率高,依賴編譯器,跨平臺(tái)性較差,如C、C++等。解釋型語(yǔ)言:程序不需要在運(yùn)行前編譯,在運(yùn)行程序時(shí)才翻譯,專門的解釋器負(fù)責(zé)在每個(gè)語(yǔ)句執(zhí)行時(shí)解釋程序代碼。這樣解釋型語(yǔ)言每執(zhí)行一次就要翻譯一次,效率比較低,如JAVA、Python等。1.4程序設(shè)計(jì)基本過(guò)程3.將目標(biāo)代碼與其他代碼鏈接起來(lái)鏈接是指將目標(biāo)代碼同使用的函數(shù)的目標(biāo)代碼(如C程序通用庫(kù))以及一些標(biāo)準(zhǔn)的啟動(dòng)代碼組合起來(lái),生成程序運(yùn)行階段版本。包含該產(chǎn)品的文件被稱為可執(zhí)行代碼。編譯源代碼將目標(biāo)代碼與其他代碼鏈接起來(lái)可以通過(guò)編譯命令一次完成。4.運(yùn)行程序編譯通過(guò)后,可以運(yùn)行程序,得到程序的運(yùn)行結(jié)果。通過(guò)程序的運(yùn)行結(jié)果是否正確可以初步判定程序是否正確。如果運(yùn)行的結(jié)果不正確,則可能是程序的邏輯或算法上有錯(cuò)誤;還有一些程序運(yùn)行的結(jié)果可能在某些數(shù)據(jù)上輸出結(jié)果是正確的,在其他數(shù)據(jù)上是錯(cuò)誤的,這些都需要進(jìn)一步排查程序的問(wèn)題并進(jìn)行改正。1.4程序設(shè)計(jì)基本過(guò)程1.分析問(wèn)題對(duì)于接收的任務(wù)要進(jìn)行認(rèn)真分析,研究所給定的條件,分析最后應(yīng)達(dá)到的目標(biāo),找出解決問(wèn)題的規(guī)律,選擇解題的方法,完成實(shí)際問(wèn)題。2.設(shè)計(jì)算法設(shè)計(jì)算法即設(shè)計(jì)出解題的方法和具體步驟。3.編寫(xiě)程序?qū)⑺惴ㄓ贸绦蛟O(shè)計(jì)語(yǔ)言實(shí)現(xiàn),對(duì)源程序進(jìn)行編輯、編譯和鏈接(如果是解釋型語(yǔ)言,則直接由解釋器解釋,無(wú)須編譯和鏈接),得到可執(zhí)行程序。4.運(yùn)行程序并分析結(jié)果運(yùn)行可執(zhí)行程序,得到運(yùn)行結(jié)果。能得到運(yùn)行結(jié)果并不意味著程序正確,要對(duì)結(jié)果進(jìn)行分析,看它是否合理。不合理要對(duì)程序進(jìn)行調(diào)試,即通過(guò)上機(jī)發(fā)現(xiàn)和排除程序中的故障。1.4.2程序設(shè)計(jì)過(guò)程1.4程序設(shè)計(jì)基本過(guò)程5.編寫(xiě)程序文檔許多程序是提供給別人使用的,如同正式的產(chǎn)品應(yīng)當(dāng)提供產(chǎn)品說(shuō)明書(shū)一樣,正式提供給用戶使用的程序,必須向用戶提供程序說(shuō)明書(shū)。內(nèi)容應(yīng)包括:程序名稱、程序功能、運(yùn)行環(huán)境、程序的裝入和啟動(dòng)、需要輸入的數(shù)據(jù),以及使用注意事項(xiàng)等。1.5算法的流程描述算法(Algorithm)是指解題方案的準(zhǔn)確且完整的描述,是一系列解決問(wèn)題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問(wèn)題的策略機(jī)制。也就是說(shuō),能夠?qū)σ欢ㄒ?guī)范的輸入在有限時(shí)間內(nèi)獲得所要求的輸出。一個(gè)算法應(yīng)該具有以下五個(gè)重要的特征。有窮性1.確切性2輸入項(xiàng)3輸出項(xiàng)4可行性51.5算法的流程描述自然語(yǔ)言就是人們?nèi)粘J褂玫恼Z(yǔ)言,可以是漢語(yǔ)、英語(yǔ)或其他語(yǔ)言。用自然語(yǔ)言表示算法通俗易懂,但容易出現(xiàn)歧義。當(dāng)算法中的操作步驟都是順序執(zhí)行時(shí)比較直觀、容易理解。缺點(diǎn)是如果算法中包含了判斷結(jié)構(gòu)和循環(huán)結(jié)構(gòu),并且操作步驟較多時(shí),就顯得不那么直觀清晰了。1.5.1自然語(yǔ)言【例1-2】求1+2+3+……+10的和。分析:在本例中,我們常用的計(jì)算方法就是采用累加的方式進(jìn)行計(jì)算,即先計(jì)算兩個(gè)數(shù)相加的結(jié)果,然后再用此結(jié)果加第三個(gè)數(shù),依此類推。下面用自然語(yǔ)言進(jìn)行描述:設(shè)兩個(gè)變量sum和i,sum記錄求和結(jié)果,i代表加數(shù)。下面的S1,S2,……代表步驟1,步驟2,……S1:賦初值sum=0S2:賦初值i=11.5算法的流程描述S3:求sum+i的值,然后把結(jié)果存入sum,即sum+i->sumS4:使i的值增加1,即i+1->iS5:如果i的值不超過(guò)10,返回S3,繼續(xù)執(zhí)行S4和S5;否則,算法結(jié)束。最后得到的sum值即所求結(jié)果。類似這樣描述算法的過(guò)程即自然語(yǔ)言。1.5算法的流程描述【例1-3】判定一個(gè)年份是否為閏年。分析:判斷一個(gè)年份是否為閏年的條件:①年份能被4整除,但不能被100整除的是閏年,即非整百年數(shù)除以4,無(wú)余數(shù)為閏年,有余數(shù)不是閏年;②年份能被400整除是閏年,即整百年數(shù)除以400,無(wú)余數(shù)為閏年,有余數(shù)不是閏年。設(shè)y為要判定的年份,用自然語(yǔ)言進(jìn)行算法描述如下:S1:輸入年份yS2:若y不能被4整除,輸出y“不是閏年”,算法結(jié)束S3:若y能被4整除,但不能被100整除,輸出y“是閏年”,算法結(jié)束S4:若y能被400整除,輸出y“是閏年”,算法結(jié)束S5:輸出y“不是閏年”,算法結(jié)束除了一些比較簡(jiǎn)單的問(wèn)題采用自然語(yǔ)言描述1.5算法的流程描述流程圖(FlowChart),是指用規(guī)定的圖形符號(hào)來(lái)描述算法。用圖形表示算法,直觀形象,易于理解。常用的流程圖符號(hào)見(jiàn)表1-1。1.5.2流程圖1.5算法的流程描述1.順序結(jié)構(gòu)順序結(jié)構(gòu)是基本、常見(jiàn)的結(jié)構(gòu)。在這種結(jié)構(gòu)中,各操作塊按它們出現(xiàn)的先后順序逐個(gè)執(zhí)行,如圖1-2所示。在執(zhí)行A框中的操作后,接著執(zhí)行B框中的操作。注:一個(gè)操作塊可以是一個(gè)操作、一組操作或一個(gè)基本結(jié)構(gòu)等。圖1-2順序結(jié)構(gòu)1.5算法的流程描述2.選擇結(jié)構(gòu)在算法中,常要根據(jù)某個(gè)給定的條件P是否成立來(lái)決定執(zhí)行幾個(gè)操作塊中的哪一個(gè)操作,具有這種性質(zhì)的結(jié)構(gòu)稱為選擇結(jié)構(gòu)。選擇結(jié)構(gòu)又分為雙分支結(jié)構(gòu)和單分支結(jié)構(gòu)。雙分支結(jié)構(gòu)在條件P成立時(shí)執(zhí)行A操作,條件P不成立時(shí)執(zhí)行B操作,如圖1-3(a)所示。單分支結(jié)構(gòu)在條件P成立時(shí),執(zhí)行A操作,條件P不成立時(shí)不執(zhí)行任何操作,如圖1-3(b)所示。圖1-3選擇結(jié)構(gòu)1.5算法的流程描述3.循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu):程序中經(jīng)常要在某處反復(fù)執(zhí)行一連串操作,這種情況應(yīng)采用循環(huán)結(jié)構(gòu),需要反復(fù)執(zhí)行的操作塊稱為循環(huán)體。按照是否進(jìn)行循環(huán)的條件,可將循環(huán)結(jié)構(gòu)分為當(dāng)型循環(huán)結(jié)構(gòu)和直到型循環(huán)結(jié)構(gòu)兩類。當(dāng)型循環(huán)結(jié)構(gòu):當(dāng)給定條件P成立時(shí),反復(fù)執(zhí)行循環(huán)體(A框);當(dāng)給定條件P不成立時(shí),終止執(zhí)行。若剛開(kāi)始時(shí)條件P就不成立,則循環(huán)體一次也不執(zhí)行。如圖1-4(a)所示。圖1-4循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu):反復(fù)執(zhí)行循環(huán)體(A框),一直執(zhí)行到給定條件P成立時(shí),終止執(zhí)行。無(wú)論條件P是否成立,都至少執(zhí)行一次循環(huán)體。如圖1-4(b)所示。一個(gè)問(wèn)題如果可以用當(dāng)型循環(huán)來(lái)解決,一般也可以用直到型循環(huán)來(lái)解決,即這兩種循環(huán)可以互相轉(zhuǎn)換。1.5算法的流程描述圖1-5求和算法流程三種基本結(jié)構(gòu)有以下共同特點(diǎn):(1)只有一個(gè)入口。(2)只有一個(gè)出口。請(qǐng)注意:一個(gè)菱形判斷框有兩個(gè)出口,而一個(gè)選擇結(jié)構(gòu)只有一個(gè)出口,不要將菱形框的出口和選擇結(jié)構(gòu)的出口混淆。(3)結(jié)構(gòu)內(nèi)的每部分都有機(jī)會(huì)被執(zhí)行到。(4)結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無(wú)終止的循環(huán))。下面將例1-2的算法描述改用流程圖表示【例1-4】用流程圖描述求1+2+3+……+10的和。按照流程圖的規(guī)定,連續(xù)求和要用到循環(huán)結(jié)構(gòu),此處選用當(dāng)型循環(huán)結(jié)構(gòu),算法流程如圖1-5所示。1.5算法的流程描述圖1-6判斷閏年的算法流程【例1-5】用流程圖描述判定一個(gè)年份是否為閏年。判斷一個(gè)年份是否為閏年的條件:①非整百年數(shù)除以4,無(wú)余數(shù)為閏年,有余數(shù)不是閏年;②整百年數(shù)除以400,無(wú)余數(shù)為閏年,有余數(shù)不是閏年。算法流程如圖1-6所示。1.5算法的流程描述靈活的流程圖在程序設(shè)計(jì)中有它自己的優(yōu)點(diǎn),但也隱藏著許多導(dǎo)致錯(cuò)誤的因素。因?yàn)樗试S用流程線使流程任意轉(zhuǎn)移,這對(duì)程序設(shè)計(jì)是一個(gè)隱患,它使程序流程看起來(lái)較亂,使程序難以理解和維護(hù)。針對(duì)這一弊端,1973年美國(guó)學(xué)者I.Nassi和B.Shneiderman提出了一種無(wú)流程線的流程圖,稱為N-S圖。它的基本表示方法是用一個(gè)矩形框,把整個(gè)程序算法像堆積木一樣組合起來(lái)。其基本結(jié)構(gòu)如圖1-7所示。1.5.3

N-S流程圖圖1-7N-S流程圖1.5算法的流程描述(1)順序結(jié)構(gòu),由若干個(gè)前后銜接的矩形框組成,如圖1-7(a)所示,先執(zhí)行A,然后執(zhí)行B。(2)選擇結(jié)構(gòu),如圖1-7(b)所示,當(dāng)條件成立時(shí)執(zhí)行A分支,條件不成立時(shí)執(zhí)行B分支。(3)循環(huán)結(jié)構(gòu),包含當(dāng)型循環(huán)(圖1-7(c))和直到型循環(huán)(圖1-7(d))兩種結(jié)構(gòu)。當(dāng)型循環(huán)結(jié)構(gòu)先判斷條件,當(dāng)條件成立時(shí)反復(fù)執(zhí)行A操作(循環(huán)體),直到條件不成立時(shí)結(jié)束循環(huán)。直到型循環(huán)結(jié)構(gòu)先執(zhí)行A操作(循環(huán)體),然后判斷條件是否成立,如果不成立則返回繼續(xù)執(zhí)行A操作,當(dāng)條件成立后,結(jié)束循環(huán)。圖1-7中的A和B可以是一個(gè)簡(jiǎn)單的操作,也可以是三種基本結(jié)構(gòu)之一。1.5算法的流程描述【例1-6】用N-S流程圖表示例1-4。用N-S流程圖描述求和算法如圖1-8所示。圖1-8用N-S流程圖描述求和算法1.5算法的流程描述【例1-7】用N-S流程圖表示例1-5。用N-S流程圖描述判斷閏年算法如圖1-9所示。流程圖中用到3個(gè)選擇結(jié)構(gòu)。圖1-9用N-S流程圖描述判斷閏年算法1.5算法的流程描述偽代碼是用介于自然語(yǔ)言和計(jì)算機(jī)語(yǔ)言之間的一種文字和符號(hào)來(lái)描述算法,不涉及圖形,書(shū)寫(xiě)方便,格式緊湊,修改方便,容易看懂。用偽代碼書(shū)寫(xiě)算法無(wú)固定的、嚴(yán)格的語(yǔ)法規(guī)則,可以用英文、中文或中英文混用?!纠?-8】用偽代碼描述求1+2+3+……+10的和。1.5.4偽代碼sum=0i=1while(i≤10){sum=sum+ii=i+1}輸出sum1.6結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)(Structured

Programming)是一種軟件開(kāi)發(fā)方法,旨在提高程序的可讀性和可維護(hù)性。它的核心思想是使用少數(shù)幾種定義清晰的控制結(jié)構(gòu)來(lái)構(gòu)造程序,避免使用復(fù)雜、難以理解的程序結(jié)構(gòu)。1.自頂向下在軟件系統(tǒng)設(shè)計(jì)時(shí),應(yīng)先考慮總體,搭建起系統(tǒng)架構(gòu),后考慮細(xì)節(jié),先考慮全局目標(biāo),后考慮局部目標(biāo)。一開(kāi)始不要過(guò)多追求細(xì)節(jié),先從最上層總目標(biāo)開(kāi)始設(shè)計(jì),逐步使問(wèn)題具體化。2.逐步細(xì)化對(duì)復(fù)雜問(wèn)題,應(yīng)設(shè)計(jì)一些子目標(biāo)作為過(guò)渡,逐步細(xì)化。逐步細(xì)化和自頂向下常常結(jié)合使用,把逐步細(xì)化看作自頂向下設(shè)計(jì)的具體體現(xiàn)。1.6結(jié)構(gòu)化程序設(shè)計(jì)方法3.模塊化一個(gè)復(fù)雜問(wèn)題,是由若干稍簡(jiǎn)單的問(wèn)題構(gòu)成。模塊化是把程序要解決的總目標(biāo)分解為多個(gè)子目標(biāo),再進(jìn)一步分解為具體的小目標(biāo),每一個(gè)小目標(biāo)稱為一個(gè)模塊。每個(gè)模塊相對(duì)獨(dú)立、功能單一,每個(gè)模塊負(fù)責(zé)完成一項(xiàng)特定的任務(wù)。結(jié)構(gòu)化程序設(shè)計(jì)有順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)三種基本控制結(jié)構(gòu),通過(guò)組合和嵌套實(shí)現(xiàn)任何單入口單出口的程序。4.結(jié)構(gòu)化程序設(shè)計(jì)的步驟開(kāi)發(fā)一個(gè)軟件系統(tǒng),無(wú)論這個(gè)系統(tǒng)規(guī)模有多大,我們通常需要按照下述步驟進(jìn)行分析與實(shí)現(xiàn)。(1)分析問(wèn)題對(duì)要解決的問(wèn)題,首先必須分析清楚,明確問(wèn)題的要求,列出所有已知量,找出題目的求解范圍、解的精度等。通過(guò)分析,主要獲取問(wèn)題所涉及的數(shù)據(jù),包括已有數(shù)據(jù)、中間結(jié)果及最終要得到的數(shù)據(jù)。1.6結(jié)構(gòu)化程序設(shè)計(jì)方法(2)建立模型對(duì)實(shí)際問(wèn)題進(jìn)行分析,找出數(shù)據(jù)間的內(nèi)在規(guī)律,在已有數(shù)據(jù)和最終要得到的數(shù)據(jù)之間建立模型,利用計(jì)算機(jī)來(lái)解決。(3)設(shè)計(jì)算法建立模型后,還不能開(kāi)始編寫(xiě)程序,必須先根據(jù)數(shù)據(jù)的結(jié)構(gòu)設(shè)計(jì)解決算法的問(wèn)題(解題步驟)。選擇算法一般要注意:?算法的邏輯結(jié)構(gòu)盡可能簡(jiǎn)單;?算法所要求的存儲(chǔ)量應(yīng)盡可能少,即算法的空間復(fù)雜度盡可能小;?避免不必要的循環(huán)和遞歸,減少算法的執(zhí)行時(shí)間,即算法的時(shí)間復(fù)雜度盡可能小;?在滿足題目要求條件下,使所需的計(jì)算量最小。1.6結(jié)構(gòu)化程序設(shè)計(jì)方法(4)編寫(xiě)程序采用某種計(jì)算機(jī)語(yǔ)言,將前面所涉及的數(shù)據(jù)和算法進(jìn)行詳細(xì)描述,把整個(gè)程序看作一個(gè)整體,先全局后局部,自頂向下,逐層分解處理,如果某些子問(wèn)題的算法相同而僅參數(shù)不同,可以用子程序來(lái)表示。(5)調(diào)試運(yùn)行將整個(gè)程序編譯、調(diào)試后,運(yùn)行程序得出結(jié)論。(6)程序測(cè)試根據(jù)運(yùn)行結(jié)果分析程序,通過(guò)數(shù)據(jù)驗(yàn)證程序的正確性。(7)撰寫(xiě)程序文檔主要是對(duì)程序中的變量、函數(shù)或過(guò)程做必要的說(shuō)明,解釋編程思路,討論運(yùn)行結(jié)果等。1.7集成開(kāi)發(fā)環(huán)境1.啟動(dòng)VisualStudio本節(jié)以VisualStudio2010為例,后續(xù)版本使用方法一致。當(dāng)VisualStudio2010成功安裝后,在Windows桌面依次選擇“開(kāi)始”→“所有程序”→“MicrosoftVisualStudio2010”,可以啟動(dòng)VisualStudio2010。VisualStudio2010的集成開(kāi)發(fā)環(huán)境如圖1-10所示。1.7.1

VisualStudio圖1-10VisualStudio2010的集成開(kāi)發(fā)環(huán)境1.7集成開(kāi)發(fā)環(huán)境2.創(chuàng)建工程(1)依次單擊“文件”→“新建”→“項(xiàng)目”,如圖1-11所示。圖1-11“新建”菜單1.7集成開(kāi)發(fā)環(huán)境(2)“新建項(xiàng)目”對(duì)話框如圖1-12所示,在左側(cè)“已安裝的模板”選擇“VisualC++”→“Win32”,右側(cè)選擇“Win32控制臺(tái)應(yīng)用程序”,在下面“名稱”欄后文本框輸入項(xiàng)目名稱,“位置”欄文本框選擇項(xiàng)目的保存位置,或單擊“瀏覽(B)”按鈕進(jìn)行選擇,然后選中“為解決方案創(chuàng)建目錄”,最后單擊“確定”按鈕。圖1-12“新建項(xiàng)目”對(duì)話框1.7集成開(kāi)發(fā)環(huán)境(3)出現(xiàn)如圖1-13所示“Win32應(yīng)用程序向?qū)А?單擊“下一步”按鈕。圖1-13Win32應(yīng)用程序向?qū)?1)1.7集成開(kāi)發(fā)環(huán)境(4)如圖1-14所示,其中“應(yīng)用程序類型”選擇“控制臺(tái)應(yīng)用程序”,“附加選項(xiàng)”選擇“空項(xiàng)目”。最后單擊“完成”按鈕完成項(xiàng)目的創(chuàng)建工作。圖1-14Win32應(yīng)用程序向?qū)?2)1.7集成開(kāi)發(fā)環(huán)境3.編輯C源程序(1)在集成開(kāi)發(fā)環(huán)境窗口右邊“解決方案資源管理器”中右擊“源文件”,依次選擇“添加”→“新建項(xiàng)”,如圖1-15所示,或單擊“項(xiàng)目”菜單下子菜單“添加新項(xiàng)”。圖1-15新建項(xiàng)1.7集成開(kāi)發(fā)環(huán)境圖1-16“添加新項(xiàng)”對(duì)話框(2)打開(kāi)“添加新項(xiàng)”對(duì)話框,如圖1-16所示,左側(cè)“已安裝的模板”中選擇“VisualC++”下面的“代碼”,右側(cè)選擇“C++文件(.cpp)”,下面名稱欄文本框中輸入文件名稱,“位置”選擇保存路徑(建議用缺省,和項(xiàng)目在同一目錄下),最后單擊“添加”按鈕。(3)在代碼編輯區(qū)輸入如圖1-17所示代碼。再單擊“文件”菜單下的“保存”子菜單,保存好源代碼。圖1-17編輯C源代碼1.7集成開(kāi)發(fā)環(huán)境4.編輯和運(yùn)行(1)在“生成”菜單中單擊“生產(chǎn)解決方案”或按快捷鍵“F7”,如圖1-18所示。(2)編譯成功后,單擊“調(diào)試”菜單中的“開(kāi)始執(zhí)行(不調(diào)試)”,或按快捷鍵“Ctrl+F5”執(zhí)行程序,如圖1-19所示。(3)運(yùn)行結(jié)果如圖1-20所示。圖1-18“生成”菜單圖1-19“調(diào)試”菜單圖1-20運(yùn)行結(jié)果1.7集成開(kāi)發(fā)環(huán)境Dev-C++是一個(gè)Windows下的C和C++程序的集成開(kāi)發(fā)環(huán)境。它使用MingW32/GCC編譯器,遵循C/C++標(biāo)準(zhǔn)。開(kāi)發(fā)環(huán)境包括多頁(yè)面窗口、工程編輯器及調(diào)試器等,在工程編輯器中集合了編輯器、編譯器、連接程序和執(zhí)行程序,提供高亮度的語(yǔ)法顯示,以減少編輯錯(cuò)誤,還具有完善的調(diào)試功能。Dev-C++還為很多程序設(shè)計(jì)競(jìng)賽提供比賽環(huán)境。1.啟動(dòng)Dev-C++當(dāng)Dev-C++成功安裝后,通過(guò)選擇Windows桌面的“開(kāi)始”→“所有程序”→“Blood-shedDev-C++”→“Dev-C++”,可以啟動(dòng)Dev-C++。Dev-C++的集成開(kāi)發(fā)環(huán)境如圖1-21所示。1.7.2

Dev-C++1.7集成開(kāi)發(fā)環(huán)境圖1-21Dev-C++的集成開(kāi)發(fā)環(huán)境1.7集成開(kāi)發(fā)環(huán)境2.創(chuàng)建項(xiàng)目在Dev-C++環(huán)境中,開(kāi)發(fā)應(yīng)用程序的第一步是創(chuàng)建一個(gè)項(xiàng)目。(1)依次單擊“文件”→“新建”→“項(xiàng)目”,彈出“新項(xiàng)目”對(duì)話框,選擇“ConsoleApplication”,在“名稱”欄文本框輸入項(xiàng)目的名稱,選擇“C項(xiàng)目”或“C++項(xiàng)目”選項(xiàng),此處選擇“C項(xiàng)目”,如圖1-22所示。圖1-22“新項(xiàng)目”對(duì)話框1.7集成開(kāi)發(fā)環(huán)境(2)單擊“確定”按鈕,將彈出保存對(duì)話框,選擇項(xiàng)目保存的位置,選擇保存位置后,系統(tǒng)創(chuàng)建項(xiàng)目,并自動(dòng)創(chuàng)建一個(gè)main.c源程序文件,如圖1-23所示。圖1-23main.c源程序文件(1)1.7集成開(kāi)發(fā)環(huán)境3.編輯C源程序在如圖1-23所示編輯區(qū)main函數(shù)中輸入如下代碼:intmain(intargc,char*argv[]){printf("Helloworld");//新加入代碼

return0;}在編輯區(qū)輸入完代碼后,再單擊“文件”菜單下的“保存”子菜單,保存代碼。1.7集成開(kāi)發(fā)環(huán)境4.編譯和運(yùn)行(1)單擊工具欄中的“編譯”圖標(biāo),或“運(yùn)行”菜單下的“編譯”子菜單或按快捷鍵“Ctrl+F9”編譯程序,如果編譯成功,顯示結(jié)果如圖1-24所示。(2)運(yùn)行程序,單擊工具欄中的“運(yùn)行”圖標(biāo)或“運(yùn)行”菜單下的“運(yùn)行”子菜單,運(yùn)行程序。圖1-24編譯結(jié)果信息(1)1.7集成開(kāi)發(fā)環(huán)境(3)運(yùn)行結(jié)果如圖1-25所示。圖1-25運(yùn)行結(jié)果(1)1.7集成開(kāi)發(fā)環(huán)境Code::Blocks簡(jiǎn)寫(xiě)成CodeBlocks,是一款開(kāi)源的C++集成設(shè)計(jì)環(huán)境。CodeBlocks支持跨平臺(tái),不僅支持Linux和Windows,也支持Mac系統(tǒng)。多編譯器支持,對(duì)于C++語(yǔ)言,CodeBlocks支持包括BorlandC++、VC++、InterC++等超過(guò)20個(gè)不同廠家或版本編譯器。另外CodeBlocks也支持多種編程語(yǔ)言的編譯,包括“D”語(yǔ)言。通常情況下,我們采用開(kāi)源g++編譯器作為C++默認(rèn)的編譯器。在Linux下,g++由操作系統(tǒng)自帶。Windows環(huán)境下,需要mingw32庫(kù)支持。不過(guò),Code::Blocks在安裝包中已經(jīng)自帶了mingw32的庫(kù)文件。1.7.3

CodeBlocks1.7集成開(kāi)發(fā)環(huán)境1.啟動(dòng)CodeBlocks當(dāng)CodeBlocks成功安裝后,通過(guò)選擇Windows桌面的“開(kāi)始”→“所有程序”→“CodeBlocks”,啟動(dòng)CodeBlocks。它的集成開(kāi)發(fā)環(huán)境如圖1-26所示。圖1-26

CodeBlocks的集成開(kāi)發(fā)環(huán)境1.7集成開(kāi)發(fā)環(huán)境2.創(chuàng)建工程和源文件在CodeBlocks環(huán)境中,開(kāi)發(fā)應(yīng)用程序的第一步是創(chuàng)建一個(gè)工程。(1)依次單擊“File”→“New”→“Project”,如圖1-27所示。選擇“Console

application”,如圖1-28所示,單擊“Go”按鈕,再次出現(xiàn)“Consoleapplication”對(duì)話框,直接單擊“Next”按鈕。圖1-27“New”菜單圖1-28“Newfromtemplate”對(duì)話框1.7集成開(kāi)發(fā)環(huán)境(2)在“Consoleapplication”中選擇編程語(yǔ)言,可以選擇C或者C++,C++編譯器一般都可以編譯C程序,這里選擇“C”,再單擊“Next”按鈕,如圖1-29所示。(3)在出現(xiàn)的對(duì)話框中,“Projecttitle”文本框輸入工程的名稱,“Foldertocreateprojectin:”選擇工程的存放位置,之后會(huì)自動(dòng)生成工程文件名*.cbp(cbp是Code::BlocksProject),再單擊“Next”按鈕,如圖1-30所示。圖1-29選擇語(yǔ)言圖1-30工程名稱和位置設(shè)置對(duì)話框1.7集成開(kāi)發(fā)環(huán)境(4)編譯器一般選擇“GNUGCCCompiler”,其他采用默認(rèn)即可,再單擊“Finish”按鈕,如圖1-31所示。圖1-31選擇編譯器1.7集成開(kāi)發(fā)環(huán)境(5)系統(tǒng)創(chuàng)建好工程,并自動(dòng)創(chuàng)建一個(gè)“main.c”的源程序文件,如圖1-32所示。打開(kāi)main.c文件后,我們就可以到這里輸入源代碼文件了,輸入完源代碼后,保存文件。這里也可以不創(chuàng)建工程,而直接創(chuàng)建一個(gè)C源文件,依次單擊“File”→“New”→“File”,即可創(chuàng)建一個(gè)空的源程序文件,可以在里面輸入源程序。圖1-32main.c源程序文件(2)1.7集成開(kāi)發(fā)環(huán)境3.編譯和運(yùn)行(1)單擊工具欄中的“Build”選項(xiàng),或“Build”菜單下的“Build”子菜單或按快捷鍵“Ctrl+F9”編譯程序,如圖1-33所示,如果編譯成功,編譯結(jié)果如圖1-34所示,編譯出錯(cuò)則會(huì)出現(xiàn)錯(cuò)誤提示信息。圖1-33“Build”菜單圖1-34編譯結(jié)果(2)1.7集成開(kāi)發(fā)環(huán)境(2)運(yùn)行程序,單擊工具欄中的“Run”按鈕或“Build”菜單下的“Run”子菜單或按快捷鍵“Ctrl+F10”運(yùn)行程序。(3)運(yùn)行結(jié)果如圖1-35所示。有關(guān)程序的調(diào)試請(qǐng)查看附錄B和附錄C圖1-35運(yùn)行結(jié)果(2)1.8程序設(shè)計(jì)競(jìng)賽國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽(International

CollegiateProgrammingContest,ICPC)是世界上規(guī)模較大、水平較高的國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽之一,其宗旨是使大學(xué)生通過(guò)計(jì)算機(jī)充分展示分析和解決問(wèn)題的能力。全球總決賽第一名將獲得獎(jiǎng)杯。另外,成績(jī)靠前的參賽隊(duì)伍也將獲得金、銀和銅牌。而成績(jī)?cè)谥械纫韵碌年?duì)伍會(huì)得到確認(rèn)但不會(huì)進(jìn)行排名。1.8.1

ICPC國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽1.8程序設(shè)計(jì)競(jìng)賽1.參賽隊(duì)組成ICPC以團(tuán)隊(duì)的形式代表各學(xué)校參賽,參賽隊(duì)可以是來(lái)自任何國(guó)家和地區(qū)的高校,每個(gè)賽區(qū)的優(yōu)勝隊(duì)伍將獲得參加國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽全球總決賽資格。2.競(jìng)賽過(guò)程(1)競(jìng)賽中至少命題8道,比賽時(shí)間為5小時(shí)。(2)參賽隊(duì)員可以攜帶諸如手冊(cè)、程序清單等參考資料。(3)試題的解答提交裁判稱為運(yùn)行,每一次運(yùn)行會(huì)被判為正確或者錯(cuò)誤,判定結(jié)果會(huì)及時(shí)通知參賽隊(duì)伍。1.8.2競(jìng)賽規(guī)則1.8程序設(shè)計(jì)競(jìng)賽(4)正確解答中等數(shù)量及中等數(shù)量以上試題的隊(duì)伍會(huì)根據(jù)解題數(shù)目進(jìn)行排名。在決定獲獎(jiǎng)和參加全球總決賽的隊(duì)伍時(shí),如果多支隊(duì)伍解題數(shù)量相同,則根據(jù)總用時(shí)加上懲罰時(shí)間進(jìn)行排名??傆脮r(shí)和懲罰時(shí)間由每道解答正確的賽題的用時(shí)加上罰時(shí)而成。每道題用時(shí)將從競(jìng)賽開(kāi)始到該題解答被判定為正確為止,其間每一次錯(cuò)誤的運(yùn)行將被加罰20分鐘時(shí)間,未正確解答的試題不計(jì)時(shí)。(5)亞洲區(qū)域賽語(yǔ)言包括C++、C和Java。(6)每支隊(duì)伍使用一臺(tái)計(jì)算機(jī),所有隊(duì)伍使用計(jì)算機(jī)的規(guī)格配置完全相同。1.8程序設(shè)計(jì)競(jìng)賽中國(guó)大學(xué)生程序設(shè)計(jì)競(jìng)賽(ChinaCollegiateProgrammingContest,CCPC)是工業(yè)和信息化部教育與考試中心主辦的“強(qiáng)國(guó)杯”技術(shù)技能大賽項(xiàng)目,由中國(guó)大學(xué)生程序設(shè)計(jì)競(jìng)賽組委會(huì)組織承辦,旨在激發(fā)高校學(xué)生學(xué)習(xí)計(jì)算機(jī)領(lǐng)域?qū)I(yè)知識(shí)與技能的興趣,鼓勵(lì)學(xué)生靈活運(yùn)用計(jì)算機(jī)知識(shí)和技能解決實(shí)際問(wèn)題,有效提升算法設(shè)計(jì)、邏輯推理、數(shù)學(xué)建模、編程實(shí)現(xiàn)和計(jì)算機(jī)系統(tǒng)能力,培養(yǎng)團(tuán)隊(duì)合作意識(shí)、挑戰(zhàn)精神和創(chuàng)新能力,培育和選拔出一大批素質(zhì)優(yōu)良、結(jié)構(gòu)合理的高素質(zhì)信息技術(shù)人才隊(duì)伍,服務(wù)“兩個(gè)強(qiáng)國(guó)”建設(shè)。CCPC的比賽規(guī)則與ICPC一致。1.8.3

CCPC中國(guó)大學(xué)生程序設(shè)計(jì)競(jìng)賽1.8程序設(shè)計(jì)競(jìng)賽團(tuán)體程序設(shè)計(jì)天梯賽屬于中國(guó)高校計(jì)算機(jī)大賽之一,分為3個(gè)組別:珠峰爭(zhēng)鼎(本科組)、華山論劍(本科組)、滄海競(jìng)舟(??平M)。本科生限參加“華山論劍”組或“珠峰爭(zhēng)鼎”組;專科生可參加任一組。每支參賽隊(duì)由最多10名隊(duì)員組成。每名參賽隊(duì)員必須是參賽隊(duì)所屬高等學(xué)校的在冊(cè)本科生或?qū)?粕?。一支?duì)伍中只要有一名本科生,即不可報(bào)名“滄海競(jìng)舟”組。每所高校報(bào)名參賽的隊(duì)數(shù)不限,但只有成績(jī)最好的3支隊(duì)伍參加計(jì)分與評(píng)獎(jiǎng)。同一所高校的參賽隊(duì)若同時(shí)報(bào)名參加不同組別,則按最高組別確定高校排名,并且只計(jì)算最高組別的前3支參賽隊(duì)的得分。原則上,獲得兩屆競(jìng)賽冠軍(高校、團(tuán)隊(duì)、個(gè)人)的隊(duì)員,將被謝絕參賽。但如果高校獲獎(jiǎng)的組別升級(jí),則在高組別參賽的次數(shù)可重新計(jì)算。每個(gè)參賽隊(duì)必須有至少1名教練,教練必須是參賽隊(duì)所屬高等學(xué)校的正式教師。一位教練可以作為多支參賽隊(duì)的代表,負(fù)責(zé)競(jìng)賽活動(dòng)中的指導(dǎo)和聯(lián)系等工作。教練必須保證所有隊(duì)員符合本規(guī)程的規(guī)定。每所學(xué)校教練的人數(shù)原則上不應(yīng)超過(guò)參賽隊(duì)員人數(shù)的1/5。1.8.4團(tuán)體程序設(shè)計(jì)天梯賽1.8程序設(shè)計(jì)競(jìng)賽Online

Judge系統(tǒng)(簡(jiǎn)稱OJ)是一個(gè)在線的判題系統(tǒng)。用戶可以在線提交多種程序(如C、C++、JAVA)源代碼,系統(tǒng)對(duì)源代碼進(jìn)行編譯和執(zhí)行,并通過(guò)預(yù)先設(shè)計(jì)的測(cè)試數(shù)據(jù)來(lái)檢驗(yàn)程序源代碼的正確性。現(xiàn)在國(guó)內(nèi)外很多高校都建有自己的OJ,大家可以在網(wǎng)絡(luò)上搜索,免費(fèi)注冊(cè)并進(jìn)行練習(xí)。1.評(píng)測(cè)系統(tǒng)反饋ICPC國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽中,自動(dòng)評(píng)測(cè)系統(tǒng)所給的反饋信息極少,主要包括:?Accepted(AC):正確。祝賀您!您的程序是正確的,并且運(yùn)行時(shí)間和內(nèi)存開(kāi)銷均不超過(guò)相應(yīng)的限制。?PresentationError(PE):格式錯(cuò)。您的程序輸出了正確的結(jié)果,但是輸出格式并非嚴(yán)格滿足題目說(shuō)明。請(qǐng)檢查空格、換行、左右對(duì)齊等。?WrongAnswer(WA):答案錯(cuò)。您的程序?qū)σ唤M或者多組評(píng)測(cè)系統(tǒng)內(nèi)部的非公開(kāi)測(cè)試數(shù)據(jù)給出了錯(cuò)誤的結(jié)果,因此還需要更進(jìn)一步的調(diào)試。1.8.5自動(dòng)評(píng)測(cè)系統(tǒng)1.8程序設(shè)計(jì)競(jìng)賽?RuntimeError(RE):運(yùn)行錯(cuò)。您的程序在運(yùn)行結(jié)束之前存在段錯(cuò)誤(SegmentationFault)、訪問(wèn)沖突(ACCESSVIOLATION)、數(shù)組下標(biāo)超出范圍(ARRAYBOUNDSEXCEEDED)、浮點(diǎn)異常(FLOATPOINTEXCEPTION)或其他類似錯(cuò)誤、除零錯(cuò)誤(DIVISIONBYZERO)、棧溢出(STACKOVERFLOW)等。請(qǐng)仔細(xì)檢查程序中類似的錯(cuò)誤。?TimeLimitExceeded(TLE):超時(shí)。您的程序在某一組或多組數(shù)據(jù)上運(yùn)行的時(shí)間過(guò)長(zhǎng),該程序可能存在效率問(wèn)題。?MemoryLimitExceeded(MLE):超內(nèi)存。您的程序試圖使用超過(guò)評(píng)測(cè)系統(tǒng)規(guī)定大小的內(nèi)存。?OutputLimitExceeded(OLE):超輸出。您的程序輸出了過(guò)多的信息,這通常意味著您的程序陷入了一個(gè)帶輸出的無(wú)限循環(huán)中。?CompileError(CE):編譯錯(cuò)。編譯器無(wú)法成功地編譯您的程序,錯(cuò)誤信息將返回給用戶,編譯過(guò)程中產(chǎn)生的警告信息不會(huì)導(dǎo)致此錯(cuò)誤。?SystemError:系統(tǒng)錯(cuò)。例如您的程序需要超過(guò)了硬件限制的內(nèi)存。1.8程序設(shè)計(jì)競(jìng)賽2.在線評(píng)測(cè)系統(tǒng)-ACM網(wǎng)站(1)國(guó)內(nèi)①湖南師范大學(xué)ACM網(wǎng)站含有涉及數(shù)據(jù)結(jié)構(gòu)、算法、計(jì)算幾何、湖南省大學(xué)生程序設(shè)計(jì)比賽題目等超過(guò)1600道題目。②杭州電子科技大學(xué)功能比較齊全,國(guó)內(nèi)比較權(quán)威的ACM網(wǎng)站。有超過(guò)5000道題目,亞洲區(qū)域賽國(guó)內(nèi)賽站的網(wǎng)絡(luò)預(yù)賽和現(xiàn)場(chǎng)賽的題目均可在本網(wǎng)站找到。此外,還可以在網(wǎng)站上組織比賽(DIYcontest)。③北京大學(xué)題目是全英文的,題目的數(shù)量、質(zhì)量都很高,是國(guó)內(nèi)知名的在線評(píng)測(cè)系統(tǒng)。1.8程序設(shè)計(jì)競(jìng)賽(2)國(guó)外①俄羅斯烏拉爾大學(xué)(URAL),題目為全英文,題目的數(shù)量、質(zhì)量都很高。②西班牙瓦拉杜利德大學(xué)(UVA)OJ,歷年區(qū)域賽和全球總決賽的題目均可以在此OJ上找到。③美國(guó)USACO在線評(píng)測(cè)系統(tǒng)具有遞進(jìn)的層次結(jié)構(gòu),由易到難,形成鮮明知識(shí)結(jié)構(gòu)的特點(diǎn)。定期有各種比賽可以參與,不僅能在網(wǎng)站上看自己提交的代碼,而且可以查看別人提交的代碼,并且提供題目的測(cè)試數(shù)據(jù)。④俄羅斯CodeforcesCodeforces是一個(gè)提供在線評(píng)測(cè)系統(tǒng)的網(wǎng)站。1.9習(xí)題1.熟悉C語(yǔ)言的集成開(kāi)發(fā)環(huán)境的使用。2.掌握C應(yīng)用程序的編輯、編譯、鏈接和運(yùn)行過(guò)程。3.將本章中的例題程序在集成開(kāi)發(fā)環(huán)境中進(jìn)行測(cè)試。4.熟悉OJ的使用,在OJ上注冊(cè)自己的賬號(hào)。5.分別用自然語(yǔ)言、流程圖、N-S流程圖和偽代碼描述下面問(wèn)題的算法。(1)求N的階乘。(2)判斷一個(gè)數(shù)是否為素?cái)?shù)。6.什么是結(jié)構(gòu)化程序設(shè)計(jì)方法?它的主要內(nèi)容包括哪些?

2.1順序結(jié)構(gòu)程序設(shè)計(jì)概述在C語(yǔ)言中,程序的基本結(jié)構(gòu)包括順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。已經(jīng)證明:任何可解問(wèn)題的解決過(guò)程都是由這三種結(jié)構(gòu)通過(guò)有限次組合而成的。其中,順序結(jié)構(gòu)是最基本的結(jié)構(gòu),它按照代碼的順序從上到下依次執(zhí)行。在順序結(jié)構(gòu)中,程序的執(zhí)行流程是線性的,從頭到尾依次執(zhí)行每個(gè)語(yǔ)句。順序結(jié)構(gòu)通常用于簡(jiǎn)單的程序,例如計(jì)算一個(gè)數(shù)的加法或減法等?!纠?-1】下面是一個(gè)簡(jiǎn)單的C語(yǔ)言程序,計(jì)算a加b的結(jié)果,它演示了順序結(jié)構(gòu)的基本用法。#include<stdio.h>intmain(){

inta=5;

intb=10;

intsum=a+b;

printf("Thesumof%dand%dis%d\n",a,b,sum);

return0;}2.2數(shù)據(jù)類型C語(yǔ)言是一門強(qiáng)數(shù)據(jù)類型語(yǔ)言,類型是C語(yǔ)言中非常重要的概念。C語(yǔ)言中的所有數(shù)據(jù)都屬于且只屬于某一種類型。C語(yǔ)言不存在沒(méi)有類型的數(shù)據(jù),也不存在擁有多種類型的數(shù)據(jù)。C語(yǔ)言將類型劃分為基本類型與復(fù)合類型,基本類型包括整型、實(shí)型和字符型,復(fù)合類型包括數(shù)組、指針、結(jié)構(gòu)體、共用體、枚舉以及空類型。2.2數(shù)據(jù)類型1.常量在程序運(yùn)行過(guò)程中,其值不能改變的數(shù)據(jù)對(duì)象稱為常量(constants)。(1)整型常量:整型常量可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制。例如:123、0123(八進(jìn)制,前綴為數(shù)字0)、0x2F(十六進(jìn)制,前綴為數(shù)字0和字符x,x大寫(xiě)和小寫(xiě)均可)。(2)浮點(diǎn)型常量:浮點(diǎn)型常量由整數(shù)部分、小數(shù)點(diǎn)、小數(shù)部分和指數(shù)部分組成??梢杂脙煞N形式表示,一是十進(jìn)制小數(shù)形式,例如:123.456。二是指數(shù)形式,例如:3.14e+002(代表3.14×102),e或E代表以10為底的指數(shù)。(3)字符型常量:字符型常量是用單引號(hào)括起來(lái)的單個(gè)字符。例如:'a'、'1'。值得注意的是,字符常量在內(nèi)存中是以ASCII碼的形式存儲(chǔ)的,因此,一個(gè)字符常量也是一個(gè)整數(shù)。例如:字符'0'的ASCII碼值為48,字符'1'的ASCII碼值為49,字符'A'的ASCII碼值為65,字符'a'的ASCII碼值為97,同一個(gè)字符的大小寫(xiě)字符的ASCII碼值相差32。字符常量可以像其他整數(shù)一樣參與數(shù)值運(yùn)算。2.2.1常量和變量2.2數(shù)據(jù)類型C語(yǔ)言還有一種特殊形式的字符常量,即轉(zhuǎn)義字符。轉(zhuǎn)義字符以反斜線\開(kāi)頭(注意與除號(hào)/的區(qū)別),形式仍然需要加單引號(hào),反斜線后面的內(nèi)容又可分為3種:第1種是規(guī)定的11個(gè)簡(jiǎn)單轉(zhuǎn)義字符;第2種是反斜線后接1到3個(gè)數(shù)字,這1到3個(gè)數(shù)字代表一個(gè)八進(jìn)制數(shù),對(duì)應(yīng)所表示字符的ASCII碼值;第3種則是反斜線后面接一個(gè)小寫(xiě)字母x,然后接若干個(gè)數(shù)字表示一個(gè)十六進(jìn)制數(shù),對(duì)應(yīng)所表示字符的ASCII碼值。轉(zhuǎn)義字符見(jiàn)表2-1。2.2數(shù)據(jù)類型(4)字符串常量:字符串常量也稱為字符串字面值,是由雙引號(hào)括起來(lái)的0個(gè)或多個(gè)字符組成的字符序列。例如:“Hello,World!”,""(空字符串)。字符串常量在內(nèi)存中由連續(xù)的字符組成,以'\0'作為結(jié)束標(biāo)志。(5)符號(hào)常量:在C語(yǔ)言中,符號(hào)常量是指在代碼中使用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)固定的值,這個(gè)標(biāo)識(shí)符就稱為符號(hào)常量。符號(hào)常量的特點(diǎn)是編譯后寫(xiě)在代碼區(qū),不可尋址,不可更改,屬于指令的一部分。符號(hào)常量在使用之前必須先定義,其一般形式為:#define標(biāo)識(shí)符常量。例如:#definePI3.14159常量的值可以是整數(shù)、浮點(diǎn)數(shù)、字符等類型。一旦定義了符號(hào)常量,就可以在程序中多次使用該標(biāo)識(shí)符,預(yù)處理器會(huì)在編譯時(shí)將其替換為對(duì)應(yīng)的常量值。2.2數(shù)據(jù)類型(6)枚舉常量:枚舉類型是一種用戶定義的數(shù)據(jù)類型,它包含一組常量整型值的列表。例如:enumcolor{RED,GREEN,BLUE};在沒(méi)有顯示說(shuō)明的情況下,enum類型中第一個(gè)枚舉名的值為0,第二個(gè)為1,依此類推。2.變量變量是一個(gè)有名字的、在內(nèi)存中占據(jù)一定存儲(chǔ)單元,用來(lái)存放數(shù)據(jù),也就是存放變量的值。在程序運(yùn)行期間,變量的值是可以改變的。在C語(yǔ)言中,變量必須先聲明后使用。聲明變量時(shí),需要指定變量的名稱和數(shù)據(jù)類型。2.2數(shù)據(jù)類型(1)標(biāo)識(shí)符標(biāo)識(shí)符是用來(lái)表示常量、變量、函數(shù)、數(shù)組、類型等命名的有效字符序列。構(gòu)造一個(gè)標(biāo)識(shí)符的名字,需要按照一定的規(guī)則。C語(yǔ)言標(biāo)識(shí)符的命名規(guī)則是:①由字母或下劃線“_”開(kāi)頭,后面接字母、數(shù)字或者下劃線。②用戶自定義的標(biāo)識(shí)符不能與關(guān)鍵字同名。例如:school_id,_age,es10為合法的標(biāo)識(shí)符。school-id,man*,2year,class為不合法的標(biāo)識(shí)符。(2)關(guān)鍵字關(guān)鍵字是一種特殊的標(biāo)識(shí)符,又稱保留字,是C系統(tǒng)為完成語(yǔ)言功能特別保留下來(lái)的一些單詞。C語(yǔ)言關(guān)鍵字見(jiàn)表2-2。2.2數(shù)據(jù)類型(3)變量的定義和初始化C語(yǔ)言使用變量定義語(yǔ)句來(lái)定義變量,其格式為:類型名變量名列表;其中,類型名表示數(shù)據(jù)類型的名字;變量名列表的格式為“變量名1,變量名2,…”,變量名就是前文所述的標(biāo)識(shí)符;注意后面的分號(hào)是不可以缺少的。例如:inta;//定義了一個(gè)int類型的變量,名字為afloatx,y;//定義了2個(gè)float類型的變量,名字分別為x、yDoubled1,d2,d3;//定義了3個(gè)double類型的變量,名字分別是d1、d2和d32.2數(shù)據(jù)類型C語(yǔ)言中,變量最重要的4個(gè)屬性:名、型、值、址。以第一個(gè)例子為例,該變量的名為a,類型是int,其取值的可能范圍就是int的取值范圍,且通過(guò)合法的語(yǔ)句是可以變化其值的,a的址就是指a在內(nèi)存空間中的保存地址(關(guān)于地址將在指針一章詳細(xì)講述)。實(shí)際上,變量一旦被定義,名、型、址都是不能變的,能變的只有值。變量的值可以通過(guò)若干方法去改變,在定義時(shí)確定其值則稱為初始化。例如:inta=3;Floatx=3.1,y=4.6;doubled1=.1,d2=1.,d3=2.31415925;2.2數(shù)據(jù)類型整型是C語(yǔ)言基本的數(shù)據(jù)類型之一,不嚴(yán)格地說(shuō),整型就是用來(lái)表示整數(shù)的。但嚴(yán)格地加以分辨,整數(shù)是一個(gè)數(shù)學(xué)概念,而整型是一個(gè)計(jì)算機(jī)概念,二者既有聯(lián)系又有區(qū)別。C語(yǔ)言使用關(guān)鍵字int來(lái)表示整型,根據(jù)其能不能加正負(fù)號(hào)以及所占內(nèi)存大小又可細(xì)分為以下幾種:unsignedshortint,signedshort,unsignedint,signedint,unsignedlongint,signedlongint,unsignedlonglongint,signedlonglongint。如果只寫(xiě)int,則默認(rèn)表示signedint。C標(biāo)準(zhǔn)本身并不規(guī)定一個(gè)int在內(nèi)存中應(yīng)該占據(jù)多少字節(jié),由于32位CPU占據(jù)市場(chǎng)主流非常長(zhǎng)的時(shí)間,直到今天也仍然沒(méi)有完全退出。所以事實(shí)是一個(gè)int占據(jù)4個(gè)字節(jié)。所以int類型總共擁有232

種可能的狀態(tài),也就是int一共可以表示232個(gè)不同的數(shù)值。2.2.2整型2.2數(shù)據(jù)類型大家都知道數(shù)學(xué)上的整數(shù)是無(wú)窮的,那么C語(yǔ)言中int到底包含哪232

個(gè)整數(shù)呢?這就跟另外2個(gè)關(guān)鍵字有關(guān)。如果是unsignedint,就說(shuō)明該類型包含的是無(wú)符號(hào)整數(shù),其實(shí)就是無(wú)負(fù)號(hào)整數(shù),包括0,所以u(píng)nsignedint的取值范圍是[0,232-1]。如果是signedint,那么就有正有負(fù)了,C++規(guī)定負(fù)數(shù)占一半,0和正數(shù)占另一半,所以取值范圍是[-231,231-1]。整型數(shù)據(jù)常見(jiàn)類型和取值范圍見(jiàn)表2-3。2.2數(shù)據(jù)類型C語(yǔ)言允許整型常量(3種形式的整型常量都可以)后面接2組4個(gè)后綴,分別是u、U和l、L。其中,u或U表示該整型常量是無(wú)符號(hào)整型常量,而l或L表示該整型常量是一個(gè)長(zhǎng)整型常量,連續(xù)兩個(gè)ll或者LL表示該整型常量是一個(gè)長(zhǎng)長(zhǎng)整型常量(64位整型)。同時(shí)U和L也可以不計(jì)秩序地進(jìn)行組合。例如:255U、255L、255LL、255UL、255LU、255ULL、255LLU都是合法的整型常量。雖然這些常量的值都是255,但它們的類型并不完全相同。2.2數(shù)據(jù)類型【例2-2】從鍵盤輸入兩個(gè)整數(shù),使用簡(jiǎn)單計(jì)算器求它們的和并輸出。分析:在程序設(shè)計(jì)中,大部分程序都可以看成是由輸入、處理、輸出三部分組成的,但部分程序也可以缺少其中部分成分。輸入即從鍵盤或文件讀取需要的數(shù)據(jù);處理是實(shí)現(xiàn)要完成的功能,比如計(jì)算;輸出是將結(jié)果展示給用戶。對(duì)應(yīng)到簡(jiǎn)單計(jì)算器:輸入———兩個(gè)整數(shù);處理———計(jì)算兩個(gè)整數(shù)的和;輸出———把計(jì)算出來(lái)的和展示給用戶。輸入使用scanf函數(shù),2.5節(jié)將詳細(xì)介紹。代碼如下:2.2數(shù)據(jù)類型#include<stdio.h>intmain(){inta,b,sum;scanf("%d%d",&a,&b);//給變量a,b輸入值,%d表示整數(shù)

sum=a+b;printf("%d\n",sum);//輸出和sumreturn0;}2.2數(shù)據(jù)類型C中的浮點(diǎn)型分為3類:float、double和longdouble,一般稱之為單精度實(shí)型、雙精度實(shí)型和長(zhǎng)精度實(shí)型。同樣,C標(biāo)準(zhǔn)本身并不規(guī)定實(shí)型在內(nèi)存中應(yīng)該占據(jù)多少個(gè)字節(jié)。但目前的事實(shí)是:float占據(jù)4個(gè)字節(jié),double占據(jù)8個(gè)字節(jié),而longdouble還沒(méi)有達(dá)成一致,有的系統(tǒng)給它分配12個(gè)字節(jié),有的則分配16個(gè)字節(jié)(所以longdouble一般使用較少)??梢钥闯?C能夠表達(dá)的實(shí)數(shù)是有限的。C可以表達(dá)的不同單精度實(shí)型數(shù)一共有232個(gè),雙精度實(shí)型有264

個(gè)。由于C采用了IEEE的浮點(diǎn)數(shù)表示法,所以C能夠表示的實(shí)數(shù)是以取值范圍和精度來(lái)衡量的。浮點(diǎn)數(shù)據(jù)取值范圍見(jiàn)表2-4。2.2.3浮點(diǎn)型2.2數(shù)據(jù)類型C使用關(guān)鍵字char來(lái)定義字符型變量,同時(shí)前面可加signed或者unsigned。C使用1個(gè)字節(jié)來(lái)存儲(chǔ)字符型變量,所以signedchar的取值范圍是[-128,127],unsignedchar的取值范圍是[0,255]。計(jì)算機(jī)內(nèi)部原則上只能保存二進(jìn)制的整數(shù),所以當(dāng)要存儲(chǔ)和表示字符數(shù)據(jù)時(shí)就需要進(jìn)行編碼(實(shí)際上存儲(chǔ)、表示任何類型都需要編碼)?;旧纤械腃實(shí)現(xiàn)都采取ASCII編碼。ASCII編碼的全稱是AmericanStandardCodeforInformationInterchange,簡(jiǎn)單地說(shuō)就是用[0,127]這128個(gè)數(shù)字分別表示對(duì)應(yīng)的128個(gè)字符。具體哪個(gè)數(shù)字對(duì)應(yīng)哪個(gè)字符請(qǐng)參考本書(shū)附錄A。2.2.4字符型2.2數(shù)據(jù)類型#include<stdio.h>intmain(){charc1='e',c2=75;printf("%d\n",c1);printf("%c\n",c2);printf("%d\n",c1-c2);printf("%c\n",c1+2);return0;}2.2數(shù)據(jù)類型運(yùn)行結(jié)果:101K26g程序說(shuō)明:printf("%d\n",c1);以整型輸出c1的值,輸出結(jié)果為101,即字符'e'的ASCII碼值。printf("%c\n",c2);以字符型輸出c2的值,輸出結(jié)果為字符'K',即整數(shù)75對(duì)應(yīng)字符'K'。printf("%d\n",c1-c2);以整型輸出c1-c2的值,即字符的ASCII碼值相減,結(jié)果為101-75=26。printf("%c\n",c1+2);以字符型輸出c1+2的值,c1+2的值為101+2=103,即字符'g'。因此,字符型可以當(dāng)成整型使用,并進(jìn)行算術(shù)運(yùn)算。2.2數(shù)據(jù)類型在C語(yǔ)言中,沒(méi)有內(nèi)置的bool類型。但是,從C99標(biāo)準(zhǔn)開(kāi)始,C語(yǔ)言引入了一個(gè)可選的stdbool.h頭文件,該文件定義了bool類型。使用stdbool.h頭文件,可以在代碼中使用bool類型,它是一個(gè)整數(shù)類型,通常具有兩個(gè)可能的值:true(1)和false(0),其中非0值表示true,0值表示false。2.2.5布爾型2.2數(shù)據(jù)類型【例2-4】布爾類型的使用。#include<stdio.h>#include<stdbool.h>intmain(){boola=100;printf("%d\n",a);a='F’;printf("%d\n",a);a=false;printf("%d\n",a);a=0;printf("%d\n",a);return0;}2.2數(shù)據(jù)類型運(yùn)行結(jié)果:1100從運(yùn)行結(jié)果可以看出,非0值在輸出的時(shí)候均輸出1,表示true。2.3運(yùn)算符和表達(dá)式C語(yǔ)言的運(yùn)算符是一種特殊字符,它指明用戶對(duì)操作數(shù)進(jìn)行的某種操作。表達(dá)式則是由若干個(gè)變量、常量及運(yùn)算符按一定格式形成組合后生成新的值,同時(shí)單獨(dú)的變量或者常量也視為一個(gè)表達(dá)式。每一個(gè)表達(dá)式都有一個(gè)計(jì)算結(jié)果,計(jì)算表達(dá)式的過(guò)程稱之為估值。例如:3+4就是一個(gè)表達(dá)式,其估值結(jié)果為7;單獨(dú)的3也是一個(gè)表達(dá)式,其估值結(jié)果就是3。2.3運(yùn)算符和表達(dá)式算術(shù)運(yùn)算符用于算術(shù)運(yùn)算,C的算術(shù)運(yùn)算符共5個(gè):+、-、*、/、%,分別是加、減、乘、除、取模(取余),都是雙目中綴運(yùn)算符。加、減的優(yōu)先級(jí)顯然低于乘、除、取模,這5個(gè)運(yùn)算符的結(jié)合性都是左結(jié)合。在使用的時(shí)候特別要注意乘法和除法的符號(hào)與數(shù)學(xué)中符號(hào)的區(qū)別?!纠?-5】交換變量的值。有兩個(gè)瓶子a和b,分別盛放醋和油,現(xiàn)要求將它們互換,即把a(bǔ)瓶子中的醋倒入b瓶子,b瓶子中的油倒入a瓶子。模擬交換的過(guò)程。分析:設(shè)a瓶子中有150毫升醋,b瓶子中有180毫升油,要交換a瓶子里的醋與b瓶子里的油,需要借助一個(gè)空瓶子t。(1)把a(bǔ)瓶子中的醋倒入t瓶子;(2)把b瓶子中的油倒入a瓶子;(3)把t瓶子中的醋倒入b瓶子。輸出交換a、b瓶子中的物品質(zhì)量。2.3.1算術(shù)運(yùn)算符2.3運(yùn)算符和表達(dá)式程序代碼如下:#include<stdio.h>intmain(){inta,b,t;a=150;b=180;t=a;a=b;b=t;printf("a=%d,b=%d",a,b);return0;}運(yùn)行結(jié)果:a=180,b=1502.3運(yùn)算符和表達(dá)式知識(shí)引申:請(qǐng)讀者思考,交換兩個(gè)變量的值的時(shí)候,可不可以不借助變量t完成兩個(gè)變量值的交換。分析:如果兩個(gè)變量存放的值對(duì)應(yīng)的數(shù)據(jù)類型是數(shù)字類型,則可以進(jìn)行交換,如a=150,b=180,計(jì)算過(guò)程如下:(1)若a=a+b,則a=330;(2)b=a-b,則b=150;(3)a=a-b,則a=180。通過(guò)三步計(jì)算完成了a和b值的交換,程序代碼如下:#include<stdio.h>intmain(){inta,b;a=150;b=180;a=a+b;b=a-b;a=a-b;printf("a=%d,b=%d",a,b);return0;}2.3運(yùn)算符和表達(dá)式關(guān)系運(yùn)算符用于對(duì)兩個(gè)操作數(shù)進(jìn)行關(guān)系比較,關(guān)系運(yùn)算符的運(yùn)算結(jié)果是一個(gè)邏輯值,即true(其值為1)或者false(其值為0)。關(guān)系運(yùn)算符一共有6個(gè):==、!=、<、<=、>、>=,分別是等于、不等于、小于、小于等于、大于、大于等于。其運(yùn)算含義就是當(dāng)運(yùn)算符描述的數(shù)學(xué)關(guān)系成立時(shí)結(jié)果為true,否則為false。例如:3==3的結(jié)果是true,而3<2的結(jié)果是false。關(guān)系運(yùn)算符都是雙目中綴運(yùn)算符,==、!=的優(yōu)先級(jí)要低于另外4個(gè),所有關(guān)系運(yùn)算符都是左結(jié)合的。2.3.2關(guān)系運(yùn)算符2.3運(yùn)算符和表達(dá)式【例2-6】分析程序中關(guān)系表達(dá)式的值。#include<stdio.h>intmain(){printf("65==65.0的值為%d\n",65==65.0);printf("9.0+1e-306>9+0的值為%d\n",9.0+1e-306>9+0);printf("68>'A'的值為%d\n",68>'A');return0;}運(yùn)行結(jié)果:65==65.0的值為19.0+1e-306>9+0的值為068>'A'的值為12.3運(yùn)算符和表達(dá)式C語(yǔ)言有3個(gè)邏輯運(yùn)算符:!、&&、||,分別是非(NOT)、與(AND)、或(OR)。其中非運(yùn)算符是單目前綴運(yùn)算符、右結(jié)合,與和或運(yùn)算符都是雙目中綴運(yùn)算符、左結(jié)合,它們的優(yōu)先級(jí)從高到低依次為非、與、或。邏輯運(yùn)算的結(jié)果可以由真值表確定。邏輯運(yùn)算的真值表見(jiàn)表2-5~表2-7。2.3.3邏輯運(yùn)算符2.3運(yùn)算符和表達(dá)式【例2-7】分析程序中邏輯表達(dá)式的值。#include<stdio.h>intmain(){inta=10,b=0;printf("a&&b=%d\n",a&&b);printf("a||b=%d\n",a||b);printf("!a=%d\n",!a);printf("!b=%d\n",!b);printf("(a>=5)&&(a<=10)=%d\n",(a>=5)&&(a<=10));return0;}運(yùn)行結(jié)果:a&&b=0a||b=1!a=0!b=1(a>=5)&&(a<=10)=12.3運(yùn)算符和表達(dá)式自增運(yùn)算符的形式為++,俗稱“加加”;自減運(yùn)算符的形式為--,俗稱“減減”。自增運(yùn)算符一共有兩種,但形式上是一樣的,都是++。一個(gè)是單目前綴運(yùn)算符,另一個(gè)是單目后綴運(yùn)算符,所以可以通過(guò)操作數(shù)的位置來(lái)判斷到底是哪一種自增運(yùn)算符。自減運(yùn)算符也有兩種,情況與自增運(yùn)算符類似。自增運(yùn)算符和自減運(yùn)算符的操作數(shù)都必須是左值,也就是能夠出現(xiàn)在賦值符號(hào)左邊的量,所以++3、(a+b)++等都是語(yǔ)法錯(cuò)誤的表達(dá)式。前綴自增運(yùn)算符的含義是將操作數(shù)的原值取出加1,并將加1后的值賦給操作數(shù),同時(shí)整個(gè)前綴自增運(yùn)算符表達(dá)式的估值結(jié)果是使用加1后的值。后綴自增運(yùn)算符的含義則是將操作數(shù)的原值取出加1,再將加1后的值賦給操作數(shù),同時(shí)整個(gè)后綴自增運(yùn)算符表達(dá)式的估值結(jié)果是原值,即加1以前的值。所以前綴自增運(yùn)算符和后綴自增運(yùn)算符對(duì)操作數(shù)的操作是一致的,不一致的地方是表達(dá)式的估值結(jié)果。此外,前綴自增運(yùn)算符表達(dá)式返回的是左值,后綴自增運(yùn)算符表達(dá)式返回的是右值。自減運(yùn)算符則是對(duì)操作數(shù)的原值進(jìn)行減1操作再將新值賦給操作數(shù),自減運(yùn)算符的前綴運(yùn)算符與后綴運(yùn)算符的區(qū)別與自增運(yùn)算符一致。2.3.4自增運(yùn)算符和自減運(yùn)算符的使用2.3運(yùn)算符和表達(dá)式【例2-8】分析程序中自增和自減運(yùn)算的值。#include<stdio.h>intmain(){inta=10,b;b=a++;printf("a=%d,b=%d\n",a,b);b=++a;printf("a=%d,b=%d\n",a,b);b=a--;printf("a=%d,b=%d\n",a,b);b=--a;printf("a=%d,b=%d\n",a,b);return0;}運(yùn)行結(jié)果:a=11,b=10a=12,b=12a=11,b=12a=10,b=102.3運(yùn)算符和表達(dá)式C語(yǔ)言位運(yùn)算符廣義上分為狹義位運(yùn)算符和移位運(yùn)算符。移位運(yùn)算符下一節(jié)講述,本節(jié)所指的位運(yùn)算符就是狹義位運(yùn)算符,共4個(gè):~、&、^、|,分別是位非、位與、位異或、位或,優(yōu)先級(jí)也是按照這個(gè)順序排列。其中,位非是單目前綴運(yùn)算符,右結(jié)合,其余都是雙目中綴運(yùn)算符,左結(jié)合。位與運(yùn)算符(&):該運(yùn)算符將兩個(gè)整數(shù)的二進(jìn)制位進(jìn)行與操作,只有當(dāng)兩個(gè)相應(yīng)的二進(jìn)制位都為1時(shí),結(jié)果位才為1,否則為0。位或運(yùn)算符(|):該運(yùn)算符將兩個(gè)整數(shù)的二進(jìn)制位進(jìn)行或操作,只要兩個(gè)相應(yīng)的二進(jìn)制位中有一個(gè)為1,結(jié)果位就為

溫馨提示

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

評(píng)論

0/150

提交評(píng)論