C及C++程序設計課件_第1頁
C及C++程序設計課件_第2頁
C及C++程序設計課件_第3頁
C及C++程序設計課件_第4頁
C及C++程序設計課件_第5頁
已閱讀5頁,還剩1468頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C及C++程序設計第1章對C語言的初步認識

1.1程序與程序設計語言

1.1.1程序、程序設計和程序設計語言

一般來說,程序是對解決或處理一個問題的方法步驟的描述。而計算機程序,則是用某種計算機能識別的語言工具所描述的解決問題的方法步驟。例如,有兩個數據a和b,它們的值分別為1和2,求這兩個量的和c。 編制并記錄解決問題的方法步驟的過程就是程序設計。在計算機技術中,將解決一個問題的方法和步驟叫做算法。進行程序設計時要使用計算機能識別的描述算法的工具,這個工具就是計算機程序設計語言。1.1.2結構化程序設計方法

計算機程序設計語言經歷了由機器語言、匯編語言到高級語言的發展過程。這些語言的特點是以簡單的語句序列構成程序。在20世紀60年代末開始提出結構化程序設計的概念,也就是將程序由語句序列結構轉變為模塊集合。

結構化程序設計方法的基本思想是,將任何復雜問題分解為若干較為簡單的功能模塊,每個模塊中的任何邏輯問題再用少數幾種基本結構(如順序結構、選擇結構、循環結構)加以描述。結構化程序設計中采用的三種基本結構如圖1.1所示,所有的程序代碼都實現在這三種結構中。圖1.1結構化程序設計的三種基本結構

進入20世紀80年代后,為了適應龐大而復雜程序的開發,出現了面向對象的程序設計方法和語言。然而它也吸收和繼承了結構化程序設計的方法。1.2C語言及C語言源程序的基本結構

1.2.1C語言 C語言是一種編譯方式的結構化高級程序設計語言。C語言主要有下列一些特點。(1)C語言是一種結構化的程序設計語言,它具有完整的程序控制語句。(2)C語言是一種模塊化程序設計語言,函數是組成程序的基本程序單位。

(3)C語言有豐富的數據類型和運算操作,使程序設計更為簡單和方便。(4)C語言提供了類似于匯編語言的低級語言動能,如直接訪問內存的物理地址,對二進制數進行位操作等。(5)語法結構簡單,語句數目不多,但功能很強。所以,C語言簡單易學且應用廣泛。

1.2.2C語言源程序的基本結構

C語言源程序,簡稱C程序,是建立在模塊的基礎上的,而基本的模塊就是函數。因此,一個C程序是由一個或多個函數組成的。每個函數是完成一定功能的一段C語言程序。編寫一個程序,首先是建立一個或若干個函數,然后把它們組織在一起,構成一個完整的C語言程序。在這些函數中必須有且只能有的一個函數就是main()函數,稱為主函數。一個程序無論包含多少個函數,程序的運行總是從主函數開始,在主函數結束。在C語言中,除了main()函數外,其他函數的函數名是用戶選定的,稱為自定義函數。自定義函數不能像main()函數那樣能獨立運行,它們只能由主函數或其他函數激活(它也能激活其他函數),并開始運行。這里發生了兩個過程:調用和返回。可見,函數之間是互相調用和返回的關系。自定義函數可以互相調用,但不能調用主函數。

在最簡單的情況下,C函數有如下的格式:

函數名(){函數體}

例1.2.1一個最簡單的C語言源程序。程序由如下一個主函數組成:main(){}因為函數體不包含任何語句,所以該程序不執行任何功能,稱它是空操作。例1.2.2給例1.2.1的程序加入一個功能:在顯示器上輸出:hello!。程序如下:

main(){printf("hello!");}

主函數的函數體由一個語句組成。C語言規定每個語句必須以分號結束。分號表示一個語句的結束。語句

printf("hello!");

hello!是一個輸出語句。在這里它的功能是在顯示器的屏幕上顯示如下的字符串:

hello!

例1.2.3由兩個函數組成的C程序。功能仍然是在顯示器上輸出:hello!。主函數main()調用另一個名為hello()的自定義函數。hello()函數的功能是在顯示器的屏幕上顯示字符串:"hello!"。下面是源程序清單:

main(){hello();}hello(){printf("hello!");}程序運行后,在顯示器的屏幕上顯示如下的字符串:

hello!主函數的函數體是C語言中的一個語句:

hello();它的功能是調用函數hello()。執行調用的結果,使程序從主函數轉去執行hello()函數。函數hello()的函數體是由一個C語句組成:

printf("hello!");

我們已經知道這個語句的功能是在顯示器的屏幕上顯示hello!。該語句執行完畢后,返回主函數。由于主函數的所有語句已經執行完畢,于是程序結束運行。程序的執行從主函數開始,在主函數結束。從以上的討論,可以總結出以下幾點。(1)C程序是由一個或多個函數組成的,其中必須有一個也只能有一個規定名為main的主函數。(2)程序的執行總是從主函數開始,在主函數結束。其他函數是通過調用來執行的。(3)主函數可以調用任何非主函數,非主函數之間可以互相調用,但不能調用主函數。(4)函數體是完成函數功能的一組C語言的語句,每個語句完成一個小功能,并以分號作為一個語句的結束標志。1.2.3C語言的基本語句

C語言的基本語句主要有以下幾種:

(1)數據定義語句;(2)賦值語句;(3)函數調用語句和返回語句;(4)輸入語句和輸出語句;(5)流程控制語句。1.3C語言的基本詞法

構成C語言的最小單位是字符,由字符可以構成詞類,再由詞構成各種語句。有關C語言的字符和詞類的規定,就形成了C語言的詞法。這一節介紹詞法方面的有關規定。

