《汽車計算機基礎(chǔ)》 課件 索明何 1 緒論、汽車程序設(shè)計基礎(chǔ)篇_第1頁
《汽車計算機基礎(chǔ)》 課件 索明何 1 緒論、汽車程序設(shè)計基礎(chǔ)篇_第2頁
《汽車計算機基礎(chǔ)》 課件 索明何 1 緒論、汽車程序設(shè)計基礎(chǔ)篇_第3頁
《汽車計算機基礎(chǔ)》 課件 索明何 1 緒論、汽車程序設(shè)計基礎(chǔ)篇_第4頁
《汽車計算機基礎(chǔ)》 課件 索明何 1 緒論、汽車程序設(shè)計基礎(chǔ)篇_第5頁
已閱讀5頁,還剩182頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

緒論

20世紀70年代微處理器的出現(xiàn),使計算機技術(shù)得到了快速的發(fā)展。以微處理器為核心的微型計算機在運算速度、存儲容量等方面不斷得到提高,并通過聯(lián)網(wǎng)實現(xiàn)了硬件資源和軟件資源的共享。微型計算機具有良好的通用性,所以又稱通用計算機。測控領(lǐng)域的計算機系統(tǒng)是嵌入到應(yīng)用系統(tǒng)中,以計算機技術(shù)為基礎(chǔ),軟、硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、成本、體積、可靠性、功耗嚴格要求的專用計算機系統(tǒng),即嵌入式計算機系統(tǒng),簡稱嵌入式系統(tǒng)(EmbeddedSystem)。通俗地說,除了通用計算機(如臺式計算機和筆記本計算機)外,所有包含CPU的系統(tǒng)都是嵌入式系統(tǒng)。通用計算機和嵌入式計算機,是計算機技術(shù)在發(fā)展過程中形成的兩大分支。緒論

汽車電子控制系統(tǒng)是典型的嵌入式計算機系統(tǒng)。一個完整的汽車電子控制系統(tǒng)主要由傳感器、電子控制單元(ElectronicControlUnit,ECU)、執(zhí)行器和網(wǎng)絡(luò)接口

4部分組成,其中ECU又稱為“汽車電腦”,其核心是微控制器(單片機)。緒論

本課程主要學(xué)習(xí)“汽車程序設(shè)計基礎(chǔ)”“汽車嵌入式技術(shù)基礎(chǔ)”和“車載網(wǎng)絡(luò)技術(shù)基礎(chǔ)”三部分內(nèi)容。

通過本課程的學(xué)習(xí),大家可以提高計算機技術(shù)在汽車領(lǐng)域中的應(yīng)用能力,從整體上加深理解汽車電子控制系統(tǒng)的組成和工作原理,為后續(xù)的汽車電子控制技術(shù)和智能網(wǎng)聯(lián)汽車技術(shù)學(xué)習(xí)奠定良好的計算機基礎(chǔ)。第1單元:C語言程序設(shè)計入門第2單元:利用三種程序結(jié)構(gòu)解決簡單問題第3單元:利用數(shù)組處理同類型的批量數(shù)據(jù)第4單元:利用函數(shù)實現(xiàn)模塊化程序設(shè)計第5單元:靈活使用指針處理問題第6單元:利用復(fù)雜的構(gòu)造類型解決實際問題汽車程序設(shè)計基礎(chǔ)篇

第1單元C語言程序設(shè)計入門【單元導(dǎo)讀】

產(chǎn)生于20世紀70年代的C語言是國際上廣泛流行的計算機高級編程語言。

C語言既是通用計算機軟件設(shè)計的基礎(chǔ)語言,也是當(dāng)前嵌入式軟件設(shè)計的主流語言。讀者通過本書的學(xué)習(xí),可以奠定C語言的編程基礎(chǔ),同時也可以掌握汽車嵌入式軟件設(shè)計方法。

單元學(xué)習(xí)目標(biāo):首先通過上機練習(xí),掌握VC++2010軟件開發(fā)C程序的使用方法和步驟;然后能利用基本的數(shù)據(jù)類型和運算符解決簡單的問題。C語言程序設(shè)計一般要經(jīng)過4個基本步驟(VC++2010開發(fā)環(huán)境的使用方法和步驟請參照教材和微課視頻):(1)編輯源程序(.c文件或

.h文件);(2)對源程序進行編譯,生成二進制目標(biāo)文件(.obj文件);(3)連接若干個源文件和庫文件對應(yīng)的多個目標(biāo)文件,生成可執(zhí)行文件(.exe文件);(4)運行程序。1.1.1VC++2010開發(fā)環(huán)境的使用方法和步驟任務(wù)1.1使用VC++2010軟件開發(fā)簡單的C程序1.1.2初識簡單的C程序【例1.1】在PC屏幕上顯示一串字符。/*程序功能:在PC屏幕上顯示一串字符*/#include

<stdio.h>

//(1)預(yù)處理命令:包含輸入輸出頭文件intmain(void)

//(2)主函數(shù){

printf("這是我寫的第1個C程序\n");

//(3)調(diào)用printf函數(shù),原樣輸出一串字符return0;

//(4)如程序正常結(jié)束,返回函數(shù)值0}可省略不寫【課堂練習(xí)】同步練習(xí)1-1:分行輸出社會主義核心價值觀。任務(wù)1.1使用VC++2010軟件開發(fā)簡單的C程序任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

數(shù)據(jù)又有常量與變量兩種表現(xiàn)形式,例如整型數(shù)據(jù)有整型常量和整型變量?!菊n堂練習(xí)】同步練習(xí)1-2:寫出C語言的基本數(shù)據(jù)類型及兩種表現(xiàn)形式。1.2.1常量和變量1、常量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

在程序執(zhí)行過程中,其值不發(fā)生改變的量稱為常量。根據(jù)書寫方式,常量可分為直接常量和符號常量。(1)直接常量:如4、23;1.23;'a'、'b';''CHINA''等(2)符號常量:用#define指令,指定一個標(biāo)識符代表一個常量。

例如,#definePI3.1415926//定義符號常量PI(代表常量3.1415926)

關(guān)于#define指令的使用方法,將在任務(wù)2.5中詳細介紹。1.2.1常量和變量1、常量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

用戶定義的標(biāo)識符不能與系統(tǒng)提供的關(guān)鍵字(參見附錄B)同名。如int、void等都不能作為用戶標(biāo)識符。另外,標(biāo)識符區(qū)分大小寫,如Sum和sum是兩個不同的標(biāo)識符。說明:

