C語言程序設計 課件全套 朱琨 機械 第1-9章 C語言語法基礎 - 嵌入式技術基礎實踐方法_第1頁
C語言程序設計 課件全套 朱琨 機械 第1-9章 C語言語法基礎 - 嵌入式技術基礎實踐方法_第2頁
C語言程序設計 課件全套 朱琨 機械 第1-9章 C語言語法基礎 - 嵌入式技術基礎實踐方法_第3頁
C語言程序設計 課件全套 朱琨 機械 第1-9章 C語言語法基礎 - 嵌入式技術基礎實踐方法_第4頁
C語言程序設計 課件全套 朱琨 機械 第1-9章 C語言語法基礎 - 嵌入式技術基礎實踐方法_第5頁
已閱讀5頁,還剩294頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教學內容: 第1章:C語言語法基礎第2章:C程序設計基礎第3章:利用數(shù)組處理同類型的批量數(shù)據第4章:利用函數(shù)實現(xiàn)模塊化程序設計第5章:靈活使用指針第6章:結構體、共用體、枚舉類型及其應用第7章:常用的三種線性數(shù)據結構第8章:利用文件進行數(shù)據管理第9章:嵌入式技術基礎實踐方法C語言程序設計第1章C語言語法基礎【學習內容】1.1C語言程序的特點1.2數(shù)據的基本類型及其表現(xiàn)形式

1.3運算符及表達式【學習目標】1.了解通用計算機和嵌入式計算機的區(qū)別;2.熟悉C語言程序的特點;

3.熟練使用VC++2010開發(fā)環(huán)境;

4.掌握C語言基本的數(shù)據類型(整型、字符型、實型),常量和變量;

5.掌握“算術、強制類型轉換、賦值、關系、邏輯、位、逗號”7種運算符及其表達式。1.1C語言程序的特點

產生于20世紀70年代的C語言是國際上廣泛流行的計算機高級編程語言,其優(yōu)點:①語法靈活、運算符豐富;②模塊化和結構化設計,程序可讀性好;③可直接對硬件進行操作,能實現(xiàn)匯編語言的大部分功能;④生成的目標代碼質量高,程序執(zhí)行效率高;⑤程序可移植性好(與匯編語言相比),可用于各種型號的計算機和各種操作系統(tǒng)。

C語言既是通用計算機軟件設計的基礎語言,也是當前嵌入式軟件設計的主流語言。通過本書的學習,可以奠定C語言的編程基礎,同時也可以掌握嵌入式軟件設計方法。1.1C語言程序的特點1、通用計算機與嵌入式計算機

微型計算機具有很大的通用性,所以又稱通用計算機。測控領域的計算機系統(tǒng)是嵌入到應用系統(tǒng)中,以計算機技術為基礎,軟硬件可裁剪,適應應用系統(tǒng)對功能、成本、體積、可靠性、功耗嚴格要求的專用計算機系統(tǒng),即嵌入式計算機系統(tǒng),簡稱嵌入式系統(tǒng)(EmbeddedSystem)。通俗地說,除了通用計算機(如臺式計算機和筆記本計算機)外,所有包含CPU的系統(tǒng)都是嵌入式系統(tǒng),其中以微控制器(MicroControllerUnit,MCU,國內也稱為單片機)為核心的嵌入式系統(tǒng)應用最廣泛。MCU的硬件集成度越來越高,使得嵌入式硬件設計難度不斷降低,因此嵌入式軟件設計在整個嵌入式系統(tǒng)開發(fā)中所占的分量越來越大。社會對嵌入式軟件設計人才的需求量也越來越大,其就業(yè)薪酬高。嵌入式軟件設計的主流語言是C語言。C語言程序設計一般要經過4個基本步驟(VC++2010開發(fā)環(huán)境的使用方法和步驟請掃描教材中的二維碼詳細學習):

(1)編輯源程序(.c文件或

.h文件);

(2)對源程序進行編譯,生成二進制目標文件(.obj文件);

(3)連接若干個源文件和庫函數(shù)對應的多個目標程序,生成可執(zhí)行文件(.exe文件);(4)運行程序。2、VC++2010開發(fā)環(huán)境的使用方法和步驟1.1C語言程序的特點【例1.1】將兩個整數(shù)求和,并將這兩個整數(shù)及求和結果輸出在PC屏幕上。3、初識簡單的C程序1.1C語言程序的特點#include<stdio.h>

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

//(2)主函數(shù){ inta,b,s;

//(3)數(shù)據聲明:定義3個整型變量a=123;b=456;

//(4)分別對變量a和b進行賦值s=a+b;

//(5)將求和結果賦給變量sprintf("ThisismyfirstCprogram.\n");//(6)原樣輸出一串字符printf("a=%d,b=%d,sum=%d\n",a,b,s);//(7)以十進制形式輸出三個變量的值return0;

//(8)如程序正常結束,返回函數(shù)值0}可省略不寫格式輸出函數(shù)printf的用法1.1C語言程序的特點3、初識簡單的C程序【例1.2】使用函數(shù)將兩個整數(shù)求和,并將這兩個整數(shù)及求和結果輸出在PC屏幕上。#include<stdio.h>