1.3.1C語言的字符集在C語言程序中允許使用的所有基本字符的集合,稱為C語言的字符集。C語言的字符集采用的是ASCII(AmericanStandardCodeforInformationInterchange)字符集。

1.3.2標識符

用C字符集中的字符組合,可以為程序中的各種對象起名字。這些名字統稱為標識符。例如常量名,變量名,函數名等都是標識符。1.3.3保留字保留字又稱關鍵字,是C語言編譯系統使用的、具有特定語法意義的一些標識符。這些標識符用戶不能作為自己的標識符使用。

1.3.4C語言的詞類C語言的詞類主要有以下幾種。(1)常量:(2)變量:(3)運算符:(4)表達式:(5)保留字:

1.4源程序的編譯和C語言的集成開發環境

1.4.1C程序的開發過程

開發一個C語言程序,要經過以下四個階段:(1)編輯源程序文件;(2)編譯源程序;(3)程序連接;(4)運行程序。1.4.2C語言的集成開發環境

為完成上述的程序開發過程,C語言系統提供兩種獨立的操作方式。一種是傳統的命令行方式。

2.1數據類型在C語言中,數據的類型分為基本數據類型、構造類型、指針類型和空值類型。對于每一種數據類型的數據,又有分成幾種不同類型,如圖2.1所示。各種類型數據又可分為常量和變量。圖2.1C語言的數據類型2.2.1整型常量在C語言中使用三種不同進位制的整型常量,它們是:(1)十進制數:(2)八進制數:(3)十六進制數:2.2整型數據整型常量在微機上一般占用兩個字節的長度。為了擴大整型數據的取值范圍,C語言還提供了一種長整型常量。長整型常量在計算機中占用4個字節。

2.2.2整型變量整型變量在計算機中占兩個字節。用以說明整型變量的關鍵字(也稱為數據類型符)為int。定義變量數據類型語句的一般格式為: 數據類型符變量名1,變量名2,……;C語言規定,每個變量在使用前,都必須先定義。 在關鍵字int前加上修飾符,可改變整型變量的所占位數和取值范圍。下列4種修飾符可以用來修飾整型變量: (1)signed (2)unsigned (3)long (4)short 實型數據也稱做浮點數,是一種帶小數點的數。2.3實型數據2.3.1實型常量實型常量就是帶小數點的10進制常數。在C語言中實型數據有兩種表達(書寫)方式:一種是用數字和小數點表示的,如123.456等;另一種是用指數方式表示的,如1.2e+2或1.2E+2(表示的是1.2×102)。

2.3.2實型變量實型變量用來存儲實型數據。實型變量分為如下兩種。(1)單精度實型變量或簡稱實型變量或浮點型變量,其類型標識符為float;(2)雙精度實型變量或稱雙精度浮點型變量,其類型標識符為double。2.4.1字符型常量C語言的字符型常量是用單引號括起來的單個字符,如“a”,“B”,“*”等都是字符型常量。2.4字符型數據與字符串

在C語言中支持一類特殊字符,它們以反斜杠“\”開頭,稱為反斜杠字符常量,或稱轉義字符。它們都可以看作為字符常量。2.4.2字符型變量字符型變量是C語言的一種數據類型,用關鍵字(類型符)char說明,用于存儲字符常量或數值。一個字符型變量只能存儲一個字符,它是以該字符的ASCII碼值存儲的,并占一個字節的寬度。例如,字母a的ASCII碼是97,在變量的內存中存儲的就是97。2.4.3字符串常量字符串常量簡稱字符串。字符串不是一種數據類型,它是用雙引號擴起來的一串字符。例如:

"abc123","4","AaBb","a"

如果字符串中含有轉義字符,則每個轉義字符當作一個字符看待。例如,字符串

\\ab\\\'AB\'\141\142表示的是下列字符:

\ab\'AB'ab

每個字符在內存占一個字節的空間。但每個字符串在內存中占用的實際字節數等于字符串的長度加一。因為在每個字符串的最后都存放一個“空字符”,其ASCII碼值為0,它的轉義字符是“\0”。它起著字符串結束標記的作用。2.5變量說明與初始化

2.5.1變量說明(定義)在C程序中,變量在引用前,必須先進行說明,C語言的編譯系統將根據變量說明,給變量分配相應的存儲空間。變量說明語句的一般格式是:

數據類型變量名列表;例如,下面是一些變量說明(定義)語句:

intm,n,k;unsignedintum;doubled1,d2;charch;floatf;2.5.2變量的初始化在對變量進行定義的同時給變量賦值稱為變量的初始化。變量初始化的一般格式如下:變量類型變量名1=常量1,變量名2=常量2,……;

變量的初始化是在程序運行到該變量所在的函數時進行的。變量初始化:

floatfnum=12.12;

實際上相當于執行下面的兩條語句:

floatfnum;fnum=12.12;一般情況下,如果變量在程序中沒有初始化,則在賦值之前,它的值是不確定的,因此,程序中在引用某變量之前,該變量應該初始化或賦值。以后我們還會介紹,在某些情況下,沒有初始化的變量的初始值可以是確定的。2.6.1運算符

運算符也稱操作符,是一種表示對數據進行何種運算處理的符號。運算的對象(數據)稱為操作數。每個運算符代表某種運算功能,每種運算功能有自己的運算規則,如運算的優先級、結合性、運算對象類型和個數,以及運算結果的數據類型都有明確的規定。2.6運算符和表達式

