程序設(shè)計(jì)基礎(chǔ)(C語言)教程 課件全套 劉媛媛 第1-10章 C語言程序設(shè)計(jì)概述-文件_第1頁
程序設(shè)計(jì)基礎(chǔ)(C語言)教程 課件全套 劉媛媛 第1-10章 C語言程序設(shè)計(jì)概述-文件_第2頁
程序設(shè)計(jì)基礎(chǔ)(C語言)教程 課件全套 劉媛媛 第1-10章 C語言程序設(shè)計(jì)概述-文件_第3頁
程序設(shè)計(jì)基礎(chǔ)(C語言)教程 課件全套 劉媛媛 第1-10章 C語言程序設(shè)計(jì)概述-文件_第4頁
程序設(shè)計(jì)基礎(chǔ)(C語言)教程 課件全套 劉媛媛 第1-10章 C語言程序設(shè)計(jì)概述-文件_第5頁
已閱讀5頁,還剩538頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)概述

1、程序設(shè)計(jì)語言的發(fā)展與分類

程序設(shè)計(jì)語言(ProgramDesignLanguage,簡稱PDL),又稱編程語言,是一組用來定義計(jì)算機(jī)程序的語法規(guī)則。它是一種被標(biāo)準(zhǔn)化的交流技巧,用來向計(jì)算機(jī)發(fā)出指令。一種計(jì)算機(jī)語言讓程序員能夠準(zhǔn)確地定義計(jì)算機(jī)所需要使用的數(shù)據(jù),并精確地定義在不同情況下所應(yīng)當(dāng)采取的行動(dòng)。程序設(shè)計(jì)語言有很多種,常用的不過十多種,按照程序設(shè)計(jì)語言與計(jì)算機(jī)硬件的聯(lián)系程度將其分為三類,即機(jī)器語言、匯編語言和高級(jí)語言。前兩類依賴于計(jì)算機(jī)硬件,有時(shí)統(tǒng)稱為低級(jí)語言,而高級(jí)語言與計(jì)算機(jī)硬件關(guān)系較小。(1)機(jī)器語言

機(jī)器語言是用二進(jìn)制代碼表示的計(jì)算機(jī)能直接識(shí)別和執(zhí)行的一種機(jī)器指令的集合。

機(jī)器指令由操作碼和操作數(shù)組成,操作碼指出要進(jìn)行什么樣的操作,操作數(shù)指出完成該操作的數(shù)或它在內(nèi)存中的地址。

例如,計(jì)算1+2的機(jī)器語言程序如下:

1011000000000001;將1存入寄存器AL中

0000010000000010;將2與寄存器AL中的值相加,結(jié)果放在寄存器AL中

11110100;停機(jī)

由此可見,用機(jī)器語言編寫程序,編程人員要首先熟記所用計(jì)算機(jī)的全部指令代碼和代碼的涵義。

(2)匯編語言

為了克服機(jī)器語言的缺點(diǎn),人們采用了有助于記憶的符號(hào)(稱為指令助記符)與符號(hào)地址來代替器指令中的操作碼和操作數(shù)。指令助記符是一些有意義的英文單詞的縮寫和符號(hào),如用ADD(Addition)表示加法,用SUB(Subtract)表示減法,用MOV(Move)表示數(shù)據(jù)的傳送等等。而操作數(shù)可以直接用十進(jìn)制數(shù)書寫,地址碼可以用寄存器名、存儲(chǔ)單元的符號(hào)地址等表示。這種表示計(jì)算機(jī)指令的語言稱為匯編語言。

例如上述計(jì)算1+2的匯編語言程序如下:

MOVAL,1;將1存入寄存器AL中

ADDAL,2;將2與寄存器AL中的值相加,結(jié)果放在寄存器AL中

HLT;停機(jī)

由些可見,匯編語言克服了機(jī)器語言的難讀難改的缺點(diǎn),同時(shí)保持了占存儲(chǔ)空間小,執(zhí)行速度快的優(yōu)點(diǎn),因此許多系統(tǒng)軟件的核心部分仍采用匯編語言編制。但是,匯編語言仍是一種面向機(jī)器的語言,每條匯編命令都一一對(duì)應(yīng)于機(jī)器指令,而不同的計(jì)算機(jī)在指令長度、尋址方式、寄存器數(shù)目等都不一樣,這使得匯編語言具有通用性差,可讀性也差。

(3)高級(jí)語言

所謂高級(jí)語言就是更接近自然語言、更接近數(shù)學(xué)語言的程序設(shè)計(jì)語言。它是面向應(yīng)用的計(jì)算機(jī)語言,與具體的機(jī)器無關(guān),其優(yōu)點(diǎn)是符合人類的敘述問題的習(xí)慣,而且簡單易學(xué)。高級(jí)語言與計(jì)算機(jī)的硬件結(jié)構(gòu)及指令系統(tǒng)無關(guān),它有更強(qiáng)的表達(dá)能力,可方便地表示數(shù)據(jù)的運(yùn)算和程序的控制結(jié)構(gòu),能更好的描述各種算法,而且容易學(xué)習(xí)掌握。但高級(jí)語言編譯生成的程序代碼一般比用匯編程序語言設(shè)計(jì)的程序代碼要長,執(zhí)行的速度也慢。

2、程序設(shè)計(jì)方法

1)程序設(shè)計(jì)過程

計(jì)算機(jī)程序設(shè)計(jì)的過程包括問題定義、算法設(shè)計(jì)、程序設(shè)計(jì)以及調(diào)試運(yùn)行。整個(gè)開發(fā)過程都要編制相應(yīng)的文檔,以便管理。

(1)問題定義

在計(jì)算機(jī)能夠理解一些抽象的名詞并做出一些智能的反應(yīng)之前,必須要對(duì)交給計(jì)算機(jī)的任務(wù)做出定義,并最終翻譯成計(jì)算機(jī)能識(shí)別的語言。問題定義的方法很多(對(duì)此在軟件工程的需求分析中會(huì)有更多解釋,包括描述方法和工具),但一般包括三個(gè)部分:輸入、輸出和處理。

(2)算法設(shè)計(jì)

問題定義確定了未來程序的輸入、輸出、處理,但并沒有具體說明處理的步驟,而算法則是對(duì)解決問題步驟的描述。

(3)程序設(shè)計(jì)

問題定義和算法設(shè)計(jì)已經(jīng)為程序設(shè)計(jì)規(guī)劃好了藍(lán)本,下一步就是用真正的計(jì)算機(jī)語言表達(dá)了。不同的語言寫出的程序有時(shí)會(huì)有較大的差別。

(4)調(diào)試運(yùn)行

程序編寫可以在計(jì)算機(jī)上進(jìn)行,也可以在紙張上進(jìn)行,但最終要讓計(jì)算機(jī)來運(yùn)行則必須輸入到計(jì)算機(jī)中,并經(jīng)過調(diào)試,以便找出錯(cuò)誤,然后才能正確地運(yùn)行。

(5)文檔

對(duì)于微小的程序來說,有沒有文檔顯得并不怎么重要,但對(duì)于一個(gè)需要有多人合作,并且開發(fā)、維護(hù)較長時(shí)間的軟件來說,文檔就是至關(guān)重要的。文檔記錄程序設(shè)計(jì)的算法、實(shí)現(xiàn)以及修改的過程,保證程序的可讀性和可維護(hù)性。程序中的注釋就是一種很好的文檔。

2)結(jié)構(gòu)化程序設(shè)計(jì)方法

在早期由于計(jì)算機(jī)存儲(chǔ)器容量非常小,人們?cè)O(shè)計(jì)程序時(shí)首先考慮的問題是如何減少存儲(chǔ)器開銷,硬件的限制不容許人們考慮如何組織數(shù)據(jù)與邏輯,為此程序員使用各種技巧和手段編寫高效的程序。其中顯著的特點(diǎn)是程序中大量使用GOTO語句,使得程序結(jié)構(gòu)混亂、可讀性差、可維護(hù)性差、通用性差。但是,隨著大容量存儲(chǔ)器的出現(xiàn)及計(jì)算機(jī)技術(shù)的廣泛應(yīng)用,程序編寫越來越困難,程序的大小以算術(shù)基數(shù)遞增,而程序的邏輯控制難度則以幾何基數(shù)遞增,人們不得不考慮程序設(shè)計(jì)的方法。