//(1)預處理命令:包含輸入輸出頭文件intadd(intx,inty);

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

//(3)主函數(shù){inta,b,s;

//(4)數(shù)據聲明:定義3個整型變量a=123;b=456;

//(5)分別對變量a和b進行賦值s=add(a,b);

//(6)調用add函數(shù)(兩個實際參數(shù)a、b)printf("ThisismysecondCprogram.\n");//(7)原樣輸出一串字符printf("a=%d,b=%d,sum=%d\n",a,b,s);//(8)以十進制形式輸出三個變量的值}intadd(intx,inty)

//(10)定義add函數(shù)(兩個形式參數(shù)x、y){

intz;

//(11)定義變量

z=x+y;

//(12)將求和結果賦給變量zreturn(z);

//(13)向主調函數(shù)求和結果}s=add(a,b);

(main函數(shù))intadd(intx,inty)(add函數(shù)){

intz; z=x+y;

return(z);

}1.2數(shù)據的基本類型及其表現(xiàn)形式

1.2.1常量和變量1、常量1.2數(shù)據的基本類型及其表現(xiàn)形式

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

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

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

用戶定義的標識符不能與系統(tǒng)提供的關鍵字(參見附錄B)同名。另外,標識符區(qū)分大小寫,如Sum和sum是兩個不同的標識符。說明:標識符是用來標識變量名、符號常量名、函數(shù)名、數(shù)組名、類型名、宏名、文件名的有效字符序列。C語言的標識符只能由字母、數(shù)字、下畫線3種字符組成,且第一個字符必須是字母或下畫線。

1.2.1常量和變量2、變量1.2數(shù)據的基本類型及其表現(xiàn)形式

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

(3)十六進制整數(shù):以0x開頭的數(shù)。如0x123表示十六進制數(shù)123。在C語言中,整型常量(整型常數(shù))有3種表示形式:(1)十進制整數(shù):如123、-456、7。(2)八進制整數(shù):以0開頭的數(shù)。如0123表示八進制數(shù)123。歸納起來,有10種整型變量,在VC++系統(tǒng)中對應的數(shù)值范圍如下:(1)整型變量的分類1.2.2整型數(shù)據2、整型變量1.2數(shù)據的基本類型及其表現(xiàn)形式

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

(2)整型變量在內存中的存儲形式(以單字節(jié)整型數(shù)據為例)(3)定義整型變量的方法1.2.2整型數(shù)據2、整型變量1.2數(shù)據的基本類型及其表現(xiàn)形式

1)定義一個變量的格式:類型標識符變量名;

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

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

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

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

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

shortint

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

i=10;//給變量i賦值練習:【例1.3】整型變量的定義、賦值和輸出。1.2.3字符型數(shù)據1、字符常量1.2數(shù)據的基本類型及其表現(xiàn)形式

練習:【例1.4】輸出轉義字符。

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

C語言還有一種以

\開頭的字符序列,稱為轉義字符。

請參考附錄A,熟悉字符0~9、大寫字母A~Z、小寫字母a~z對應的ASCII碼值。1.2.3字符型數(shù)據2、字符變量1.2數(shù)據的基本類型及其表現(xiàn)形式

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

例如:charc1,c2;//定義字符變量c1、c2c1='a';c2='b';//給變量c1賦值'a',變量c2賦值'b'3、字符型數(shù)據在內存中的存儲形式及使用方法

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

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

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

charc1,c2,c3,c4;

//定義字符變量c1='a';c2='A';//給字符變量賦字符常量

c3=97;c4=65;//給字符變量賦整數(shù)(ASCII碼值)printf("%c,%c,%c,%c\n",c1,c2,c3,c4);//以字符形式輸出字符變量的值printf("%d,%d,%d,%d\n",c1,c2,c3,c4);//以十進制形式輸出字符變量的值printf("%x,%x,%x,%x\n",c1,c2,c3,c4);//以十六進制形式輸出字符變量的值}1.2.3字符型數(shù)據1.2數(shù)據的基本類型及其表現(xiàn)形式

【例1.5】字符變量的定義、賦值和輸出。#include<stdio.h>intmain(void){charc1,c2;//定義字符變量

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

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

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

//將字符變量對應的ASCII碼值更新

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

}1.2.3字符型數(shù)據1.2數(shù)據的基本類型及其表現(xiàn)形式

【例1.6】輸出給定小寫字母對應的大寫字母。4、字符串常量

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

字符串常量是由一對雙撇號括起來的字符序列。例如:"CHINA","Cprogram","a","$12.5"字符常量和字符串常量的區(qū)別:因此字符串常量"CHINA"在內存中占用6個字節(jié)。【思考】字符常量'a'和字符串常量"a"有何區(qū)別?練習:【例1.7】輸出字符串常量及其占用內存的字節(jié)數(shù)。1.2.4實型數(shù)據1.2數(shù)據的基本類型及其表現(xiàn)形式

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、實型變量