C語言的基本運算符有以下幾大類:算術運算符;邏輯運算符;關系運算符;位運算符;賦值運算符;條件運算符;逗號運算符;數據長度運算符。除了這些基本運算符外,還有一些專門用途的運算符,如:指針運算符;改變優先級運算符;成員運算符;下標運算符;其他。2.6.2表達式用運算符把運算對象連接起來所組成的運算式,在C語言中叫做表達式。對表達式進行運算所得到的結果,稱為表達式的值。表2.6.1給出了C語言的各種運算符、名稱、優先級和結合性。

優先級運算符運算符名稱結合性1()[]->.圓括號數組下標運算符指向結構指針成員運算符取結構成員->(自左向右)2!~++??-*&sizeof邏輯非反碼(按位取反)加一(自加)減一(自減)取負取地址的內容(指針運算)取地址取字節數<-(自右向左)表2.6.13*/%乘運算除運算模運算

->4+-加運算減運算->

5<<>>左移右移->6<<=>>=小于小于等于大于大于等于

->優先級運算符運算符名稱結合性7==!=等于不等于->8&按位邏輯與->9^按位邏輯加(異或)->10|按位邏輯或->11&&邏輯與->12||邏輯或->續表13?:條件運算<-14=+=?=*=/=%=>>=<<=&=^=|=賦值運算自反賦值(復合賦值)<-15,逗號運算(順序求值)->表達式的值的數據類型,因運算對象的不同而不同。歸納起來可分為整型、實型和邏輯型。邏輯型數據是只有兩個可能值的數據,這兩個值是:真和假。在C語言中,真用數字1表示,假用數字0表示。因此,邏輯值也可以按整型數看待。

從構成表達式的運算符來看,可以把表達式分成以下幾種。(1)算術表達式:(2)關系表達式:(3)邏輯表達式:(4)條件表達式:(5)賦值表達式:(6)逗號表達式:

3.1.1算術運算符與算術表達式表3.1.1給出了C語言中算術運算符及其運算功能。3.1算術運算符和賦值運算符表3.1.1運算符名稱作用優先級結合性--減1減一運算2<-(從右向左)++加1加一運算-取負取負值*乘乘法3->(從左向右)/除除法%模整除取余(模運算)+加加法4->-減減法模運算的運算對象(操作數)和運算結果是整型。模運算符“%”是計算兩個整數進行整除后的余數。運算結果的符號與被除數相同。對于除法運算,需要強調的是,兩個整型數相除時,結果為整數,小數部分丟失。加1運算和減1運算是對變量進行算術運算的。變量可以是整型、字符型、指針型和數組元素。運算結果仍為原數據類型,并存回原運算對象(變量)。在使用加1和減1運算符時,運算符可以放在運算對象的前面,稱為前綴,也可以放在運算對象的后面,稱為后綴。

例如:

x++;++x;其運算功能都是:

x=x+1;當加1運算和減1運算出現在表達式中時,前綴和后綴的功能是不同的。在前綴的情況下,其運算規則是:先對運算對象(變量)進行加1運算或減1運算;然后,使用加1或減1后的運算值參加表達式的運算。在后綴的情況下,其運算規則是:先取運算對象(變量)的值參加表達式的運算,然后進行加1運算或減1運算并存入變量。3.1.2賦值運算符與賦值表達式

C語言中的賦值運算符可分為兩類:賦值運算符和自反賦值運算符(或稱復合賦值運算符)。賦值運算符為“=”。賦值運算符號的作用是:將賦值運算符右邊表達式的值賦予賦值運算符左邊的變量。例如:將表達式:

a+2-b*c/6+c%3的值賦給變量b,則應該這樣使用賦值運算符:

b=a+2-b*c/6+c%3用賦值運算符組成的表達式叫做賦值表達式。賦值表達式的一般形式為:

變量=表達式

賦值表達式的值等于賦值運算符左邊變量的值,也就是右邊表達式的值。

賦值運算符的結合性是自右向左的,表達式:

a=b=c=43.1.3自反賦值運算符

自反賦值運算符也稱為復合賦值運算符,它是在賦值運算符前加上某個其他運算符構成的運算符。自反賦值運算賦共有10個:與算術運算符有關的有5個,與位運算符有關的有5個。下面先介紹算術自反賦值運算符,它們是:+=?=*=/=%=

上述運算符的運用可寫成如下的一般形式:

變量OP=表達式

例如:

a+=8等效于運算a=a+(8)3.2.1賦值語句計算機程序實質上是由語句的序列構成的,賦值語句主要用來完成數據的加工處理任務。賦值語句有如下兩種格式:

變量=表達式;變量OP=表達式;

3.2賦值語句和注釋語句所有C語句都是以分號結束的。對于第一種格式的賦值語句,其功能是:計算表達式的值,然后賦予變量。對于第二種格式的賦值語句,其功能是:將變量和表達式進行指定的運算后,將獲得的值賦予變量。3.2.2注釋語句

注釋語句只是為程序加的注解或說明文字,對程序的編譯和執行不產生任何影響。注釋語句的格式是:

/*注釋/字符集合*/

/*注釋字符集合注釋字符集合*/系統函數很多,也稱為系統庫函數。這些庫函數分別定義在擴展名為“h”的各個系統文件中,這些文件稱為頭文件。要在程序中使用某個系統函數,用戶必須在程序的開頭寫出如下的包含命令:3.3輸入輸出語句

#include"頭文件名.h"

#include"<頭文件名.h>"本節介紹4個用于輸入和輸出的系統庫函數,它們是函數putchar()、getchar()、printf()和scanf()。這些函數的定義包含在頭文件“stdio.h”中。如果編程時要使用上述的輸入輸出函數,應先將該頭文件,用包含命令寫在本程序的開頭:

#include"stdio.h"3.3.1字符輸出函數putchar()

字符輸出函數的調用格式為:

putchar(ch);其中的ch是一整型或字符型函數參數,它可以是變量,也可以是常量。函數的功能,是將參數ch的值,按ASCII碼所對應的字符輸出到標準輸出設備(顯示器)當前光標位置。函數的返回值是對應ch的字符。3.3.2字符輸入函數getchar()字符輸入函數的調用格式為:

getchanr();

它的功能是從標準輸入設備(鍵盤)上接收一個字符。此函數沒有參數。它的返回值就是讀取的字符,因此,可以用一個整型或字符型變量來接收函數的返回值。例如,有字符型變量ch,則語句:

ch=gechar();

接收輸入的字符并存儲到變量ch中。 用戶從鍵盤輸入數據時,數據被送入內存中專門開辟的緩沖區。當程序執行上面的輸入語句時,輸入函數從緩沖區讀區數據。當緩沖區空時,等待用戶輸入。用戶輸入數據并按回車鍵后,數據被送入緩沖區。例3.3.1putchar()函數和getchar()函數的簡單應用程序。

#include<stdio.h> /*包含命令*/

main()/*主函數*/{

inta; /*定義整型變量a*/charb; /*定義字符型變量b*/

a=getchar();/*鍵盤輸入字符并存入變量a*/b=getchar();/*鍵盤輸入字符并存入變量b*/

putchar(a);/*輸出變量a*/putchar('\n');/*輸出變量回車換行*/

putchar(b);/*輸出變量b*/putchar(getchar());/*輸出從鍵盤輸入的字符*/}程序的第一行,是包含命令,它包含了為使用輸入輸出函數所需要的頭文件。程序只由一個函數組成,這個函數就是main()函數。函數體由若干語句組成。第一部分是兩個變量定義語句,接下來是兩個輸入語句,接受鍵盤的輸入。最后是4個輸出語句。語句“putchar('\n');”是輸出一個回車換行,這里使用了轉義字符'\n'。使后面的輸出從下一行開始。語句

putchar(getchar());

中輸出函數的參數是字符輸入函數,也就是以接受的字符作為輸出函數的參數。因此,此語句的作用是輸出接受到的字符。如果運行程序時,從鍵盤輸入3個字符“ABC”,則程序的輸出應為:

ABC3.3.3格式輸出函數printf()

格式輸出函數printf()的調用格式為:

printf(輸出格式字符串,輸出表達式列表);輸出函數printf()的功能是,以自右向左的順序,依次計算輸出列表中各表達式的值,并按格式字符規定的輸出格式,將數據按輸出表達式列表的順序(自左到右)輸出到標準設備(顯示器)上。

例3.3.2

分析下面程序的輸出。#include<stdio.h>main(){inta;floatb;doubled=12687.3251956;a=1234;b=12687.3251956;printf("1:%d\n",a);printf("2:%10d\n",a);printf("3:%f\n",b);printf("4:%015.4f\n",b);printf("5:%e\n",b);printf("6:%f\n",d);printf("7:%13.11e\n",d);}這個程序的輸出如下:1:12342:12343:12687.3251954:0000012687.32525:1.268733e+046:12687.3251967:1.26873251956e+04請讀者根據程序的輸出格式仔細分析上面的輸出清單,掌握輸出格式的應用。例3.3.3分析下面程序的輸出,了解非格式字符的使用。

#include<stdio.h>main(){inta=1,b=2;printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}我們來分析程序中輸出語句的格式字符串,其中包含了3個輸出格式字符“%d”,表示輸出3個十進制整型數據。3個輸出格式字符依次分別與輸出表達式表中的a,b,a+b3個表達式相對應。在輸出格式字符串中還包含有非格式字符:在第一個格式符之前的a=;在第二個格式符之前的b=;在第三個格式符之前的a+b=。這些非格式符是按原樣順序輸出的。根據以上分析可知,這個程序的輸出,也就是輸出語句的執行結果應該是:

a=1,b=2,a+b=33.3.4格式輸入函數scanf()格式輸入函數scanf()的一般格式為:

scanf(輸入格式字符串,輸入變量地址表);函數的功能是接受從鍵盤按輸入格式字符串規定的格式輸入的若干數據,并按輸入變量地址表中變量地址的順序,依次存入對應的變量。實際的輸入輸出過程都是通過內存的一個專門緩沖區實現的。例3.3.4格式輸入輸出函數使用舉例。下面的程序要求用戶輸入一些不同類型的數據,然后輸出。設要求輸入的數據是:

c1='a'i1=123i2=456f1=1.25lx=999dx=1.234我們關心的是如何從鍵盤輸入數據和輸出的格式是怎樣的。程序如下:#include"stdio.h"main(){charc1;inti1,i2;floatf1;longlx;doubledx;

scanf("%c%d",&c1,&i1);scanf("%d,%f",&i2,&f1);scanf("%8ld%5lf",&lx,&dx);

printf("%c%d\n",c1,i1);printf("%d%f\n",i2,f1);printf("%ld%f\n",lx,dx);} 對于輸入語句“scanf("%c%d",&c1,&i1);”,為使變量c1的值為'a',變量i1的值為123,可以輸入“a123回車”,或者輸入“a空格123回車”,或者輸入“a回車123回車”。 對于輸入語句“scanf("%d,%f",&i2,&f1);”,為使變量i2的值為456和變量f1的值為1.25,必須輸入456,1.25,后跟回車。根據格式以逗號作為2個數據之間的間隔。對于輸入語句“scanf("%8ld%5lf",&lx,&dx);”,為使變量lx的值為999,變量dx的值為1.234,可以這樣輸入數據:999空格1.234。使用空格作為2個數據的間隔,是因為變量lx的格式規定的寬度大于實際寬度,所以用了空格結束lx數據的輸入。對程序中3條輸出語句,請讀者自己來分析。最后,上面程序的輸出為:

a1234561.2500009991.234000例3.3.5應用數據寬度格式字符的例子。設有語句:

scanf("%3d%4d",&a,&b);如果輸入1234567給變量a和變量b,它們的值分別是什么呢?格式輸入函數會自動根據格式“%3d%4d”,為變量a截取3位數據,即123;為變量b截取4位數據,即4567。所以,這個語句執行后有: a=123b=4567

例3.3.6從鍵盤輸入3個字符的程序。用scanf()語句輸入3個字符給3個變量時,3個字符一般要連續輸入,中間不要使用空格或回車,因為空格和回車都會作為字符輸入并賦給相應的變量。程序如下:

main(){charch1,ch2,ch3;scanf("%c%c%c",&ch1,&ch2,&ch3);printf("ch1=%cch2=%cch3=%c\n",ch1,ch2,ch3);}如果希望ch1='a',ch2='b',ch3='c',則應輸入abc后按回車以結束輸入。3.4順序結構程序設計

順序結構的特點是順序地、依次地執行程序中語句序列。在程序的運行過程中,每條語句都必定執行一次,并且只能是執行一次。順序結構的流程圖如第1章圖1.1(a)所示。這一節將分析幾個順序結構的程序例題,從中學習簡單順序結構程序的設計方法。例3.4.1設計計算方程:ax2+bx+c=0的實根的程序。已知該方程式滿足條件:b2?4ac>0。 一般程序設計的步驟不外乎輸入原始數據,對問題求解和輸出結果這樣一個過程。數據的輸入和輸出,可以很容易地通過相應的函數來完成。剩下的核心問題是求解題目的方法。有了方法,編程就比較容易了。也就是要有一個算法來解決編程的問題。對于本例題,解該方程的算法就是公式:

在上面的公式中有一個開平方的運算。在C語言的運算符中是沒有開方運算的,這可以使用系統提供的開平方函數sqrt()。這個函數的參數是雙精度型的被開平方的數據(變量或常量),函數返回的是參數的平方根。Sqrt()函數定義在頭文件math.h,所以在程序中應該有相應的包含命令。

描述算法的一個很好的工具就是流程圖。根據流程圖寫程序,則要容易得多。對于非常簡單的程序,一般不需要流程圖,作為練習,圖3.1給出本例題的流程圖。根據流程圖寫出程序如下:

#include"stdio.h"#include"math.h"

main(){floata,b,c,x1,x2,d;

printf("Entera,b,c:\n");scanf("%f,%f,%f",&a,&b,&c);

d=sqrt(b*b-4*a*c);x1=(-b+d)/(2*a);x2=(-b-d)/(2*a);

printf("x1=%f,x2=%f\n",x1,x2);}如果輸入a=1.0,b=3.0,c=2.0,則程序的輸出為:

x1=?1.000000,x2=?2.000000例3.4.2使兩個變量的值進行相互交換的程序。設有兩個變量a和b,我們的問題是,將變量a的值賦給變量b,變量b的值賦給變量a。程序的過程還是不外乎:輸入a和b原始數據,數據處理(交換a、b的值),輸出結果(交換后a、b的值)。輸入和輸出大家都很熟悉。問題是怎樣實現兩個數據的交換。一個可能的方法是這樣。定義一個類型與變量a和b相同的變量temp,通過變量temp進行數據交換,其步驟如下:(1)變量a的數據送入變量temp;(2)變量b的數據賦予變量a;(3)變量temp的數據送入變量b。圖3.2顯示了上述數據交換過程。程序如下:#include"stdio.h"

main(){

inta=10;intb=20;inttemp;

printf("a=%db=%d\n",a,b);

temp=a;a=b;b=temp;printf("a=%db=%d\n",a,b);}如果輸入a=10,b=20,則程序的輸出為:

b=20a=10例3.4.3設計一個求4位正整數中各位數字的和的程序。問題的關鍵是如何將一整數x的個、十、百、千位的數字分離出來,這是本問題算法的核心。下面介紹一種簡單算法。x%10的模運算的結果就是所求的個位數,然后,用x/10的整除運算,使十位數出現在個位上,再通過模運算得到十位數。如此計算下去,求得百位和千位數。具體計算步驟如下:第一步,x%10得到x的個位數,存入變量x1;第二步,x=x/10,x%10得到x的十位數,存入變量x2;第三步,x=x/10,x%10得到x的百位數,存入變量x3;

第四步,x=x/10,x%10得到x的千位數,存入變量x4;第五步,各位數字的和:x1+x2+x3+x4。有了上述算法,再在此算法前加上輸入數據x的操作,算法后加上輸出計算結果的操作,就是解決本例題的完整算法了。根據上述算法的描述,可寫出下面的程序:#include"stdio.h"main(){intx,sum; /*定義變量:分別存儲原始數據和各位數的和*/

intx1,x2,x3,x4; /*定義變量:分別存儲整數x的個、十、百、千、位數*/

scanf("%d",&x);/*輸入原始數據x*/

關系運算符是用來確定一個量與另一個量之間的關系,

C語言提供六種關系運算符。4.1

關系運算符及關系運算表達式

關系運算的結果是一個邏輯值。邏輯值是一種只有兩個值的量:真和假。關系運算的結果成立,或者說為真(true),則運算結果為1,也就是用1表示真。比較的結果不成立,或者說為假(false),則運算結果為0,也就是用0表示假。例如,關系運算:10>100 顯然是不成立的,表達式的值為假,實際存儲的數字為0。例4.1.1設有變量定義:

inta=90,b=80;計算下面關系運算表達式的值:

a>b>=1<=0==1!=0