標(biāo)識符是用來標(biāo)識變量名、符號常量名、函數(shù)名、數(shù)組名、類型名、宏名、文件名的有效字符序列。C語言的標(biāo)識符只能由字母、數(shù)字、下畫線3種字符組成,且第一個字符必須是字母或下畫線。

【課堂練習(xí)】同步練習(xí)1-3:識別C語言標(biāo)識符。

在程序執(zhí)行過程中,其值可以改變的量稱為變量。變量必須“先定義,后使用”。定義變量后,編譯系統(tǒng)為每個變量名分配對應(yīng)的內(nèi)存地址,即一個變量名對應(yīng)一個存儲單元。1.2.1常量和變量2、變量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

1.2.2整型數(shù)據(jù)1、整型常量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

(3)十六進制整數(shù):以0x開頭的數(shù)。如0x123表示十六進制數(shù)123,對應(yīng)十進制291。在C語言中,整型常量(整型常數(shù))有3種表示形式:(1)十進制整數(shù):如123、-456、7。(2)八進制整數(shù):以0開頭的數(shù)。如0123表示八進制數(shù)123,對應(yīng)十進制83。1.2.2整型數(shù)據(jù)2、整型變量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

歸納起來,有10種整型變量,在VC++系統(tǒng)中對應(yīng)的數(shù)值范圍如下:(1)整型變量的分類數(shù)值范圍是怎樣計算出來的?(2)整型變量在內(nèi)存中的存儲形式(以單字節(jié)整型數(shù)據(jù)為例)1.2.2整型數(shù)據(jù)2、整型變量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

1.2.2整型數(shù)據(jù)2、整型變量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

(3)定義整型變量的方法1)定義一個變量的格式:類型標(biāo)識符變量名;

例如:inti;//定義有符號基本整型變量i

unsignedintj;//定義無符號基本整型變量j2)同時定義多個同類型變量的格式:類型標(biāo)識符

變量名1,變量名2,變量名3,…;

例如:inti,j,k;//同時定義三個基本整型變量i、j、k

定義變量后,系統(tǒng)將根據(jù)變量的類型給變量分配對應(yīng)大小的內(nèi)存空間,用于存儲該變量。例如:

shortint

i;//定義短整型變量i

i=10;//給變量i賦值【課堂練習(xí)】同步練習(xí)1-4:定義變量。1.2.2整型數(shù)據(jù)2、整型變量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

【例1.2】整型變量的定義、賦值和輸出。#include<stdio.h>//(1)預(yù)處理命令:包含輸入輸出頭文件intmain(void)

//(2)主函數(shù){

inti;

//(3)定義變量

i=1234;

//(4)給變量賦值

printf("這是我寫的第2個C程序\n");

//(5)原樣輸出一串字符

printf("i=%d\n",i);//(6)輸出變量的值}格式輸出函數(shù)printf的用法一般形式:printf(格式控制字符串,輸出列表)作用:向顯示器輸出若干個任意類型的數(shù)據(jù)。②原樣輸出的字符,在顯示中起提示作用。(2)輸出列表:是需要輸出的一些數(shù)據(jù),可以是常量、變量或表達式。

多個數(shù)據(jù)之間要用逗號隔開。

括號內(nèi)包含兩部分:(1)格式控制字符串:由雙撇號括起來的一個字符串,它包含兩種信息。

①由%開頭的格式符,用于指定數(shù)據(jù)的輸出格式。

%d:以十進制形式輸出帶符號整數(shù);

%%:輸出%%x:以十六進制形式輸出無符號整數(shù);

%c:輸出單個字符;

%s:輸出字符串;%f:以小數(shù)形式輸出實數(shù)(默認輸出6位小數(shù));%e:以指數(shù)形式輸出實數(shù);%u:以十進制形式輸出無符號整數(shù);

使用printf函數(shù)時,要求格式控制字符串中必須含有與輸出項一一對應(yīng)的格式符,并且類型要匹配。printf函數(shù)也可以沒有輸出項。printf("這是我寫的第2個C程序\n");

//原樣輸出一串字符,并換行printf("i=%d\n",i);//原樣輸出i=,然后以%d形式輸出變量i的值,并換行1.2.3字符型數(shù)據(jù)1、字符常量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

用一對單撇號括起來的一個字符,稱為字符常量,例如:'A','6','+'等。

C語言還有一種以

\開頭的字符序列,稱為轉(zhuǎn)義字符。最常用的轉(zhuǎn)義字符:

'\n'表示換行,將當(dāng)前位置移到下一行開頭;

'\t'表示橫向跳到下一Tab位置;

'\r'表示回車,將當(dāng)前位置移到本行開頭(不換行)

字符變量用來存放字符,并且只能存放1個字符。其類型標(biāo)識符是char。

例如:charc1,c2;//定義字符變量c1、c2c1='a';c2='b';//給變量c1賦值'a',變量c2賦值'b'2、字符變量1.2.3

字符型數(shù)據(jù)任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

3、字符型數(shù)據(jù)在內(nèi)存中的存儲形式及使用方法

一個字符變量在內(nèi)存中占一個字節(jié)。字符型數(shù)據(jù)在內(nèi)存中存儲的是該字符對應(yīng)的ASCII碼。

字符型數(shù)據(jù)的存儲形式與單字節(jié)整型數(shù)據(jù)相同。因此,字符型可以當(dāng)作單字節(jié)整型。

【課堂練習(xí)】同步練習(xí)1-5:字符型數(shù)據(jù)在內(nèi)存中的存儲形式、常用字符的ASCII碼值。#include<stdio.h>intmain(void){

charc1;

//定義字符變量

c1=97;

//給變量c1賦整數(shù)(將ASCII碼值97賦給變量c1)

printf("%c\n",c1);//以字符形式輸出變量c1的值(ASCII碼值對應(yīng)的字符)

printf("%d\n",c1);//以整數(shù)形式輸出變量c1的值(字符對應(yīng)的ASCII碼)}1.2.3字符型數(shù)據(jù)【例1.3】向字符變量賦整數(shù)。任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

#include<stdio.h>intmain(void){charc1,c2;//定義字符變量

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

//給字符變量賦字符常量

c1=c1-32;c2=c2-32;

//將字符變量對應(yīng)的ASCII碼值更新

printf("%c,%c\n",c1,c2);//以字符形式輸出變量c1和c2的值

}1.2.3字符型數(shù)據(jù)【例1.4】輸出給定小寫字母對應(yīng)的大寫字母。任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