根據數(shù)據的數(shù)值范圍和精度,實型變量的類型主要有單精度(float)型和雙精度(double)型。需要注意:實型數(shù)據在計算機內存中的存儲精度有限,不可能得到完全精確的數(shù)值。1.2.4實型數(shù)據1.2數(shù)據的基本類型及其表現(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.8】實型變量的定義、賦值和輸出。練習:【例1.9】利用sizeof運算符測試系統(tǒng)中數(shù)據類型的長度。1.2.5變量的初始化1.2數(shù)據的基本類型及其表現(xiàn)形式

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

inta=3;

//定義整型變量a,并賦初值3floatb=1.23;//定義實型變量b,并賦初值1.23charc='a';

//定義字符變量c,并賦初值'a'

當一次定義同類型的多個變量時,可以給全部變量或部分變量賦初值。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三個整型變量,并賦相同的初值3練習:【例1.10】變量的初始化和輸出。1.2.6常變量1.2數(shù)據的基本類型及其表現(xiàn)形式

練習:【例1.11】常變量的初始化與輸出。

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

//用const聲明整型變量a為常變量,其值始終是51.3運算符及表達式

1.3.1算術運算符及其表達式1.3.2強制類型轉換運算符及其表達式1.3.3賦值運算符及其表達式1.3.4關系運算符及其表達式1.3.5邏輯運算符及其表達式1.3.6位運算符及其表達式1.3.7

逗號運算符及其表達式1.3.1算術運算符及其表達式1、基本的算術運算符1.3運算符及表達式

(2)-

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

(1)+

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

(4)/

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

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

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

說明:

【例1.12】將三位十進制整數(shù)的百位數(shù)、十位數(shù)和個位數(shù)分離。#include<stdio.h>intmain(void){inta=123;

intb,c,d;//3個變量分別存放個位數(shù)、十位數(shù)和百位數(shù)

b=a%10;//獲得個位數(shù)

a=a/10;//右移1位,變量a的值更新為12

c=a%10;//獲得十位數(shù)

a=a/10;//右移1位,變量a的值更新為1

d=a%10;//獲得百位數(shù)

printf("123的百位數(shù)=%d\n",d);//輸出百位數(shù)

printf("123的十位數(shù)=%d\n",c);//輸出十位數(shù)

printf("123的個位數(shù)=%d\n",b);//輸出個位數(shù)}1.3.1算術運算符及其表達式1、基本的算術運算符1.3運算符及表達式

練習:【例1.13】將一個正整數(shù)倒序輸出。【例1.14】不同類型數(shù)據之間的混合運算。自增運算符++:使變量的值自增1,相當于i=i+1。自減運算符--:使變量的值自減1,相當于i=i-1。有以下4種形式的表達式:

i++

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

++i

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

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

i--

表達式先用i的值,然后對i的值減1(先用后減)1.3.1算術運算符及其表達式2、自增、自減運算符1.3運算符及表達式

可見,由自增(自減)運算符構成不同形式的表達式時,對變量而言,自增1(自減1)都具有相同的效果,但對表達式而言卻有著不同的值。1.3.1算術運算符及其表達式2、自增、自減運算符【例1.15】自增、自減運算符的應用。1.3運算符及表達式

說明:

(1)自增、自減運算符只能用于變量,不能用于常量或表達式。如5++或(a+b)++都是不合法的。(2)自增、自減運算符常用在循環(huán)語句中,使循環(huán)變量自動加1、減1,這將在后續(xù)單元中學習。#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);}3、算術表達式和運算符的優(yōu)先級與結合性1.3.1算術運算符及其表達式1.3運算符及表達式

算術表達式:用算術運算符和括號將運算對象(常量、變量或表達式)連接起來的、符合C語法規(guī)則的式子。例如:a+b*c-5/2+'a'。C語言規(guī)定了運算符的優(yōu)先級和結合性。在表達式求值時,先按運算符的優(yōu)先級高低次序執(zhí)行,例如:x-y*z相當于x-(y*z)。如果在一個運算對象兩側的運算符的優(yōu)先級相同,則按照規(guī)定的“結合方向(結合性)”處理。

算術運算符的結合方向為“自左向右(左結合性)”,即先左后右。因此a+b-c相當于(a+b)-c。附錄C給出了C語言運算符的優(yōu)先級和結合性,供查詢參考。1.3.2強制類型轉換運算符及其表達式1.3運算符及表達式

強制類型轉換表達式的一般形式:(類型標識符)(表達式)例如:

(int)i

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

將x轉換成整型后,再與y相加(float)(x+y)

將x+y的結果轉換為float型#include<stdio.h>intmain(void){inti;//定義整型變量i

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

i=(int)x;//將實型變量x強制轉換為int型

printf("x=%f,i=%d\n",x,i);}【例1.16】將實型數(shù)據強制轉換為整型。練習:【例1.17】將整型數(shù)據強制轉換為實型。1、簡單賦值運算符“=”及其表達式1.3.3賦值運算符及其表達式1.3運算符及表達式

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

表達式