按照關系運算符的優先級和結合性,上面表達式的運算順序相當于

((((a>b>)=1)<=0)==1)!=0表達式的值為0。上式的運算過程可以用圖4.1來說明。 例4.1.2下面的程序應用關系運算符判斷用戶輸入的兩個整型變量數是否相等,并將比較的結果輸出。程序如下:

/*Thisprogramillustratestherelationaloperators.*/#include"stdio.h"main(){

intnum1,num2; /*定義變量*/printf("Entertwonumbers:"); /*提示用戶輸入數據*/

scanf("%d%d",&num1,&num2); /*用戶輸入數據*/printf("num1=%dnum2=%d\n",num1,num2); /*輸出用戶數據*/printf("result=%d\n",num1==num2); /*輸出比較結果*/}程序輸出舉例:Entertwonumbers:22(用戶從鍵盤輸入22)

num1=2num2=2result=1 邏輯運算符用于支持基本邏輯運算。三種邏輯運算符及其意義,如表4.2.1所示。4.2邏輯運算符及邏輯表達式

表4.2.1邏輯運算符名稱優先級結合性!邏輯非2<-(自右向左)&&邏輯與11->(自左向右)||邏輯或12邏輯運算是對邏輯量或表達式進行運算的。邏輯運算的對象可以是數值型的、字符型的,也可以是邏輯量。C語言規定,邏輯運算的運算對象為0時,代表邏輯量假;運算對象為非0時,代表邏輯量真。邏輯運算的結果仍是邏輯量:真或假。

例4.2.1分析下面表達式的值是什么?

25>5&&!(8>7)||2<=10

根據上述的關系運算和邏輯運算的意義以及運算符的優先級,不難知道該表達式的值為真。這可以從圖4.3清楚地看出。

例4.2.2設有如下變量定義:

charch='A';/*ch的值是65*/

intk1=65,k2=97;計算下面表達式的值:

k1+32==k1&&k2==ch

上式的計算過程相當于:

((k1+32)==k2)&&(k1==ch)第一步運算k1+32=97;第二步運算97==k2結果為真;第三步運算k1==ch結果為真;第四步運算1&&1結果為真;所以,整個表達式的值為1(真)。例4.2.3編寫程序,求25&&10,25||10的邏輯值。程序如下:

#include<stdio.h>main(){intx=25,y=10;printf("x=%dy=%dx&&y=%d\n",x,y,x&&y);printf("25||10=%d\n",25||10);}程序的輸出有如下的形式:

x=25y=10x&&y=125||10=1

關于邏輯運算,有一點要特別說注意:當對兩個表達式進行邏輯與運算時,若前一個表達式的值為假,則不再進行后一個表達式的計算,整個表達式的值肯定為假。同樣,當對兩個表達式進行邏輯或運算時,若前一個表達式的值為真,整個表達式的值肯定為真,也不再進行后一個表達式的計算。例如,表達式10>12&&(a=a+1)中前一個表達式的值為0(假),整個表達式的值為0,不進行后面表達式“a=a+1”的計算,a的值保持不變。又如,表達10<121||(a=a+1)中前一個表達式的值為1(真),整個表達式的值為0,不進行后面表達式“a=a+1”的計算,a的值保持不變。4.3選擇語句

選擇語句是用于構造選擇程序結構的語句。4.3.1單分支if選擇語句單分支if選擇語句是形式最簡單的if條件轉移語句,它的格式如下:

if(表達式)語句;本語句的功能是,首先計算“表達式”的值,如果表達式的值為真,則執行“語句”,否則不執行,而是轉去執行本語句后面的語句。單分支if語句的流程圖如圖4.4所示。圖4.4單分支if語句的流程if語句中表達式可以任何類型的C表達式。其中語句也可以是任何語句,包括另一個if語句(稱嵌套if語句);也可以是由若干語句組成的一個組語句。在這種情況下,這組語句需要用花括號“{}”括起來。

例4.3.1編寫程序,求輸入的整數的絕對值并將其輸出。整個程序的思路可歸結為以下三步:(1)輸入整數a;(2)求a的絕對值并存入a;(3)輸出a。求a的絕對值的簡單方法就是:如果a是負數,再對它取一次負就變為正數了。按照這個思路,不難寫出如下的程序:

#include"stdio.h"main(){inta,a1;scanf("%d",&a);a1=a;

if(a<0)a=-a;printf("|%d|=%d\n",a1,a);}

如果輸入整數?5,則程序輸出|?5|=5。4.3.2雙分支if_else選擇語句if_else語句的格式為:

if(表達式)語句1;

else語句2;

語句的功能是,首先計算表達式的值,如果為真,則執行語句(塊)1,否則執行else后面的語句(塊)2。上述功能如圖4.5所示。圖4.5雙分支if_else選擇語句流程例4.3.2比較用戶輸入的兩個整數的大小。若輸入的第一個數大于第二個數,則顯示:

first>second

否則,顯示:

first<=second最后,顯示:

Alldone!顯然,這是一個有兩個分支的程序。用圖4.6的流程圖說明編程的思想。

圖4.6例4.3.2程序的流程圖根據流程圖可寫出程序如下:#include<stdio.h>main(){intfirst,second;

printf("Entertwonumbers:");scanf("%d%d",&first,&second);

if(first>second)printf("first>second");elseprintf("first<=second");

printf("Alldone!");}例4.3.3用雙分支if語句重新編寫例4.3.1的程序。可以利用一個分支處理變量a為正數的情況,如令x=a。用另一個分支初處理變量a為負數的情況,如令x=?a。最后輸出結果。下面給出程序:

#include"stdio.h"main(){inta,x;scanf("%d",&a);if(a>0)x=a;elsex=-a;printf("|%d|=%d\n",a,x);}4.3.3多分支結構如果在if選擇語句的一個或兩個分支語句中,還包含有if語句,則稱這種結構為“if語句的嵌套”。利用if語句的嵌套,可以構成多個分支的選擇結構程序。例4.3.4編寫一程序,進行十進制數、八進制數和十六進制數之間的轉換。程序首先給出一個菜單,供用戶選擇所要求的數制轉換。

菜單的形式如下:Convert:1:decimaltohexadecimal(十進制數轉換為十六進制數)2:hexadecimaltodecimal(十六進制數轉換為十進制數)3:decimaltooctal(十進制數轉換為八進制數)4:octaltodecimal(八進制數轉換為十進制數)5:octaltohexadecimal(八進制數轉換為十六進制數)6:hexadecimaltooctal(十六進制數轉換為八進制數)并提示用戶輸入數制轉換類型:

Enteryourchoice:

用戶通過輸入數字(1~6)選定所要轉換類型,然后程序提示用戶輸入待轉換的數,例如:

Enteradecimalvalue:

輸入數據后,程序輸出換算的結果。根據題意可知,本程序應該有六個分支語句塊分別處理六種不同情況數制的轉換。在每個分支中數制之間的轉換,可通過函數printf()的格式控制字符實現。十進制數用格式字符“%d”輸出。八進制數用格式字符“%o”輸出,十六進制數用格式字符“%x”輸出。

下面給出程序清單:

#include<stdio.h>main(){intvalue,choice;

printf("Convert:\n"); /*輸出菜單*/

printf("1:decimaltohexadecimal\n");printf("2:hexadecimaltodecimal\n");printf("3:decimaltooctal\n");

printf("4:octaltodecimal\n");printf("5:octaltohexadecimal\n");printf("6:hexadecimaltooctal\n");

printf("Enteryourchoice:"); /*輸入菜單選擇*/

scanf("%d",&choice);if(choice==1){

printf("Enteradecimalvalue:");scanf("%d",&value);printf("%dinhexadecimalis%x\n",value,value);}elseif(choice==2){printf("Enterahexadecimalvalue:");scanf("%x",&value);printf("%xindecimalis%d\n",value,value);}elseif(choice==3){printf("Enteradecimalvalue:");scanf("%d",&value);printf("%dinoctalis%o\n",value,value);}elseif(choice==4){

printf("Enteraoctalvalue:");scanf("%o",&value);printf("%oindecimalis%d\n",value,value);}elseif(choice==5){printf("Enteraoctalvalue:");scanf("%o",&value);printf("%oinhexadecimalis%x\n",value,value);}

elseif(choice==6){printf("Enterahexadecimalvalue:");scanf("%x",&value);printf("%xinoctalis%o\n",value,value);}elseprintf("Invalidselection.\n");}我們看到,本程序通過六個if_else_if結構的語句,構成了七個分支的多分支程序。根據if語句的執行流程,當第一個if語句的條件(choice==1)為真時,執行它后面的語句塊:進行十→十六的轉換,輸出結果后,程序運行結束。否則,表達式為假時,通過else分支進入第二個if語句。若表達式(choice==2)為真,執行它后面的語句塊:進行十六→十的轉換,輸出結果后,程序運行結束。否則,表達式為假時,跳過它后面的語句塊,執行下一個if語句,等等。以此類推,一直執行到第六個if語句。如果用戶輸入的數字不是在1~6中,則執行程序最后一行的else語句。下面是程序的一次運行輸出實例(十進制數轉換為十六進制數)。程序開始運行后顯示采單:

Convert:1:decimaltohexadecimal;2:hexadecimaltodecimal;3:decimaltooctal;4:octaltodecimal;

5:octaltohexadecimal;6:hexadecimaltooctal;Enteryourchoice:1(輸入1)

Enteradecimalvalue:255(輸入255)

輸出如下的計算結果:

255inhexadecimalisff

一般情況下,只要在一個if語句中包含有另一個if語句就是if語句的嵌套,組成的就是多分支的選擇結構程序。例如,下面也是一種多分支的選擇結構:

if(表達式)

if(表達式){語句}

else{語句}

elseif(表達式){語句}

else{語句}C語言對語句在程序中書寫形式沒有嚴格的要求。一行可以寫多個語句,也可以把一個語句寫在兩行里。一個語句可以從一行的頭開始寫,也可以從一行的某個位置開始寫。為了使嵌套結構清楚、醒目并避免產生錯誤的理解,建議各層嵌套的語句采用不同的縮進書寫形式,如上面所寫的那樣。必要時,使用花括號也會使是程序的嵌套結構顯示得更清晰。例4.3.5分析下面的多分支語句:

if(a>b)if(b>5)c=0;elsec=1;

在這個語句中含有兩個if和一個else。從語句的書寫形式上,分支結構不是很清楚。可能產生兩種不同的理解。第一種理解是:如果(a>b)并(b>5),則執行c=0;否則,(a>b)不成立,則執行c=1。這種理解是把else與第一個if配為一對。用縮進格式表達上述理解時,可把語句寫成如下的形式:

if(a>b)if(b>5)c=0;elsec=1;第二種理解是:如果(a>b)并(b>5),則執行c=0;否則,(a>b)成立,(b>5)不成立,則執行c=1。這種理解是把else與第二個if配對。用縮進格式表達上述理解時,可把語句寫成如下的形式:

if(a>b)if(b>5)c=0;elsec=1;