結(jié)構(gòu)化程序設(shè)計(jì)是進(jìn)行以模塊功能和處理過程設(shè)計(jì)為主的詳細(xì)設(shè)計(jì)的基本原則,其概念最早由荷蘭科學(xué)家E.W.Dijkstra提出,它的主要觀點(diǎn)是采用自頂向下、逐步求精的程序設(shè)計(jì)方法;使用三種基本控制結(jié)構(gòu)構(gòu)造程序,任何程序都可由順序、選擇、重復(fù)三種基本控制結(jié)構(gòu)構(gòu)造。

3)面向?qū)ο蟪绦蛟O(shè)計(jì)

雖然結(jié)構(gòu)化程序設(shè)計(jì)方法具有很多的優(yōu)點(diǎn),但它仍是一種面向過程的程序設(shè)計(jì)方法,它把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨(dú)立的實(shí)體。當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過程都要進(jìn)行相應(yīng)的修改,每一種相對(duì)于老問題的新方法都要帶來額外的開銷,程序的可重用性差。

同時(shí)由于圖形用戶界面的應(yīng)用,程序運(yùn)行由順序運(yùn)行演變?yōu)槭录?qū)動(dòng),使得軟件使用起來越來越方便,但開發(fā)起來卻越來越困難,對(duì)這種軟件的功能很難用過程來描述和實(shí)現(xiàn),使用面向過程的方法來開發(fā)和維護(hù)都將非常困難。

由于上述缺陷已不能滿足現(xiàn)代化軟件開發(fā)的要求,一種全新的軟件開發(fā)技術(shù)應(yīng)運(yùn)而生,這就是面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming,OOP)。面向?qū)ο蟪绦蛟O(shè)計(jì)方法是于20世紀(jì)60年代后期首次提出,80年代開始走向?qū)嵱谩?/p>

面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming,OOP)是一種計(jì)算機(jī)編程架構(gòu)。OOP的一條基本原則是計(jì)算機(jī)程序由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。OOP=對(duì)象+類+繼承+多態(tài)+消息,其中核心概念是類和對(duì)象。面向?qū)ο蟪绦蛟O(shè)計(jì)方法是盡可能模擬人類的思維方式,使得軟件的開發(fā)方法與過程盡可能接近人類認(rèn)識(shí)世界、解決現(xiàn)實(shí)問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結(jié)構(gòu)上盡可能一致,把客觀世界中的實(shí)體抽象為問題域中的對(duì)象。面向?qū)ο蟪绦蛟O(shè)計(jì)以對(duì)象為核心,該方法認(rèn)為程序由一系列對(duì)象組成。

3、程序設(shè)計(jì)語言翻譯系統(tǒng)

1)匯編語言翻譯系統(tǒng)

匯編語言翻譯系統(tǒng)(匯編程序)的主要功能是將匯編語言書寫的源程序翻譯成用二進(jìn)制代碼0或1表示的等價(jià)的機(jī)器語言,形成計(jì)算機(jī)可以執(zhí)行的機(jī)器指令代碼,如圖所示。

匯編語言源程序匯編程序機(jī)器語言目標(biāo)程序輸入翻譯輸出2)高級(jí)程序設(shè)計(jì)語言翻譯系統(tǒng)

高級(jí)程序設(shè)計(jì)語言翻譯系統(tǒng)是指將用高級(jí)語言編寫的源程序翻譯成等價(jià)的匯編語言程序或機(jī)器語言程序的處理系統(tǒng),也稱為編譯程序。

由此可見,在計(jì)算機(jī)上用編譯方式執(zhí)行高級(jí)語言編寫的程序,一般需要兩個(gè)階段:第一階段稱為編譯階段,其任務(wù)是由編譯程序?qū)⒃闯绦蚍g為目標(biāo)程序,如果目標(biāo)程序不是機(jī)器語言程序,則尚須匯編程序再行匯編為機(jī)器代碼程序;第二階段為運(yùn)行階段,其任務(wù)是在目標(biāo)計(jì)算機(jī)上執(zhí)行編譯階段所得到的目標(biāo)程序。編譯程序和運(yùn)行系統(tǒng)合稱為編譯系統(tǒng)。圖1-6顯示了按編譯方式執(zhí)行一個(gè)高級(jí)語言的主要步驟。

3)高級(jí)程序設(shè)計(jì)語言解釋系統(tǒng)

高級(jí)程序設(shè)計(jì)語言解釋系統(tǒng)是按源程序中的語句的動(dòng)態(tài)順序逐條翻譯并立即執(zhí)行相應(yīng)功能的處理系統(tǒng)。它將源語言(如BASIC)書寫的源程序作為輸入,解釋一句后就提交計(jì)算機(jī)執(zhí)行一句,并不形成目標(biāo)程序。

就像外語翻譯中的“口譯”一樣,說一句翻一句,不產(chǎn)生全文的翻譯文本。這種工作方式非常適合于人通過終端設(shè)備與計(jì)算機(jī)會(huì)話,如在終端上打一條命令或語句,解釋程序就立即將此語句解釋成一條或幾條指令并提交硬件立即執(zhí)行且將執(zhí)行結(jié)果反映到終端,從終端把命令打入后,就能立即得到計(jì)算結(jié)果。

對(duì)源程序邊解釋翻譯成機(jī)器代碼邊執(zhí)行的高級(jí)語言程序。由于它的方便性和交互性較好,早期一些高級(jí)語言采用這種方式,如BASIC。但它的弱點(diǎn)是運(yùn)行效率低,程序的運(yùn)行依賴于開發(fā)環(huán)境,不能直接在操作系統(tǒng)下運(yùn)行。

4、算法及其描述

1)什么是算法

計(jì)算機(jī)解題一般可分解成若干操作步驟,通常把完成某一任務(wù)的操作步驟稱為求解該問題的算法。程序就是用計(jì)算機(jī)語言描述的算法。

算法是指完成一個(gè)任務(wù)所需要的具體步驟和方法。也就是說給定初始狀態(tài)或輸入數(shù)據(jù),能夠得出所要求或期望的終止?fàn)顟B(tài)或輸出數(shù)據(jù)。

既然算法是解決給定問答的方法,算法所處理的對(duì)象就是該問題所涉及的數(shù)據(jù)。程序的目的就是加工數(shù)據(jù),而如何加工數(shù)據(jù)就是算法的目的。

例如給定兩個(gè)正整數(shù)m和n求它們的最大公約數(shù)。在學(xué)數(shù)學(xué)的時(shí)候,我們都知道即求能同時(shí)整除m和n的最大正整數(shù)。但是要在計(jì)算機(jī)中實(shí)現(xiàn)的話,僅有數(shù)學(xué)的思維是不行的,計(jì)算機(jī)中實(shí)現(xiàn)的步驟如下:

(1)以n除m并令所得余數(shù)為r,r必小于n;

(2)若r=0算法結(jié)束,輸出結(jié)果n。否則繼續(xù)步驟(3);

(3)將m置換為n,n置換為r,并返回步驟(1)繼續(xù)進(jìn)行。

2)算法的性質(zhì)

著名計(jì)算機(jī)科學(xué)家DonaldKnuth在他的著作《TheArtofComputerProgramming》曾把算法的性質(zhì)歸納為以下五點(diǎn):

(1)輸入:一個(gè)算法必須有零個(gè)或以上輸入量。

(2)輸出:一個(gè)算法應(yīng)有一個(gè)或以上輸出量,輸出量是算法計(jì)算的結(jié)果。

(3)明確性:算法的描述必須無歧義,以保證算法的實(shí)際執(zhí)行結(jié)果是精確地符合要求或期望,通常要求實(shí)際運(yùn)行結(jié)果是確定的。

(4)有限性:依據(jù)圖靈的定義,一個(gè)算法是能夠被任何圖靈完備系統(tǒng)模擬的一串運(yùn)算,而圖靈機(jī)只有有限個(gè)狀態(tài)、有限個(gè)輸入符號(hào)和有限個(gè)轉(zhuǎn)移函數(shù)(指令)。而一些定義更規(guī)定算法必須在有限個(gè)步驟內(nèi)完成任務(wù)。

(5)有效性:又稱可行性。能夠?qū)崿F(xiàn),算法中描述的操作都是可以通過已經(jīng)實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限次來實(shí)現(xiàn)。

3)算法的描述