賦值表達式中的“表達式”,又可以是一個賦值表達式。賦值運算符是按照“自右向左”的結合順序。

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

賦值表達式“

a=5”的值是5。執(zhí)行運算后,變量a的值也是5?!舅伎肌糠治鱿旅娓髻x值表達式中變量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、復合的賦值運算符及其表達式1.3.3賦值運算符及其表達式1.3運算符及表達式

在簡單賦值運算符“=”之前加上其他運算符,可構成復合的賦值運算符。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(將“a*”移到“=”右側)③a=a*

(b+2)

(在“=”左側補上變量名a,并對b+2外加括號)練習:【例1.18】復合賦值運算符的使用。3、類型轉換

如果賦值運算符“=”兩側的數(shù)據類型不一致,但同為數(shù)值型數(shù)據,在賦值時,系統(tǒng)會自動進行類型轉換。下面介紹3種常見的情況。1.3.3賦值運算符及其表達式(1)將整型數(shù)據賦給整型變量1.3運算符及表達式

【例1.19】將無符號整型數(shù)據賦給有符號整型變量。正數(shù)變成了負數(shù)

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

unsignedchara=255;

signedcharb;b=a;printf("a=%d\n",a);printf("b=%d\n",b);}3、類型轉換1.3.3賦值運算符及其表達式

如果賦值運算符“=”兩側的數(shù)據類型不一致,但同為數(shù)值型數(shù)據,在賦值時,系統(tǒng)會自動進行類型轉換。下面介紹3種常見的情況。(1)將整型數(shù)據賦給整型變量1.3運算符及表達式

【例1.20】將有符號整型數(shù)據賦給無符號整型變量。負數(shù)變成了正數(shù)

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

signed

chara=-1;

unsignedcharb;b=a;printf("a=%d\n",a);printf("b=%d\n",b);}3、類型轉換1.3.3賦值運算符及其表達式

如果賦值運算符“=”兩側的數(shù)據類型不一致,但同為數(shù)值型數(shù)據,在賦值時,系統(tǒng)會自動進行類型轉換。下面介紹3種常見的情況。(1)將整型數(shù)據賦給整型變量1.3運算符及表達式

【例1.21】將短字節(jié)整型數(shù)據賦給長字節(jié)整型變量。無誤#include<stdio.h>intmain(void){

unsignedchar

a=255;

unsignedint

b;b=a;printf("a=%d\n",a);printf("b=%d\n",b);}3、類型轉換1.3.3賦值運算符及其表達式

如果賦值運算符“=”兩側的數(shù)據類型不一致,但同為數(shù)值型數(shù)據,在賦值時,系統(tǒng)會自動進行類型轉換。下面介紹3種常見的情況。(1)將整型數(shù)據賦給整型變量【例1.22】將長字節(jié)整型數(shù)據賦給短字節(jié)整型變量。1.3運算符及表達式

有誤!如何解決?#include<stdio.h>intmain(void){

unsignedchar

a=255,b=1;

unsignedchar

c;c=a+b;printf("a=%d\n",a);printf("b=%d\n",b);printf("c=%d\n",c);}3、類型轉換1.3.3賦值運算符及其表達式

如果賦值運算符“=”兩側的數(shù)據類型不一致,但同為數(shù)值型數(shù)據,在賦值時,系統(tǒng)會自動進行類型轉換。下面介紹3種常見的情況。(2)將實型數(shù)據賦給整型變量【例1.23】將實型數(shù)據賦給整型變量。1.3運算符及表達式

只取了整數(shù)部分#include<stdio.h>intmain(void){

floata=1234.567F;

intb;b=a;printf("a=%f\n",a);printf("b=%d\n",b);}3、類型轉換1.3.3賦值運算符及其表達式1.3運算符及表達式

數(shù)值不變,但變成了實數(shù)

如果賦值運算符“=”兩側的數(shù)據類型不一致,但同為數(shù)值型數(shù)據,在賦值時,系統(tǒng)會自動進行類型轉換。下面介紹3種常見的情況。(3)將整型數(shù)據賦給實型變量【例1.24】將整型數(shù)據賦給實型變量。

通過上述例題可以看出,在賦值運算中,需要根據數(shù)據的類型和數(shù)值的范圍為變量指定合適的類型,必要時還需要借助強制類型轉換運算符,以防出錯。

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

inta=1234;

floatb;b=a;printf("a=%d\n",a);printf("b=%f\n",b);}1.3.4關系運算符及其表達式1、關系運算符及其優(yōu)先級次序

優(yōu)先級相同(高)優(yōu)先級相同(低)③>大于①<小于②<=小于或等于⑥!=不等于④>=大于或等于⑤==等于

關系運算符的優(yōu)先級低于算術運算符,高于賦值運算符。a=b>c等價于

a=(b>c)例如:

c>a+b等價于

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

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

(a>b)==c1.3運算符及表達式

2、關系表達式1.3.4關系運算符及其表達式1.3運算符及表達式

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

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