字符串常量是由一對雙撇號括起來的字符序列。例如:"CHINA"

,"Cprogram"

,"a","$12.5"

字符常量和字符串常量的區(qū)別:因此字符串常量"CHINA"在內(nèi)存中占用6個字節(jié)。

【課堂練習(xí)】同步練習(xí)1-6:字符常量'a'和字符串常量"a"有何區(qū)別?

4、字符串常量

1.2.3字符型數(shù)據(jù)任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

1.2.4實型數(shù)據(jù)1、實型常量

(2)指數(shù)形式。如123e3或123E3都代表123×103。要注意字母e(或E)之前必須要有數(shù)字,且e后面的指數(shù)必須為整數(shù),如e2、4e2.5、.e3、e都不是合法的指數(shù)形式。

實型常量也稱實數(shù),在C語言中,實數(shù)有兩種表示形式:

(1)十進制小數(shù)形式。它由數(shù)字和小數(shù)點組成(注意,必須要有小數(shù)點)。如:0.123、123.、123.0、0.0。

一個實數(shù)可以有多種指數(shù)表示形式。在程序中以指數(shù)形式輸出一個實數(shù)時,會以規(guī)范化的指數(shù)形式輸出。

例如123.456的規(guī)范化指數(shù)形式是1.23456e2。2、實型變量

根據(jù)數(shù)據(jù)的數(shù)值范圍和精度,實型變量的類型主要有單精度(float)型和雙精度(double)型。需要注意:實型數(shù)據(jù)在計算機內(nèi)存中的存儲精度有限,不可能得到完全精確的數(shù)值。任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

#include<stdio.h>intmain(void){

floatx;//定義實型變量xx=12.3;//將實型常數(shù)12.3賦給變量xprintf("%f\n",x);//以小數(shù)形式輸出變量x的數(shù)值printf("%e\n",x);//以指數(shù)形式輸出變量x的數(shù)值}1.2.4實型數(shù)據(jù)【例1.5】實型變量的定義、賦值和輸出。任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

【課堂練習(xí)】同步練習(xí)1-7:實數(shù)有兩種表示形式、實型變量的兩種類型。

1.2.5變量的初始化任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

C語言允許在定義變量的同時,對變量賦初值,即變量的初始化。例如:

inta=3;

//定義整型變量a,并賦初值3

當(dāng)一次定義同類型的多個變量時,可以給全部變量或部分變量賦初值。inta,b,c=5;

//定義a、b、c三個整型變量,只給c賦初值5注意,對3個變量賦相同的初值3時,不能寫成:inta=b=c=3;inta=1,b=2,c=3;

//定義a、b、c三個整型變量,并賦不同的初值inta=3,b=3,c=3;

//定義a、b、c三個整型變量,并賦相同的初值3charc='a';

//定義字符變量c,并賦初值'a'floatb=1.23;//定義實型變量b,并賦初值1.23

在定義變量并對變量初始化時,如果加上關(guān)鍵字const,則變量的值在程序運行期間不再改變,這種變量稱為常變量(constantvariable),也稱為只讀變量。例如:constinta=5;

//用const聲明整型變量a為常變量,其值始終是51.2.6常變量任務(wù)1.2掌握數(shù)據(jù)的基本類型及其表現(xiàn)形式

1.3.1算術(shù)運算符及其表達式1.3.2強制類型轉(zhuǎn)換運算符及其表達式1.3.3賦值運算符及其表達式1.3.4關(guān)系運算符及其表達式1.3.5邏輯運算符及其表達式1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

附錄C列出了C語言的各種運算符。1.3.1算術(shù)運算符及其表達式1、基本的算術(shù)運算符(2)-

減法運算符,或負值運算符,如7-2、-4

(1)+

加法運算符,或正值運算符,如2+3、+5

(4)/

除法運算符,如5/2、5.0/2

(3)*乘法運算符,如2*3

(5)%模運算符,或稱求余運算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如5%2的值為1

說明:

任務(wù)1.3

利用基本的運算符解決簡單問題

【例1.6】將兩位十進制整數(shù)的十位數(shù)和個位數(shù)分離。1.3.1算術(shù)運算符及其表達式1、基本的算術(shù)運算符任務(wù)1.3

利用基本的運算符解決簡單問題

#include<stdio.h>intmain(void){inta=23,b,c;

//定義a、b、c三個變量

b=a/10;

//求變量a的十位數(shù)

c=a%10;

//求變量a的個位數(shù)printf("a=%d\n",a);

//輸出變量a的值printf("十位=%d\n",b);//輸出變量a對應(yīng)的十位數(shù)printf("個位=%d\n",c);//輸出變量a對應(yīng)的個位數(shù)

}

【課堂練習(xí)】同步練習(xí)1-8第1、2題。

【課后作業(yè)】同步練習(xí)1-8第3、4題。

1.3.1算術(shù)運算符及其表達式2、自增、自減運算符任務(wù)1.3

利用基本的運算符解決簡單問題

自增運算符++:使變量的值自增1,相當(dāng)于i=i+1。自減運算符--:使變量的值自減1,相當(dāng)于i=i-1。

i++

表達式先用i的值,然后對i的值加1

(先用后加)

++i

先對i的值加1,然后表達式用i加1的值(先加后用)--i

先對i的值減1,然后表達式用i減1的值(先減后用)

i--

表達式先用i的值,然后對i的值減1

(先用后減)有以下4種形式的表達式:

可見,由自增(自減)運算符構(gòu)成不同形式的表達式時,對變量而言,自增1(自減1)都具有相同的效果,但對表達式而言卻有著不同的值。1.3.1算術(shù)運算符及其表達式2、自增、自減運算符【例1.7】自增、自減運算符的應(yīng)用。#include<stdio.h>intmain(void){int

i=3,j=3,k=3,x=3;

printf("%d\t",i++);printf("i=%d\n",i);

printf("%d\t",++j);printf("j=%d\n",j);

printf("%d\t",k--);printf("k=%d\n",k);

printf("%d\t",--x);printf("x=%d\n",x);}說明:

(1)自增、自減運算符只能用于變量,不能用于常量或表達式。如5++或(a+b)++都是不合法的。(2)自增、自減運算符常用在循環(huán)語句中,使循環(huán)變量自動加1、減1,這將在后續(xù)單元中學(xué)習(xí)。任務(wù)1.3

利用基本的運算符解決簡單問題