第一種理解是把else與第一個if配對;第二種理解是把else與第二個if配對。哪種理解是正確的呢?C語言的規定:在if嵌套語句中,一般從最內層開始,else與它前面最近的if配成一對。根據“else與它前面最近的if配對”的原則,這里的else應該是與第2個if配對,就是第二種理解是合乎C語法規則的。語句的功能應該這樣理解:如果a>b成立,并且b>5,則把0賦給變量c;如果a>b成立,但b>5不成立,則把1賦給變量c。如果這不是我們所要表達的意思。我們要表達的是:如果a>b成立,并且b>5,則把0賦給變量c;如果a>b不成立,則把1賦給變量c。這時,else要與第一個if配對。我們應該這樣寫:

if(a>b){if(b>5)c=0;}elsec=1;

這里花括號是必須的。4.3.4多分支開關語句switch在許多情況下,switch語句非常適合構造多分支選擇結構程序。switch語句的一般格式為:

switch(表達式){

case常量表達式1: 語句(塊)1

break;case常量表達式2: 語句(塊)2

break;……case常量表達式n: 語句(塊)n break;default: 語句(塊)n+1}

switch語句的執行過程如下:

首先,計算switch后圓括號內的表達式的值,然后,用這個值逐個與各case的常量表達式i的值進行比較。當找到與其相等(匹配)的case時,就執行該case中的語句(塊)i,如果在語句(塊)i中有break語句,便退出該switch語句。如果沒有break語句,則在執行完某個語句(塊)i后,連續執行其后的語句(塊),直到遇上另一個break語句,結束switch的執行,或者一直執行到最后的語句(塊),然后,結束switch語句的執行。switch語句的上述功能如圖4.8所示。

圖4.8switch語句的流程例4.3.6分析下面應用switch語句程序的輸出。

#include"stdio.h"main(){intc;scanf("%d",&c);switch(c){

case1:printf("case1\n");break;case2:printf("case2\n");break;case3:printf("case3\n");case4:printf("case4\n");break;default:printf("default\n");}}輸入1,則程序輸出:case1(執行break語句,退出switch,程序結束)輸入2,則程序輸出:case2(執行break語句,退出switch,程序結束)輸入3,則程序輸出:case3(沒有break語句,連續執行下后邊的case)輸入3,則程序輸出:case4(執行break語句,退出switch,程序結束)

輸入4,則程序輸出:case4(執行break語句,退出switch,程序結束)輸入1~4以外的數,如6,則程序輸出:default(退出switch,程序結束)。

4.4選擇結構程序設計

本節將通過一些例題,進一步練習選擇結構程序的編程技術。例4.4.1用戶從鍵盤輸入三個整數,找出并輸出其中數值最大的那一個。如果其中有一個以上的最大數(兩數相等的情況),也要表示出來。因為程序要多次進行兩個數的大小比較才能找出其中的最大值,所以這是一個多分支的選擇結構的程序。我們要特別注意各語句中if和else的配對關系和相應的縮進書寫形式。程序如下:

#include<stdio.h>main(){inta,b,c;printf("Enter3numbers:");scanf("%d%d%d",&a,&b,&c);if(a>b){

if(a>c)printf("max.a=%d\n",a);elseif(a==c)printf("max.a=c=%d\n",c);elseprintf("max.c=%d\n",c);}elseif(a==b){if(a>c)printf("max.a=b=%d\n",a);elseif(a==c)printf("a=b=c=%d\n",c);elseprintf("max.c=%d\n",c);}elseif(b>c)printf("max.b=%d\n",b);elseif(b==c)printf("max.b=c=%d\n",b);elseprintf("max.c=%d\n",c);}程序的輸出有如下的形式:

Enter3numbers:132(132是用戶的輸入)

max.b=3(程序的輸出)

需要強調指出的是,任何合法的C表達式都可以作為if語句的條件表達式。表達式中,關系操作符和邏輯操作符并不是絕對必要的。只要表達式的值是0,就認為條件為假,非0就認為是真。請看下面的例子。例4.4.2用戶從鍵盤輸入兩個整數,進行除法運算。其中變量dividend是被除數,divider是除數,result是商。要求當除數(divider)為0時,輸出信息“Can'tdividedbyzero.”,不進行計算。如果除數不為0,則進行除法運算并輸出計算結果。程序中用

if(divider)判斷除數是否是0。這里表達式divider不是什么關系表達式,也不是邏輯表達式,甚至也不是算術表達式。就是由一個變量組成的表達式。但是利用0代表假,非0代表真這一規則,因此,可以用作if語句的判斷條件。程序如下:#include<stdio.h>{main()

floatdividend,divider,result;

printf("Entertwofloatnumbers:");scanf("%f%f",÷nd,÷r);

if(divider){result=dividend/divider;printf("result=%f",result);}

elseprintf("Can'tdividedbyzero.");}

當然,也可以把上面程序中的if(divider)寫成下面的關系表達式的形式:

if(divider!=0)

但這種形式不如前一種形式更為簡單。

在if語句的條件表達式中也可以出現賦值表達式,如if(x=y)。但不要與相等的比較運算(x==y)相混淆。前者是賦值表達式,后者是關系表達式。請看下面的例子。例4.4.3判斷兩整型數的和是否小于0的程序。程序中使用了如下的if語句:

if((z=x+y)<0)其中的z=x+y是賦值表達式。它與z==x+y的意義是不同的。程序如下:

#include<stdio.h>main(){intx,y,z;

printf("Entertwonumbers:");scanf("%d%d",&x,&y);

if((z=x+y)<0)printf("Thesumisnegative.\n");elseprintf("Thesumispositive.\n");}default是switch語句中的一個任選的分支,在語句中是可用可不用部分。但是,使用它可能產生很好的效果。在實踐中,它一般用在處理不能與所有的case相匹配的情況。例如,鍵盤輸入錯誤的數字,則在找不到匹配case后,便執行

溫馨提示

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

評論

0/150

提交評論