關系運算結果,以“1”代表“真”,以“0”代表“假”。關系表達式邏輯值(真、假)關系表達式的值(1、0)a>ba>b+ca!=b+ca>b>c若a=3,b=2,c=1,則:真假假假1000練習:【例1.25】考察關系表達式的值。1.3.5邏輯運算符及其表達式1、邏輯運算符及其優(yōu)先級次序

1.3運算符及表達式

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

邏輯運算的真值表aba&&ba||b!a真真真假假真假假真真假真假真假假真!a==b||c<d等價于a>b&&c>d等價于a+b>c&&x+y<d等價于幾種運算符的優(yōu)先級次序如右圖所示:!(非)

高算術運算符關系運算符&&和||賦值運算符低(a+b)(>c)(x+y)(<d)&&(a>b)(c>d)&&(!a)(==b)||(c<d)2、邏輯表達式的值

1.3.5邏輯運算符及其表達式1.3運算符及表達式

C語言規(guī)定,參與邏輯運算的操作數(shù)以非0代表“真”,以0代表“假”。邏輯表達式的值,即邏輯運算結果,以數(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:只有當a為真(非0)時,才需要判斷b的值。只要a為假,就不必判斷b的值,此時整個表達式已確定為假。(2)a||b:只要a為真(非0),就不必判斷b的值。只有a為假,才判斷b。【思考與練習】

1.3.5邏輯運算符及其表達式1.3運算符及表達式

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

(1)80≤i<89

(2)i<0或i≥100

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

i>=100i!=0練習:【例1.26】考察邏輯表達式的值。1.3.6位運算符及其表達式1.3運算符及表達式

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

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

在嵌入式軟件設計中,經常用到位運算符:對二進制位進行運算。例如,0x23與0x45按位與:00100011(0x23)

&)01000101(0x45)0&0=0,0&1=0,1&0=0,1&1=11、“按位與”運算符(&)00000001(0x01)1.3.6位運算符及其表達式1.3運算符及表達式

特殊用途:“與0清零、與1保留”——可對數(shù)據的某些位清零,某些位保留不變。例如,將0x23的高4位清零,低4位保留不變。00100011(0x23)

&)00001111(0x0f)0000

0011

(0x03)2、“按位或”運算符(|)1.3.6位運算符及其表達式1.3運算符及表達式

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

|)01000101(0x45)

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

|)11110000(0xf0)01011101(0x67)1111

0011

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

^)01000101(0x45)

特殊用途:“異或1取反(0變1,1變0),異或0保留”——可對數(shù)據的某些位取反,某些位保留不變。例如,將0x23的高4位取反,低4位保留不變。00100011(0x23)

^)11110000(0xf0)3、“按位異或”運算符(^)01011100(0x66)1101

0011

(0xd3)兩者相異為1,相同為0。0^0=0,0^1=1,1^0=1,1^1=0

1.3.6位運算符及其表達式1.3運算符及表達式

4、“按位取反”運算符(~)對一個二進制數(shù)按位取反:0變1,1變0。

例如,0x55按位取反:01010101(0x55)~)↓

10010110(0xaa)1.3.6位運算符及其表達式1.3運算符及表達式

5、“左移”運算符(<<)

用來將一個數(shù)的各二進制位全部左移若干位。例如:

a<<3,表示將a的二進制數(shù)左移3位,高位溢出后丟棄,低位補0。1.3.6位運算符及其表達式1.3運算符及表達式

6、“右移”運算符(>>)

用來將一個數(shù)的各二進制位全部右移若干位。例如:

a>>3,表示將a的二進制數(shù)右移3位,低位溢出后丟棄,對于無符號數(shù),高位補0。1.3.6位運算符及其表達式1.3運算符及表達式

1.3.6位運算符及其表達式【例1.27】位運算符使用。1.3運算符及表達式

可以看出,3個變量a、b、c的值在參與位運算的過程中并未發(fā)生改變。

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

unsignedchara,b,c,r1,r2,r3,r4,r5,r6;a=0x23;b=0x45;

c=0x55;r1=a&b;r2=a|b;r3=a^b;r4=~c;r5=a<<3;r6=a>>3;

//以十六進制形式輸出變量的值printf("a=0x%x,b=0x%x,c=0x%x\n",a,b,c);printf("a&b=0x%x\n",r1);printf("a|b=0x%x\n",r2);printf("a^b=0x%x\n",r3);printf("~c=0x%x\n",r4);printf("a<<3=0x%x\n",r5);printf("a>>3=0x%x\n",r6);}【例1.29】利用位運算符實現(xiàn)對8位寄存器R和對16位寄存器R'的位操作

。1.3.6位運算符及其表達式1.3運算符及表達式

1.3.7逗號運算符及其表達式1.3運算符及表達式

逗號表達式的一般形式:表達式1,表達式2

逗號運算符的結合性是“從左至右”。求解過程:先求解表達式1,再求解表達式2。整個逗號表達式的值是表達式2的值。

例如,逗號表達式“2+3,3+5”的值是8。

【思考】

表達式“a=2*3,a*5”的值是多少?

30C語言中,在所有運算符中,逗號運算符的優(yōu)先級最低。