算法是對(duì)解題過程的精確描述。定義解決問題的算法對(duì)程序員來說通常是最具挑戰(zhàn)性的任務(wù)。它既是一種技能又是一門藝術(shù),要求程序員懂得程序設(shè)計(jì)概念并具有創(chuàng)造性。對(duì)算法的描述是建立在語言基礎(chǔ)之上的。在將算法轉(zhuǎn)化為高級(jí)語言源程序之前,通常先采用文字或圖形工具來描述算法。文字工具如自然語言、偽代碼等,圖形工具如流程圖、N-S流程圖等。

(1)自然語言

自然語言即人們?nèi)粘I钪兴玫恼Z言,如漢語、英語等。使用自然語言不用專門訓(xùn)練,所描述的算法也通俗易懂。然而其缺點(diǎn)也是明顯的:首先是由于自然語言的歧義性容易導(dǎo)致算法執(zhí)行的不確定性;其次是由于自然語言表示的串行性,因此當(dāng)一個(gè)算法中循環(huán)和分支較多時(shí)就很難清晰地表示出來;此外,自然語言表示的算法不便轉(zhuǎn)換成用計(jì)算機(jī)程序設(shè)計(jì)語言表示的程序。

(2)流程圖

流程圖是采用一些框圖符號(hào)來描述算法的邏輯結(jié)構(gòu),每個(gè)框圖符號(hào)表示不同性質(zhì)的操作。流程圖可以很方便地表示任何程序的邏輯結(jié)構(gòu)。另外,用流程圖表示的算法不依賴于任何具體的計(jì)算機(jī)和程序設(shè)計(jì)語言,從而有利于不同環(huán)境的程序設(shè)計(jì)。早在20世紀(jì)60年代,美國國家標(biāo)準(zhǔn)協(xié)會(huì)ANSI(AmericanNationalStandardsInstitute)就頒布了流程圖的標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)規(guī)定了用來表示程序中各種操作的流程圖符號(hào),例如用矩形表示處理,用菱形表示判斷,用平行四邊形表示輸入/輸出,用帶箭頭的折線表示流程等等。如表1所示流程圖符號(hào)及意義

(3)N-S流程圖

N-S流程圖又稱為結(jié)構(gòu)化流程圖,于1973年由美國學(xué)者I.Nassi和B.Shnei-derman提出。與傳統(tǒng)流程圖不同的是,N-S流程圖不用帶箭頭的流程線來表示程序流程的方向,而采用一系列矩形框來表示各種操作,全部算法寫在一個(gè)大的矩形框內(nèi),在大框內(nèi)還可以包含其他從屬于它的小框,這些框一個(gè)接一個(gè)從上向下排列,程序流程的方向總是從上向下。N-S結(jié)構(gòu)化流程圖比較適合于表達(dá)三種基本結(jié)構(gòu)(順序、選擇、循環(huán)),適于結(jié)構(gòu)化程序設(shè)計(jì),因此很受程序員歡迎。

N-S流程圖用以下的流程圖符號(hào)表示:

a)順序結(jié)構(gòu)。順序結(jié)構(gòu)用圖1-3形式表示。A和B兩個(gè)框組成一個(gè)順序結(jié)構(gòu)。

b)選擇結(jié)構(gòu)。選擇結(jié)構(gòu)用圖1-4表示。它與圖1-3相應(yīng)。當(dāng)p條件成立時(shí)執(zhí)行A操作,p不成立則執(zhí)行B操作。注意:圖1-4時(shí)一個(gè)整體,代表一個(gè)基本結(jié)構(gòu)。

圖1-3圖1-4圖1-5圖1-6c)循環(huán)結(jié)構(gòu)?!爱?dāng)”型循環(huán)結(jié)構(gòu)用圖1-5形式表示。圖1-5表示當(dāng)p1條件成立時(shí)反復(fù)執(zhí)行A操作,直到p1條件不成立為止?!爸钡健毙脱h(huán)結(jié)構(gòu)用圖2-15形式表示。

在初學(xué)時(shí),為清楚起見,可如圖1-5和圖1-6那樣,寫明“當(dāng)p1”或“直到p2”,待熟練之后,可以不寫“當(dāng)”和“直到”字樣,只寫“p1”和“p2”。從圖的形狀即可知道是“當(dāng)”型或“直到”型。

用以上三種N-S流程圖中的基本框可以組成復(fù)雜的N-S流程圖,以表示算法。

應(yīng)當(dāng)說明,在圖中的A框或B框,可以是一個(gè)簡單的操作(如讀入數(shù)據(jù)或打印輸出等),也可以是3個(gè)基本結(jié)構(gòu)之一。

例如,圖1-7所表示的順序結(jié)構(gòu),其中的A框可以又是一個(gè)選擇結(jié)構(gòu),B框可以又是一個(gè)循環(huán)結(jié)構(gòu)。如圖1-8所示那樣,由A和B這兩個(gè)基本結(jié)構(gòu)組成一個(gè)順序結(jié)構(gòu)。圖1-7圖1-8(4)偽代碼

偽代碼是指不能夠直接編譯運(yùn)行的程序代碼,它是用介于自然語言和計(jì)算機(jī)語言之間的文字和符號(hào)來描述算法和進(jìn)行語法結(jié)構(gòu)講解的一個(gè)工具。表面上它很像高級(jí)語言的代碼,但又不像高級(jí)語言那樣要接受嚴(yán)格的語法檢查。它比真正的程序代碼更簡明,更貼近自然語言。它不用圖形符號(hào),因此書寫方便,格式緊湊,易于理解,便于向計(jì)算機(jī)程序設(shè)計(jì)語言算法程序過渡。用偽代碼書寫算法時(shí),既可以采用英文字母或單詞,也可以采用漢字,以便于書寫和閱讀。它沒有固定的、嚴(yán)格的語法規(guī)則,只要把意思表達(dá)清楚即可。用偽代碼描述算法時(shí),自上而下地往下寫。每一行(或每幾行)表示一個(gè)基本操作。用偽代碼書寫的算法格式緊湊,易于理解,便于轉(zhuǎn)化為計(jì)算機(jī)語言算法(即程序)。在書寫時(shí),偽代碼采用縮進(jìn)格式來表示三種基本結(jié)構(gòu)。一個(gè)模塊的開始語句和結(jié)束語句都靠著左邊界書寫,模塊內(nèi)的語句向內(nèi)部縮進(jìn)一段距離,選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)內(nèi)的語句再向內(nèi)縮進(jìn)一段距離。這樣的話,算法書寫格式一致,富有層次,清晰易讀,能直觀地區(qū)別出控制結(jié)構(gòu)的開始和結(jié)束。

(5)程序設(shè)計(jì)語言

對(duì)一些簡單的問題,可以直接使用某種程序設(shè)計(jì)語言來描述算法。

C語言實(shí)例

【例1-4】在屏幕上輸出Hello,World!。

C源程序:

#include<stdio.h>/*文件包含*/

Voidmain()/*主函數(shù)*/

{/*函數(shù)體開始*/

printf("Hello,World!\n");/*輸出語句*/

}/*函數(shù)體結(jié)束*/

說明:main是主函數(shù)名,每個(gè)C程序必須有一個(gè)主函數(shù)main,void是函數(shù)類型,表示空類型,說明主函數(shù)main沒有返回值。{}是函數(shù)開始和結(jié)束的標(biāo)志,不可省。每個(gè)C語句以分號(hào)結(jié)束。C語言提供了很多標(biāo)準(zhǔn)庫函數(shù)供用戶使用,使用時(shí)應(yīng)在程序開頭一行寫:#include<stdio.h>。

c說明:

程序的功能是從鍵盤輸入一個(gè)數(shù)x,求x的正弦值,然后輸出結(jié)果。在main()之前的兩行稱為預(yù)處理命令(詳見后面)。預(yù)處理命令還有其它幾種,這里的include稱為文件包含命令,其意義是把尖括號(hào)<>或引號(hào)""內(nèi)指定的文件包含到本程序來,成為本程序的一部分。被包含的文件通常是由系統(tǒng)提供的,其擴(kuò)展名為.h。因此也稱為頭文件或首部文件。C語言的頭文件中包括了各個(gè)標(biāo)準(zhǔn)庫函數(shù)的函數(shù)原型。因此,凡是在程序中調(diào)用一個(gè)庫函數(shù)時(shí),都必須包含該函數(shù)原型所在的頭文件。在本例中,使用了三個(gè)庫函數(shù):輸入函數(shù)scanf,正弦函數(shù)sin,輸出函數(shù)printf。sin函數(shù)是數(shù)學(xué)函數(shù),其頭文件為math.h文件,因此在程序的主函數(shù)前用include命令包含了math.h。scanf和printf是標(biāo)準(zhǔn)輸入輸出函數(shù),其頭文件為stdio.h,在主函數(shù)前也用include命令包含了stdio.h文件。