3、算術(shù)表達式和運算符的優(yōu)先級與結(jié)合性1.3.1算術(shù)運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

算術(shù)表達式:用算術(shù)運算符和括號將運算對象(常量、變量或表達式)連接起來的、符合C語法規(guī)則的式子。例如:a+b*c-5/2+'a'。C語言規(guī)定了運算符的優(yōu)先級。在表達式求值時,先按運算符的優(yōu)先級高低次序執(zhí)行,例如:x-y*z相當(dāng)于x-(y*z)。

算術(shù)運算符的結(jié)合方向為“自左向右(左結(jié)合性)”,即先左后右。因此a+b-c相當(dāng)于

(a+b)-c。附錄C給出了C語言運算符的優(yōu)先級和結(jié)合性,在分析表達式時查詢參考。

如果在一個運算對象兩側(cè)的運算符的優(yōu)先級相同,則按照規(guī)定的“結(jié)合方向(結(jié)合性)”處理。

問題:a+b-c,b先與a相加,還是先與c相減?1.3.2強制類型轉(zhuǎn)換運算符及其表達式強制類型轉(zhuǎn)換表達式的一般形式:(類型標(biāo)識符)(表達式)任務(wù)1.3

利用基本的運算符解決簡單問題

例如:

(int)i

將i轉(zhuǎn)換為整型(int)x+y

將x轉(zhuǎn)換成整型后,再與y相加(“(int)”的優(yōu)先級高于“+”)

(float)(x+y)

將x+y的結(jié)果轉(zhuǎn)換為float型#include<stdio.h>intmain(void){

inti;//定義整型變量i

floatx=2.4F;//定義實型變量x,并賦初值

i=

(int)x;//將實型變量x強制轉(zhuǎn)換為int型

printf("x=%f,i=%d\n",x,i);

//輸出變量

x

i的值}【例1.8】將實型數(shù)據(jù)強制轉(zhuǎn)換為整型。1.3.2強制類型轉(zhuǎn)換運算符及其表達式強制類型轉(zhuǎn)換表達式的一般形式:(類型標(biāo)識符)(表達式)任務(wù)1.3

利用基本的運算符解決簡單問題

【思考與總結(jié)】數(shù)值類型轉(zhuǎn)換有幾種方式?

1)系統(tǒng)自動進行的類型轉(zhuǎn)換。如2+3.5,系統(tǒng)自動將整數(shù)2轉(zhuǎn)換為實型。

2)強制類型轉(zhuǎn)換。若i為float型,則i%3不合法,必須用(int)i%3。

【課后作業(yè)】同步練習(xí)1-9:分析表達式的值。

1、簡單賦值運算符“=”及其表達式1.3.3賦值運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

簡單賦值表達式的形式:變量=

表達式

賦值表達式中的“表達式”,又可以是一個賦值表達式。根據(jù)附錄C,賦值運算符是按照“自右向左”的結(jié)合順序。

根據(jù)附錄C,賦值運算符的優(yōu)先級僅高于逗號運算符,而低于其他運算符。因此賦值表達式a=3*5等價于a=(3*5),i=a+b等價于i=(a+b)。

一個表達式應(yīng)該有一個值,例如賦值表達式“

a=5”的值是5。執(zhí)行運算后,變量a的值也是5。

【同步練習(xí)1-10】分析下面各賦值表達式中變量a的值。a=5+(c=7)a=b=c=33a=(b=6)/(c=2)a=(b=2)+(c=5)1273

因此

a=b=5與

a=(b=5)等價。2、復(fù)合的賦值運算符及其表達式1.3.3賦值運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

在簡單賦值運算符“=”之前加上其他運算符,可構(gòu)成復(fù)合的賦值運算符。a*=3等價于a=a*3a-=3等價于a=a-3a*=b+2等價于a=a*(b+2)a+=3等價于a=a+3a/=3等價于a=a/3a%=3等價于a=a%3①a*=b+2

②a*=

(b+2)

(

)

(對表達式

b+2

外加括號,因為“+”的優(yōu)先級高于“*=”)③

=

(在“=”左側(cè)補上變量名a)

(將“a*”移到“=”右側(cè))

aa*(b+2)

1.3.3賦值運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

3、類型轉(zhuǎn)換

注意:在賦值運算中,需要根據(jù)數(shù)據(jù)的類型和數(shù)值的范圍為變量指定合適的類型,必要時還需要借助強制類型轉(zhuǎn)換運算符,以防出錯。

【思考與實驗】

如果賦值運算符“=”兩側(cè)的數(shù)據(jù)類型不一致,但同為數(shù)值型數(shù)據(jù),在賦值時,系統(tǒng)會自動進行類型轉(zhuǎn)換。

課后上機編程,輸出教材中所列的幾種情況下變量的值,并思考其原因。1.3.4關(guān)系運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

1、關(guān)系運算符及其優(yōu)先級次序

優(yōu)先級相同(高)優(yōu)先級相同(低)③>

大于①<

小于②<=

小于或等于⑥!=

不等于④>=

大于或等于⑤==

等于

根據(jù)附錄C,關(guān)系運算符的優(yōu)先級低于算術(shù)運算符,高于賦值運算符。a=b>c等價于

a=(b>c)例如:

c>a+b等價于

c>(a+b)a==b<c等價于

a==(b<c)a>b==c等價于

(a>b)==c2、關(guān)系表達式1.3.4關(guān)系運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

用關(guān)系運算符將兩個表達式連接起來的式子,稱為關(guān)系表達式。a+b>c+d(a=3)>(b=5)'a'<'b'a==3例如:a>ba!=3

關(guān)系表達式的值是一個邏輯值:“真”或“假”。例如關(guān)系表達式“5==3”的值為“假”,“5>=0”的值為“真”。

關(guān)系運算結(jié)果,以“1”代表“真”,以“0”代表“假”。關(guān)系表達式邏輯值(真、假)關(guān)系表達式的值(1、0)a>ba>b+ca!=b+ca>b>c【同步練習(xí)1-11】若a=3,b=2,c=1,則:真假假假10001.3.5邏輯運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

假1、邏輯運算符及其優(yōu)先級次序

③!邏輯非①&&邏輯與②||邏輯或

邏輯運算的真值表aba&&ba||b!a真真真假假真假假真真假真假真假假真!a==b||c<d等價于a>b&&c>d等價于a+b>c&&x+y<d等價于根據(jù)附錄C,幾種運算符的優(yōu)先級次序:

?。ǚ牵?/p>

高算術(shù)運算符關(guān)系運算符&&和||賦值運算符低(a+b)(>c)(x+y)(<d)&&(a>b)(c>d)&&(!a)(==b)||(c<d)1.3.5邏輯運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

2、邏輯表達式的值

C語言規(guī)定,參與邏輯運算的操作數(shù)以非0代表“真”,以0代表“假”。邏輯表達式的值,即邏輯運算結(jié)果,以數(shù)值1代表“真”,以0代表“假”。例如:(1)若a=3,則!a的值:(4)'a'&&'b'的值:(2)若a=3,b=4,則a&&b的值:(3)3&&0||-4的值:0111在邏輯表達式的求解過程中,有時并非所有的運算都被執(zhí)行。

例如:

(1)a&&b:只有當(dāng)a為真(非0)時,才需要判斷b的值。只要a為假,就不必判斷b的值,此時整個表達式已確定為假。(2)a||b:只要a為真(非0),就不必判斷b的值。只有a為假,才判斷b的值?!菊n堂練習(xí)】同步練習(xí)1-12:

1.3.5邏輯運算符及其表達式

分別寫出下列數(shù)學(xué)表達式對應(yīng)的C語言表達式:

(1)80≤i<89

(2)i<0或i>100

(3)i≠0i>=80&&i<89i<0||

i>=100i!=0任務(wù)1.3

利用基本的運算符解決簡單問題

1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

位運算符含義&按位與|按位或^按位異或~按位取反<<左移>>右移說明:1)位運算符中除“~”以外,均為二目運算符,即要求兩側(cè)各有一個運算量。

2)運算量只能是整型或字符型數(shù)據(jù),不能是實型數(shù)據(jù)。

在嵌入式軟件設(shè)計中,經(jīng)常用到位運算符:對二進制位進行運算。1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

例如,0x23與0x45按位與:00100011(0x23)

&)01000101(0x45)

特殊用途:“與0清零、與1保留”——可對數(shù)據(jù)的某些位清零,某些位保留不變。0&0=0,0&1=0,1&0=0,1&1=100000001(0x01)1、“按位與”運算符(&)

例如,將0x23的高4位清零,低4位保留不變。00100011

(0x23)

&)00001111(0x0F)0000

0011

(0x03)1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

例如,0x23與0x45按位或:00100011(0x23)

|)01000101(0x45)

特殊用途:“或1置1、或0保留”——可對數(shù)據(jù)的某些位置1,某些位保留不變。0|0=0,0|1=1,1|0=1,1|1=101011101(0x67)2、“按位或”運算符(|)例如,將0x23的高4位置1,低4位保留不變。00100011

(0x23)

|)

11110000(0xF0)1111

0011

(0xF3)1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

例如,0x23與0x45按位異或:00100011(0x23)

^)01000101(0x45)

特殊用途:“異或1取反(0變1,1變0),異或0保留”——可對數(shù)據(jù)的某些位取反,某些位保留不變。3、“按位異或”運算符(^)01011100(0x66)兩者相異為1,相同為0。0^0=0,0^1=1,1^0=1,1^1=0

例如,將0x23的高4位取反,低4位保留不變。00100011

(0x23)

^)11110000(0xF0)1101

0011

(0xD3)1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

4、“按位取反”運算符(~)例如,0x55按位取反:01010101(0x55)~)↓

10010110(0xaa)對一個二進制數(shù)按位取反:0變1,1變0。

1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

例如:

a<<3,表示將a的二進制數(shù)左移3位,高位溢出后丟棄,低位補0。

用來將一個數(shù)的各二進制位全部左移若干位。5、“左移”運算符(<<)1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

例如:

a>>3,表示將a的二進制數(shù)右移3位,低位溢出后丟棄,對于無符號數(shù),高位補0。6、“右移”運算符(>>)

用來將一個數(shù)的各二進制位全部右移若干位。1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

【課后作業(yè)】同步練習(xí)1-13:

寫出下面無符號單字節(jié)整數(shù)的6個位運算表達式的值(用十六進制數(shù)表示)。(1)0x34&0x56(2)0x34|0x56(3)0x34^0x56(4)~0x12(5)0xFF<<3(6)0xFF>>30x140x760x620xED0xF80x1F【例1.9】利用位運算符實現(xiàn)對8位寄存器R和對16位寄存器R'的二進制位操作

。1.3.6位運算符及其表達式任務(wù)1.3

利用基本的運算符解決簡單問題

第1單元:C語言程序設(shè)計入門第2單元:利用三種程序結(jié)構(gòu)解決簡單問題第3單元:利用數(shù)組處理同類型的批量數(shù)據(jù)第4單元:利用函數(shù)實現(xiàn)模塊化程序設(shè)計第5單元:靈活使用指針處理問題第6單元:利用復(fù)雜的構(gòu)造類型解決實際問題汽車程序設(shè)計基礎(chǔ)篇

第4單元利用函數(shù)實現(xiàn)模塊化程序設(shè)計【單元導(dǎo)讀】

前面所學(xué)的大部分程序都比較簡單,只有一個源程序文件(.c文件)。但在設(shè)計復(fù)雜的C程序時,往往將其劃分為若干個程序模塊,每個程序模塊作為一個程序文件,而每個程序文件可包括多個函數(shù)。

單元學(xué)習(xí)目標(biāo):熟悉C程序的結(jié)構(gòu)和函數(shù)的分類,熟悉定義函數(shù)的方法,掌握函數(shù)的兩種調(diào)用方式(一般調(diào)用和嵌套調(diào)用),能利用數(shù)組作為函數(shù)參數(shù)進行模塊化程序設(shè)計,能根據(jù)問題的需求靈活設(shè)置變量的類型,能使用內(nèi)部函數(shù)和外部函數(shù)進行模塊化程序設(shè)計。任務(wù)4.1熟悉C程序的結(jié)構(gòu)和函數(shù)的分類

一個復(fù)雜的C程序由若干個程序模塊組成,每個程序模塊作為一個源程序文件(.c文件、.h文件等),而每個源程序文件由預(yù)處理命令、數(shù)據(jù)聲明以及若干函數(shù)組成。

一個C程序必須有且只能有一個主函數(shù),C程序總是從主函數(shù)開始執(zhí)行(不論位置如何),最后在主函數(shù)中結(jié)束整個程序的運行。需要注意:在主函數(shù)中可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用。