逗號表達式的擴展形式:表達式1,

表達式2,表達式3,

…,表達式n整個逗號表達式的值等于表達式n的值。練習:【例1.30】考察逗號表達式的值。教學內容: 第1章:C語言語法基礎第2章:C程序設計基礎第3章:利用數(shù)組處理同類型的批量數(shù)據第4章:利用函數(shù)實現(xiàn)模塊化程序設計第5章:靈活使用指針第6章:結構體、共用體、枚舉類型及其應用第7章:常用的三種線性數(shù)據結構第8章:利用文件進行數(shù)據管理第9章:嵌入式技術基礎實踐方法C語言程序設計第2章C程序設計基礎【學習內容】2.1預備知識

2.2順序結構程序設計

2.3選擇結構程序設計

2.4循環(huán)結構程序設計

2.5預處理命令2.6三種結構程序設計的綜合應用【學習目標】1.熟悉算法及其表示方法;

2.熟悉C語句及其分類;

3.掌握數(shù)據輸入輸出函數(shù)的應用方法;

4.掌握順序、選擇、循環(huán)3種結構程序設計方法;

5.掌握預處理命令的應用方法。

本章首先介紹程序設計的預備知識,然后詳細介紹順序結構、選擇結構和循環(huán)結構這3種基本結構的程序設計方法,最后給出預處理命令的應用方法。

計算機程序

=數(shù)據結構

+算法

+程序代碼2.1預備知識2.1.1算法及流程圖表示1、算法的概念

為解決問題而采用的方法和步驟稱為算法。對于同一個問題可以有不同的算法,應盡量選擇占用內存小、執(zhí)行速度快的算法。2、算法的5個特征

(1)有窮性:一個算法應包含有限的操作步驟,且每個步驟都能在有限時間內完成。

(2)確定性:算法中的每一個步驟都應該是確定的,而不應模糊和具有二義性。

(3)可行性:算法的每一個步驟都是切實可行的。

(4)有輸入:一個算法可有零個或多個輸入。

(5)有輸出:一個算法必須有一個或多個輸出。3、算法的流程圖表示

常用的算法表示方法:自然語言描述法、流程圖法、計算機語言描述法。在此,只介紹最常用的流程圖法。2.1.1算法及流程圖表示2.1預備知識2.1.2程序的三種基本結構1、順序結構

按照程序語句書寫的順序一步一步依次執(zhí)行。

2.1預備知識

根據條件判斷的結果,從多種路徑中選擇其中的一種路徑執(zhí)行。

2、選擇結構

將一組操作重復執(zhí)行多次。有“當型”和“直到型”兩種循環(huán)結構。

2.1.2程序的三種基本結構3、循環(huán)結構2.1預備知識當型循環(huán)結構

先判斷后執(zhí)行直到型循環(huán)結構

先執(zhí)行后判斷1、聲明語句:對變量、函數(shù)、類型(如結構體等類型)等進行聲明例如:

變量聲明語句:inta,b,s;

變量聲明語句:inti=3,j=3,k=3,x=3;函數(shù)聲明語句:intadd(intx,inty);在C語言中,分號是語句的結束標志。C語句分為6類。2.1.3C語句分類2、表達式語句例如:

a=3(賦值表達式)

a=3;

(賦值語句)i++(自增1表達式)i++;

(自增1語句)2.1預備知識3、函數(shù)調用語句:函數(shù)調用表達式加分號例如:

printf("ThisisamyfirstProgram.\n");

add(a,b);

2.1.3C語句分類4、控制語句:控制程序的流程(1)條件語句:if語句、switch語句(3)轉向語句:break語句、continue語句、return語句、goto語句(2)循環(huán)語句:while語句、do…while語句、for語句2.1預備知識

把多條語句用花括號括起來組成的一個語句,稱為復合語句。例如:5、復合語句2.1.3C語句分類2.1預備知識

例如:下面的for循環(huán)體是空語句,在嵌入式軟件設計中常用作軟件延時。

for(i=10000;i>0;i--) {

;

//空語句

}6、空語句:只有一個分號,什么也不執(zhí)行2.2順序結構程序設計1、數(shù)據輸入輸出的在C語言中的實現(xiàn)2.2.1數(shù)據輸入輸出函數(shù)

(1)從計算機內存向輸出設備傳送數(shù)據稱為輸出,從輸入設備向計算機內存?zhèn)魉蛿?shù)據稱為輸入。

(2)C語言本身不提供輸入輸出語句,而在C標準函數(shù)庫中提供了一些輸入輸出函數(shù),例如printf函數(shù)和scanf函數(shù),分別用于數(shù)據的輸出和輸入。

(3)使用標準輸入輸出庫函數(shù)時,要用預處理命令#include將其對應的頭文件“stdio.h”包含到源文件中: #include<stdio.h>或

#include"stdio.h"2.2順序結構程序設計2、字符輸出函數(shù)——putchar()

一般形式:putchar(c)

●向顯示器輸出字符變量c對應的字符。2.2.1數(shù)據輸入輸出函數(shù)【例2.1】輸出一個字符

