版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
單片機(jī)應(yīng)用技術(shù)(第2版)全套可編輯PPT課件項目5項目4項目3項目2項目1C語言基礎(chǔ)知識單片機(jī)開發(fā)軟件及硬件系統(tǒng)的認(rèn)識中斷系統(tǒng)與定時/計數(shù)器的應(yīng)用顯示器與鍵盤接口技術(shù)的應(yīng)用串行接口技術(shù)的應(yīng)用目錄項目7項目6A/D與D/A轉(zhuǎn)換技術(shù)的應(yīng)用單片機(jī)綜合實踐項目1C語言基礎(chǔ)知識項目導(dǎo)讀C語言是當(dāng)前工程應(yīng)用中一種使用頻率非常高的高級語言,學(xué)習(xí)單片機(jī)的應(yīng)用開發(fā),使用C語言編程是必不可少的。
為了能夠順利使用C語言編寫單片機(jī)程序,本項目主要介紹基于單片機(jī)的C語言基礎(chǔ)知識。C知識目標(biāo)掌握C語言的基本結(jié)構(gòu)、數(shù)據(jù)類型、常量與變量等概念掌握運算符及其表達(dá)式的應(yīng)用掌握輸入與輸出函數(shù)的應(yīng)用了解C語言的基本語句,掌握選擇語句、循環(huán)語句的應(yīng)用了解數(shù)組的概念,掌握定義、引用和初始化一維、二維數(shù)組的方法了解函數(shù)的概念,掌握函數(shù)的定義及調(diào)用方式達(dá)成目標(biāo)達(dá)成目標(biāo)技能目標(biāo)能夠使用C語言進(jìn)行程序設(shè)計思政目標(biāo)加強(qiáng)實踐練習(xí),掌握一定的專業(yè)技能和職業(yè)素養(yǎng)多角度思考問題,增強(qiáng)創(chuàng)新意識和發(fā)展意識樹立技能成才、技能報國的人生理想項目導(dǎo)航設(shè)計簡單C語言程序——C語言程序設(shè)計基礎(chǔ)任務(wù)1.1設(shè)計“學(xué)生成績排序”程序——C語言語句、數(shù)組、函數(shù)任務(wù)1.2C設(shè)計簡單C語言程序
——C語言程序設(shè)計基礎(chǔ)
011211101101011011010010011001101010100100110110100101100101110110101001101110101010101011010100110100101.11.1任務(wù)描述小華是一名電子信息工程技術(shù)專業(yè)的學(xué)生,這學(xué)期他們要上《單片機(jī)應(yīng)用技術(shù)》這門課程,這門課程比較難,需要有一定的編程基礎(chǔ)才能上,上學(xué)期他們已經(jīng)上了《C語言程序設(shè)計》的課程,為了檢驗他們C語言學(xué)習(xí)的效果,老師出了下面這個題來進(jìn)行測試。編寫程序?qū)崿F(xiàn):已知圓的半徑,求圓的周長和面積。任務(wù)實施1.任務(wù)分析
可以使用符號常量來表示圓周率,在運行時先顯示文字,提示用戶輸入圓的半徑。用戶輸入半徑后,經(jīng)過計算就可以得到圓的周長和面積,最后將計算結(jié)果顯示出來。任務(wù)實施#include<stdio.h>#definePI3.1415926 /*使用符號常量表示圓周率*/intmain(){
doubler,l,s; /*定義半徑r,周長l和面積s*/
printf("請輸入圓的半徑:"); /*輸出提示語*/
scanf("%lf",&r); /*輸入半徑r的值*/
l=2*PI*r; /*計算周長l*/
s=PI*r*r; /*計算面積s*/
printf("圓的周長為%lf,圓的面積為%lf\n",l,s); /*輸出周長l和面積s*/
return0; /*程序返回值0*/}1234567891011122.參考代碼任務(wù)實施3.運行結(jié)果程序運行結(jié)果如圖所示。1.1.1C語言程序的基本結(jié)構(gòu)
與用其他語言編寫的程序相比,C語言較少要求“形式化的內(nèi)容”。一個完整的C語言程序可以只有寥寥數(shù)行。下面以一個簡單的例子(例1-1)說明C語言程序的基本結(jié)構(gòu)。1.1.1C語言程序的基本結(jié)構(gòu)123456#include<stdio.h> /*編譯預(yù)處理指令*/intmain() /*主函數(shù)的函數(shù)頭*/{ /*函數(shù)體的開始標(biāo)記*/
printf("你好,C語言!\n"); /*輸出要顯示的字符串*/
return0; /*程序返回值0*/} /*函數(shù)的結(jié)束標(biāo)記*/【例1-1】
只有一行輸出的C語言程序。1.1.1C語言程序的基本結(jié)構(gòu)【運行結(jié)果】
程序運行結(jié)果如圖所示?!境绦蛘f明】
程序該程序運行結(jié)果的第1行是程序運行后輸出的結(jié)果;第2行是任何一個C語言程序在VisualC++環(huán)境下運行都會自動輸出的一行信息,告訴用戶:“如果想繼續(xù),請按任意鍵”;當(dāng)用戶按任意鍵后,屏幕上不再顯示運行結(jié)果,返回程序窗口。這是一個預(yù)處理操作?!癷nclude”稱為文件包含命令,后面尖括號中的內(nèi)容稱為頭文件;“stdio.h”是C語言的系統(tǒng)文件,“stdio”是“standardinput&output(標(biāo)準(zhǔn)輸入輸出)”的縮寫,“.h”是文件的擴(kuò)展名。由于程序的第4行使用了庫函數(shù)printf,C語言編譯系統(tǒng)要求程序提供有關(guān)此函數(shù)的信息(如對此函數(shù)的聲明和宏的定義、全局變量的定義等),所以此處需要這條命令。1.1.1C語言程序的基本結(jié)構(gòu)例1-1的程序是一個由頭文件和主函數(shù)組成的簡單C語言程序。
第1行:#include<stdio.h>這一行代碼是函數(shù)頭。其中,main是函數(shù)的名字,表示“主函數(shù)”;main前面的int表示函數(shù)的返回值是int類型(整型)。每個C語言程序都必須有一個main函數(shù)。1.1.1C語言程序的基本結(jié)構(gòu)
第2行:intmain()由花括號括起來的部分是函數(shù)體,該程序主函數(shù)的函數(shù)體由兩條語句構(gòu)成,每條語句后都要加分號,表示語句結(jié)束。printf是C語言編譯系統(tǒng)提供的函數(shù)庫中的輸出函數(shù),用來在屏幕上輸出內(nèi)容,輸出語句中雙引號中間可以是字母、符號及中文字符等;“return0;”的作用是在main函數(shù)執(zhí)行結(jié)束前將整數(shù)0作為函數(shù)值,返回到調(diào)用函數(shù)處。1.1.1C語言程序的基本結(jié)構(gòu)
第3行到第6行:{
printf("你好,C語言!\n");
return0;} 1.1.1C語言程序的基本結(jié)構(gòu)定義:在程序各行的右側(cè)看到一段關(guān)于這行代碼的文字描述(用“/**/”括起來),稱為代碼注釋。作用:是對代碼進(jìn)行解釋說明,日后自己或他人閱讀程序時,方便理解程序代碼含義和程序設(shè)計思路。1.1.1C語言程序的基本結(jié)構(gòu)字符串末尾的“\n”是C語言中規(guī)定的一個特殊符號,其作用是回車換行。本程序中“\n”使得輸出“你好,C語言!”后執(zhí)行一個回車換行操作,如果之后還有輸出,將從下一行的左端開始。1.1.1C語言程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)CC語言程序是由函數(shù)構(gòu)成的,函數(shù)是C語言程序的基本單位。
任何一個C語言程序必須包含一個且僅包含一個main函數(shù),可
以包含零個或多個其他函數(shù)。1.1.1C語言程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)C一個函數(shù)由以下兩部分組成。intmain(){printf("你好,C語言!\n");
return0;}函數(shù)頭:包括函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)形參名、形參類型等。一個函數(shù)名后面必須跟一對圓括號,括號內(nèi)可以有參數(shù)也可以沒有參數(shù)。函數(shù)體:即函數(shù)頭下由花括號括起來的部分。如果一個函數(shù)內(nèi)有多對花括號,則最外層的一對花括號為函數(shù)體的范圍。1.1.1C語言程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)CC語言程序總是從main函數(shù)開始執(zhí)行,到main函數(shù)結(jié)束,與main函數(shù)所處的位置無關(guān)(main函數(shù)可以位于程序的開始位置,也可以位于程序的末尾,還可以位于一些自定義函數(shù)的中間)。C語言程序書寫格式自由,一行內(nèi)可以連續(xù)寫幾個語句,一個語句也可以分寫在多行中。但任何一條C語句必須以分號結(jié)束。C語言程序中可以使用編譯預(yù)處理命令。C語言程序中可以有注釋,用于解釋程序的功能,增強(qiáng)可讀性,但注釋對程序的編譯和運行不起作用。1.1.1C語言程序的基本結(jié)構(gòu)知識鏈接C語言程序中允許用以下兩種注釋方式。①以“//”開始的單行注釋。這種注釋可以單獨占一行,也可以出現(xiàn)在一行中其他內(nèi)容的右側(cè)。此種注釋的范圍從“//”開始,以換行符結(jié)束,即這種注釋不能跨行。若注釋內(nèi)容一行寫不下,可以用多個單行注釋。例如:
②以“/*”開始、以“*/”結(jié)束的塊式注釋。這種注釋可以單獨占一行,也可以占多行。編譯系統(tǒng)在發(fā)現(xiàn)一個“/*”后,會開始找注釋結(jié)束符“*/”,把二者間的內(nèi)容作為注釋,如例1-1中的注釋。
1.1.1C語言程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)CC語言本身沒有輸入輸出語句,輸入輸出操作是通過調(diào)用系統(tǒng)提供的標(biāo)準(zhǔn)庫函數(shù)完成的,其目的是將與硬件設(shè)備直接相關(guān)的輸入輸出等操作交由庫函數(shù)實現(xiàn),使程序不直接對硬件設(shè)備進(jìn)行管理,增加程序的可移植性。C語言要求嚴(yán)格區(qū)分字母大小寫,同一字母的大小寫被視為兩個不同的字符。C語言程序中的語句、類型名、定義符、函數(shù)名、變量名等一般均用小寫字母表示。1.1.1C語言程序的基本結(jié)構(gòu)
在編寫計算機(jī)程序的過程中,要求堅守程序的規(guī)范性、準(zhǔn)確性和合理性,精益求精,養(yǎng)成良好的編程習(xí)慣,為個人的長遠(yuǎn)發(fā)展夯實基礎(chǔ)。1.1.2數(shù)據(jù)類型及轉(zhuǎn)換1.?dāng)?shù)據(jù)類型51系列單片機(jī)中應(yīng)用的C語言稱為C51語言。C51語言中使用的基本數(shù)據(jù)類型除了包含C語言中的標(biāo)準(zhǔn)數(shù)據(jù)類型外,還包含了C51語言擴(kuò)展的數(shù)據(jù)類型。數(shù)據(jù)類型即數(shù)據(jù)的格式。對數(shù)據(jù)類型的描述包括數(shù)據(jù)的表示形式、數(shù)據(jù)長度、數(shù)值范圍等。程序設(shè)計中的數(shù)據(jù)可分為常量和變量,變量必須先說明類型,才能使用。1.1.2數(shù)據(jù)類型及轉(zhuǎn)換數(shù)據(jù)類型數(shù)據(jù)名稱長度值域unsignedchar無符號字符型1B0~255signedchar有符號字符型1B?128~+127unsignedint無符號整型2B0~65535signedint有符號整型2B?32768~+32767unsignedlong無符號長整型4B0~4294967295signedlong有符號長整型4B?2147483648~+2147483647float浮點型4B±1.175494×10?38~±3.402823×1038*指針型1~3B對象的地址bit位類型1bit0或1sfr特殊功能寄存器1B0~255sfr1616位特殊功能寄存器2B0~65535sbit可尋址位1bit0或1
C51語言的基本數(shù)據(jù)類型C51語言擴(kuò)展的數(shù)據(jù)類型
利用sfr可以訪問51系列單片機(jī)內(nèi)部的所有特殊功能寄存器。該數(shù)據(jù)類型的變量占用一個字節(jié),取值范圍為0~255。該數(shù)據(jù)類型的定義格式為
sfr變量名=變量地址;
位類型(bit)可以定義一個位變量,定義位變量時可以為變量賦值,但不能定義位指針或位數(shù)組。位變量的值是一個二進(jìn)制位,非0即1。該數(shù)據(jù)類型的定義格式為bit變量名=變量值;1.1.2數(shù)據(jù)類型及轉(zhuǎn)換位類型(bit)特殊功能寄存器(sfr)1)2)例如,“sfrP1=0x90;”這條語句定義變量P1為P1端口在片內(nèi)的寄存器,其地址為0x90。利用sfr16可以訪問16位特殊功能寄存器。該數(shù)據(jù)類型的變量占用兩個字節(jié),取值范圍為0~65535。該數(shù)據(jù)類型的定義格式為sfr16變量名=變量地址;1.1.2數(shù)據(jù)類型及轉(zhuǎn)換16位特殊功能寄存器(sfr16)3)此處的變量地址為16位地址中的低8位地址。通過sfr16定義的變量訪問16位特殊功能寄存器時,先讀取低字節(jié)數(shù)據(jù),再讀取高字節(jié)數(shù)據(jù);對16位特殊功能寄存器寫入數(shù)據(jù)時,先寫入高字節(jié)地址,再寫入低字節(jié)地址??蓪ぶ肺唬╯bit)可以訪問單片機(jī)內(nèi)部RAM中的位尋址區(qū)或特殊功能寄存器中的位尋址區(qū)。
1.1.2數(shù)據(jù)類型及轉(zhuǎn)換可尋址位(sbit)4)例如:sbitOV=0xd2; /*定義變量OV的位地址為0xd2*/sbitOV=PSW^2; /*定義變量OV在PSW寄存器中的位置為PSW.2*/sbitOV=0xd0^2; /*定義變量OV在PSW寄存器中的位地址為0xd0
(PSW寄存器需先用sfr定義)*/該數(shù)據(jù)類型的定義格式有以下三種:sbit變量名=位地址;sbit變量名=sfr變量名^位序號;sbit變量名=sfr變量地址^位序號;1.1.2數(shù)據(jù)類型及轉(zhuǎn)換2.?dāng)?shù)據(jù)類型轉(zhuǎn)換在C語言中,數(shù)據(jù)類型的轉(zhuǎn)換方式有下面兩種自動轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換1.1.2數(shù)據(jù)類型及轉(zhuǎn)換2.?dāng)?shù)據(jù)類型轉(zhuǎn)換如果參與運算的變量類型不同,則先轉(zhuǎn)換成同一類型,然后再進(jìn)行運算。賦值運算兩邊的數(shù)據(jù)類型不同時,賦值號右邊的類型將轉(zhuǎn)換為左邊的類型?!暗图壪蚋呒夀D(zhuǎn)換”原則,如果運算中有幾種不同類型的數(shù)據(jù),則先統(tǒng)一轉(zhuǎn)換為最高級的數(shù)據(jù)類型,然后再進(jìn)行運算。自動轉(zhuǎn)換由C語言編譯系統(tǒng)自動完成,不需要人為干預(yù)。自動轉(zhuǎn)換遵循三個基本規(guī)則。類型標(biāo)識符和表達(dá)式都應(yīng)用圓括號括起來,當(dāng)只有單個操作數(shù)時,表達(dá)式的括號可以省略。例如:(double)a /*將a轉(zhuǎn)換成double類型*/(int)(x+y) /*將x+y的值轉(zhuǎn)換成整型*/(int)x+y /*將x轉(zhuǎn)換成整型,然后與y相加*/強(qiáng)制轉(zhuǎn)換是將表達(dá)式的結(jié)果強(qiáng)制轉(zhuǎn)換成類型標(biāo)識符所指定的數(shù)據(jù)類型。其一般形式為(類型標(biāo)識符)(表達(dá)式)1.1.2數(shù)據(jù)類型及轉(zhuǎn)換2.?dāng)?shù)據(jù)類型轉(zhuǎn)換1.1.2數(shù)據(jù)類型及轉(zhuǎn)換無論是自動轉(zhuǎn)換,還是強(qiáng)制轉(zhuǎn)換,都是為了本次運算的需要,對數(shù)據(jù)的類型進(jìn)行臨時轉(zhuǎn)換,并沒有改變數(shù)據(jù)的定義。例如,i為整型,表達(dá)式(double)i的類型double,但i的類型仍然是整型。1.1.3常量與變量1.常量常量是指在程序運行過程中,其值不能改變的量,如固定的數(shù)據(jù)表、字符等。常量的數(shù)據(jù)類型主要有下面幾種。整型字符型位標(biāo)量型等浮點型字符串型1.1.3常量與變量1)整型常量2)浮點型常量整型常量的表示方法有多種,可采用十進(jìn)制形式表示,如123、0、?89等;也可采用十六進(jìn)制形式表示,以0x或0X開頭,如0x34、?0x3B等。如果是長整型數(shù)據(jù),則需要在數(shù)字后面加上字母L,如204L、023L、1345L等。浮點型常量可分為十進(jìn)制和指數(shù)兩種表示形式。(1)十進(jìn)制浮點型常量由數(shù)字和小數(shù)點組成,整數(shù)或小數(shù)部分為0時可以省略,但必須要保留小數(shù)點,如0.666、1125.125、0.0、.25、300.等。(2)指數(shù)浮點型常量的表示形式為:[±]數(shù)字[.數(shù)字]e[±]數(shù)字。[]中的內(nèi)容為可選項,如125e3、7e9、?3.0e?3等。1.1.3常量與變量3)字符型常量4)字符串型常量字符型常量一般是指單引號內(nèi)的單個字符,如'a'、'd'等。還有一類字符型常量,它們專門用來表示控制字符,稱為轉(zhuǎn)義字符,其表示形式為在字符前面加上一個反斜杠“\”。例如,'\n',表示換行。字符串型常量通常由放在雙引號內(nèi)的一個或多個字符組成,如"test"、"OK"等。當(dāng)雙引號內(nèi)沒有字符時,該字符串為空字符串。在C51語言中,字符串型常量是被當(dāng)作字符類型數(shù)組來處理的。在存儲字符串時,系統(tǒng)會在字符串尾部加上“\0”轉(zhuǎn)義字符作為該字符串的結(jié)束符。位標(biāo)量型常量可以定義一個位標(biāo)量,但是不能定義位指針,也不能定義位數(shù)組。位標(biāo)量型常量的值是一個二進(jìn)制位,非0即1。位標(biāo)量型常量的定義形式為:#define<位標(biāo)量常量名><常量>。例如,定義位標(biāo)量False和True:#defineFalse0#defineTrue1 /*用預(yù)定義語句可以定義常量,這里定義False為0,True為1;程序中用到False時編譯器自動用0替換,用到True時自動用1替換*/1.1.3常量與變量5)位標(biāo)量型常量1.1.3常量與變量知識鏈接將程序中的常量定義為一個標(biāo)識符,稱為符號常量,一般使用大寫英文字母表示。其定義形式為:#define<符號常量名><常量>。例如,#definePI3.14,這條預(yù)處理命令定義了一個符號常量PI,它的值為3.14。1.1.3常量與變量2.變量
變量是指在程序運行過程中,其值能改變的量。要在程序中使用變量,必須先定義變量,即指定變量名,并指出變量對應(yīng)的數(shù)據(jù)類型和存儲模式,這樣編譯系統(tǒng)才能為變量分配相應(yīng)的存儲空間。1.1.3常量與變量在變量的定義格式中,數(shù)據(jù)類型和變量名是必要的,存儲類型和存儲器類型是可選項。下面主要介紹存儲類型和存儲器類型。變量的定義格式為
[存儲類型]數(shù)據(jù)類型[存儲器類型]變量名;存儲類型用于指定變量在程序運行過程中的作用范圍;數(shù)據(jù)類型用于指定變量的數(shù)據(jù)類型;存儲器類型用于指定變量在單片機(jī)中使用的存儲區(qū)域;變量名用于指定變量的名稱。1)變量的定義1.1.3常量與變量不同存儲類型的變量或不同位置定義的變量具有不同的作用范圍(即作用域)。在單片機(jī)程序中,變量的存儲類型可分為四種。2)變量的存儲類型靜態(tài)變量自動變量全局變量寄存器變量1.1.3常量與變量(1)自動變量關(guān)鍵字:auto標(biāo)識的變量類型。作用域:是函數(shù)或復(fù)合語句的內(nèi)部。在C51語言中,函數(shù)或復(fù)合語句內(nèi)部定義自動變量時,關(guān)鍵字auto可以省略,即默認(rèn)為自動變量。在程序執(zhí)行過程中,自動變量的存儲空間是動態(tài)分配的。當(dāng)程序執(zhí)行到該變量的聲明語句時,編譯系統(tǒng)根據(jù)變量類型自動為其分配存儲空間。當(dāng)函數(shù)或復(fù)合語句執(zhí)行完畢后,自動變量的存儲空間將立刻自動取消,此時,自動變量失效,在函數(shù)或復(fù)合語句外部將不能使用該變量。1.1.3常量與變量(2)全局變量關(guān)鍵字:extern標(biāo)識的變量類型。作用域:全局變量一般定義在所有函數(shù)的外部,其作用域是從全局變量定義的位置到程序文件結(jié)束,它可以被作用域范圍內(nèi)的任何函數(shù)調(diào)用。因此,全局變量有時也稱為外部變量。在程序執(zhí)行過程中,全局變量將被靜態(tài)地分配適當(dāng)?shù)拇鎯臻g。全局變量一旦分配存儲空間,在整個程序運行過程中便不會消失。因此,全局變量對整個程序文件都有效,即全局變量可以被該程序文件中的任何函數(shù)使用。1.1.3常量與變量(3)靜態(tài)變量關(guān)鍵字:static標(biāo)識的變量類型。作用域:靜態(tài)變量和自動變量類似,其作用域只是定義該變量的函數(shù)內(nèi)部。如果靜態(tài)變量定義在函數(shù)外部,將具有全局變量的作用域。從內(nèi)存占用的角度來看,靜態(tài)變量和全局變量類似,一旦分配存儲空間,它始終占有該內(nèi)存空間,直至程序運行結(jié)束。1.1.3常量與變量(4)寄存器變量定義:單片機(jī)的CPU寄存器中也可以保存少量的變量,這種變量稱為寄存器變量。關(guān)鍵字:register標(biāo)識的變量類型。由于單片機(jī)對寄存器變量的讀寫速度要遠(yuǎn)高于對其他類型的變量,因此把最頻繁使用的變量定義為寄存器變量可以有效地提高程序運行速度。由于單片機(jī)資源有限,因此程序中只允許同時定義兩個寄存器變量。如果多于兩個,在編譯時系統(tǒng)會自動地將其他寄存器變量當(dāng)作非寄存器變量來處理。1.1.3常量與變量
Keil軟件所能識別的變量的存儲器類型如下表所示。3)變量的存儲器類型變量的存儲器類型說明data直接訪問內(nèi)部數(shù)據(jù)存儲器(128B),訪問速度最快bdata可尋址位內(nèi)部數(shù)據(jù)存儲器(16B),允許位與字節(jié)混合訪問idata間接訪問內(nèi)部數(shù)據(jù)存儲器(256B),允許訪問全部內(nèi)部地址pdata分頁訪問外部數(shù)據(jù)存儲器(256B),通過P0端口的地址對其訪問xdata外部數(shù)據(jù)存儲器(64KB),通過數(shù)據(jù)指針DPTR訪問code程序存儲器(64KB),通過數(shù)據(jù)指針DPTR訪問1.1.3常量與變量3)變量的存儲器類型smallcompactlarge如果在定義變量時省略了存儲器類型,編譯系統(tǒng)會按照默認(rèn)的存儲模式去指定變量的存儲區(qū)域,這些存儲模式包括三種:1.1.3常量與變量3)變量的存儲器類型該模式是將函數(shù)參數(shù)和局部變量都放置在片內(nèi)RAM中(默認(rèn)變量類型為data,最大128B)。另外,其他所有對象(包括棧)也都優(yōu)先放置在片內(nèi)RAM區(qū),當(dāng)片內(nèi)RAM用滿時,再放置到片外RAM中。優(yōu)點:是訪問速度快。缺點:空間有限。small存儲模式1.1.3常量與變量3)變量的存儲器類型該模式是將函數(shù)參數(shù)和局部變量都放置在片外RAM中(默認(rèn)存儲類型為pdata,最大256B),變量需要通過間接尋址方式進(jìn)行訪問。優(yōu)點:空間比small模式大。缺點:訪問速度比small模式慢,但比large模式快。compact存儲模式1.1.3常量與變量3)變量的存儲器類型該模式是將函數(shù)參數(shù)和局部變量都放置在片外RAM中(默認(rèn)存儲類型為xdata,最大64KB),變量需要使用數(shù)據(jù)指針DPTR通過間接尋址方式進(jìn)行訪問。優(yōu)點:空間大。缺點:訪問速度慢。large存儲模式1.1.4運算符與表達(dá)式算術(shù)關(guān)系邏輯賦值位逗號條件運算符是完成某種特定運算的符號。C51語言中常用的運算符有右邊這七種。表達(dá)式是由運算符及運算對象所組成的具有特定含義的式子。根據(jù)運算符種類的不同,表達(dá)式可分為右邊這幾種。1.1.4運算符與表達(dá)式1.算術(shù)運算符與算術(shù)表達(dá)式運算符作用舉例說明+正號運算+aa的值?負(fù)號運算?aa的負(fù)數(shù)+加法運算a+ba和b的和?減法運算a?ba和b的差*乘法運算a*ba和b的積/除法運算a/ba除以b的商%取余運算(模運算)a%ba除以b的余數(shù)++自增1a++將變量a的值自加1--自減1a--將變量a的值自減1算術(shù)運算符是執(zhí)行算術(shù)運算時的操作符,如表所示。1.1.4運算符與表達(dá)式1.算術(shù)運算符與算術(shù)表達(dá)式
若一個運算量兩側(cè)的運算符同優(yōu)先級,則按結(jié)合性方向進(jìn)行計算。算術(shù)運算符的結(jié)合性皆為左結(jié)合性,即同優(yōu)先級算術(shù)運算符按自左向右方向進(jìn)行計算。例如,對于算術(shù)表達(dá)式a+b?c,先計算a+b,再計算減c。
和基本四則運算法則一致,即“先乘除,后加減,括號最優(yōu)先”,取余運算符與乘除同級。根據(jù)算術(shù)運算符的優(yōu)先級從高到低依次執(zhí)行注意事項優(yōu)先級用算術(shù)運算符和括號將表達(dá)式連接起來的式子稱為算術(shù)表達(dá)式。算術(shù)表達(dá)式的一般形式為:表達(dá)式1算術(shù)運算符表達(dá)式2例如,a+b*(10?a)、(x+9)/(y?a)都是算術(shù)表達(dá)式。計算方式1.1.4運算符與表達(dá)式知識鏈接自增運算符和自減運算符的操作對象只能是變量,作用是使變量的值增1或減1。自增運算符和自減運算符均有前置與后置之分,如下表所示。運算符作用舉例(i=3)結(jié)果++i先將i的值加1,再使用加1后i的值j=++ij為4,i為4i++先使用i當(dāng)前的值,再將i的值加1j=i++j為3,i為4--i先將i的值減1,再使用減1后i的值j=--ij為2,i為2i--先使用i當(dāng)前的值,再將i的值減1j=i--j為3,i為21.1.4運算符與表達(dá)式2.關(guān)系運算符與關(guān)系表達(dá)式運算符作用舉例說明==相等x==y比較變量x的值與變量y的值是否相等,相等則結(jié)果為1,不相等則結(jié)果為0!=不相等x!=y比較變量x的值與變量y的值是否相等,不相等則結(jié)果為1,相等則結(jié)果為0>
大于x>y若變量x的值大于變量y的值,則結(jié)果為1,否則為0<
小于x<y若變量x的值小于變量y的值,則結(jié)果為1,否則為0>=大于等于x>=y若變量x的值大于或等于變量y的值,則結(jié)果為1,否則為0<=小于等于x<=y若變量x的值小于或等于變量y的值,則結(jié)果為1,否則為0關(guān)系運算符用來比較兩個變量的大小,運算結(jié)果只有0和1兩種,也就是邏輯的真與假,當(dāng)指定的條件滿足時結(jié)果為1,不滿足時結(jié)果為0。常見的關(guān)系運算符如表所示。1.1.4運算符與表達(dá)式2.關(guān)系運算符與關(guān)系表達(dá)式優(yōu)先級關(guān)系運算符的優(yōu)先級別:(==、!=)優(yōu)先級相同(>、<、>=、<=)也具有相同的優(yōu)先級,但是前兩個的優(yōu)先級要低于后四個。用關(guān)系運算符將兩個表達(dá)式連接起來的式子稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式通常用來判別某個條件是否滿足。關(guān)系表達(dá)式的一般形式為表達(dá)式1關(guān)系運算符表達(dá)式2例如,I<J、I==J、(I=4)>(J=3)、J+I>J等都是關(guān)系表達(dá)式。關(guān)系表達(dá)式1.1.4運算符與表達(dá)式優(yōu)先級是計算機(jī)操作系統(tǒng)在處理多個程序時,決定各個程序接受系統(tǒng)資源的優(yōu)先等級的參數(shù),它能極大地提高系統(tǒng)資源的利用率。在平時的工作和學(xué)習(xí)中,我們也要有優(yōu)先級意識,可以把要做的事情分為重要緊急、重要不緊急、不重要緊急、不重要不緊急,然后選擇重要的事情優(yōu)先去做,這對提高工作和學(xué)習(xí)效率有很大的幫助。如果沒有優(yōu)先級意識,瑣碎的事情一多,就會分散對重要事情的關(guān)注,忙碌了一段時間回過頭來發(fā)現(xiàn),重要的事情可能被遺漏了,或工作和學(xué)習(xí)效率較低。1.1.4運算符與表達(dá)式3.邏輯運算符與邏輯表達(dá)式運算符作用舉例說明&&與運算(x>y)&&(y>z)若變量x的值大于變量y的值,且變量y的值也大于變量z的值,其結(jié)果為真(值為1),否則為假(值為0)||或運算(x>y)||(y>z)若變量x的值大于變量y的值,或變量y的值大于變量z的值,其結(jié)果為真(值為1),否則為假(值為0)!非運算!(x>y)若變量x的值大于變量y的值,其結(jié)果為假(值為0),否則為真(值為1)邏輯運算符是執(zhí)行邏輯運算時的操作符,包括邏輯與(&&)、邏輯或(||)、邏輯非(!),如下表所示。邏輯運算的最終結(jié)果為真(值為1)或假(值為0)。1.1.4運算符與表達(dá)式3.邏輯運算符與邏輯表達(dá)式邏輯表達(dá)式用邏輯運算符將關(guān)系表達(dá)式或邏輯量連接起來的式子稱為邏輯表達(dá)式。邏輯表達(dá)式的一般形式為邏輯與:條件式1&&
條件式2邏輯或:條件式1||
條件式2邏輯非:!條件式1.1.4運算符與表達(dá)式3.邏輯運算符與邏輯表達(dá)式邏輯與表達(dá)式的值當(dāng)條件式1與條件式2都為真時結(jié)果為真,否則結(jié)果為假。也就是說,運算會先對條件式1進(jìn)行判斷,如果為真,則繼續(xù)對條件式2進(jìn)行判斷,當(dāng)其也為真時,邏輯運算的結(jié)果為真,否則邏輯運算的結(jié)果為假。如果在判斷條件式1時就為假的話,就不用再判斷條件式2了,而直接判定邏輯運算結(jié)果為假。1.1.4運算符與表達(dá)式3.邏輯運算符與邏輯表達(dá)式邏輯或表達(dá)式的值只要兩個條件式中有一個為真,邏輯運算結(jié)果就為真。只有當(dāng)兩個條件式都不為真時,邏輯運算結(jié)果才為假。邏輯非表達(dá)式的值如果條件式的運算結(jié)果為真,則進(jìn)行邏輯非運算后結(jié)果為假;如果條件式的運算結(jié)果為假,則進(jìn)行邏輯非運算后結(jié)果為真。1.1.4運算符與表達(dá)式3.邏輯運算符與邏輯表達(dá)式ab!a!ba&&ba||b001100011001100101110011邏輯運算的真值表如下1-7所示,表示當(dāng)a和b的值為不同組合時,各種邏輯運算所得到的值。優(yōu)先級邏輯運算符的優(yōu)先級別從高到低依次為::!(邏輯非)>&&(邏輯與)>||(邏輯或)1.1.4運算符與表達(dá)式4.逗號運算符與逗號表達(dá)式逗號C語言把逗號“,”
作為間隔符,也作為運算符。用逗號運算符將幾個表達(dá)式連接起來的式子稱為逗號表達(dá)式。逗號表達(dá)式的一般形式為表達(dá)式1,表達(dá)式2,…表達(dá)式n1.1.4運算符與表達(dá)式4.逗號運算符與逗號表達(dá)式逗號表達(dá)式在運算時將從左至右依次求取各個表達(dá)式的值(先求表達(dá)式1,然后求表達(dá)式2…直至求解完表達(dá)式n),而整個逗號表達(dá)式的值為最后一個表達(dá)式的值。例如:a=3,b=2; /*給變量a和b進(jìn)行賦值*/c=(a+b,a?b); /*依次計算表達(dá)式a+b和a?b的值,將a?b的值賦給變量c,
所以c的值為1*/使用注意事項(1)1.1.4運算符與表達(dá)式4.逗號運算符與逗號表達(dá)式逗號運算符在全部運算符里優(yōu)先級最低,因此最好將整個逗號表達(dá)式用圓括號括起來,否則意義可能會不同。例如:a=3,b=2; /*給變量a和b進(jìn)行賦值*/c=a+b,a?b; /*c的值為5*/這里是將c=a+b作為表達(dá)式1,a?b作為表達(dá)式2,構(gòu)成逗號表達(dá)式,因此表達(dá)式1即c=a+b執(zhí)行后,c等于5。使用注意事項(2)1.1.4運算符與表達(dá)式4.逗號運算符與逗號表達(dá)式逗號運算符的結(jié)合性為自左向右。因此當(dāng)前后表達(dá)式用到相同的變量時,如果前面表達(dá)式中變量值發(fā)生了變化,則會影響后面的表達(dá)式。例如:a=2;x=(a=a*3,a+12); /*x的值為18,先計算a=a*3等于6,然后再計算a+12等于18*/使用注意事項(3)1.1.4運算符與表達(dá)式5.位運算符與位運算表達(dá)式運算符作用舉例說明&與運算A=x&y變量x與y的每位進(jìn)行與運算后的結(jié)果送入變量A|或運算B=x|y變量x與y的每位進(jìn)行或運算后的結(jié)果送入變量B^異或運算C=x^y變量x與y的每位進(jìn)行異或運算后的結(jié)果送入變量C~取反運算D=~x變量x的每位進(jìn)行取反運算后的結(jié)果送入變量D<<
左移運算E=x<<n變量x的每位左移n位后的結(jié)果送入變量E>>
右移運算F=x>>n變量x的每位右移n位后的結(jié)果送入變量F位運算符的作用是按二進(jìn)制位對變量進(jìn)行運算,但是并不改變參與運算的變量的值。C51語言中共有6種位運算符,如表所示。1.1.4運算符與表達(dá)式5.位運算符與位運算表達(dá)式表達(dá)式用位運算符將兩個變量連接起來的式子稱為位運算符表達(dá)式。位運算表達(dá)式的一般形式為變量1位運算符變量2優(yōu)先級位運算符的優(yōu)先級從高到低依次是:“~”(按位取反)>“<<”(左移)>“>>”(右移)>“&”(按位與)>“^”(按位異或)>“|”(按位或)。1.1.4運算符與表達(dá)式5.位運算符與位運算表達(dá)式(a) (b)
(c)
(d)(e)(f)【例1-2】已知a=00000010,b=00000011,試計算a&b、a|b、a^b、~a、b=b<<2、b=b>>1的結(jié)果。【解答】計算過程如圖
1.1.4運算符與表達(dá)式知識鏈接進(jìn)行“&”運算時,如果兩個相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1;否則為0。例如,0&0=0,0&1=0,1&0=0,1&1=1。進(jìn)行“|”運算時,兩個相應(yīng)的二進(jìn)制位中只要有一個為1,該位的結(jié)果值就為1。例如,0|0=0,0|1=1,1|0=1,1|1=1。進(jìn)行“^”運算時,如果參與運算的兩個二進(jìn)制位相同,則結(jié)果為0;不同則為1。例如,0^0=0,0^1=1,1^0=1,1^1=0。進(jìn)行“~”運算時,是將0變?yōu)?,將1變?yōu)?。進(jìn)行“<<”運算時,是將一個數(shù)的二進(jìn)制位全部左移若干位,高位左移溢出后舍棄。進(jìn)行“>>”運算時,是將一個數(shù)的二進(jìn)制位全部右移若干位,移到右端的低位被舍棄,對無符號數(shù),高位補(bǔ)0。1.1.4運算符與表達(dá)式6.賦值運算符與賦值表達(dá)式賦值符號“=”
就是賦值運算符。用賦值運算符將一個變量與一個表達(dá)式連接起來的式子稱為賦值表達(dá)式。賦值表達(dá)式的一般形式為變量=表達(dá)式運算符和表達(dá)式賦值表達(dá)式的作用是將一個表達(dá)式的值賦給一個變量,因此,賦值表達(dá)式具有計算和賦值兩個功能。例如,“a=4+5”是一個賦值表達(dá)式,其求解過程是先求賦值運算符右側(cè)的表達(dá)式“4+5”的值(9),然后再將9賦給賦值表達(dá)式左側(cè)的變量a。作用1)簡單賦值1.1.4運算符與表達(dá)式6.賦值運算符與賦值表達(dá)式運算符和表達(dá)式2)復(fù)合賦值C語言可以在賦值運算符“=”
之前加上其他運算符,構(gòu)成復(fù)合賦值運算,用以簡化程序,提高編譯的效率。其一般形式為變量復(fù)合賦值運算符表達(dá)式相當(dāng)于:變量=變量運算符表達(dá)式復(fù)合賦值運算時,首先對變量進(jìn)行某種運算,然后將運算的結(jié)果再賦給該變量。1.1.4運算符與表達(dá)式6.賦值運算符與賦值表達(dá)式運算符作用舉例說明+=加法賦值a+=b相當(dāng)于a=a+b?=減法賦值a?=b相當(dāng)于a=a?b*=乘法賦值a*=b相當(dāng)于a=a*b/=除法賦值a/=b相當(dāng)于a=a/b%=取余賦值a%=b相當(dāng)于a=a%b&=邏輯與賦值a&=b相當(dāng)于a=a&b|=邏輯或賦值a|=b相當(dāng)于a=a|b^=邏輯異或賦值a^=b相當(dāng)于a=a^b<<=左移賦值a<<=b相當(dāng)于a=a<<b>>=右移賦值a>>=b相當(dāng)于a=a>>b常用的復(fù)合賦值運算符如下表所示。賦值運算符都為同一優(yōu)先級,遵循右結(jié)合性,其結(jié)合方向為自右向左。1.1.4運算符與表達(dá)式7.條件運算符與條件表達(dá)式定義條件運算符為“?:”。用條件運算符將三個表達(dá)式連接起來的式子稱為條件表達(dá)式。條件表達(dá)式的一般形式為
邏輯表達(dá)式?表達(dá)式1:表達(dá)式2作用條件表達(dá)式中邏輯表達(dá)式的類型可以與表達(dá)式1和表達(dá)式2的類型不一樣。條件運算符的作用是根據(jù)邏輯表達(dá)式的結(jié)果來選擇表達(dá)式的值。當(dāng)邏輯表達(dá)式的結(jié)果為真時(非0值)時,則條件表達(dá)式的值為表達(dá)式1的值;當(dāng)邏輯表達(dá)式的結(jié)果為假(值為0)時,則條件表達(dá)式的值為表達(dá)式2的值。1.1.4運算符與表達(dá)式7.條件運算符與條件表達(dá)式若a=1,b=2,要求取a、b中的較小值放入min變量中,一般會這樣寫:if(a<b) min=a;else min=b; /*當(dāng)a<b時,min的值為a的值,否則為b的值*/用條件運算符構(gòu)成條件表達(dá)式時,可寫為min=(a<b)?a:b很明顯它的結(jié)果和含意都和上面的一段程序是一樣的,但是代碼卻比上一段程序少很多,編譯的效率也相對要高。知識鏈接C51語言中運算符的優(yōu)先級及結(jié)合性如下表所示。1.1.4運算符與表達(dá)式運算符優(yōu)先級結(jié)合性()1左結(jié)合性!、~2左結(jié)合性*、/、%3左結(jié)合性+、?4左結(jié)合性<<、>>5左結(jié)合性>、<、>=、<=6左結(jié)合性==、!=7左結(jié)合性&8左結(jié)合性^9左結(jié)合性|10左結(jié)合性&&11左結(jié)合性||12左結(jié)合性?:13右結(jié)合性=、+=、?=、*=、/=、%=、&=、
|=、^=、<<=、>>=14右結(jié)合性,15左結(jié)合性1.1.5輸入與輸出C語言本身沒有提供輸入和輸出語句,輸入和輸出操作由C語言函數(shù)庫中的函數(shù)來實現(xiàn)。1.1.5輸入與輸出1.格式輸入與輸出函數(shù)DIGITALVIRTUAL1)格式輸入函數(shù)(scanf函數(shù))scanf函數(shù)的作用是按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量中。scanf函數(shù)的一般形式為scanf("格式控制",輸入項地址列表);例如:scanf("a=%d,b=%f",&a,&b);1.1.5輸入與輸出1.格式輸入與輸出函數(shù)括號內(nèi)包括以下兩部分內(nèi)容。(1)“格式控制”是用雙引號括起來的一個字符串,稱為轉(zhuǎn)換控制字符串。它包括兩個信息:格式聲明和普通字符。格式聲明:由“%”和格式字符組成,如%d、%f等。它的作用是以指定的格式輸入數(shù)據(jù),如指定輸入數(shù)據(jù)的類型、長度等。普通字符:是需要按原樣輸入的字符。例如,上面scanf函數(shù)括號內(nèi)的“a=”“b=”及中間的逗號都是普通字符。1.1.5輸入與輸出1.格式輸入與輸出函數(shù)(2)輸入項地址列表,由需要輸入變量的地址組成。變量的地址需用取地址運算符“&”得到。多個輸入項之間用逗號隔開,要求格式聲明和各輸入項在數(shù)量和類型上一一對應(yīng)。例如,右圖所示的scanf函數(shù)中,第一個格式聲明“%d”與變量a對應(yīng),第二個格式聲明“%c”與變量b對應(yīng),第三個格式聲明“%f”與變量c對應(yīng)。1.1.5輸入與輸出在賦值表達(dá)式中給變量賦值,賦值號左邊是變量名,不能寫地址;而scanf函數(shù)在本質(zhì)上也是給變量賦值,但其要求寫變量的地址,如&a。這兩者在形式上是不同的。&a是一個表達(dá)式,其功能是求變量的地址。1.1.5輸入與輸出1.格式輸入與輸出函數(shù)DIGITALVIRTUAL2)格式輸出函數(shù)(printf函數(shù))printf函數(shù)的作用是按用戶指定的格式,把指定的數(shù)據(jù)輸出到屏幕上。printf函數(shù)可以用于所有類型數(shù)據(jù)的輸出,只要采用不同的轉(zhuǎn)換控制字符串,就可以將不同類型的數(shù)據(jù)輸出到屏幕上scanf函數(shù)的一般形式為printf函數(shù)的一般形式為printf("格式控制",輸出項列表);例如:printf("a=%d,b=%f",a,b);1.1.5輸入與輸出1.格式輸入與輸出函數(shù)(1)“格式控制”與scanf函數(shù)類似,也包含兩部分內(nèi)容:格式聲明與普通字符。格式聲明:用于指定輸出的格式(如%d、%f等),如指定輸出數(shù)據(jù)的類型、長度等;普通字符:需要按原樣輸出的字符,如前面的“a=”、“b=”及中間的逗號,會原樣輸出到屏幕上。(2)“輸出項列表”是程序需要輸出的一些數(shù)據(jù),可以是常量、變量或表達(dá)式。輸出項列表中給出了各個輸出項,要求格式聲明和各輸出項在數(shù)量和類型上一一對應(yīng)。括號內(nèi)包括以下兩部分內(nèi)容1.1.5輸入與輸出2.字符輸入與輸出函數(shù)1)字符輸入函數(shù)(getchar函數(shù))getchar函數(shù)的作用是從輸入設(shè)備上輸入一個字符。getchar函數(shù)的一般形式為:getchar();getchar函數(shù)的返回值為所讀取的字符,所以一般與賦值語句聯(lián)合使用,將讀取的字符賦給變量。例如:charc; /*定義字符變量c*/c=getchar(); /*從輸入設(shè)備讀取一個字符并賦值給變量c*/1.1.5輸入與輸出
getchar函數(shù)只讀取單個字符,如果輸入多個字符,則只讀取第一個字符。1.1.5輸入與輸出2.字符輸入與輸出函數(shù)2)字符輸出函數(shù)(putchar函數(shù))putchar函數(shù)的作用是向輸出設(shè)備輸出一個字符。putchar函數(shù)的一般形式為putchar(c);c為欲輸出的字符常量或變量,亦可為整型常量或變量(ASCII碼)。1.1.5輸入與輸出可以用putchar函數(shù)輸出轉(zhuǎn)義字符,例如:putchar('\n'); /*輸出換行符*/putchar(‘\101’); /*輸出字符A,因為八進(jìn)制
的101等于十進(jìn)制的65,65是A的ASCII碼*/putchar('\''); /*輸出單撇號*/課堂小結(jié)1C語言程序的基本結(jié)構(gòu)2數(shù)據(jù)類型及轉(zhuǎn)換3常量與變量4運算符與表達(dá)式5輸入與輸出C設(shè)計“學(xué)生成績排序”程序
——C語言語句、數(shù)組、函數(shù)
011211101101011011010010011001101010100100110110100101100101110110101001101110101010101011010100110100101.21.2任務(wù)描述小學(xué)一年級(2)班的期末考試成績出來了,數(shù)學(xué)老師想開一次家長會,對學(xué)生的數(shù)學(xué)學(xué)習(xí)情況做個總結(jié)?,F(xiàn)在數(shù)學(xué)老師需要把班級里學(xué)生的數(shù)學(xué)成績按照從高分到低分的順序進(jìn)行排序并輸出,班級里共有20名學(xué)生,數(shù)學(xué)成績?nèi)绫?-11(表格詳見教材)所示。請設(shè)計一個C語言程序,要求能夠完成學(xué)生成績的錄入和成績表的排序操作。任務(wù)實施1.任務(wù)分析對學(xué)生成績進(jìn)行排序,可以看成是:先求最高分,然后求次高分,…,一直到倒數(shù)第二個分?jǐn)?shù)找出為止。所以先要解決的是求最高分,然后再在剩下的分?jǐn)?shù)中找次高分,不斷重復(fù),直到剩下的最后一個數(shù)是最小數(shù)為止。2.參考代碼3.運行結(jié)果1.2.1語句基本語句選擇語句循環(huán)語句轉(zhuǎn)向語句
C語言中的語句是用來向計算機(jī)系統(tǒng)發(fā)出操作指令的,所以說,語句是用來完成一定操作任務(wù)的。一個實際的程序應(yīng)該包含若干條語句。語句1.2.1語句
根據(jù)程序設(shè)計語言的基本要求,C語言所有的語句歸納為五類。
空語句
函數(shù)調(diào)用語句
表達(dá)式語句
控制語句
復(fù)合語句1.基本語句1.2.1語句表達(dá)式語句是由一個表達(dá)式加上分號組成的語句。其一般形式為
表達(dá)式;執(zhí)行表達(dá)式語句就是計算表達(dá)式的值。例如:“number=20”是一個賦值表達(dá)式,
“number=20;”就是一條賦值表達(dá)式語句;1)表達(dá)式語句“count++”是自增表達(dá)式,“count++;”就是自增表達(dá)式語句。1.2.1語句函數(shù)調(diào)用語句是由一個函數(shù)調(diào)用加上分號組成的語句。其一般形式為函數(shù)名(實際參數(shù)列表);執(zhí)行函數(shù)調(diào)用語句就是調(diào)用函數(shù)體并把實際參數(shù)(簡稱“實參”)賦予函數(shù)定義中的形式參數(shù)(簡稱“形參”),然后執(zhí)行被調(diào)函數(shù)體中的語句,求取函數(shù)值。例如,調(diào)用printf函數(shù),輸出字符串:
“printf("Hello!"); /*調(diào)用名為printf的函數(shù)*/2)函數(shù)調(diào)用語句1.2.1語句空語句是只有分號組成的語句,什么也不執(zhí)行。在程序中,空語句可用來作空循環(huán)體。例如:
while(getchar()!='\n');本語句的功能是:只要輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語句。3)空語句1.2.1語句復(fù)合語句是把多條語句用花括號括起來組成的語句。在程序中,可把復(fù)合語句看成是單條語句。例如:
{ x=y+z; a=b+c; printf("%d%d",x,a);}4)復(fù)合語句1.2.1語句復(fù)合語句內(nèi)的各條語句都必須以分號結(jié)尾,但在花括號的“}”外不能加分號。1.2.1語句控制語句用于控制程序的執(zhí)行流程,它們是由特定的語句定義符組成的語句。C語言有九種控制語句,可分為以下三類。選擇語句:if語句、switch語句。循環(huán)語句:while語句、do-while語句、for語句。轉(zhuǎn)向語句:break語句、continue語句、goto語句、return語句。5)控制語句1.2.1語句2.選擇語句fiC語言提供了四種形式的if語句:基本if語句if-else語句if-else-if語句嵌套if語句形式If語句是條件選擇語句,先判斷表達(dá)式的值,然后根據(jù)該值的結(jié)果(“真”或“假”)控制程序流程。表達(dá)式的值非0即為“真”,否則即為“假”。定義基本形式1)if語句
1.2.1語句(1)基本if語句一般形式:if(表達(dá)式){語句;}“表達(dá)式”:可以是任意表達(dá)式,但一般為關(guān)系表達(dá)式或邏輯表達(dá)式;“語句”:可以是一條簡單語句,或是由多個語句構(gòu)成的復(fù)合語句,也可以是一個空語句。執(zhí)行過程:
如果表達(dá)式的值為真(非0),則執(zhí)行其后的語句,否則不執(zhí)行該語句,如圖所示。
1.2.1語句(2)if-else語句基本if語句只允許在條件為真時指定要執(zhí)行的語句,而if-else語句還可在條件為假時指定要執(zhí)行的語句。一般形式:if(表達(dá)式){
語句1;}else(表達(dá)式){
語句2;}執(zhí)行過程:如果表達(dá)式的值為真(非0),執(zhí)行語句1,否則執(zhí)行語句2,如圖所示。1.2.1語句應(yīng)當(dāng)說明的是:盡管if-else語句中存在兩個語句段,且有兩個表示語句結(jié)束的分號,但整個語句在語法上只是一條語句。尤其要注意if分支“語句1”后的分號是不可缺少的。
1.2.1語句(3)if-else-if語句編程時常常需要判定一系列的條件,一旦其中某一個條件為真就立刻停止。這種情況可以采用if-else-if語句。一般形式如右:if(表達(dá)式1){
語句1;}elseif(表達(dá)式2){
語句2;}elseif(表達(dá)式3){
語句3;} …elseif(表達(dá)式m){
語句m;}else{
語句n;}
1.2.1語句(3)if-else-if語句執(zhí)行過程:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個值為真(非0)時,則執(zhí)行其對應(yīng)的語句,然后跳到整個if語句之外繼續(xù)執(zhí)行后續(xù)程序。如果所有表達(dá)式的值都為假(0),則執(zhí)行最后一個else后的語句,然后繼續(xù)執(zhí)行后續(xù)程序,如圖所示。
1.2.1語句(4)嵌套if語句在if語句中又包含一個或多個if語句稱為嵌套if語句。前面介紹的if-else-if語句就屬于嵌套if語句。一般形式如右:
1.2.1語句(4)嵌套if語句執(zhí)行過程如圖所示。在上述嵌套語句中,if與else既可成對出現(xiàn),也可不成對出現(xiàn),且else總是與其之前最近的且還沒配對的if相配對。在書寫這種語句時,每個else應(yīng)與對應(yīng)的if對齊,形成鋸齒形狀,這樣能夠清晰地表示if語句的邏輯關(guān)系。1.2.1語句【例1-3】編寫程序,實現(xiàn)輸入三個整數(shù),輸出最大值。【問題分析】本題可以采用嵌套if語句來實現(xiàn),先比較a和b的大小,如果a大于b,就將a與c進(jìn)行比較,如果a也大于c,那么最大值就為a;否則,最大值為c。如果a小于b,就將b與c進(jìn)行比較,如果b大于c,那么最大值就為b;否則,最大值為c。程序設(shè)計流程如圖所示。1.2.1語句【例1-3】編寫程序,實現(xiàn)輸入三個整數(shù),輸出最大值?!緟⒖即a】#include<stdio.h>intmain(){ inta,b,c,max; /*定義變量*/ printf("請輸入三個整數(shù),用逗號隔開\n"); /*輸出提示信息*/ scanf("%d,%d,%d",&a,&b,&c); /*輸入a、b、c變量的值*/ if(a>b) /*a>b*/ { if(a>c)
/*a>b并且a>c*/ { max=a;
/*最大值為a*/ }else /*a>b并且c>a*/ { max=c; /*最大值為c*/ } } 1.2.1語句【例1-3】編寫程序,實現(xiàn)輸入三個整數(shù),輸出最大值?!緟⒖即a】else /*a<b*/ { if(b>c) /*b>a并且b>c*/ { max=b; /*最大值為b*/ } else /*b>a并且c>b*/ { max=c; /*最大值為c*/ } } printf("max=%d\n",max); /*輸出最大值max*/ return0; }
1.2.1語句【例1-3】編寫程序,實現(xiàn)輸入三個整數(shù),輸出最大值。【運行結(jié)果】程序運行結(jié)果如圖所示。1.2.1語句每個else本身都隱含了一個條件,如例1-3中的第1個else實質(zhì)上表示條件c>a成立,此隱含條件與對應(yīng)的if所給出的條件(a>c)完全相反,在編程時要善于利用隱含條件,使程序代碼清晰簡潔。1.2.1語句2)switch語句編程時,常常要把表達(dá)式和一系列值進(jìn)行比較,從中找出當(dāng)前匹配的值。if-else-if語句可以達(dá)到這個目的。此外,C語言還提供了switch語句作為這類if-else-if語句的替換。switch語句往往比if-else-if語句更容易閱讀。1.2.1語句switch(表達(dá)式){ case常量表達(dá)式1:[語句1] case常量表達(dá)式2:[語句2] … case常量表達(dá)式n:[語句n] [default:語句n+1]}方括號括起來的內(nèi)容是可選項。switch語句的一般形式為:switch1.2.1語句switch語句的執(zhí)行過程如右圖所示。計算switch后表達(dá)式的值,將其值與case后常量表達(dá)式的值依次進(jìn)行比較,若此值與某case后常量表達(dá)式的值一致,即轉(zhuǎn)去執(zhí)行該case后的語句;若沒有找到與之匹配的常量表達(dá)式,則執(zhí)行default后的語句。1.2.1語句3.循環(huán)語句1)while語句
在C語言所有循環(huán)語句中,while語句是最簡單也是最基本的。1.2.1語句1)while語句一般形式為:
while(表達(dá)式)
{
語句; /*循環(huán)體*/
}圓括號內(nèi)的表達(dá)式是控制表達(dá)式,語句是循環(huán)體,循環(huán)體可以是一條簡單的語句,也可以是多條語句組成的復(fù)合語句(用花括號括起來)。while1.2.1語句1)while語句執(zhí)行過程如圖:執(zhí)行該語句時,先計算表達(dá)式的值,如果它為真,則執(zhí)行循環(huán)體;接著再次判定表達(dá)式的值,如果它仍為真,則繼續(xù)執(zhí)行循環(huán)體,依此類推,直到表達(dá)式的值為假,結(jié)束循環(huán),執(zhí)行while語句后的下一條語句。1.2.1語句
while語句是“先判斷,后執(zhí)行”。如果剛進(jìn)入循環(huán)時條件就不滿足,則循環(huán)體一次也不執(zhí)行。還需要注意的是,一定要有語句修改表達(dá)式的值,使其有結(jié)果為假的時候,否則將出現(xiàn)“死循環(huán)”。1.2.1語句1)while語句在while語句中沒有包含設(shè)置初始狀態(tài)的功能,因此,這一工作需要在while語句之前完成。循環(huán)相關(guān)狀態(tài)的修改是在循環(huán)體中完成的,因此,除了少數(shù)特殊情況外,while語句的循環(huán)體一般都是復(fù)合語句。1.2.1語句【例1-4】輸入整數(shù)n的值,求S=1+2+3+…+n的值?!締栴}分析】
這是一個累加的問題,需要先后將n個數(shù)相加。要重復(fù)進(jìn)行n次加法運算,因此,可以用循環(huán)體來實現(xiàn)。重復(fù)執(zhí)行循環(huán)體n次,每次加一個數(shù)。繼續(xù)分析發(fā)現(xiàn)每次累加的數(shù)是有規(guī)律的,后一個數(shù)是前一個數(shù)加1。因此,只需要在加完上一個數(shù)i后,使i加1就可以得到下一個數(shù)。具體程序設(shè)計流程如圖所示。1.2.1語句【例1-4】輸入整數(shù)n的值,求S=1+2+3+…+n的值?!緟⒖即a】#include<stdio.h>intmain(){
inti,n,S; /*定義變量*/
printf("請輸入n的值:"); /*輸出提示語*/ scanf("%d",&n); /*輸入n的值*/ i=1; /*給i賦初值*/ S=0; /*給S賦初值*/
while(i<=n) /*循環(huán),當(dāng)i>n時結(jié)束*/ { S+=i; /*求和,將結(jié)果賦值給S*/ i++; /*循環(huán)控制變量i加1*/ } printf("S=%d\n",S); /*輸出S的值*/ return0;}1.2.1語句【例題】輸入整數(shù)n的值,求S=1+2+3+…+n的值?!具\行結(jié)果】程序運行結(jié)果如圖所示,輸入“100”并回車,輸出累加值“5050”。1.2.1語句2)do-while語句一般形式為:do{
語句;/*循環(huán)體*/}while(表達(dá)式);1.2.1語句2)do-while語句執(zhí)行過程如圖所示:do-while語句與while語句的不同在于:它先執(zhí)行循環(huán)體,然后再判斷表達(dá)式的值是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while語句至少要執(zhí)行一次循環(huán)體。1.2.1語句
do-while語句中,條件放在while后面的圓括號中,并且最后必須加上一個分號,這是很多初學(xué)者容易遺漏的。1.2.1語句3)for語句在C語言中,除了可以用while和do-while語句實現(xiàn)循環(huán)外,還可以用for語句實現(xiàn)循環(huán)。其一般形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3) {
語句; /*循環(huán)體*/ }for語句將控制循環(huán)的主要操作集中在循環(huán)語句開頭的圓括號里。1.2.1語句一般稱為“步長”,用于循環(huán)變量的修改,該表達(dá)式是在每次循環(huán)體執(zhí)行完以后、下一次循環(huán)條件判斷之前執(zhí)行的,使循環(huán)變量經(jīng)過多次循環(huán)的累積而發(fā)生改變,最終因為不滿足循環(huán)條件退出循環(huán)。表達(dá)式1表達(dá)式2表達(dá)式3通常為關(guān)系表達(dá)式或邏輯表達(dá)式,用來判斷是否繼續(xù)循環(huán)。在每次執(zhí)行循環(huán)體前先執(zhí)行此表達(dá)式,決定是否繼續(xù)執(zhí)行循環(huán)。通常為賦值表達(dá)式,實現(xiàn)循環(huán)控制變量的初始化,只執(zhí)行一次。for(表達(dá)式1;表達(dá)式2;表達(dá)式3)圓括號中三個表達(dá)式的作用如下:1.2.1語句3)for語句執(zhí)行過程如圖所示:先執(zhí)行表達(dá)式1。然后判斷表達(dá)式2的值,若其值為真(非0),則執(zhí)行for語句中指定的循環(huán)語句,然后轉(zhuǎn)到第(3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。執(zhí)行表達(dá)式3。返回到第(2)步繼續(xù)執(zhí)行。循環(huán)結(jié)束,執(zhí)行for語句下面的語句。1.2.1語句【例1-5】用for語句求S=1+2+3+…+n的值?!緟⒖即a】#include<stdio.h>intmain(){ inti,n,S; /*定義變量*/ printf("請輸入n的值:"); /*輸出提示語*/ scanf("%d",&n); /*輸入n的值*/ S=0; /*給S賦初值*/ for(i=1;i<=n;i++) /*循環(huán),當(dāng)i>n時結(jié)束*/
{ S+=i; /*求和,將結(jié)果賦值給S*/ } printf("S=%d\n",S); /*輸出S的值*/ return0;}1.2.1語句【例1-5】用for語句求S=1+2+3+…+n的值?!具\行結(jié)果】程序運行結(jié)果如圖所示,輸入“20”并回車,輸出累加值“210”。1.2.1語句不同的語句雖然可以完成相同的功能,但是語句的復(fù)雜程度卻不相同。要想使代碼清晰簡潔,就需要對相關(guān)語句有著深刻的理解,并掌握其正確的使用方法。在平時的學(xué)習(xí)和工作中,我們要善于學(xué)習(xí)、勇于鉆研,只有學(xué)好專業(yè)本領(lǐng),才能更好地服務(wù)社會。1)break語句break語句主要是在循環(huán)次數(shù)不能預(yù)先確定的情況下使用的,在循環(huán)體中增加一個分支結(jié)構(gòu),當(dāng)某個條件成立時,由break語句退出循環(huán)體,從而結(jié)束循環(huán)過程。一般形式為:break;1.2.1語句4.轉(zhuǎn)向語句break1.2.1語句(1)break語句不能用于循環(huán)語句和switch語句之外的其他語句。(2)在多重循環(huán)的情況下,使用break語句時,僅退出包含break語句的那層循環(huán)體。2)continue語句有時并不希望終止整個循環(huán)的操作,只希望提前結(jié)束本次循環(huán),而接著執(zhí)行下次循環(huán)。這時可以用continue語句。一般形式為:continue;1.2.1語句4.轉(zhuǎn)向語句continue1.2.1語句(1)continue語句只能出現(xiàn)在while、do-while和for語句的循環(huán)體中。(2)若執(zhí)行while或do-while語句中的continue語句,則跳過循環(huán)體中continue語句后面的語句,直接轉(zhuǎn)去判別下次循環(huán)控制條件;若執(zhí)行for語句中的continue語句,則跳過循環(huán)體中continue語句后面的語句,轉(zhuǎn)而執(zhí)行for語句的表達(dá)式3。(3)在循環(huán)結(jié)構(gòu)中,continue語句通常與if語句一起使用,用來加速循環(huán)。1.2.2數(shù)組數(shù)組是具有相同數(shù)據(jù)類型的變量的集合,這些變量具有相同的名字,但用不同的下標(biāo)來表明其位置,一般稱這些變量為數(shù)組元素。常用的數(shù)組包括三種。一維數(shù)組二維數(shù)組字符數(shù)組1.2.2數(shù)組類型說明符可以是任意基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型,如int、float、char等。
數(shù)組名是用戶定義的數(shù)組標(biāo)識符。對于數(shù)組元素來說,它們具有
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水幕噴泉采購合同范例
- 招商咨詢合同范例
- 農(nóng)用撒糞車采購合同范例
- 安徽金寨飯店合同范例
- 充電樁車庫租賃合同范例
- 沙子居間協(xié)議合同范例
- 校園代理有合同范例
- 工程變更總承包合同范例
- 解聘合同范例范例
- 企業(yè)投資貸款合同范例
- 2022-2023學(xué)年廣東省汕頭市八年級(上)期末數(shù)學(xué)試卷【含答案】
- 業(yè)主授權(quán)租戶安裝充電樁委托書
- 失眠之中醫(yī)問診單
- 醫(yī)院內(nèi)急診重癥快速反應(yīng)小組建設(shè)專家共識1
- 橋式起重機(jī)定期檢查記錄表
- MOOC 警察禮儀-江蘇警官學(xué)院 中國大學(xué)慕課答案
- 2023-2024學(xué)年度九上圓與無刻度直尺作圖專題研究(劉培松)
- 2024年廣東省2024屆高三二模英語試卷(含標(biāo)準(zhǔn)答案)
- 2023年-2024年醫(yī)療器械知識測試題與答案(含A.B卷)
- 2023年度四川公需科目:數(shù)字經(jīng)濟(jì)與驅(qū)動發(fā)展
- 汽車制造業(yè)的柔性生產(chǎn)與敏捷制造
評論
0/150
提交評論