在實際工程應(yīng)用中,可將主函數(shù)設(shè)計得簡單些,主要負責(zé)調(diào)用各個功能函數(shù),依次實現(xiàn)各項功能——模塊化程序設(shè)計(將在7.4.2節(jié)詳細學(xué)習(xí))。任務(wù)4.1熟悉C程序的結(jié)構(gòu)和函數(shù)的分類

從不同的角度對函數(shù)進行分類。1.從定義函數(shù)的角度

(1)庫函數(shù):由編譯系統(tǒng)提供,只要在源文件中包含其對應(yīng)的頭文件,即可在程序中直接調(diào)用。例如,“stdio.h”頭文件中的printf、scanf等函數(shù),“math.h”頭文件中的sin、cos等函數(shù)。

(2)用戶自定義函數(shù):用戶根據(jù)需要,將實現(xiàn)某個功能的代碼編寫成相對獨立的函數(shù)。2.從有無返回值的角度

(1)有返回值函數(shù):執(zhí)行完畢后會向主調(diào)函數(shù)返回一個值。

(2)無返回值函數(shù):執(zhí)行完畢后不向主調(diào)函數(shù)返回值。3.從數(shù)據(jù)傳遞的角度

(1)無參函數(shù):調(diào)用時,主調(diào)函數(shù)和被調(diào)函數(shù)之間不進行參數(shù)傳遞。

(2)有參函數(shù):調(diào)用時,主調(diào)函數(shù)需將實參的值傳遞給被調(diào)函數(shù)的形參(虛參)?!菊n堂練習(xí)】同步練習(xí)4-1:知識鞏固。任務(wù)4.2熟悉定義函數(shù)的方法4.2.1定義無參函數(shù)定義形式:

類型標(biāo)識符函數(shù)名(void){

聲明部分 執(zhí)行部分}函數(shù)首部函數(shù)體函數(shù)的類型(函數(shù)返回值的類型)表示函數(shù)沒有參數(shù),也可省略不寫例如:intfun(void){

inti,j;

intsum=0; i=2;j=3; sum=i+j; retrun(sum);}

聲明執(zhí)行說明:(1)書寫函數(shù)體時,一般先寫聲明部分,后寫執(zhí)行部分。若將前3行寫成:inti,j;//聲明語句i=2;j=3;//執(zhí)行語句intsum=0;//聲明語句系統(tǒng)編譯不通過!(2)若函數(shù)無需返回值,則函數(shù)類型應(yīng)定義為void類型。例如:

voidHello(){ printf("Helloworld\n");}函數(shù)返回值(變量sum)的類型任務(wù)4.2熟悉定義函數(shù)的方法4.2.2定義有參函數(shù)定義形式:

類型標(biāo)識符函數(shù)名(形參列表){

聲明部分 執(zhí)行部分}

形參可以是各種類型的變量。若有多個形參,則各形參之間要用逗號分隔。在函數(shù)調(diào)用時,主調(diào)函數(shù)將實參的值傳遞給形參。注意:必須在形參列表中給出形參的類型標(biāo)識符。例如:

intmax(intx,inty)

{

intz;

if(x>y)z=x;elsez=y;

return(z);

}

有返回值的函數(shù)中至少應(yīng)有一個return語句。形參:整型變量x、y,其具體值由主調(diào)函數(shù)調(diào)用時傳遞過來將z的值作為函數(shù)值返回給主調(diào)函數(shù)函數(shù)返回值(變量

z)的類型【課堂練習(xí)】照葫蘆畫瓢:定義求兩個整數(shù)最小值的min函數(shù)。任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式4.3.1函數(shù)的一般調(diào)用

函數(shù)的一般調(diào)用流程:

函數(shù)被定義之后,即可被其他函數(shù)調(diào)用。本節(jié)將介紹函數(shù)的一般調(diào)用、嵌套調(diào)用。1、函數(shù)的一般調(diào)用形式

調(diào)用有參函數(shù)時,主調(diào)函數(shù)將“實參”的值傳遞給被調(diào)函數(shù)的“形參”,從而實現(xiàn)信息傳遞。如果有多個實參,則各參數(shù)之間要用逗號隔開。實參與形參的個數(shù)應(yīng)相等,類型應(yīng)匹配,按順序?qū)?yīng),一一傳遞信息。(2)有參函數(shù)的調(diào)用形式:函數(shù)名(實參列表)

(1)無參函數(shù)的調(diào)用形式:函數(shù)名()

例如,4.2.1節(jié)中的Hello函數(shù)調(diào)用語句可寫為:Hello();任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式【例4.1】有參函數(shù)的一般調(diào)用:求兩個數(shù)的最大值。4.3.1函數(shù)的一般調(diào)用1、函數(shù)的一般調(diào)用形式

c=max(a,b);

(main函數(shù))intmax(int

x,int

y)(max函數(shù)){intz;if(x>y)z=x;elsez=y;return(z);

}#include<stdio.h>intmax(intx,inty);

//對max函數(shù)進行聲明intmain(void){

int

a,b,c;printf("請輸入兩個整數(shù):");scanf("%d%d",

&a,

&b);c

=

max(a,b);

//調(diào)用max函數(shù)printf("a=%d,b=%d,max=%d\n",

a,

b,

c);}intmax(intx,inty)

//定義有參函數(shù){

intz;if(x>y)z=x;else

z=y;

return(z);

//向主調(diào)函數(shù)返回z的值

}任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式2、關(guān)于函數(shù)調(diào)用時“參數(shù)傳遞”

的幾點說明4.3.1函數(shù)的一般調(diào)用

(1)形參變量只有在發(fā)生函數(shù)調(diào)用時才被臨時分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占用的內(nèi)存單元也被釋放。實參與形參占用不同的存儲空間。

(2)只能由實參傳遞給形參,而不能由形參傳遞給實參,即“單向信息傳遞”。在執(zhí)行一個被調(diào)函數(shù)時,形參的值如果發(fā)生改變,并不會改變主調(diào)函數(shù)的實參值。

(3)當(dāng)形參為普通變量(基本類型的變量)時,實參可以是常量、變量或表達式,但必須有確定的值。形參:x函數(shù)調(diào)用時被調(diào)函數(shù)執(zhí)行時實參:a1b3y1324【例4.2】函數(shù)參數(shù)傳遞。#include<stdio.h>voidfun(intx,inty);

//對fun函數(shù)進行聲明intmain(void){

inta=1,

b=3;

fun(a,

b);

//調(diào)用fun函數(shù)printf("a=%d,b=%d\n",