。#include

<stdio.h>

//包含輸入輸出庫函數(shù)頭文件intmain(void){chara,b,c,d;

a='N';b='U';c='A';d='A';

putchar(a);putchar(b);putchar(c);putchar(d);putchar('\n');

//在屏幕上顯示字符}2.2順序結構程序設計3、字符輸入函數(shù)——getchar()

通常將鍵盤上輸入的字符賦給一個字符變量,構成賦值語句。如:

charc; c=getchar();2.2.1數(shù)據輸入輸出函數(shù)

注意:getchar函數(shù)只能接收一個字符,輸入數(shù)字也按字符處理。輸入多個字符時,計算機只接收第一個字符?!纠?.2】從鍵盤輸入一個字符,并在顯示屏顯示

。#include<stdio.h>

//包含輸入輸出庫函數(shù)頭文件intmain(void){

charc;printf("請輸入一個字符:");//原樣輸出一串字符,增加人機互動性

c=getchar();

//從鍵盤輸入一個字符

putchar(c);

//在屏幕上顯示輸入的字符putchar('\n');

//換行

}putchar(getchar());//在屏幕上顯示輸入的字符

2.2順序結構程序設計4、格式輸出函數(shù)——printf()●向顯示器輸出若干個任意類型的數(shù)據。2.2.1數(shù)據輸入輸出函數(shù)一般形式:printf(格式控制字符串,輸出列表)例如: printf("%d,%c\n",i,c)

②原樣輸出的字符,在顯示中起提示作用。(2)輸出列表:是需要輸出的一些數(shù)據,可以是常量、變量或表達式。

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

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

①由%開頭的格式符,用于指定數(shù)據的輸出格式。例如,%d:以十進制形式輸出帶符號整數(shù);%c:輸出單個字符;%x:以十六進制形式輸出無符號整數(shù);%s:輸出字符串;%f:以小數(shù)形式輸出實數(shù);%e:以指數(shù)形式輸出實數(shù)。

使用printf函數(shù)時,要求格式控制字符串中必須含有與輸出項一一對應的格式符,并且類型要匹配。printf函數(shù)也可以沒有輸出項。2.2順序結構程序設計4、格式輸出函數(shù)——printf()2.2.1數(shù)據輸入輸出函數(shù)#include<stdio.h>//包含輸入輸出庫函數(shù)頭文件intmain(void){inta=5,b=-1;floatc=1.2;

chard='a';printf("a=%d,b=%d,c=%f,d='%c'\n",a,b,c,d);//依次按指定的格式將多個數(shù)據輸出

printf("字母a的ASCII碼:%d\n",d);//以十進制格式輸出字母a的ASCII碼printf("字母a的ASCII碼:%x\n",d);//以16進制格式輸出字母a的ASCII碼printf("輸出字符串:%s\n","CHINA");//輸出字符串"CHINA"printf("今年的增長率=");//原樣輸出一串字符printf("50%%\n");//輸出50%}【例2.3】printf函數(shù)使用:格式化輸出數(shù)據。練習:【例2.4】printf函數(shù)的使用:指定輸出寬度、小數(shù)位數(shù)和左端對齊。2.2順序結構程序設計5、格式輸入函數(shù)——scanf()2.2.1數(shù)據輸入輸出函數(shù)

一般形式:scanf(格式控制字符串,地址列表)

作用:按用戶指定的格式從鍵盤把數(shù)據輸入到指定的變量地址中。

地址列表:由若干個地址組成的列表。變量的地址:地址運算符“&”后跟變量名。多個地址之間要用逗號隔開。

格式控制字符串的作用與printf函數(shù)類似。例如,%d:以十進制形式輸入帶符號整數(shù);%c:輸入單個字符;%x:以十六進制形式輸入無符號整數(shù);%s:輸入字符串;%f(%lf):以實數(shù)形式輸入單精度(雙精度)實數(shù)。2.2順序結構程序設計5、格式輸入函數(shù)——scanf()2.2.1數(shù)據輸入輸出函數(shù)【例2.5】用scanf函數(shù)輸入多個數(shù)值數(shù)據。#include<stdio.h>//包含輸入輸出庫函數(shù)頭文件intmain(void){inti,j;

floatk;

doublex;

printf("請輸入兩個整數(shù)和兩個實數(shù):\n");//提示輸入4個數(shù)據

scanf("%d%d%f%lf",&i,&j,&k,&x);//輸入4個數(shù)據分別賦給4個變量

printf("%d,%d,%f,%f\n",i,j,k,x);//將4個變量的數(shù)值輸出}

說明:用scanf函數(shù)一次輸入多個數(shù)值或多個字符串時,在兩個數(shù)據之間可用空格或換行符或Tab符作分隔。①用空格作分隔

②用換行符作分隔③用Tab符作分隔2.2順序結構程序設計5、格式輸入函數(shù)——scanf()2.2.1數(shù)據輸入輸出函數(shù)