C程序構(gòu)成簡介

(1)C程序是由函數(shù)構(gòu)成的。這使得程序容易實(shí)現(xiàn)模塊化。

(2)一個(gè)函數(shù)由兩部分組成:

函數(shù)的首部:【例1-6】中的max函數(shù)首部

intmax(intx,inty)

函數(shù)體:花括號(hào)內(nèi)的部分。若一個(gè)函數(shù)有多個(gè)花括號(hào),則最外層的一對(duì)花括號(hào)為函數(shù)體的范圍。

函數(shù)體包括兩部分:

聲明部分:inta,b,c;可缺省。

執(zhí)行部分:由若干個(gè)語句組成。可缺省。

例如:

voiddump()

{

}

這是一個(gè)空函數(shù),什么也不做,但是合法的函數(shù)。

(3)C程序總是從main函數(shù)開始執(zhí)行的,與main函數(shù)的位置無關(guān)。

(4)C程序書寫格式自由,一行內(nèi)可以寫幾個(gè)語句,一個(gè)語句可以分寫在多行上,C程序沒有行號(hào)。

(5)每個(gè)語句和數(shù)據(jù)聲明的最后必須有一個(gè)分號(hào)。

(6)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數(shù)scanf和printf等函數(shù)來完成的。C對(duì)輸入輸出實(shí)行“函數(shù)化”。

C語言程序的執(zhí)行

C程序的運(yùn)行步驟

按照C語言語法規(guī)則編寫的C程序稱為源程序。事實(shí)上,計(jì)算機(jī)只能識(shí)別和執(zhí)行由0和1組成的二進(jìn)制機(jī)器語言,而不能識(shí)別和執(zhí)行高級(jí)語言。為了使計(jì)算機(jī)能夠執(zhí)行C源程序,設(shè)計(jì)好C源程序后,必須使用編譯軟件將源程序翻譯成二進(jìn)制的目標(biāo)程序,然后將目標(biāo)程序和系統(tǒng)的函數(shù)庫以及其他目標(biāo)程序鏈接起來,形成可執(zhí)行的目標(biāo)程序。所以在編好一個(gè)C源程序后,要經(jīng)過以下幾個(gè)步驟才能上機(jī)運(yùn)行:輸入編輯源程序→編譯源程序→鏈接庫函數(shù)→運(yùn)行目標(biāo)程序,具體過程如圖1-15所示,其中實(shí)線表示操作流程,虛線表示文件的輸入輸出。

1.編輯源程序

設(shè)計(jì)好的源程序要利用程序編輯器輸入到計(jì)算機(jī)中,輸入的程序一般以文本文件的形式存放在磁盤上,文件的擴(kuò)展名為.c。所用的編輯器可以是任何一種文本編輯軟件,比如像TurboC和VC++這樣的專用編輯系統(tǒng),或者是Windows系統(tǒng)提供的寫字板或字處理軟件等都可以用來編輯源程序。

2.編譯源程序

源程序是無法直接被計(jì)算機(jī)執(zhí)行的,因?yàn)橛?jì)算機(jī)只能執(zhí)行二進(jìn)制的機(jī)器指令,這就需要把源程序先翻譯成機(jī)器指令,然后計(jì)算機(jī)才能執(zhí)行翻譯好的程序,這個(gè)過程是由C語言的編譯系統(tǒng)完成的。源程序編譯之后生成的機(jī)器指令程序叫目標(biāo)程序,其擴(kuò)展名為.obj。

3.鏈接程序

在源程序中,輸入輸出等標(biāo)準(zhǔn)函數(shù)不是用戶自己編寫的,而是直接調(diào)用系統(tǒng)函數(shù)庫中的庫函數(shù)。因此,必須把目標(biāo)程序與庫函數(shù)進(jìn)行鏈接,才能生成擴(kuò)展名為.exe的可執(zhí)行文件。

4.運(yùn)行程序

執(zhí)行.exe文件,得到最終結(jié)果。

在編譯、鏈接和運(yùn)行程序過程中,都有可能出現(xiàn)錯(cuò)誤,此時(shí)可根據(jù)系統(tǒng)給出的錯(cuò)誤提對(duì)源程序進(jìn)行修改,并重復(fù)以上環(huán)節(jié),直到得出正確的結(jié)果為止。

第2章C語言的基礎(chǔ)知識(shí)2.1預(yù)備知識(shí)2.2數(shù)據(jù)類型2.3常量與變量2.4運(yùn)算符和表達(dá)式

2.5運(yùn)算符的優(yōu)先級(jí)及結(jié)合性2.6表達(dá)式的書寫規(guī)則2.7各種數(shù)據(jù)類型的轉(zhuǎn)換

2.1

預(yù)備知識(shí)計(jì)算機(jī)中數(shù)的表示及進(jìn)制轉(zhuǎn)換數(shù)碼、基與權(quán)數(shù)碼:表示數(shù)的符號(hào)基:數(shù)碼的個(gè)數(shù)權(quán):每一位所具有的值數(shù)制<>各種進(jìn)制之間的轉(zhuǎn)換二進(jìn)制、八進(jìn)制、十六進(jìn)制轉(zhuǎn)換成十進(jìn)制方法:按權(quán)位展開,相加<>各種進(jìn)制之間的轉(zhuǎn)換(整數(shù))二進(jìn)制、八進(jìn)制、十六進(jìn)制轉(zhuǎn)換成十進(jìn)制方法:按權(quán)位展開,相加十進(jìn)制轉(zhuǎn)換成二進(jìn)制、八進(jìn)制、十六進(jìn)制原理:方法:連續(xù)除以基,從低到高記錄余數(shù),直至商為0例把十進(jìn)制數(shù)59轉(zhuǎn)換成二進(jìn)制數(shù)5922921427232120(59)10=(111011)2110111111011余余余余余余例把十進(jìn)制數(shù)159轉(zhuǎn)換成八進(jìn)制數(shù)1598198280(159)10=(237)8237余7余3余2例把十進(jìn)制數(shù)459轉(zhuǎn)換成十六進(jìn)制數(shù)4591628161160(459)10=(1CB)161CB余11余12余1二進(jìn)制與八進(jìn)制之間的轉(zhuǎn)換二進(jìn)制轉(zhuǎn)換成八進(jìn)制:從右向左,每3位一組(不足3位左補(bǔ)0),轉(zhuǎn)換成八進(jìn)制八進(jìn)制轉(zhuǎn)換成二進(jìn)制:用3位二進(jìn)制數(shù)代替每一位八進(jìn)制數(shù)例(1101001)2=(001,101,001)2=(151)8例(246)8=(010,100,110)2=(10100110)2000~0001~1010~2011~3100~4101~5110~6111~7<>在C語言中,可以這樣表示:0151=(151)8、0246=

(246)8二進(jìn)制與十六進(jìn)制之間的轉(zhuǎn)換二進(jìn)制轉(zhuǎn)換成十六進(jìn)制:從右向左,每4位一組(不足4位左補(bǔ)0),轉(zhuǎn)換成十六進(jìn)制十六進(jìn)制轉(zhuǎn)換成二進(jìn)制:用4位二進(jìn)制數(shù)代替每一位十六進(jìn)制數(shù)例(11010101111101)2=(0011,0101,0111,1101)2=(357D)16例(4B9E)16=(0100,1011,1001,1110)2=(100101110011110)20000~00001~10010~20011~30100~40101~50110~60111~71000~81001~91010~A1011~B1100~C1101~D1110~E1111~F<>在C語言中,可以這樣表示:0x357D=(357D)16,0x4B9E=(4B9E)16字節(jié)和位內(nèi)存以字節(jié)為單元組成每個(gè)字節(jié)有一個(gè)地址一個(gè)字節(jié)一般由8個(gè)二進(jìn)制位組成每個(gè)二進(jìn)位的值是0或101234567012345678910……...<>7643251數(shù)值的表示方法——原碼、反碼和補(bǔ)碼原碼:最高位為符號(hào)位,其余各位為數(shù)值本身的絕對(duì)值反碼:正數(shù):反碼與原碼相同負(fù)數(shù):符號(hào)位為1,其余位對(duì)原碼取反補(bǔ)碼:正數(shù):原碼、反碼、補(bǔ)碼相同負(fù)數(shù):最高位為1,其余位為原碼取反,再對(duì)整個(gè)數(shù)加13126912457810119-5=49+7=16=(14)12<>原碼反碼補(bǔ)碼+7000001110000011100000111-7100001111111100011111001+0000000000000000000000000-0100000001111111100000000數(shù)的范圍01111111~11111111(-127~+127)01111111~10000000(-127~+127)01111111~10000000(-128~+127)(用一字節(jié)表示數(shù))負(fù)數(shù)補(bǔ)碼轉(zhuǎn)換成十進(jìn)制數(shù):最高位不動(dòng),其余位取反加1例補(bǔ)碼:11111001