a,

b);}voidfun(intx,inty)

//定義有參函數(shù){

x=x+1;

y=y+1;printf("x=%d,y=%d\n",

x,

y);}任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式3、函數(shù)的值(3)沒有返回值的函數(shù),函數(shù)的類型應(yīng)當(dāng)明確定義為void類型。(1)函數(shù)的值只能通過return語句獲得。

return語句的一般形式:return表達式;

或return(表達式);

(2)函數(shù)返回值的類型和定義函數(shù)時指定的函數(shù)類型應(yīng)保持一致。定義函數(shù)時若不指定函數(shù)類型,C編譯系統(tǒng)則默認為整型。

說明:在函數(shù)中可有多個return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,因此只能返回一個函數(shù)值。return語句也可以不含表達式,此時必須將函數(shù)定義為void類型,其作用只是使流程返回到主調(diào)函數(shù)。4.3.1函數(shù)的一般調(diào)用任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式4、對被調(diào)函數(shù)的聲明

在例4.1和例4.2的主調(diào)函數(shù)(主函數(shù))的前面,都對被調(diào)函數(shù)進行了聲明。若不進行聲明,編譯系統(tǒng)對程序從上到下進行編譯的過程中,遇到被調(diào)函數(shù)名時,就會認為是一個“陌生人”而報告錯誤。解決辦法有兩個。

(1)在主調(diào)函數(shù)的函數(shù)體的開始,或者在源文件中所有函數(shù)的前面,對被調(diào)函數(shù)進行聲明。提前向編譯系統(tǒng)“打招呼”,讓編譯系統(tǒng)“提前認識”被調(diào)函數(shù)。

(2)若在主調(diào)函數(shù)前面定義被調(diào)函數(shù),則無須額外對被調(diào)函數(shù)進行聲明?;颍?/p>

類型標(biāo)識符函數(shù)名(形參類型1,形參類型2,…);

函數(shù)聲明(也稱為函數(shù)原型)的一般形式:

類型標(biāo)識符函數(shù)名(形參類型1

形參名1,形參類型2形參名2,…);

在函數(shù)首部的基礎(chǔ)上加一分號4.3.1函數(shù)的一般調(diào)用任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式說明:調(diào)用庫函數(shù)時,無需對其進行聲明,但要把該函數(shù)對應(yīng)的頭文件用#include命令包含在源文件中。4、對被調(diào)函數(shù)的聲明

4.3.1函數(shù)的一般調(diào)用提倡使用【課后作業(yè)】同步練習(xí)4-2:

知識鞏固;

學(xué)以致用(定義和調(diào)用函數(shù))。任務(wù)4.3掌握函數(shù)的兩種調(diào)用方式4.3.2函數(shù)的嵌套調(diào)用

在C語言中,所有函數(shù)(包括主函數(shù))都是相互平行、相互獨立的。在一個函數(shù)內(nèi)不能再定義另一個函數(shù)(函數(shù)不能嵌套定義)。但允許在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù),即函數(shù)的嵌套調(diào)用?!纠?.3】函數(shù)的嵌套調(diào)用:加、減、乘、除四則運算。

#include<stdio.h>voidadd(float

x,floaty);

//加法函數(shù)聲明voidsub(float

x,floaty);

//減法函數(shù)聲明voidmul(float

x,floaty);

//乘法函數(shù)聲明voiddiv(float

x,floaty);

//除法函數(shù)聲明voidresult(float

i,

float

j);

//四則運算函數(shù)聲明intmain(void){

floata,

b;printf("請輸入兩個實數(shù)(用空格隔開):");scanf("%f%f",&a,&b);printf("a=%f,b=%f\n",a,b);

result(a,

b);

//調(diào)用result函數(shù)}voidresult(float

i,

float

j)

//定義四則運算函數(shù){

add(i,j);

//調(diào)用加法函數(shù)

sub(i,j);

//調(diào)用減法函數(shù)

mul(i,j);

//調(diào)用乘法函數(shù)

div(i,j);

//調(diào)用除法函數(shù)}void

add(floatx,floaty)

//定義加法函數(shù){printf("add=%f\n",x+y);}void

sub(floatx,

floaty)

//定義減法函數(shù){printf("sub=%f\n",x-y);}void

mul(floatx,

floaty)

//定義乘法函數(shù){printf("mul=%f\n",x*y);}void

div(floatx,

floaty)

//定義除法函數(shù){printf("div=%f\n",x/y);}【課后作業(yè)】同步練習(xí)4-3:知識鞏固及學(xué)以致用。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進行模塊化程序設(shè)計4.4.1數(shù)組元素作為函數(shù)實參

在函數(shù)調(diào)用時,將實參(數(shù)組元素,相當(dāng)于普通變量)的值傳遞給形參(變量),實現(xiàn)“單向的值傳遞”。

數(shù)組用作函數(shù)參數(shù)有兩種形式:數(shù)組元素作為函數(shù)的實參;數(shù)組名作為函數(shù)的實參和形參?!纠?.4】數(shù)組元素作為函數(shù)實參:根據(jù)學(xué)生課程成績,判斷考試結(jié)果。#include<stdio.h>voidtest(intx);

//函數(shù)聲明intmain(void){

inta[5]

=

{62,

57,

70,

48,

85},i;//將課程成績存入數(shù)組a中for(i=0;i<5;i++){printf("a[%d]=%d:",i,

a[i]);test(a[i]);

//調(diào)用成績測試函數(shù),數(shù)組元素a[i]

作為實參

}}voidtest(intx)

//成績測試函數(shù),函數(shù)參數(shù):變量x{if(x>=60)printf("及格!\n");else

printf("不及格!\n");

}【課后作業(yè)】同步練習(xí)4-4:學(xué)以致用。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進行模塊化程序設(shè)計4.4.2數(shù)組名作為函數(shù)參數(shù)

數(shù)組名作為函數(shù)參數(shù)時,實參向形參傳遞的信息是數(shù)組的首地址,即“單向的地址傳遞”。

數(shù)組名作為函數(shù)的實參和形參時,應(yīng)在主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義實參數(shù)組和形參數(shù)組,并且類型要一致,其中形參數(shù)組在定義時可以不指定大小?!竞唵卫}】數(shù)組名作為函數(shù)的實參和形參,輸出形參數(shù)組元素的值。#include<stdio.h>voidoutput(intb[],intn);

//函數(shù)聲明intmain(void){

inta[5]={1,3,5,7,9};