當輸入數(shù)據的類型與scanf函數(shù)中的格式符指定的類型不一致時,系統(tǒng)認為該數(shù)據結束?!纠?.6】scanf函數(shù)輸入多個不同類型的數(shù)據

。#include<stdio.h>intmain(void){ inti;charj; floatk;printf("請輸入1個整數(shù)、1個字符和1個實數(shù):\n");

//提示輸入3個數(shù)據

scanf("%d%c%f",&i,&j,&k);//輸入3個數(shù)據分別賦給變量i、j、k

printf("%d,%c,%f\n",i,j,k);//將變量i、j、k的數(shù)據輸出

}2.2順序結構程序設計5、格式輸入函數(shù)——scanf()2.2.1數(shù)據輸入輸出函數(shù)#include<stdio.h>intmain(void){chari,j,k;

printf("請輸入3個字符:\n");//提示輸入3個數(shù)據

scanf("%c%c%c",&i,&j,&k);//輸入3個數(shù)據分別賦給變量i、j、k

printf("%c,%c,%c\n",i,j,k);//將變量i、j、k的數(shù)據輸出}用scanf函數(shù)輸入字符時,系統(tǒng)將輸入的空格、換行符作為有效字符?!纠?.7】scanf函數(shù)輸入多個字符。2.2順序結構程序設計2.2.2順序結構程序設計應用【例2.9】將輸入的兩個整數(shù)交換,然后再輸出這兩個整數(shù)。ABABABAB

兩名同學互換位置,如何實現(xiàn)?

需要借助一個臨時變量實現(xiàn)兩數(shù)的交換。//==================================//程序功能:輸入兩個整數(shù),交換后再輸出。//設計日期:2020-03-25//==================================#include<stdio.h>//包含頭文件intmain(void){intx,y,t;//定義三個變量

printf("請輸入兩個整數(shù)(用空格隔開):");

scanf("%d%d",&x,&y);//輸入兩個數(shù)據給x和y

t=x;x=y;y=t;//將數(shù)x和y交換

printf("將輸入的兩個整數(shù)交換之后:");

printf("%d%d\n",x,y);//輸出x和y兩個數(shù)}2.2順序結構程序設計【例2.10】從鍵盤輸入一個雙精度型實數(shù),然后根據需要保留的小數(shù)點后的位數(shù)進行四舍五入處理,最后輸出該實數(shù)處理后的數(shù)值。#include<stdio.h>#include<math.h>

//包含數(shù)學函數(shù)庫頭文件intmain(void){

//(1)定義變量

doublei,j;intn;

//(2)輸入相關的數(shù)據

printf("請輸入一個實數(shù):");

scanf("%lf",&i);

printf("請輸入保留小數(shù)點后的位數(shù):");

scanf("%d",&n);

//(3)進行四舍五入運算

j=i*pow(10,n);j=j+0.5;

j=(int)j;

j=j/pow(10,n);

//(4)輸出處理后的實數(shù)值

printf("%f\n",j);}2.2.2順序結構程序設計應用2.3選擇結構程序設計

選擇結構程序:根據不同的條件,執(zhí)行不同的語句(根據不同的條件選擇不同的道路)。兩種選擇語句:if語句和switch語句。1、if語句的3種形式

(1)if基本形式if(表達式)語句#include<stdio.h>intmain(void){inti;

printf("請輸入一個整數(shù):");

scanf("%d",&i);

if(i>=0)printf("該數(shù)為非負數(shù).\n");}2.3.1if語句及應用【例2.11】用if語句判斷輸入數(shù)據的正負。2.3選擇結構程序設計#include<stdio.h>intmain(void){ inti;

printf("請輸入一個整數(shù):");

scanf("%d",&i);

if(i>=0)printf("該數(shù)為非負數(shù).\n");

elseprintf("該數(shù)為負數(shù).\n");}1、if語句的3種形式

2.3.1if語句及應用if(表達式)語句1else語句2(2)if…else基本形式【例2.12】用if…else語句判斷輸入數(shù)據的正負。練習:【例2.13】判斷輸入的數(shù)據是否為0?!纠?.14】判斷輸入的兩個數(shù)據是否有0。2.3選擇結構程序設計1、if語句的3種形式

2.3.1if語句及應用(3)if…else嵌套形式——用于解決多分支問題說明:注意if與else的配對關系。else總是與它上面最近的未配對的if配對。2.3選擇結構程序設計

虛線左側的嵌套結構,還可寫成虛線右側的更加緊湊的形式。1、if語句的3種形式

2.3.1if語句及應用(3)if…else嵌套形式——用于解決多分支問題2.3選擇結構程序設計1、if語句的3種形式

2.3.1if語句及應用(3)if…else嵌套形式——用于解決多分支問題【例2.15】根據符號函數(shù),編程實現(xiàn)輸入一個x值,輸出y值。#include<stdio.h>intmain(void){intx,y;

printf("請輸入x的值:");

scanf("%d",&x);

printf("x=%d,y=%d\n",x,y);}if(x<0)y=-1;elseif(x==0)y=0;elsey=1;i

溫馨提示

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

評論

0/150

提交評論