取反:10000110

加1:10000111=-7<>2.2

數(shù)據(jù)類型數(shù)據(jù)類型總表<>C數(shù)據(jù)類型基本類型非基本類型指針類型(*)空類型(void)字符類型char枚舉類型(enum)整型(short/int/long)實(shí)型(浮點(diǎn)型)單精度型(float)雙精度型(double)數(shù)組類型([])結(jié)構(gòu)體(struct[...]共用體union[...]數(shù)據(jù)類型決定:1.數(shù)據(jù)占內(nèi)存字節(jié)數(shù)2.數(shù)據(jù)取值范圍3.其上可進(jìn)行的操作基本數(shù)據(jù)類型類型符號(hào)關(guān)鍵字?jǐn)?shù)的表示范圍所占位數(shù)整型字符型實(shí)型有無(signed)

int16-32768~32767(signed)

short16-32768~32767(signed)

long32-2147483648~214748364716unsigned

int0~65535320~4294967295unsigned

longunsigned

short160~65535有float323.4e-38~3.4e38有double641.7e-308~1.7e308有char8-128~127無unsignedchar80~255說明:數(shù)據(jù)類型所占字節(jié)數(shù)隨機(jī)器硬件不同而不同,下表以IBMPC機(jī)為例2.3常量與變量2.3.1標(biāo)識(shí)符定義:用來標(biāo)識(shí)變量、常量、函數(shù)等的字符序列組成:只能由字母、數(shù)字、下劃線組成,且第一個(gè)字母必須是字母或下劃線大小寫敏感不能使用關(guān)鍵字

討論:判斷下列標(biāo)識(shí)符號(hào)合法性sum Sum M.D.John day Date 3daysstudent_name #33 lotus_1_2_3 char a>babove$123_toDayM.D.John3days#33char$123a>b長度:TurboC中最長32個(gè)字符命名原則:見名知意,采用簡潔有含義的英文單詞(或縮寫)不宜混淆如1與L,o與0

標(biāo)識(shí)符命名實(shí)例stu_name,sum,total,day,count,sort關(guān)鍵字

關(guān)鍵字是被C語言保留、具有特定含義,并且不能用于其他用途的一批標(biāo)識(shí)符,用戶只能按規(guī)定使用它們。根據(jù)ANSI的標(biāo)準(zhǔn),C語言中的關(guān)鍵字如圖所示。charshortintunsignedlongfloatdoublestructunionvoidenumsignedconstvolatiletypedefautoregisterstaticexternbreakcasecontinuedefaultdoelseforgotoifreturnswitchwhilesizeof2.3.2

常量與符號(hào)常量常量是指在程序運(yùn)行過程中其值不能改變的量。<>常量直接常量符號(hào)常量(需要定義)字符型常量數(shù)值常量整型常量實(shí)型常量字符常量字符串常量直接常量在程序運(yùn)行過程中,其值不能改變的量稱為常量常量可為任意數(shù)據(jù)類型直接常量(字面常量)整型常量:

12、0、-3、10L、0x10、010、039(×)實(shí)型常量:

4.6、-1.23、2.5e-5、.33、0.、E7(×)、字符型常量:'a'、'0'、'+'、't'、'\105'、'x10'、“a”(×)字符串常量:“Hello”、“GoodMorning!”ASCII碼表注意:指數(shù):在計(jì)算機(jī)中用字母E(或e)表示以10為底的指數(shù)。一般格式:aEn或aen,代表a×10n(其中a為十進(jìn)制數(shù),n為十進(jìn)制整數(shù))hello\0內(nèi)存中存儲(chǔ)形式:符號(hào)常量:標(biāo)識(shí)符代表常量定義格式:#define<符號(hào)常量名><常量>

符號(hào)常量定義舉例

#definePI

3.1415926 #defineSTAR

‘*’說明:(3)符號(hào)常量一般使用大寫英文字母表示,以區(qū)別一般用于小寫字母表示的變量。說明:(1)#define是一條預(yù)處理命令(必須以#開頭),又稱“宏定義命令”。(2)#define命令行的最后不能加分號(hào)。符號(hào)常量使用例符號(hào)常量舉例#include<stdio.h>#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}運(yùn)行結(jié)果:total=300符號(hào)常量的使用能給程序員帶來哪些好處?變量其值可以改變的量稱為變量變量也可以為任意數(shù)據(jù)類型變量定義的一般格式數(shù)據(jù)類型變量1[,變量2,…,變量n];決定分配字節(jié)數(shù)和數(shù)的表示范圍變量定義舉例:inta,b,c;floatdata;變量的使用:作強(qiáng)制定義,也就是“先定義,后使用”例1intstudent;stadent=19;//Undefinedsymbol‘stadent’infunctionmain

例2floata,b,c;c=a%b;//Illegaluseoffloatingpointinfunctionmain

整型數(shù)據(jù)整型常量形式表示方式舉例十進(jìn)制整數(shù)由數(shù)字0-9和正負(fù)號(hào)表示123,-456,0八進(jìn)制整數(shù)由數(shù)字0開頭,后跟數(shù)字0~7表示0123,011十六進(jìn)制整數(shù)由0x開頭,后跟0~9,a~f,A~F表示0x123,0Xff問題:0123=()100x123=()100Xff=()1083291255整型變量整型變量在內(nèi)存中以二進(jìn)制的形式存放根據(jù)占用的字節(jié)數(shù)不同,分為不同類別TurboC2.0編譯系統(tǒng)[signed]

int返回VisualC++2010編譯系統(tǒng)類型字節(jié)數(shù)值范圍[signed]int4-2147483648~2147483647Unsignedint40~4294967295(即232-1)[signed]short[int]2-32768~32767unsignedshort[int]20~65535(即216-1)long[int]4-2147483648~2147483647unsignedlong[int]40~4294967295(232-1)返回整型變量的定義整型變量定義舉例:inta,b;unsignedshortc,d;longe,f;例:cha3-01.c#include<stdio.h>voidmain(){inta,b,c,d;unsignedu;a=12;b=-24;u=10;c=a+u;d=b+u;printf("a+u=%d,b+u=%d\n",c,d);}

運(yùn)行結(jié)果:a+u=22,b+u=-14整型數(shù)據(jù)在內(nèi)存中的存放形式數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存放的,以補(bǔ)碼表示。

inti,j; /*定義I,j為整型變量*/i=10; /*給i,j賦以整數(shù)10,-10*/j=-10;i

j00000000000010101111111111110110變量3要素:變量名、變量值、變量在內(nèi)存的存儲(chǔ)單元。實(shí)型(浮點(diǎn)型)數(shù)據(jù)實(shí)型常量十進(jìn)制數(shù)形式(必須有小數(shù)點(diǎn),整數(shù)部分為0時(shí)可以省略)0.123.123123.00.0123.

指數(shù)形式(e或E之前必須有數(shù)字;指數(shù)必須為整數(shù))12.3e3123E21.23e4e-5×1.2E-3.5×.e3×規(guī)范化的指數(shù)形式:在字母e(或E)之前的數(shù)據(jù)中,小數(shù)點(diǎn)左邊有且僅有一位非零的數(shù)字。指數(shù)形式實(shí)型常量12.3e3123E21.23e4(規(guī)范化)0.123e-3類型字節(jié)有效數(shù)字/精度(位)數(shù)值范圍float47-3.4×10-39~3.4×1039double815~16-1.7×10-309~3.4×10309返回實(shí)型(浮點(diǎn)型)數(shù)據(jù):與數(shù)學(xué)中的實(shí)數(shù)概念相同,這種數(shù)據(jù)由整數(shù)和小數(shù)兩部分組成。實(shí)型數(shù)據(jù)分為:(1)單精度型:類型聲明符為float(2)雙精度型:類型聲明符為double.實(shí)型(浮點(diǎn)型)數(shù)據(jù)floata;a=111111.111doublea;a=111111.111問題:以下兩段程序代碼,是否有區(qū)別?float:占4字節(jié),提供7位有效數(shù)字double:占8字節(jié),提供15~16位有效數(shù)字字符常量定義:用單引號(hào)括起來的單個(gè)普通字符或轉(zhuǎn)義字符。字符常量的值:該字符的ASCII碼值轉(zhuǎn)義字符:反斜線后面跟一個(gè)字符或一個(gè)代碼值表示如‘a(chǎn)’‘A’‘?’‘\n’‘\101’如‘A'——65,‘a(chǎn)'——97,