output(a,5);//調(diào)用output函數(shù),實參:數(shù)組名a、數(shù)值5}voidoutput(intb[],intn)//形參:數(shù)組名b、變量n{

inti;for(i=0;i<n;i++)printf("b[%d]=%d",i,b[i]);//輸出形參數(shù)組元素的值}【實踐與思考】編寫并運行下面的程序,根據(jù)運行結(jié)果思考形參數(shù)組與實參數(shù)組的關(guān)系。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進行模塊化程序設(shè)計4.4.2數(shù)組名作為函數(shù)參數(shù)【例4.5】數(shù)組名作為函數(shù)的實參和形參,改變實參數(shù)組元素的值。

函數(shù)調(diào)用時,是將實參數(shù)組a的首地址傳遞給形參數(shù)組名b,使形參數(shù)組名獲得了實參數(shù)組的首地址,因此形參數(shù)組與實參數(shù)組為同一數(shù)組。

顯然,a[i]與b[i]共占同一存儲單元,因此當(dāng)形參數(shù)組各元素的值發(fā)生變化時,實參數(shù)組元素的值也隨之變化。#include<stdio.h>voidchange(intb[],

intn);

//函數(shù)聲明intmain(void){

inta[5]

=

{1,

3,

5,

7,

9},i;printf("函數(shù)調(diào)用前:");for(i=0;i<5;i++)printf("a[%d]=%d",

i,

a[i]);printf("\n");

change(a,

5);//調(diào)用change函數(shù),實參:數(shù)組名a、數(shù)值5printf("函數(shù)調(diào)用后:");for(i=0;i<5;i++)printf("a[%d]=%d",

i,

a[i]);printf("\n");}voidchange(intb[],intn)//形參:數(shù)組名b、變量n{

inti;for(i=0;i<n;i++)

b[i]

++;}

可見,在函數(shù)調(diào)用之后,實參數(shù)組a元素的值發(fā)生了變化。其奧秘何在?【課后作業(yè)】同步練習(xí)4-5:知識鞏固、活學(xué)活用。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進行模塊化程序設(shè)計4.4.2數(shù)組名作為函數(shù)參數(shù)

數(shù)組名作函數(shù)參數(shù),在函數(shù)執(zhí)行過程中,當(dāng)形參數(shù)組各元素的值發(fā)生變化時,實參數(shù)組元素的值也隨之變化。在程序設(shè)計中,可以利用這一特點改變實參數(shù)組元素的值?!纠?.6】根據(jù)例3.2程序,以數(shù)組名作為函數(shù)參數(shù),編寫冒泡法排序程序(由小到大)。voidMPSort(intb[],intn)//冒泡排序函數(shù),形參:數(shù)組名b、變量n{

inti,j,

t,swap_flag;for(i=1;i<n;i++)

//n個數(shù),共需比較n-1輪{swap_flag=0;

//交換標(biāo)志:0-無交換,1-有交換for(j=0;j<n-i;j++)//第i輪需要比較n-i次{if(b[j]

>b[j+1])//依次比較兩個相鄰的數(shù),將大數(shù)放后面{ t

=

b[j];b[j]

=

b[j+1];b[j+1]

=

t;swap_flag

=

1;//交換

}}if(swap_flag==0)break;//若本輪無交換,則結(jié)束比較}}#defineN5

//宏定義參與排序的數(shù)據(jù)個數(shù)voidMPSort(intb[],intn);

//函數(shù)聲明intmain(void){

inta[N],

i;

//數(shù)組a存放待排序的N個數(shù)

...//依次輸入N個數(shù)據(jù)給數(shù)組a...//依次輸出數(shù)組a的各元素值(排序前)

MPSort(a,N);//調(diào)用排序函數(shù),實參:數(shù)組名a、數(shù)值N...//依次輸出數(shù)組a的各元素值(排序后)}【課后作業(yè)】同步練習(xí)4-6:活學(xué)活用。任務(wù)4.5靈活設(shè)置變量的類型4.5.1局部變量和全局變量

從變量值存在的時間(生存期)角度,變量有靜態(tài)存儲和動態(tài)存儲兩種存儲方式。從變量的作用域(作用范圍)角度,變量可分為局部變量和全局變量。1、局部變量

在函數(shù)或復(fù)合語句的內(nèi)部定義的變量是內(nèi)部變量,也稱為“局部變量”,只在本函數(shù)或復(fù)合語句范圍內(nèi)有效。函數(shù)的形參是局部變量。

主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用,并且主函數(shù)也不能使用其他函數(shù)中定義的變量。

允許在不同的函數(shù)中使用相同的局部變量名,它們代表不同的對象,分配不同的內(nèi)存單元,互不干擾,也不會發(fā)生混淆。

通過函數(shù)可實現(xiàn)模塊化程序設(shè)計,而每個函數(shù)中都會定義和使用一些變量。4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類型2、全局變量

在函數(shù)外部定義的變量是外部變量,也稱“全局變量”。全局變量的有效范圍是從定義變量的位置開始到本源文件結(jié)束。4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類型【例4.7】輸入正方體的棱長,輸出其表面積和體積的大小。

(1)打通函數(shù)之間數(shù)據(jù)聯(lián)系的通道,使多個函數(shù)共享全局變量的值;并且通過函數(shù)調(diào)用可以得到一個以上的值。

2、全局變量#include

<stdio.h>float

S,V;

//定義全局變量S和V,分別存放表面積和體積voidsv(floatx)

//求正方體的表面積和體積函數(shù){

S

=

6*x*x;

//計算表面積

V

=

x*x*x;

//計算體積

}intmain(void){

floata;

//定義變量a,存放正方體的棱長printf("請輸入正方體的棱長:");scanf("%f",

&a);

sv(a);

//調(diào)用求表面積和體積函數(shù)printf("棱長=%6.2f,表面積=%6.2f,體積=%6.2f\n",

a,

S,

V);}4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類型2、全局變量

(2)在同一個源文件中,若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量被“屏蔽”失效?!纠?.8】外部變量與局部變量同名。

說明:盡管使用全局變量有時會帶來一些便利,但建議不是非常必要的情況下,盡量不要使用全局變量。為了實現(xiàn)程序的模塊化設(shè)計(函數(shù)化),提倡通過“實參-形參”的方式實現(xiàn)函數(shù)之間的信息傳遞,例如數(shù)組名作為函數(shù)參數(shù)。#include

溫馨提示

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

評論

0/150

提交評論