‘0'——48,'\n'——10<轉(zhuǎn)義字符及其含義:轉(zhuǎn)義字符含義\n\v\r\a\‘\ddd\t\b\f\\\“\xhh轉(zhuǎn)義字符含義換行垂直制表回車響鈴單引號(hào)3位8進(jìn)制數(shù)代表的字符水平制表退格換頁反斜線雙引號(hào)2位16進(jìn)制數(shù)代表的字符如'\101'-----------'A''\012'-----------'\n''\376'-----------'''\x61'-----------'a''\60'-----------'0''\483'----------(

)例:'A'-------'\101'-------'\x41'--------65例轉(zhuǎn)義字符舉例(ch3_001.c,ch2_004.c)main(){printf("\101\x42C\n");printf("Isay:\"Howareyou?\"\n");printf("\\CProgram\\\n");printf("Turbo\'C\'");}運(yùn)行結(jié)果:(屏幕顯示)ABCIsay:”Howareyou?”\CProgram\Turbo‘C’例main(){printf(“Y\b=\n”);}運(yùn)行結(jié)果:屏幕顯示:=打印機(jī)輸出:¥ASCII碼表注意事項(xiàng):單撇號(hào)中的字符不能是’或者\(yùn)一個(gè)字符占一個(gè)字節(jié),存其對(duì)應(yīng)的ASCII碼思考:'9’和9的區(qū)別字符型數(shù)據(jù)可像整數(shù)一樣在程序中參與相關(guān)的運(yùn)算‘a(chǎn)’–32結(jié)果為65字符變量字符型的類型聲明符為char,可以分為有符號(hào)和無符號(hào)兩種。字符變量存放字符ASCII碼char與int數(shù)據(jù)間可進(jìn)行算術(shù)運(yùn)算例1a=‘D’;/*a=68;*/x=‘A’+5;/*x=65+5;*/s=‘!’+‘G’/*s=33+71;*/例2/*cha3-002.c*/main(){charc1,c2;c1='a';c2=98;printf(“%d%c\n”,c1,c2);}類型分配的字節(jié)數(shù)數(shù)值范圍[signed]char1-128~127即-2-7~(27-1)unsignedchar10~255即0~(28-1)#include<stdi.h>#definePRICE12.5main(){intnum=3;floattotal;charch1,ch2='D';total=num*PRICE;ch1=ch2-'A'+'a';

printf(“total=%f,ch1=%c\n”,total,ch1);}宏定義變量定義輸出結(jié)果運(yùn)行結(jié)果:total=37.500000,ch1=d例字符串常量定義:用雙引號(hào)(“”)括起來的字符序列存儲(chǔ):每個(gè)字符串尾自動(dòng)加一個(gè)‘\0’作為字符串結(jié)束標(biāo)志字符常量與字符串常量不同hello

\0例字符串“hello”在內(nèi)存中例空串“”\0aa\0例‘a(chǎn)’“a”例:charch;ch=‘A’;例:charch;ch=“A”;沒有字符串變量,用字符數(shù)組存放變量賦初值編譯程序根據(jù)變量定義為其分配指定字節(jié)的內(nèi)存單元…...地址inta=1,b=-3,c;abc2字節(jié)2字節(jié)2字節(jié)地址地址…...內(nèi)存1-3

隨機(jī)數(shù)如果定義了變量,但是沒有對(duì)它賦初值,則它的值是一個(gè)不確定的數(shù)值例main(){intx,y;printf(“%d,%d”,x,y);}如果定義了變量,但是沒有對(duì)它賦初值,則它的值是一個(gè)不確定的數(shù)值。2.4運(yùn)算符和表達(dá)式C運(yùn)算符簡介C運(yùn)算符算術(shù)運(yùn)算符:(+-*/%++--)關(guān)系運(yùn)算符:(<<===>>=!=)邏輯運(yùn)算符:(!&&||)位運(yùn)算符:(<<>>~|^&)賦值運(yùn)算符:(=及其擴(kuò)展)條件運(yùn)算符:(?:)逗號(hào)運(yùn)算符:(,)指針運(yùn)算符:(*&)求字節(jié)數(shù):(sizeof)強(qiáng)制類型轉(zhuǎn)換:(類型)分量運(yùn)算符:(.->)下標(biāo)運(yùn)算符:([])其它:(()-)學(xué)習(xí)運(yùn)算符應(yīng)注意運(yùn)算符功能與運(yùn)算量關(guān)系-要求運(yùn)算量個(gè)數(shù)-要求運(yùn)算量類型運(yùn)算符優(yōu)先級(jí)別結(jié)合方向結(jié)果的類型基本的算術(shù)運(yùn)算符+

加法運(yùn)算或正值運(yùn)算符- 減法運(yùn)算或負(fù)值運(yùn)算符*

乘法運(yùn)算符/

除法運(yùn)算符,求商,兩個(gè)整數(shù)相除結(jié)果為整數(shù)%

模運(yùn)算符,求余,要求兩則均為整型數(shù)據(jù)3+5、+35-2、-33*55/37%4例9/2=-9/2.0=例9%2=-9%2=9%-2=1%10=

9%1=9.9%2=4-4.51-110(

)1取模的余數(shù)符號(hào)由分子(被除數(shù)決定)例題/*cha3-005.c*/算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)和結(jié)合性算術(shù)表達(dá)式:用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來的、符合C語法規(guī)則的式子。求表達(dá)式的值:先按運(yùn)算符的優(yōu)先級(jí)別高低次序執(zhí)行;在一個(gè)運(yùn)算對(duì)象兩則的運(yùn)算符的優(yōu)先級(jí)別相同,則按規(guī)定的“結(jié)合方向”處理。a*b/c-1.5+’a’a–b*c/d自增++、自減運(yùn)算符--作用:使變量值加1或減1種類:前置++i,--i(先執(zhí)行i+1或i-1,再使用i值)后置i++,i--(先使用i值,再執(zhí)行i+1或i-1)

inta=3;intb=++a;intc=a++;近水樓臺(tái)先得月4a值表達(dá)式值a值表達(dá)式值++aa++345444則:a:5,b:4,c:4。j=3;k=++j;j=3;k=j++;j=3;printf(“%d”,++j);j=3;printf(“%d”,j++);a=3;b=5;c=(++a)*b;a=3;b=5;c=(a++)*b;

//k=4,j=4//k=3,j=4//4//3//c=20,a=4//c=15,a=4例注意說明:只能用于變量,不能用于常量或表達(dá)式;結(jié)合方向“自右向左”;優(yōu)先級(jí)別:--++-------->*/%----->+-自增(減)運(yùn)算常用于循環(huán)語句中循環(huán)變量自動(dòng)加(減)1或指針變量,使指針指向下一個(gè)地址5++(×)(a+b)++(×)i++(√)例1解答:

-i++

-(i++)i=3;printf(“%d”,-i++);//-3

例1:-i++i=3;printf(“%d”,-i++);

例2:

i+++j;(i++)+j;解答:理解為(i++)+jC編譯在處理時(shí)盡可能多地(自左而右)將若干個(gè)字符組成一個(gè)運(yùn)算符。有關(guān)表達(dá)式使用中的問題說明表達(dá)式中包含多個(gè)自加、自減運(yùn)算時(shí),很容易出錯(cuò)例1:

如i=3,則k=i++結(jié)果:k=3,i=4例2:

如i=3,則(i++)+(i++)+(i++)結(jié)果:9,i=6例3:

如i=3,則(++i)+(++i)+(++i)結(jié)果:16,i=62.4.2關(guān)系運(yùn)算符和關(guān)系表達(dá)式關(guān)系運(yùn)算符種類:<<=>>===!=結(jié)合方向:自左向右優(yōu)先級(jí)別:低于算術(shù)運(yùn)算符而高于賦值運(yùn)算符<<=>>===!=優(yōu)先級(jí)6(高)優(yōu)先級(jí)7(低)例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)關(guān)系表達(dá)式的一般格式:表達(dá)式關(guān)系運(yùn)算符表達(dá)式關(guān)系表達(dá)式的值:是邏輯量“真”或“假”,分別用1和0表示。例inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//表達(dá)式值1//表達(dá)式值1//表達(dá)式值0//d=1//f=0C中沒有邏輯型例1若a=0;b=0.5;x=0.3;

則a<=x<=b的值為0例25>2>7>8在C中是允許的,值為0例3inti=1,j=7,a;a=i+(j%4!=0);

則a=2例4‘a(chǎn)’>0結(jié)果為‘A’>100結(jié)果為10例5注意區(qū)分“=”與“==”inta=0,b=1;if(a==b)printf(“aequaltob”);elseprintf(“anotequaltob”);2.4.3邏輯運(yùn)算符和邏輯表達(dá)式邏輯運(yùn)算符種類:&&||!邏輯運(yùn)算真值表ab!a!ba&&ba||b真1假0真1假0假0假0真1真1真1假0假0假0假0假0真1真1假0假0真1真1真1假0真1真1優(yōu)先級(jí)和結(jié)合方向!算術(shù)運(yùn)算符關(guān)系運(yùn)算符&&||賦值運(yùn)算符高低優(yōu)先級(jí):結(jié)合方向:!:從右向左&&:從左向右||:從左向右例a<=x&&x<=b

a>b&&x>ya==b||x==y!a||a>b//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)#include<stdio.h>main(){inta=3,b=0,p,q,s,r;p=s=(!a)&&(a+b)&&(a++);q=s=a||b||b++;printf("p=s=%d,q=s=%d\n",p,q);printf("(p&&(q&&!q))||!(r||(s||!s))=%d\n",(p&&(q&&!q))||!(r||(s||!s)));}運(yùn)算結(jié)果:p=s=0,q=r=1(p&&(q&&!q))||!(r||(s||!s))=0Pressanykeytocontinue.例#include<stdio.h>main(){ charc='k'; inti=1,j=2,k=3; floatx=3e+5,y=0.85; printf("%d,%d\n",!x*!y,!!!x); printf("%d,%d\n",x||i&&j-3,i<j&&x<y); printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);}例運(yùn)算結(jié)果:0,01,00,1eg.寫出以下表達(dá)式1.整型變量m的內(nèi)容是否為偶數(shù)m%2==02.檢查字符變量a的內(nèi)容是否為字母.a>=‘a(chǎn)’&&a<=‘z’||a>=‘A’&&a<=‘Z’2.4.4位運(yùn)算符及其表達(dá)式邏輯運(yùn)算符種類:&(按位與)|(按位或)^(按位異或)~(取反)<<(左移)>>(右移)位運(yùn)算是指按二進(jìn)制位執(zhí)行的運(yùn)算,位運(yùn)算符只能用于整型操作數(shù),即只能用于帶符號(hào)或無符號(hào)的char、short、int與long類型。&(按位與)

雙目運(yùn)算符,功能是參與運(yùn)算的兩數(shù)中各對(duì)應(yīng)的二進(jìn)位執(zhí)行與運(yùn)算。只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1;否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼形式出現(xiàn)。例9&5可寫為如下算式:00001001 (9的二進(jìn)制補(bǔ)碼)&00000101

(5的二進(jìn)制補(bǔ)碼)00000001 (1的二進(jìn)制補(bǔ)碼)可見表達(dá)式9&5的值為1。清0操作:例原數(shù)為43,即00101011。另找一個(gè)數(shù)設(shè)為148,即10010100,將二者執(zhí)行按位與運(yùn)算:00101011&10010100

00000000

取一個(gè)數(shù)中某些指定位:例若有一個(gè)整數(shù)a(2字節(jié)),需要取其中的低字節(jié),只需要將a與8個(gè)1按位與即可。a0010110010101100&b0000000011111111c0000000010101100

保留指定位:例有一數(shù)84即01010100需要把其中從左邊算起的第3、4、5、7、8位保留下來,運(yùn)算如下:01010100&00111011

00010000即a=84,b=59,a&b=16。

|(按位或)雙目運(yùn)算符,功能是參與運(yùn)算的兩數(shù)中對(duì)應(yīng)的二進(jìn)位執(zhí)行或運(yùn)算。只要對(duì)應(yīng)的兩個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。例9|5的算式如下:00001001|0000010100001101(十進(jìn)制為13)可見9|5=13。

^(按位異或)雙目運(yùn)算符,其功能是參與運(yùn)算的兩個(gè)數(shù)中對(duì)應(yīng)的二進(jìn)位相異或。當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。例9^5可寫成如下算式:00001001^0000010100001100(十進(jìn)制為12)使特定位翻轉(zhuǎn):例假設(shè)有二進(jìn)制數(shù)01111010,要使其低4位翻轉(zhuǎn)。即1變0,0變1,可以將其與00001111執(zhí)行異或運(yùn)算。01111010^0000111101110101

與0相異或保留原值:例012^00=01200001010^0000000000001010因?yàn)樵瓟?shù)位中的1與0執(zhí)行異或運(yùn)算得1,0^0得0,故保留原數(shù)

~(取反)單目運(yùn)算符,具有右結(jié)合性。其功能是按位求反參與運(yùn)算數(shù)的各個(gè)二進(jìn)位。例~9的運(yùn)算:~(0000000000001001)結(jié)果為1111111111110110。<<(左移)雙目運(yùn)算符,功能是把<<左邊運(yùn)算數(shù)的各個(gè)二進(jìn)位全部左移<<右邊數(shù)指定的位數(shù),高位丟棄,低位補(bǔ)0。>>(右移)雙目運(yùn)算符,功能是把>>左邊的運(yùn)算數(shù)的各個(gè)二進(jìn)位全部右移>>右邊的數(shù)指定的位數(shù)。例a<<4把a(bǔ)的各個(gè)二進(jìn)位向左移動(dòng)4位。假設(shè)a=00000011(十進(jìn)制3),左移4位后為00110000(十進(jìn)制48)。例

設(shè)a=15,a>>2表示把00001111右移為00000011(十進(jìn)制3)。左移1位相當(dāng)于該數(shù)乘以2,左移兩位相當(dāng)于該數(shù)乘以2*2=4。15<<2=60即乘了4,但此結(jié)論只適用于該數(shù)左移時(shí)被溢出舍棄的高位中不包含1的情況。假設(shè)以一個(gè)字節(jié)(8位)存一個(gè)整數(shù),且a為無符號(hào)整型變量,則a=64時(shí),左移一位時(shí)溢出的是0;而左移2位時(shí),溢出的高位中包含1。有符號(hào)數(shù)在右移時(shí)符號(hào)位將隨同移動(dòng),為正數(shù)時(shí)最高位補(bǔ)0;為負(fù)數(shù)時(shí)符號(hào)位為1,最高位補(bǔ)0或補(bǔ)1取決于編譯系統(tǒng)的規(guī)定(TurboC和很多系統(tǒng)規(guī)定為補(bǔ)1)。2.4.5賦值運(yùn)算符及其表達(dá)式簡單賦值運(yùn)算符“=”作用:將一個(gè)數(shù)據(jù)賦給一個(gè)變量結(jié)合方向:自右向左 優(yōu)先級(jí):14常量或表達(dá)式只能是變量,不能是常量或表達(dá)式例3=x-2*y;a+b=3;例a=3;a=(a+b)*c賦值轉(zhuǎn)換規(guī)則:使賦值號(hào)右邊表達(dá)式值自動(dòng)轉(zhuǎn)換成其左邊變量的類型例1

floatf;inti;i=10;f=i;

f=10.0例2inti;i=2.56;//結(jié)果i=2;賦值表達(dá)式定義:由賦值運(yùn)算符”=”將一個(gè)變量和一個(gè)表達(dá)式連接起來的式子,叫賦值表達(dá)式。一般形式:<變量>=<表達(dá)式>賦值表達(dá)式的值與變量值相等,且可嵌套例:a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)//b=10,c=2,a=5,表達(dá)式值5//b=4,c=6,a=10,表達(dá)式值10//c=6,a=11,表達(dá)式值11//b=5;a=5,表達(dá)式值為5//a,b,c值為5,表達(dá)式值為5復(fù)合的賦值運(yùn)算符

+=-=*=/=%=《=》=&=^=|=a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3例:a=12;a+=a-=a*a//a=-264等價(jià)于a=a+(a=a-(a*a))例:inta=2;a%=4-1;a+=a*=a-=a*=3;//a=0等價(jià)于a=a+(a=a*(a=a-(a=a*3)))a-=4a=a-4x/=y++x=x/(y++)x<<=3x=x<<3//a=22.4.6條件運(yùn)算符及其表達(dá)式條件運(yùn)算符一般形式為:表達(dá)式1?表達(dá)式2:表達(dá)式3運(yùn)算規(guī)則:如果“表達(dá)式1”的值為非0(即邏輯真),則運(yùn)算結(jié)果等于“表達(dá)式2”的值,否則,運(yùn)算結(jié)果等于“表達(dá)式3”的值。也就是說,“表達(dá)式2”與“表達(dá)式3”中,只有一個(gè)被執(zhí)行,而不會(huì)全部執(zhí)行。例如:(a>b)?a:b/*返回a和b中較大的數(shù)*/x?1:0/*若x是非0數(shù),返回1,否則返回0*/(score>=60)?’Y’:’N’/*若及格,返回字符‘Y’,否則返回字符‘N’*/條件運(yùn)算符是C語言中唯一的三目運(yùn)算符,要求有3個(gè)操作對(duì)象。2.4.7逗號(hào)運(yùn)算符和表達(dá)式形式:表達(dá)式1,表達(dá)式2,……表達(dá)式n結(jié)合性:從左向右優(yōu)先級(jí):15(最低)逗號(hào)表達(dá)式的值:等于表達(dá)式n的值例1a=3*5,a*4a=3*5,a*4,a+5例2x=(a=3,6*3)x=a=3,6*a例3a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);例4printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c)//a=15,逗號(hào)表達(dá)式值為60//a=15,逗號(hào)表達(dá)式值為20//x=18,賦值表達(dá)式值18//x=3,逗號(hào)表達(dá)式值18//1,2,3//3,2,3//逗號(hào)起分隔作用//逗號(hào)為逗號(hào)運(yùn)算符例:lt2-009.c#include<stdio.h>main(){intx,y=7;floatz=4;x=(y=y+6,y/z);printf("x=%d\n",x);}運(yùn)行結(jié)果:x=32.4.8求字節(jié)運(yùn)算符sizeof運(yùn)算符是一個(gè)求字節(jié)數(shù)運(yùn)算符。它是一個(gè)單目運(yùn)算符,求字節(jié)運(yùn)算的一般形式為:sizeof(數(shù)據(jù)類型名|變量名|常量)功能:返回某數(shù)據(jù)類型、某變量或者某常量在內(nèi)存中的字節(jié)長度。例如:#include<stdio.h>main(){ floatx;chara; printf("%d\n",sizeof(short));

/*輸出字節(jié)數(shù)2*/ printf("%d\n",sizeof(x));

/*輸出字節(jié)數(shù)4*/ printf("%d\n",sizeof(a)); /*輸出字節(jié)數(shù)1*/ printf("%d\n",sizeof(2)); /*輸出字節(jié)數(shù)4*/ printf("%d\n",sizeof(2+3.14)); /*輸出字節(jié)數(shù)8*/}2.5運(yùn)算符的優(yōu)先級(jí)及結(jié)合性優(yōu)先級(jí)運(yùn)算符含義結(jié)合性說明1()圓括號(hào)左結(jié)合括號(hào)優(yōu)先2-(取負(fù)運(yùn)算)++(自增運(yùn)算符)--(自減運(yùn)算符)算術(shù)運(yùn)算符右結(jié)合單目運(yùn)算符(類型名)(表達(dá)式)強(qiáng)制類型轉(zhuǎn)換!邏輯非運(yùn)算符sizeof求字節(jié)運(yùn)算符~(按位取反)位運(yùn)算符3*(乘法)/(除法)%(求余)算術(shù)運(yùn)算符左結(jié)合雙目運(yùn)算符4+(加法)-(減法)5<<左移、>>右移位運(yùn)算符左結(jié)合雙目運(yùn)算符6>(大于)>=(大于等于)<(小于)<=(小于等于)關(guān)系運(yùn)算符左結(jié)合雙目運(yùn)算符7==(等于)!=(不等于)2.5運(yùn)算符的優(yōu)先級(jí)及結(jié)合性優(yōu)先級(jí)運(yùn)算符含義結(jié)合性說明8&(按位與)位運(yùn)算符

左結(jié)合雙目運(yùn)算符9^(按位異或)10|(按位或)11&&(邏輯與)邏輯運(yùn)算符左結(jié)合雙目運(yùn)算符12||(邏輯或)13?:條件運(yùn)算符右結(jié)合三目運(yùn)算符14=、+=、-=、*=、/=、%=、&==、|=、>>=、<<=、^=賦值運(yùn)算符右結(jié)合雙目運(yùn)算符15,逗號(hào)運(yùn)算符左結(jié)合雙目運(yùn)算符2.6表達(dá)式的書寫規(guī)則書寫表達(dá)式應(yīng)注意以下規(guī)則:①在C語言中,所有括號(hào)全部使用圓括號(hào),沒有小括號(hào)、中括號(hào)以及大括號(hào)之分。②C語言表達(dá)式中的乘號(hào)不能省略。例如:數(shù)學(xué)表達(dá)式3[x+2(y+z)]寫成C語言表達(dá)式為:3*(x+2*(y+z))③表達(dá)式中各操作數(shù)和運(yùn)算符應(yīng)在同一水平線上,沒有上下標(biāo)和高低之分。表達(dá)式的書寫規(guī)則用C語言表達(dá)式描述數(shù)學(xué)表達(dá)式1、ax2+by1+c C語言表達(dá)式:a*x*x+b*y1+c2、C語言表達(dá)式:(y-1)/(2*x)或(y-1)/2/x3、a≤x≤b,C語言表達(dá)式:a<=x&&x<=b(關(guān)系運(yùn)算優(yōu)于邏輯運(yùn)算)該式相當(dāng)于(a<=x)&&(x<=b)思考:以上不等式,能否用C語言表達(dá)式a<=x<=b來表示呢?

表達(dá)式的書寫規(guī)則用C語言表達(dá)式描述數(shù)學(xué)表達(dá)式凡使用數(shù)學(xué)函數(shù),必須使用#include<math.h>

4、5、e|10-x5|例如:求2x2+5x+3=0的解。4題的C語言表達(dá)式為:(-b+sqrt(b*b-4*a*c))/(2*a)(-b-sqrt(b*b-4*a*c))/(2*a)5題的C語言表達(dá)式為:exp(fabs(10-pow(x,5)))數(shù)學(xué)函數(shù)見P277頁。2.7各種數(shù)據(jù)類型的轉(zhuǎn)換隱式轉(zhuǎn)換什么情況下發(fā)生運(yùn)算轉(zhuǎn)換------不同類型數(shù)據(jù)混合運(yùn)算時(shí)賦值轉(zhuǎn)換------把一個(gè)值賦給與其類型不同的變量時(shí)輸出轉(zhuǎn)換------輸出時(shí)轉(zhuǎn)換成指定的輸出格式函數(shù)調(diào)用轉(zhuǎn)換------實(shí)參與形參類型不一致時(shí)轉(zhuǎn)換‘a(chǎn)’–32intage;age=11.1charname=‘a(chǎn)’;printf(“%d\n”,name);運(yùn)算轉(zhuǎn)換規(guī)則:不同類型數(shù)據(jù)運(yùn)算時(shí)先自動(dòng)轉(zhuǎn)換成同一類型doublefloatlongunsignedintchar,short低高說明:必定的轉(zhuǎn)換運(yùn)算對(duì)象類型不同時(shí)轉(zhuǎn)換

charch;inti;floatf;doubled;ch/i+f*d-(f+i)intintdoubledoublefloatdoubledoubledouble例1intintdoubledoubledoubledoubledoubledouble10+‘a(chǎn)’+i*f-d/l例2inti;floatf;doubled;longl;例3:100+'a'+u-f*s的結(jié)算結(jié)果為何種數(shù)據(jù)類型.(55頁)100+‘a(chǎn)'+u

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論