下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程學(xué)習(xí)的基本要求:??掌握C語(yǔ)言的基本語(yǔ)
則、數(shù)據(jù)類型,掌握C程序的基本結(jié)構(gòu)。學(xué)習(xí)運(yùn)用高級(jí)語(yǔ)言進(jìn)行程序設(shè)計(jì)的思想和方法。熟悉并掌握一些基本算法和C語(yǔ)言程序設(shè)計(jì)技術(shù),并能用C語(yǔ)言解決實(shí)際問(wèn)題。2021/10/2922021/10/293第一章
C語(yǔ)言概述程序設(shè)計(jì)概述C語(yǔ)言簡(jiǎn)介C語(yǔ)言上機(jī)操作步驟1.1
程序設(shè)計(jì)概述、程序、程序設(shè)計(jì)數(shù)據(jù)是計(jì)算機(jī)程序處理的對(duì)象,可以是整數(shù)、實(shí)數(shù)、字符,也可以是圖像、聲音等的編碼表示。數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)與數(shù)據(jù)間存在一種或多種特定關(guān)系。在程序設(shè)計(jì)語(yǔ)言中,與數(shù)據(jù)結(jié)構(gòu)密切相關(guān)的便是數(shù)據(jù)的類型和數(shù)據(jù)的存放。2021/10/294?程序+文檔。程序把 設(shè)計(jì)的結(jié)果用程序設(shè)計(jì)語(yǔ)言表達(dá)的結(jié)果
。程序設(shè)計(jì):編寫程序的過(guò)程。數(shù)據(jù)的確定:確定數(shù)據(jù)的類型和數(shù)據(jù)的存放方式。高級(jí)語(yǔ)言中用變量定義來(lái)實(shí)現(xiàn)。數(shù)據(jù)是操作的對(duì)象。操作步驟(即算法)的確定:用語(yǔ)句來(lái)實(shí)現(xiàn)。操作的目的是對(duì)數(shù)據(jù)進(jìn)行加工處理,以得到期望結(jié)果。2021/10/2951.1.2算法與算法描述求解問(wèn)題的步驟(1)分析問(wèn)題
(2)算法分析
(3)程序設(shè)計(jì)
(4)程序調(diào)試
(5)運(yùn)行與2021/10/2962021/10/297算法與算法的特性算法(Algorithm),簡(jiǎn)單地說(shuō),是為解決一個(gè)特定問(wèn)題而采取的確定的、有限的方法和步驟。
(1)有窮性。(2)確定性。
(3)可行性。
(4)輸入。(5)輸出2021/10/2981.1.3
程序設(shè)計(jì)風(fēng)格選用合適的常量標(biāo)識(shí)符選用有實(shí)際意義的標(biāo)識(shí)符作為變量名程序書寫的縮進(jìn)規(guī)則適當(dāng)?shù)淖⑨屵m當(dāng)?shù)慕换バ?.2
C語(yǔ)言簡(jiǎn)介C語(yǔ)言出現(xiàn)的歷史背景匯編語(yǔ)言B語(yǔ)言C語(yǔ)言C語(yǔ)言的特點(diǎn)與應(yīng)用C語(yǔ)言具有結(jié)構(gòu)化的流程控制語(yǔ)句,用函數(shù)作為程序的組成單位,因而設(shè)計(jì)出的程序結(jié)構(gòu)清晰,便于開發(fā)大型
;2021/10/299C語(yǔ)言能夠直接物理部件,能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能。既有高級(jí)語(yǔ)言的特點(diǎn)(具有良好的可移植性),又有低級(jí)語(yǔ)言的許多功能;C語(yǔ)言提供了豐富的數(shù)據(jù)類型;C語(yǔ)言語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)度大;C語(yǔ)言簡(jiǎn)潔、緊湊。C語(yǔ)言生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行速度快。2021/10/29102021/10/29111.2.3
簡(jiǎn)單的C程序介紹例1.1
求兩個(gè)整數(shù)之和。分析:解題的基本思路
(1)準(zhǔn)備兩個(gè)整數(shù);(2)做加法運(yùn)算;(3)運(yùn)算的結(jié)果存放;(4)輸出。main(
){int i,
j,
r;i=-2;
j=-3;r=i+j;printf("
The
sum
is
%d\n",
r);}一個(gè)程序的開始函數(shù)開始的標(biāo)志變量說(shuō)明,申請(qǐng) 空間給出兩個(gè)整數(shù),給變量賦值做加法,并保留和結(jié)果輸出函數(shù)結(jié)束2021/10/2912C語(yǔ)言程序設(shè)計(jì)小結(jié)C程序由函數(shù)構(gòu)成,一個(gè)C源程序至少包含一個(gè)main函數(shù),也可以包含一個(gè)main函數(shù)和若干個(gè)其它函數(shù)。一個(gè)函數(shù)有兩部分組成:函數(shù)頭函數(shù)體C程序書寫格式。每條語(yǔ)句必須以分號(hào)(;)結(jié)束。2021/10/2913作可以用/*和*/對(duì)C程序中的注釋。一個(gè)C程序總是從main函數(shù)開始執(zhí)行的,而不論main函數(shù)在整個(gè)程序中的位置如何。2021/10/29141.3
C語(yǔ)言的上機(jī)操作步驟上機(jī)過(guò)程基本文件:tc.exetlib.exetlink.exetcc.exe
tcconfig.exemake.exethelp.exe
*.lib
*.h編譯正確正確正確有錯(cuò)誤有錯(cuò)誤編輯運(yùn)行2021/10/2915上機(jī)過(guò)程流程圖裝載c程序編輯c程序運(yùn)行c程序(ctrl+F9)正確?是是看結(jié)果(alt+F5)否退出運(yùn)行下一程序?否2021/10/2916編寫、運(yùn)行C程序時(shí)常用功能鍵F3(打開源程序)F2(保存當(dāng)前源程序)F9(編譯當(dāng)前源程序)CTRL+F9(運(yùn)行當(dāng)前源程序)ALT+F5(查看運(yùn)行結(jié)果)2021/10/29172021/10/2918第二章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式C語(yǔ)言的數(shù)據(jù)類型常量與變量運(yùn)算符與表達(dá)式數(shù)據(jù)類型轉(zhuǎn)換2.1C語(yǔ)言的數(shù)據(jù)類型數(shù)據(jù)類型總表:C數(shù)據(jù)類型基本類型構(gòu)造類型指針類型空類型void定義類型typedef枚舉類型enum整型實(shí)型字符類型char數(shù)組結(jié)構(gòu)體struct共用體union短整型short整型int長(zhǎng)整型long單精度型float雙精度型double數(shù)據(jù)類型決定:數(shù)據(jù)占內(nèi)存字節(jié)數(shù)數(shù)據(jù)取值范圍其上可進(jìn)行的操作2021/10/29192021/10/29202.2
常量與變量常量在程序運(yùn)行過(guò)程中,其值不能改變的量。常量有兩種存在形式:直接常量:如:
1,5,34,-234
等都是整型常量5.2,3.14,-34.5
等都是實(shí)型常量字符型常量'A','a','b','!'在下面程序中:main(){
int
a,b,c; a=23;b=87;c=a+b; printf("%d\n",c);
}23和87都是以直接常量形式出現(xiàn)的符號(hào)常量:用一個(gè)標(biāo)識(shí)符來(lái)代表一個(gè)常量。標(biāo)識(shí)符:程序設(shè)計(jì)中用到的變量、符號(hào)常量、函數(shù)等,都要給他們?nèi)€(gè)名字,這些變量名、符號(hào)常量名、函數(shù)名等統(tǒng)稱為標(biāo)識(shí)符。標(biāo)識(shí)符命名規(guī)則:只能由字母、數(shù)字、下劃線組成,并且,名字的第一個(gè)字符只能是字母或下劃線(即不能是數(shù)字)。大小寫敏感不能使用關(guān)鍵字(關(guān)鍵字指c語(yǔ)言中有特定含義的標(biāo)識(shí)符,如例:判斷下列標(biāo)識(shí)符號(hào)sum
Sum
M.D.John
day
Date
3daysstudent_name
#33
lotus_1_2_3char
a>b
_above
$1232021/10/2921符號(hào)常量的定義形式:#define量說(shuō)明:符號(hào)常量名
常要";"加上分號(hào)會(huì)的使行時(shí)后面出用一的(1)
上,符號(hào)常量例符號(hào)常量舉例(ch2_1.c)后面將要介紹的變#definePRICE
30(2)用#define語(yǔ)句定main(){int
num,total;num=10;total=PRICE*num;printf("total=%d",total);}程序運(yùn)行時(shí),該條語(yǔ)句變成
total=30*num;程序運(yùn)行結(jié)果:total=3002021/10/2922若將上例的符號(hào)常量定義語(yǔ)句改為:#define
PRICE30;
,運(yùn)行時(shí),
total=
PRICE
*num;語(yǔ)句將變成為:在看程序,寫結(jié)果:2021/10/2923(3
#define
A
2B
3#definemain(
){ intc;c=A*B;
printf("c=%d\n",c);c=c+A+B;printf("c=%d\n",c);}c=6c=112.2.2
變量程序運(yùn)行過(guò)程中,值可以改變的量。變量不同于常量的是,它一般不直接表示為某一個(gè)特定數(shù)值,而是對(duì)應(yīng)于內(nèi)存中的某個(gè) 空間,所以,一個(gè)完整的變量包含變量名和變量值兩方面含義。main(
){ inta;a=21;…}定義變量a,實(shí)質(zhì)上是在內(nèi)存中分配兩個(gè)字節(jié)的空間,并將這兩個(gè)字節(jié)的空間取名為a往a空間中存入數(shù)值21,21就是a變量此時(shí)的值2021/10/29242021/10/2925說(shuō)明:變量必須先定義再使用。如果使用一個(gè)未定義的變量,編譯時(shí)會(huì)出現(xiàn)諸如"undefinedsymbol
…"此類的錯(cuò)誤提示。變量定義格式:類型 變量名;如:int
a,b,c; float
x,y,z;
等變量命名應(yīng)符合標(biāo)識(shí)符命名規(guī)則2.3
整型數(shù)據(jù)整型常量的表示方法十進(jìn)制形式:如:123,-456,76
等八進(jìn)制形式 以0開頭的八進(jìn)制數(shù)字串??闯绦?寫結(jié)果:main(){
inta,b;a=10;
b=010;printf("%d,%d\n",a,b);}2021/10/292610,8看程序,寫結(jié)果:main(){ inta,b;a=10;
b=018;printf("%d,%d\n",a,b);}十六進(jìn)制形式:以0x或0X開頭的十六進(jìn)制數(shù)字串。如:0x24,0x2f
等。結(jié)果是多少?程序出錯(cuò),018不是正確的八進(jìn)制整數(shù)常量形式2021/10/29272.3.2
整型變量整型數(shù)值在內(nèi)存中的存放:眾所周知,數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式數(shù)據(jù) 可分為有符號(hào)數(shù) 和無(wú)符號(hào)數(shù)的。。有符號(hào)數(shù):可以表示正數(shù)和負(fù)數(shù),有符號(hào)數(shù)
時(shí),單元的最
為符號(hào)位,最為0,表示正數(shù);最為1,表示負(fù)數(shù),其余位為數(shù)值位。如:int
a;a=37;
在turbo
c中,對(duì)于int
型變量,系統(tǒng)會(huì)為它分00000000儲(chǔ)00100101符號(hào)位2021/10/2928
若有:int
a; a=
-37;
又是如何 的呢?在大多數(shù)計(jì)算機(jī)系統(tǒng)中,有符號(hào)數(shù)
采用補(bǔ)碼形式。數(shù)值
形式:原碼、補(bǔ)碼。原碼:+37:00000000
00100101-37:10000000
00100101即:最
表示符號(hào),其余位表示數(shù)值本身的絕對(duì)值。補(bǔ)碼:正數(shù)的補(bǔ)碼和原碼一樣。所以:+37:00000000
00100101負(fù)數(shù)的補(bǔ)碼
形式:假設(shè)x<0,
求x的補(bǔ)碼
方式:求|x|
→
|x|
的二進(jìn)制形式→
按位取反→末位加1問(wèn)題:已知整數(shù)x的二進(jìn)制
形式,求x對(duì)應(yīng)的十進(jìn)制整數(shù)是多少?2021/10/2929無(wú)符號(hào)數(shù):只能表示0和正數(shù),沒(méi)有符號(hào)位,所有數(shù)位都表示數(shù)值。整型變量的分類:基本整型:int短整型:short長(zhǎng)整型:long以上三種類型都是有符號(hào)數(shù)類型無(wú)符號(hào)基本整型:unsigned
int無(wú)符號(hào)短整型:unsigned
short無(wú)符號(hào)長(zhǎng)整型:unsigned
long變量的數(shù)據(jù)類型不同,系統(tǒng)為變量所分配的
空間的字節(jié)數(shù)會(huì)有所不同,變量的取值范圍也會(huì)不同。2021/10/2930整型變量的定義與使用C語(yǔ)言規(guī)定在程序中要用到的變量必須先定義,體開始的 部分。相當(dāng)于:基本整型變量的取值范圍是:-32768~32767有程序:main(){inta=32767,b=
-32768,c,d;c=a+1;d=b-1;printf("c=%d,d=%d\n",c,d);}結(jié)果輸出:c=-32768,d=32767why?2021/10/29312021/10/29322.4
實(shí)型數(shù)據(jù)實(shí)型常量的表示方法十進(jìn)制小數(shù)形式:由數(shù)字和小數(shù)點(diǎn)組成(必須要小數(shù)點(diǎn))如:34.1,0.345,34.
,.23
;但不能只有小數(shù)點(diǎn):.
不代表0.0,是錯(cuò)誤形式。指數(shù)形式:如:12.3e3
代表12.3*103,123e-3說(shuō)明:e后面的指數(shù)部分必須為整常數(shù),不能是小數(shù);e前面的尾數(shù)部分?jǐn)?shù)值可以是整常數(shù),也可以是實(shí)型常數(shù);尾數(shù)部分和指數(shù)部分均不可省略。e10,1.23e2.5,0.5e
都是不合法的浮點(diǎn)數(shù)表示。2.4.2
實(shí)型變量16byte(一般的turbo
c據(jù)分配定的誤差。所以一,要判般不能直接用等于號(hào)判斷。例如:main(){floata=0.2;if (a==0.2)
printf("yes\n");else
printf("no\n");}程序運(yùn)行結(jié)果:2021/10/2933no那如何判斷呢?main(){
floata=0.2;可以將上面的程序改為:if
(fabs(a-0.2)<1e-6)
printf("yes\n");else
printf("no\n");}2021/10/29342021/10/29352.5
字符型數(shù)據(jù)字符常量普通字符常量:?jiǎn)我?hào)括起來(lái)的一個(gè)字符。如:'a','B','!','+','5'等轉(zhuǎn)義字符常量:用單引號(hào)括起來(lái)的以"\"開頭的字符序列。如:'\n','\t','\b','\r','\\','\36','\x21'等P29
例2.42021/10/2936看程序,寫結(jié)果main(){int
l;l=strlen("ab\t\xff\056\\23\n");printf("%d\n",l);}程序執(zhí)行結(jié)果:92.5.2
字符變量一個(gè)字符變量一經(jīng)定義,將對(duì)應(yīng)于內(nèi)存中的空間,該 空間用于存放一個(gè)字節(jié)的字符常量。例如:char
a;a='A';注意:因?yàn)閿?shù)據(jù)在內(nèi)存中是以二進(jìn)制編碼形式存儲(chǔ)的,所以,內(nèi)存中實(shí)際存放的是該字符常量'A'的ASCII碼。2021/10/2937因?yàn)樵趦?nèi)存中,字符數(shù)據(jù)以ASCII碼的二進(jìn)制形式,它的形式就與整數(shù)的形式類似。所以,C語(yǔ)言規(guī)定字符型數(shù)據(jù)和值介于-128到127之間的整型數(shù)據(jù)可以通用。P31
例2.5main(){char
c1,c2;
c1='a';
c2='b';c1=c1-32;
c2=c2-32;printf("%c
%c\n",c1,c2);printf("%d
%d\n",c1,c2);
}2021/10/29382.5.3
字符串常量:一對(duì)雙引號(hào)括起來(lái)的0個(gè)或多個(gè)字符組成的字符串序列。如:"c
program","字符串常量的實(shí)際'\0'
結(jié)束標(biāo)志符o
kitty\n","a\\n"等2021/10/29392021/10/29402.6
運(yùn)算符和表達(dá)式C語(yǔ)言運(yùn)算符分類:算術(shù)運(yùn)算符關(guān)系運(yùn)算符邏輯運(yùn)算符逗號(hào)運(yùn)算符位運(yùn)算符賦值運(yùn)算符等等2021/10/2941運(yùn)算符有關(guān)性質(zhì)目數(shù):運(yùn)算操作數(shù)數(shù)目單目運(yùn)算符、雙目運(yùn)算符、三目運(yùn)算符優(yōu)先級(jí):當(dāng)一個(gè)表達(dá)式中同時(shí)包含多個(gè)運(yùn)算符時(shí),先進(jìn)行運(yùn)算的運(yùn)算符優(yōu)先級(jí)高,后進(jìn)行運(yùn)算的運(yùn)算符優(yōu)先級(jí)低。例如:2+3*4–(2+3)該表達(dá)式中,()運(yùn)算符優(yōu)先級(jí)最高,其次是*,再是+和-結(jié)合性:當(dāng)表達(dá)式中的運(yùn)算符優(yōu)先級(jí)相同時(shí),由運(yùn)算符的結(jié)合性來(lái)決定表達(dá)式的運(yùn)算順序,是從左向右運(yùn)行(左結(jié)合性),還是從右向左運(yùn)行(右結(jié)合性)例如:2+3-4+5
左結(jié)合性2.6.2
算術(shù)運(yùn)算符和表達(dá)式算術(shù)運(yùn)算符?
+、-、*、/、%(求余數(shù))對(duì)于+,*,-運(yùn)算符,操作數(shù)可以是整型或?qū)嵭统A炕蜃兞?運(yùn)算規(guī)則等同于一般的數(shù) 算規(guī)則。對(duì)于/運(yùn)算,操作數(shù)可以是整型或?qū)嵭蛿?shù)據(jù),當(dāng)操作數(shù)中有一個(gè)是實(shí)型,運(yùn)算結(jié)果也是實(shí)型;但若/運(yùn)算兩端的操作數(shù)都是整型,則只做整除運(yùn)算。例如:3/2.0
值為1.5,但3/2
的值為1對(duì)于%運(yùn)算,要求兩端的操作數(shù)必須是整型,若是實(shí)型,則表達(dá)式出錯(cuò)。例如:3%2
結(jié)果為1 3.0%2則是錯(cuò)誤的算術(shù)表達(dá)式。都是雙目運(yùn)算符2021/10/29422021/10/2943優(yōu)先級(jí):*、/、%運(yùn)算符優(yōu)先級(jí)相同,?+、-運(yùn)算符相同,*、/、%的優(yōu)先級(jí)高于+、-結(jié)合性:左結(jié)合性舉例:P33
例2.62.6.3
自增、自減運(yùn)算符(++、--)+)型變量++;;
j++;量可以是變量,變量的k的區(qū)++k;若句,功變+須+相同,都等是值別單價(jià)看程序,寫結(jié)果:main(){intk;k=3;k++;printf("k=%d\n",k);}看程序,寫結(jié)果:main(){intk;k=3;++k;printf("k=%d\n",k);}程序運(yùn)行結(jié)果都是:k=42021/10/29442021/10/2945含看程序,寫結(jié)果:main(
){int
j,k;j=3;k=j++;printf("j=%d,k=程序運(yùn)行結(jié)果:j=4,k=3看程序,寫結(jié)果:main(){int
j,k;j=3;k=++j;printf("j=%d,k=%d\n",j,k);}j=4,k=4算符看程序,寫結(jié)果:main(
){int
x,y,j,k;x=2;y=3;printf("j=%d,k=%d\n",j,k);printf("x=%d,y=%d\n",x,y);}j=15,k=92021/10/2946j=(++x)+(++x)+(++x);
x=5,y=0k=(y--)+(y--)+(y--);2021/10/29472.6.4
賦值運(yùn)算符和賦值表達(dá)式普通賦值運(yùn)算符(=)功能:將一個(gè)數(shù)據(jù)或表達(dá)式的值賦給一個(gè)變量使用方法:變量=變量/常量/表達(dá)式;例如:a=12;
x=y;
b=x*y;
c=a+b;等復(fù)合賦值運(yùn)算符(+=、-=、*=、/=、%=等)例如:a+=3;
等同于
a=a+3;b*=x+y;
等同于
b=b*(x+y);說(shuō)明:賦值運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符2021/10/2948賦值表達(dá)式由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連接起來(lái)的式子。一般形式:變量賦值運(yùn)算符表達(dá)式不帶分號(hào)稱為表達(dá)式,加上分號(hào)就是賦值語(yǔ)句。賦值運(yùn)算符右邊的表達(dá)式可以以變量、常量、表達(dá)式等多種形式出現(xiàn)。如果賦值運(yùn)算符兩側(cè)的變量和表達(dá)式類型不同時(shí),系統(tǒng)將自動(dòng)進(jìn)行類型轉(zhuǎn)換。轉(zhuǎn)換的原則是:以賦值號(hào)左邊變量類型為準(zhǔn)。例如:
int
a;
a=3.4;
最后a的值為3賦值運(yùn)算符右邊的表達(dá)式還可以以賦值表達(dá)式形式出現(xiàn)。例如:int
x,y;
x=y=8;2021/10/2949賦值運(yùn)算符具有右結(jié)合性main(){
int
a,b;a=10;b=a+=a-=a*a;printf("a=%d,b=%d\n",a,b);}程序運(yùn)行結(jié)果:a=-180,b=-1802021/10/29502.6.5
逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式逗號(hào)運(yùn)算符(,)將若干個(gè)表達(dá)式連接起來(lái)逗號(hào)表達(dá)式形式:表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n求解:先計(jì)算表達(dá)式1的值,再計(jì)算表達(dá)式2的值,…,一直計(jì)算到表達(dá)式n的值,整個(gè)逗號(hào)表達(dá)式的值就等于最后一個(gè)表達(dá)式n的值例如:求逗號(hào)表達(dá)式的值以及表達(dá)式中出現(xiàn)的各個(gè)變量的值2+3,x=4,x*=2,y=x+5,22*3a=2,b=a*4,3+25,7-3,a*42021/10/2951逗號(hào)表達(dá)式可以嵌套,如(x=8*2,x*4),x*2逗號(hào)表達(dá)式可以作為賦值運(yùn)算右邊的表達(dá)式x=(i=4,j=6,k=8)逗號(hào)表達(dá)式在所有c語(yǔ)言表達(dá)式中優(yōu)先級(jí)最低,所以:x=(z=5,5*2)
與
x=z=5,5*2
是不同表達(dá)式不是程序中所有的逗號(hào)都是逗號(hào)運(yùn)算符,大多數(shù)情況下,逗號(hào)只作為分隔符使用。2021/10/29522.6.6
條件運(yùn)算符三目運(yùn)算符形式:表達(dá)式1?表達(dá)式2:表達(dá)式3求解:首先計(jì)算表達(dá)式1的值,若表達(dá)式1的值為真
(即不等于0),則求表達(dá)式2的值,并將它作為整個(gè)條件表達(dá)式的值;若表達(dá)式1的值為假(即等于0),則求表達(dá)式3的值,并將它作為整個(gè)表達(dá)式的值。例如:5>3?100:200
表達(dá)式值為多少?已知變量x的初始值為2,y的初始值為3,求條件表達(dá)式的值以及該語(yǔ)句執(zhí)行后x和y變量的值x>y?x+=y:y>2?(y+=x):(y-=x)2.7
不同類型數(shù)據(jù)間的混合運(yùn)算在計(jì)算表達(dá)式時(shí),不但要考慮到運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,還要分析運(yùn)算對(duì)象的數(shù)據(jù)類型。不同類型的數(shù)據(jù)在一起運(yùn)算時(shí),需要轉(zhuǎn)換成相同的數(shù)據(jù)類型。兩種轉(zhuǎn)換方式:自動(dòng)轉(zhuǎn)換:編譯系統(tǒng)自動(dòng)完成轉(zhuǎn)換規(guī)則:
p38
圖2.7解釋:橫向箭頭表示必定的轉(zhuǎn)換,縱向箭頭表示運(yùn)算對(duì)象類型不同時(shí)所作的轉(zhuǎn)換。賦值類型的自動(dòng)轉(zhuǎn)換:表達(dá)式計(jì)算完以后賦值給一個(gè)變量是進(jìn)行的數(shù)據(jù)類型的轉(zhuǎn)換。P38~39強(qiáng)制類型轉(zhuǎn)換形式:(類型名)(表達(dá)式)2021/10/29532021/10/2954第三章順序程序設(shè)計(jì)預(yù)備知識(shí)C語(yǔ)言的基本語(yǔ)句數(shù)據(jù)輸入與輸出順序結(jié)構(gòu)程序設(shè)計(jì)舉例預(yù)備知識(shí)(P5)算法:描述某一問(wèn)題求解的有限步驟。也可以表述如下:算法是為解決一個(gè)問(wèn)題采取的方法和步驟。簡(jiǎn)單的算法舉例:例1:設(shè)有兩個(gè)
A和B,分別盛放了酒和醋,要求將兩個(gè)
的內(nèi)容互換。分析:直接交換A、B
的內(nèi)容會(huì)使得酒和醋摻在一起,顯然不符合要求。在這兒,
應(yīng)首先拿來(lái)一個(gè)空
C,利用它來(lái)幫助完成工作。算法描述(算法3.1)將A將B將C中的酒倒入C中中的醋倒入A中中的酒倒入B中2021/10/2955例2:依次將20個(gè)數(shù)輸入,要求將其中最大的數(shù)輸出。分析:可以定義20個(gè)變量a1,a2,a3,a4,…,a20,分別用于存儲(chǔ)這20個(gè)將要被輸入的數(shù),再定義一個(gè)變量max,用于
最大值,然后對(duì)這20個(gè)變量的值進(jìn)行比較,求出最大值輸出。算法描述(算法3.2.1)(1)從鍵盤輸入20個(gè)數(shù),分別送入a1~a20中存放(2)將a1和a2進(jìn)行比較,取得較大值,放在max中將max與a3進(jìn)行比較,取得他們的較大值,再放入max中,此時(shí),max里存放的是前三個(gè)數(shù)a1,a2,a3的最大值。將max與a4進(jìn)行比較,取得他們的較大值,放入max中,此時(shí),max里存放的是前四個(gè)數(shù)的最大值將max與a5進(jìn)行比較,…………(20)將max與a20進(jìn)行比較,取得較大值放入max中。(21)輸出max.2021/10/2956利用一組數(shù),檢驗(yàn)算法的正確性。如:2
23
45
43
32
56
54
32
34
6通過(guò)上組數(shù)據(jù)的檢驗(yàn),說(shuō)明了算法的可行性,但這個(gè)算法描述起來(lái)過(guò)于麻煩,共分為了21個(gè)步驟,并且,使用了21個(gè)變量,使得以空間和運(yùn)行時(shí)后的程序書寫很麻煩,也在一定程度上存在間的浪費(fèi)。將上述算法進(jìn)行簡(jiǎn)化(算法3.2.2)首先定義變量a,用于接收每次輸入的數(shù);再定義變量x,用于控制輸入的次數(shù),定義變量max,存放最大值(1)從鍵盤輸入一個(gè)數(shù),送入a中,因?yàn)橐呀?jīng)輸入了一次,設(shè)置x的值為1,并將a的值賦給max(2)再輸入一個(gè)數(shù),送入a中,x增1(3)判斷x的值是否小于等于20,如果是,轉(zhuǎn)到(4),否則,轉(zhuǎn)到(5)(4)將max和a進(jìn)行比較,較大值放入max中,轉(zhuǎn)到(2)(5)輸出max也可以用較少的數(shù)據(jù)驗(yàn)證算法3.2.2的可行性2021/10/29572021/10/2958算法的特性:有窮性確定性零個(gè)和多個(gè)輸入一個(gè)和多個(gè)輸出可行性2021/10/2959算法的表示用自然語(yǔ)言描述,如算法3.1,3.2.1,3.2.2等用流程圖表示(P7)C程序三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)
(算法3.1只用到順序結(jié)構(gòu)形式,3.2.1同時(shí)用到順序結(jié)構(gòu)和選擇結(jié)構(gòu)形式,算法3.2.2中3種基本結(jié)構(gòu)都有涉及到)流程圖符號(hào)利用傳統(tǒng)流程圖表示算法3.1,3.2.1和算法3.2.2注意:算法只是說(shuō)明完成一項(xiàng)工作的步驟,只有將算法中的每個(gè)步驟用C語(yǔ)言的語(yǔ)句描述出來(lái),才是程序。3.1
C語(yǔ)言的基本語(yǔ)句一個(gè)實(shí)際的C程序是一系列語(yǔ)句的集合,每一條語(yǔ)句都用來(lái)完成一定的操作任務(wù),C程序的每一條語(yǔ)句都要有分號(hào)結(jié)束,但變量
部分不算嚴(yán)格意義上的C語(yǔ)句。main(
){
int
a,b;a=2;
b=++a;printf("%d,%d\n",a,b);}嚴(yán)格說(shuō)來(lái),應(yīng)不稱為語(yǔ)句。C語(yǔ)句分為以下幾類:(1)控制語(yǔ)句
(2)函數(shù)調(diào)用語(yǔ)句(3)表達(dá)式語(yǔ)句
(4)空語(yǔ)句(5)復(fù)合語(yǔ)句2021/10/29602021/10/29613.2
數(shù)據(jù)輸入與輸出數(shù)據(jù)的"輸入"和"輸出"是相對(duì)于計(jì)算機(jī)主機(jī)而言的。C語(yǔ)言本身不提供輸入輸出語(yǔ)句,輸入輸出操作是通過(guò)調(diào)用庫(kù)函數(shù)來(lái)實(shí)現(xiàn)的,例如:printf和scanf就是c語(yǔ)言中用于實(shí)現(xiàn)數(shù)據(jù)輸入、輸出的庫(kù)函數(shù)之一。因?yàn)閏語(yǔ)言的輸入輸出庫(kù)函數(shù)都位于一個(gè)名為stdio.h的頭文件中,所以,每一個(gè)c語(yǔ)言程序的開始都要用下面的編譯預(yù)處理命令將該頭文件包括到用戶編輯的文件中去。#include
"stdio.h"
或
#include
<stdio.h>2021/10/29623.2.1
字符數(shù)據(jù)的輸入輸出字符輸出函數(shù)putchar語(yǔ)法:putchar(字符常量或字符變量);功能:將括號(hào)內(nèi)的字符常量或字符變量的值顯示在屏幕上。如:#include
<stdio.h>main(
){
char
c;c='A';
putchar('c');putchar('\n');
putchar(c);}cA字符輸入函數(shù)getchar語(yǔ)法:getchar(
);
注意:()內(nèi)為空在程序執(zhí)行時(shí)從鍵盤上輸入一個(gè)字鍵的在鍵字字放車的個(gè)戶先回入一的例:#include
<stdio.h>main(
){
char
c;c=getchar(
);putchar(c);}例:#include<stdio.h>main(){putchar(getchar(
));}2021/10/29633.2.2
格式化輸入與輸出格式化輸出函數(shù)printf串,用息:(1)普通字符和轉(zhuǎn)義字符常量,普通字符原樣輸轉(zhuǎn)義字符按所表示的字符含義輸出;(2)格式說(shuō)明:如%d,%c等形式的字符串,指定出表列中相應(yīng)的變量或表達(dá)式的值的輸出形例如:若已知整型變量a的值為65,整型變量b的值為97,程序中有輸出語(yǔ)句:printf("a=%d,%c\nx=%d\n",
a
,
b
,
a+b);輸出結(jié)果為()。a=65,ax=1622021/10/2964輸出表列其實(shí)就是輸出內(nèi)容,可以是變量、常量或者。?出相?;如:p格?是注
輸對(duì)
目同當(dāng)式%,若,則左端補(bǔ)空格,若數(shù)據(jù)實(shí)際m際例如:main(){
inta,b;clrscr();/*清屏*/a=123,b=12345;printf("************************");printf("%d,%2d,%d,%10d\n",a,a,b,b);結(jié)果:2021/10/2965123,123,12345,12345
位數(shù)輸出。2021/10/2p9rintf("%ld\n",l); printf("%d\n",l);
}66(3)%-md
m是正整數(shù),指明數(shù)據(jù)輸出所占列數(shù),若數(shù)據(jù)位數(shù)小于m,則右端補(bǔ)空格,若數(shù)據(jù)實(shí)際位數(shù)大于m,則按實(shí)際位數(shù)輸出。main(){
inta,b;
a=123,b=12345;printf("********************\n");printf("%-2d,%-10d,%d\n",a,b,b);
}(4)%ld
用于輸出長(zhǎng)整型數(shù)據(jù)。也可使用%mld、%-mld形式。
main(){
long
l=65536;Printf
("#################\n");2021/10/2967main(){
long
l=32000;printf("#################\n");printf("%ld,%-3ld\n",l,l);printf("%8ld,%-8ld,%d\n",l,l,l);}
注意:基本整型數(shù)據(jù)用%ld格式輸出,也會(huì)出錯(cuò)。如:main(){int
a=12;printf("%ld\n",a);}2021/10/2968%o、%mo、%-mo
以八進(jìn)制形式輸出基本整型整數(shù)%lo
以八進(jìn)制形式輸出長(zhǎng)整型整數(shù)%x、%mx、%-mx
以十六進(jìn)制形式輸出基本整型整數(shù)%lx
以十六進(jìn)制形式輸出長(zhǎng)整型整數(shù)如:eg1:main(
){ int
a=012,
b=34;printf("%d,%d,%o,%o",a,b,a,b);}eg2:main(
){ int
a=012,b=0x34;printf("%x,%x,%d",a,b,b);}2021/10/2969%u
一般用于輸出無(wú)符號(hào)整數(shù),但一個(gè)有符號(hào)整數(shù)也可以用%u格式輸出,同樣,一個(gè)無(wú)符號(hào)整數(shù)也可以用%d格式輸出。例:main(){
unsigned
u=65535; int
a=-1;printf("%u,%u\n",u,a);printf("%d,%d\n",u,a);}%c、%mc、%-mc以字符形式輸出。例:main(){ char
c='\101';printf("%c\n",c);printf("%d\n",c);printf("%3c\n",c);}%f
以小數(shù)形式輸出實(shí)型(包括單、雙精度)數(shù)據(jù)值%f
不指定輸出寬度,由系統(tǒng)自動(dòng)指定,使整數(shù)部分全部如數(shù)輸出,并輸出6位小數(shù)。例:main(){ floatf1=3.54,f2=3.54678892;printf("%f,%f\n",f1,f2);
}注:double類型的數(shù)據(jù)用%lf格式輸出,也可以用%f格式輸出。%m.nf
指定輸出的數(shù)據(jù)共占m列,其中有n位小數(shù)。如果(整數(shù)部分位數(shù)+1+n)<m,則左端補(bǔ)空格。小數(shù)點(diǎn)2021/10/29702021/10/2971若(整數(shù)部分位數(shù)+1+n)>=m
,輸出占(整數(shù)部分位數(shù)+1+n)列。例:main(){float
f=123.375;printf("%f,%10f,%10.2f\n",f,f,f);printf("%.2f,%-10.2f\n",f,f);}注意:整型數(shù)據(jù)不能以%f形式輸入或輸出,同樣,實(shí)型數(shù)據(jù)也不能用%d格式輸入輸出。2021/10/2972格式化輸入函數(shù)scanf用于在程序運(yùn)行時(shí),由用戶自行輸入數(shù)值送入相應(yīng)變量保存。語(yǔ)法:scanf(格式控制,地址表列);說(shuō)明:格式控制含義與printf中的相同,地址表列一般是由若干個(gè)變量的地址組成的。例:用scanf函數(shù)輸入數(shù)據(jù),并用printf函數(shù)輸出。main(){
int
a,b; float
f,d;scanf("%d%d",&a,&b);scanf("%f,%f",&f,&d);printf("%d##%d##%f##%f\n",a,b,f,d);}說(shuō)明:c語(yǔ)言程序執(zhí)行時(shí),首先會(huì)找到main函數(shù),然后按順序執(zhí)行main函數(shù) 的每條語(yǔ)句,當(dāng)遇到scanf語(yǔ)句時(shí),程序會(huì)暫停,等待用戶輸入數(shù)據(jù)后按回車,才繼續(xù)向下運(yùn)行,運(yùn)行到main函數(shù)的最后一條語(yǔ)句后,運(yùn)行結(jié)束,可以看結(jié)果了。用戶輸入時(shí)應(yīng)按格式控制部分要求的格式輸入,否則會(huì)出錯(cuò)。格式控制部分若有普通字符,按原樣輸入。(注:scanf函數(shù)的格式控制部分中,不應(yīng)該出現(xiàn)轉(zhuǎn)義字符。)格式控制部分若有格式說(shuō)明符,如%d,%f等,要求輸入相應(yīng)格式的數(shù)據(jù)。2021/10/2973思考:像上例的scanf("%d%d",&a,&b);語(yǔ)句,格式說(shuō)明部分只要求輸入兩個(gè)十進(jìn)制整數(shù),并且兩個(gè)%d相連,之間沒(méi)有任何間隔符,那么在輸入的時(shí)候是不是直接輸入兩個(gè)相連的整數(shù)呢?2021/10/29742021/10/2975若輸入語(yǔ)句格式控制為"%d%d",那么在輸入兩個(gè)整數(shù)時(shí),在數(shù)據(jù)之間以一個(gè)或多個(gè)空格間隔,也可以用回車鍵、tab鍵間隔。若輸入語(yǔ)句格式控制為"%d,%d",那么在輸入兩個(gè)整數(shù)時(shí),在數(shù)據(jù)之間必須以","間隔。若輸入語(yǔ)句格式控制為"a=%d,#%d",那么在輸入時(shí),應(yīng)首先輸入:a=,再輸入一個(gè)整數(shù),接著輸入,#,然后輸入下一個(gè)整數(shù)。若輸入語(yǔ)句為scanf("%c%c%c",&a,&b,&c);
又希望用戶輸入后a,b,c變量的值分別是'a'、'A'、'd',正確的輸入格式應(yīng)是什么?3.3
順序結(jié)構(gòu)程序設(shè)計(jì)舉例例1:輸入一個(gè)華氏溫度,要求輸出對(duì)應(yīng)的攝氏溫度(保留兩位小數(shù)),轉(zhuǎn)換公式為c=5/9(f-32)。分析問(wèn)題,找出求解問(wèn)題的方法和步驟(簡(jiǎn)稱問(wèn)題求解的算法)。該問(wèn)題的求解步驟很簡(jiǎn)單,首先要從鍵盤輸入一個(gè)華氏溫度,
在一個(gè)變量里,供以后做華氏溫度向攝氏溫度的轉(zhuǎn)換用;接著,使用轉(zhuǎn)換公式,將轉(zhuǎn)換后的攝氏溫度值保存在另一變量中,等待輸出;然后輸出該攝氏溫度值。2021/10/29762021/10/2977用c語(yǔ)言語(yǔ)句描述上面的算法,寫成完整的程序。main(){
float
f,c;
scanf("%f",&f);c=5.0/9*(f-32);
printf("%.2f\n",c);}書寫程序時(shí),注意:首先,應(yīng)考慮程序中要使用幾個(gè)變量,每個(gè)變量的含義及類型(2)變量應(yīng)在有了確定值后,才可以使用(3)數(shù)學(xué)表達(dá)式到c語(yǔ)言表達(dá)式的轉(zhuǎn)換2021/10/2978例2:輸入兩個(gè)整數(shù),分別存放在變量a和b中,要求將這兩個(gè)變量的值互換,輸出它們的值。分析:完成該問(wèn)題的算法可分為以下幾步:輸入兩個(gè)數(shù),分別存入a和b中(2)將a,b變量的值相互交換(3)輸出交換后的a和b的值問(wèn)題是:第(2)步如何具體實(shí)現(xiàn)?main(){inta,b,c;scanf("%d,%d",&a,&b);:a=%d,b=%d\n",a,b);printf("c=a;a=b;b=c;printf("later:a=%d,b=%d\n",a,b);}2021/10/29792021/10/2980例3:編寫c程序,按下列公式計(jì)算并輸出s的值,其中,a和b的值由鍵盤輸入。s=2ab/(a+b)2分析:求解該問(wèn)題的算法分為以下幾步輸入a和b的值由公式計(jì)算出s的值
(3)輸出s2021/10/2981main(
){float
a,b,s;scanf("%f,%f",&a,&b);s=2*a*b/((a+b)*(a+b));printf("s=%f\n",s);}2021/10/2982若程序如下,則不能實(shí)現(xiàn)題意要求的功能。為什么?main(){inta,b; floats;scanf("%d,%d",&a,&b);s=2*a*b/((a+b)*(a+b));printf("s=%f\n",s);}思考:如果要求對(duì)上面的程序作修改,但不允許改變變量的類型,使程序仍能實(shí)現(xiàn)題意要求的功能,應(yīng)該怎么辦?2021/10/29832021/10/2984第四章選擇、循環(huán)程序設(shè)計(jì)關(guān)系運(yùn)算符、關(guān)系表達(dá)式邏輯運(yùn)算符、邏輯表達(dá)式選擇結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)2021/10/29854.1
關(guān)系運(yùn)算符與關(guān)系表達(dá)式關(guān)系運(yùn)算符功能:進(jìn)行數(shù)據(jù)的大小關(guān)系比較運(yùn)算符:<、<=、>=、>、==、!=都是雙目運(yùn)算符,進(jìn)行兩個(gè)操作數(shù)的大小比較。優(yōu)先級(jí):(1)
<、<=、>=、>
高于
==、!=(2)算術(shù)運(yùn)算符優(yōu)先級(jí)高于關(guān)系運(yùn)算符(3)賦值運(yùn)算符優(yōu)先級(jí)低于關(guān)系運(yùn)算符結(jié)合性:(優(yōu)先級(jí)相同時(shí)考慮)左結(jié)合性2021/10/29864.1.2
關(guān)系表達(dá)式用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來(lái)的式子關(guān)系表達(dá)式求值:關(guān)系表達(dá)式的結(jié)果只有兩種可能,關(guān)系成立,值為1;關(guān)系不成立,值取0。例如:求下列表達(dá)式的值。(2)2*5==3(4)(a=5)<7(6)5>4>3(1)5>3(3)a=5<3(5)1!=3>4(7)3<4<52021/10/29874.2
邏輯運(yùn)算符和邏輯表達(dá)式邏輯運(yùn)算符進(jìn)行邏輯"與"、"或"、"非"運(yùn)算運(yùn)算符:&&、||
、!&&、||
是雙目運(yùn)算符,!是單目運(yùn)算符優(yōu)先級(jí):!高于算術(shù)運(yùn)算符算術(shù)運(yùn)算符高于關(guān)系運(yùn)算符關(guān)系運(yùn)算符高于&&&&
高于||||
高于賦值運(yùn)算符(3)!(3>5)2021/10/29884.2.2
邏輯表達(dá)式用邏輯運(yùn)算符將運(yùn)算對(duì)象連接起來(lái)形成的式子。邏輯表達(dá)式求值:邏輯表達(dá)式的結(jié)果也只有兩種可能性,邏輯關(guān)系成立(為"真"),值為1;否則(為"假"),值為0例如:(1)(5>3)&&(1+3>6)(2)(5>3)||(1+3>6)2021/10/2989邏輯表達(dá)式中,運(yùn)算對(duì)象還可以是任一種類型數(shù)據(jù),運(yùn)算時(shí),不必關(guān)心運(yùn)算對(duì)象的具體類型,只用判斷它是否為0即可。例如:(2)'a'&&'b'(4)0||7(1)!7(3)'a'&&0(5)!0||0(6)5<3&&2||8>4
-
!02021/10/2990在計(jì)算邏輯表達(dá)式時(shí),注意以下情況:表達(dá)式1
&&表達(dá)式2首先計(jì)算表達(dá)式1的值,若表達(dá)式1的值為0,不需要計(jì)算表達(dá)式2,就可以知道整個(gè)邏輯表達(dá)式的值為0;所以,只有在表達(dá)式1的值不為0時(shí),才計(jì)算表達(dá)式2。例如:main(){ int
a,b,c,d,e,l;
b=2;c=3;d=5;e=7;l=(a=b>c)&&(d=d+e);printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,l);}2021/10/2991main(){ int
a,b,c,d,e,l;
b=3;c=2;d=5;e=7;l=(a=b>c)&&(d=d+e);printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,l);}(2)表達(dá)式1
||
表達(dá)式2首先計(jì)算表達(dá)式1的值,若表達(dá)式1結(jié)果不為0,整個(gè)邏輯表達(dá)式結(jié)果肯定為1,無(wú)須求表達(dá)式2;只有表達(dá)式1的值求出為0,才需要求解表達(dá)式2。2021/10/2992注意:c語(yǔ)言邏輯表達(dá)式與數(shù)學(xué)式子的區(qū)別。例如:int a=8,b=5,
c=2數(shù)學(xué)式子a>b>c,在c語(yǔ)言中應(yīng)這樣寫a>b
&&
b>c2021/10/29934.3
選擇結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)程序設(shè)計(jì)過(guò)程比較簡(jiǎn)單,只需考慮清楚求解問(wèn)題的方法和步驟,然后嚴(yán)格按照步驟的先后順序關(guān)系來(lái)書寫和運(yùn)行程序即可。選擇結(jié)構(gòu)程序設(shè)計(jì)在順序結(jié)構(gòu)程序設(shè)計(jì)基礎(chǔ)的上增加了根據(jù)某個(gè)條件的成立與否,選擇相應(yīng)分支來(lái)實(shí)現(xiàn)的功能。2021/10/2994例如:(1)從鍵盤輸入兩個(gè)整數(shù),求和,輸出。(2)從鍵盤輸入兩個(gè)整數(shù),求較大值,輸出。例題(1)是順序結(jié)構(gòu)程序設(shè)計(jì)的例子,它的實(shí)現(xiàn)由三個(gè)步驟組成,首先從鍵盤輸入兩個(gè)整數(shù)(用scanf語(yǔ)句實(shí)
現(xiàn)),其次,做這兩個(gè)整數(shù)的加法運(yùn)算(用賦值語(yǔ)句實(shí)現(xiàn)),最后輸出和(printf語(yǔ)句)。例題(2)的實(shí)現(xiàn)步驟也可以分為三步:1、從鍵盤輸入兩個(gè)整數(shù)(scanf),2、對(duì)兩個(gè)整數(shù)求較大值,3、輸出較大值(printf)。2021/10/2995例題(2)的三個(gè)步驟看起來(lái)也是順序結(jié)構(gòu)的,因?yàn)樗麄兊捻樞蜿P(guān)系在書寫和執(zhí)行程序時(shí)也是要嚴(yán)格遵循的。但關(guān)鍵在于步驟2的實(shí)現(xiàn)僅僅利用順序結(jié)構(gòu)程序設(shè)計(jì)是不行的。步驟2如何實(shí)現(xiàn)呢?用流程圖描述程序的算法(解題方法和步驟)傳統(tǒng)流程圖符號(hào):起止框輸入輸出框處理框判斷框流程線2021/10/2996例題(1)的算法用傳統(tǒng)流程圖表示。開始輸入整數(shù)送a,b變量c賦值為a+b輸出c結(jié)束2021/10/2997例題(2)的算法用流程圖描述開始輸入值送a,b變量a>b?Ymax賦值為amax賦值為bN求a,b的較大值2021/10/2998輸出max結(jié)束2021/10/2999有兩種語(yǔ)句可以實(shí)現(xiàn)選擇結(jié)構(gòu)程序設(shè)計(jì),它們分別是if和switch語(yǔ)句。if語(yǔ)句if語(yǔ)句三種使用形式:(1)if
(表達(dá)式)
語(yǔ)句含義:如果表達(dá)式為"真"(即不等于0),執(zhí)行表達(dá)式后面的語(yǔ)句。例如:寫程序,實(shí)現(xiàn):從鍵盤上輸入一個(gè)整數(shù),求它的絕對(duì)值,輸出。2021/10/29100寫出下面語(yǔ)句段的結(jié)果。if
(3)
printf("ok\n");
inta;a=10;if
(a=5+6)
printf("%d\n",a);int
a,b,c;a=9;
b=5;if
(a>b)
{c=a;
a=b;
b=c;}printf("%d,%d\n",a,b);2021/10/29101(2)if
(表達(dá)式)
語(yǔ)句1
else
語(yǔ)句2含義:如果表達(dá)式的值為"真"(即為非0數(shù)),執(zhí)行語(yǔ)句1;否則(表達(dá)式值為"假"(即為0)),執(zhí)行語(yǔ)句2編程實(shí)現(xiàn),求兩個(gè)整數(shù)的較大值,輸出P60
例4.1用if
(表達(dá)式)
語(yǔ)句1
else
語(yǔ)句2
形式實(shí)現(xiàn)。2021/10/29102P60
例4.1main(){inta,b,max;printf("input
twonumbers:");scanf("%d,%d",&a,&b);max=a;if(max<b)max=b;printf("max=%d",max);}2021/10/29103(3)if
(表達(dá)式1)
語(yǔ)句1elseif(表達(dá)式2)
語(yǔ)句2elseif(表達(dá)式3)
語(yǔ)句3…elseif(表達(dá)式n-1)
語(yǔ)句n-1else
語(yǔ)句nP61
例4.3注意事項(xiàng),見P622021/10/29104P61
例4.3main(){intscore;printf("input
score:");scanf("%d",&score);if
(score<0||score>100)
printf("score
error\n");else
if(score<60)printf("bujige\n");else
if(score<70)
printf("jige\n");else
if(score<80)
printf("zhong\n");else
if(score<90)
printf("lianghao\n");else
printf("youxiu\n");}2021/10/29105if語(yǔ)句的嵌套
if語(yǔ)句的執(zhí)行語(yǔ)句又是if語(yǔ)句的情況,稱為if語(yǔ)句的嵌套。例如:if (表達(dá)式1)if (表達(dá)式2)
語(yǔ)句1else
語(yǔ)句2該種形式的if語(yǔ)句應(yīng)理解成什么含義?在if語(yǔ)句的嵌套使用中,注意:else總是與它前面最近的未匹配的if配對(duì)??闯绦?寫結(jié)果:main(){int a,
b;
a=2;b=3;if
(a<b)if
(b>4) {
a=a+b;
b=b-a;
}else
{
a=a-b; b=b+a;}printf("a=%d,b=%d\n",a,b);}2021/10/29106(2)
if (表達(dá)式1)if (表達(dá)式2)
語(yǔ)句1else
語(yǔ)句2elseif(表達(dá)式3)
語(yǔ)句32021/10/29107(3)
if (表達(dá)式1){
if
(表達(dá)式2)else語(yǔ)句1
}if (表達(dá)式3)
語(yǔ)句2else
語(yǔ)句32021/10/291082021/10/291094.3.2
switch語(yǔ)句(進(jìn)行多分支選擇)一般形式:switch (表達(dá)式){case
常量表達(dá)式1:語(yǔ)句1case
常量表達(dá)式2:語(yǔ)句2case
常量表達(dá)式3:語(yǔ)句3……case
常量表達(dá)式n:
語(yǔ)句ndefault
:
語(yǔ)句n+1}2021/10/29110說(shuō)明:
switch后面括號(hào)中的表達(dá)式,一般情況下,結(jié)果應(yīng)為整型或字符型
switch語(yǔ)句執(zhí)行時(shí),首先計(jì)算表達(dá)式的值,并依次與
case后的各個(gè)常量表達(dá)式的值進(jìn)行比較,當(dāng)表達(dá)式的值與某一個(gè)case后的常量表達(dá)式的值相等時(shí),執(zhí)行此
case后面的語(yǔ)句。若所有的case中的常量表達(dá)式的值都沒(méi)有與表達(dá)式的值匹配的,就執(zhí)行default后面的語(yǔ)句。(P64)每一個(gè)case后面的常量表達(dá)式的值必須互不相同。各個(gè)case
和default
的出現(xiàn)順序不影響執(zhí)行結(jié)果。2021/10/29111例題:從鍵盤輸入一個(gè)0到6的數(shù)字,輸出對(duì)應(yīng)的從"sunday"到"saturday"的英文單詞。
(P65)選擇結(jié)構(gòu)程序設(shè)計(jì)舉例2021/10/291124.4
循環(huán)結(jié)構(gòu)程序設(shè)計(jì)4.4.1
循環(huán)語(yǔ)句先看一個(gè)例題:某班有50名學(xué)生,現(xiàn)要求從鍵盤上輸入每個(gè)人的數(shù)學(xué)成績(jī),計(jì)算出平均分并輸出。例題分析:按前面學(xué)習(xí)過(guò)的順序結(jié)構(gòu)程序設(shè)計(jì)方法,應(yīng)事先定義好
50個(gè)實(shí)型變量a1,a2,a3,…,a50,用于接收用戶從鍵盤輸入的50個(gè)學(xué)生的數(shù)學(xué)成績(jī);另外,還得定義兩個(gè)變量
sum和aver,分別用于存放總成績(jī)和平均分。2021/10/29113算法用流程圖表示如下:開始輸入50個(gè)成績(jī)送入a1,a2,…a50中求a1,a2,…,a50的和,賦值給sumaver賦值為sum/50輸出aver結(jié)束該程序在設(shè)計(jì)及書寫過(guò)程中,使用了過(guò)多的(52個(gè))變量,造成 空間的浪費(fèi)以及程序書寫的麻煩,應(yīng)該對(duì)其進(jìn)行改進(jìn)。其實(shí),
可以邊輸入邊求和(此時(shí)求的是部分和),等50個(gè)學(xué)生的成績(jī)都輸入完畢,就可以獲得總分和平均分。采用邊輸入邊求已經(jīng)輸入過(guò)的成績(jī)的和的方法解決該問(wèn)題時(shí),只需定義四個(gè)變量,分別為a,
sum,
i和
aver;其中,a用于接收每次輸入的一個(gè)學(xué)生成績(jī),sum用于存放輸入時(shí)求得的部分和,aver用于存放平均分,而
i用于控制輸入的次數(shù)。2021/10/29114新的算法用流程圖表示如下:開始輸入第i個(gè)學(xué)生的成績(jī),送入a中sum賦值為sum+ai賦初始值為1,sum初始值也設(shè)為0i=i+1aver=sum/50輸出aver結(jié)束2021/10/29115i<=50?Y
N
由上例可見,在有些程序的實(shí)現(xiàn)過(guò)程中,需要在給定條件成立時(shí),反復(fù)執(zhí)行某個(gè)程序段,直至條件不成立為止,這種程序設(shè)計(jì)結(jié)構(gòu)就稱為循環(huán)結(jié)構(gòu)。
以后將給定條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。下面,將介紹實(shí)現(xiàn)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)的語(yǔ)句,簡(jiǎn)稱循環(huán)語(yǔ)句。2021/10/29116(1)while語(yǔ)句一般形式:while (表達(dá)式)
語(yǔ)句語(yǔ)義:當(dāng)表達(dá)式為真(不為0)時(shí),執(zhí)行后面的語(yǔ)句,直到表達(dá)式為假(等于0),退出本循環(huán)。while語(yǔ)句對(duì)應(yīng)的流程圖為:注意:若表達(dá)式為真時(shí),循環(huán)體部分是由多條語(yǔ)句組成的,應(yīng)將它表示成復(fù)合語(yǔ)句形式。表達(dá)式Y(jié)N循環(huán)體語(yǔ)句2021/10/291172021/10/29118前面的例題寫成C程序:main(){
int
i;
float
a,sum,aver;i=1;
sum=0;while
(i<=50){
scanf("%f",&a);sum=sum+a;i++;
}aver=sum/50;printf("average=%.1f\n",aver);
}2021/10/29119使用while語(yǔ)句應(yīng)注意以下幾點(diǎn):while語(yǔ)句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,只要表達(dá)式的值不為0,就執(zhí)行循環(huán)體部分語(yǔ)句。在循環(huán)體中,應(yīng)包含使循環(huán)趨向于結(jié)束的語(yǔ)句,以避免出現(xiàn)死循環(huán)。例如:求1+2+3+4+…+1002021/10/29120main(){int
sum,i;sum=0;
i=1;while(i<=100){ sum=sum+i;
i++;
}printf("sum=%d\n",sum);
}(2)
do-while語(yǔ)句一般形式:do
語(yǔ)句
while
(表達(dá)式);語(yǔ)義:先執(zhí)行一次循環(huán)體語(yǔ)句,再判別表達(dá)式的值,若表達(dá)式的值為真(不等于0)則繼續(xù)循環(huán),直到表達(dá)式值為假(等于0),才退出循環(huán)。do-while語(yǔ)句流程圖:循環(huán)體語(yǔ)句Y2021/10/29121表達(dá)式N2021/10/29122do-while語(yǔ)句是先執(zhí)行后判斷,所以,至少執(zhí)行一次循環(huán)體,而while語(yǔ)句要求先判斷后執(zhí)行,循環(huán)體語(yǔ)句可能一次都不執(zhí)行。一般情況下,while和do-while語(yǔ)句可以相互轉(zhuǎn)換。(3)for語(yǔ)句一般形式:for
(表達(dá)式1;表達(dá)式2;表達(dá)式3)
語(yǔ)句執(zhí)行過(guò)程:表達(dá)式1循環(huán)體語(yǔ)句表達(dá)式3表達(dá)式2Y2021/10/29123N2021/10/29124for
語(yǔ)句可以轉(zhuǎn)換成以下形式語(yǔ)句:表達(dá)式1;while(表達(dá)式2){語(yǔ)句表達(dá)式3;}2021/10/29125使用說(shuō)明:表達(dá)式1只在循環(huán)開始時(shí)執(zhí)行一次,一般是賦值表達(dá)式,用于對(duì)循環(huán)變量賦初始值,若在for語(yǔ)句之前已經(jīng)給循環(huán)變量賦過(guò)初始值,則可在for語(yǔ)句中省略該表達(dá)式,此時(shí)應(yīng)注意:表達(dá)式1后的分號(hào)不能省略!例如:用for語(yǔ)句求階乘n!(n的值由用戶從鍵盤輸入)main(){ int
n,i; float
fact=1;
scanf("%d",&n);for
(i=1;i<=n;
i++)
fact=fact*i;printf("%d!=%.0f\n",n,fact);
}2021/10/29126上面的程序也可寫成:main(){int
i,n; float
fact;scanf("%d",&n);for
(fact=1,i=1;i<=n;i++)
fact=fact*i;printf("%d!=%.0f\n",n,fact);}此處,表達(dá)式1是逗號(hào)表達(dá)式(順序求解表達(dá)式),用于為變量fact和i賦初始值。2021/10/29127上面的程序還可寫成:main(){int
i=1,n; float
fact=1;
scanf("%d",&n);for
(
;i<=n;i++)
fact=fact*i;printf("%d!=%.0f\n",n,fact);}此處,表達(dá)式1省略,應(yīng)為需要賦初始值的變量已經(jīng)在for語(yǔ)句之前被賦了值。但表達(dá)式1后的分號(hào)不能省略!否則,表達(dá)式2就會(huì)被當(dāng)成表達(dá)式1?;蛘呤荘71的形式。2021/10/29128表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,表示循環(huán)條件。for語(yǔ)句的表達(dá)式2一般不能省略,否則不對(duì)循環(huán)條件進(jìn)行判斷,將造成無(wú)限循環(huán)。表達(dá)式3一般是賦值語(yǔ)句或自增、自減語(yǔ)句,用來(lái)修改循環(huán)變量的值,從而使循環(huán)能趨向
于結(jié)束,避免出現(xiàn)死循環(huán)。表達(dá)式3可以省略,此時(shí),應(yīng)將表達(dá)式3的內(nèi)容寫在循環(huán)體語(yǔ)句中。2021/10/29129main(){int
i=1,n; float
fact=1;
scanf("%d",&n);for
(
;
i<=n;
){
fact=fact*i;
i++;
}printf("%d!=%.0f\n",n,fact);}舉一反三:編程序,求1*3*5*7*…*(2n-1),其中,n的值由用戶從鍵盤輸入。分別用while、do
while以及for語(yǔ)句來(lái)實(shí)現(xiàn)!2021/10/291304.4.2
轉(zhuǎn)移語(yǔ)句程序中的語(yǔ)句通??偸前错樞蚍较蚧虬凑Z(yǔ)句功能所定義的方向執(zhí)行的。如果需要改變語(yǔ)句的正常流向,可以使用下面將要介紹的轉(zhuǎn)移語(yǔ)句。break語(yǔ)句使用格式:break;兩種使用場(chǎng)合:一是在switch語(yǔ)句中使用,用于執(zhí)行某一分支對(duì)應(yīng)的語(yǔ)句后,退出switch語(yǔ)句.二是在循環(huán)語(yǔ)句while、dowhile、for語(yǔ)句中使用,用于結(jié)束本層循環(huán),轉(zhuǎn)去執(zhí)行后面的程序。2021/10/29131例1:P73例4.13例2:從鍵盤任意輸入兩個(gè)正整數(shù),求他們的最大公約數(shù)和最小公倍數(shù)。main(){ int
m,
n,
c,
gy,
gb;
scanf("%d,%d",&m,&n);if
(m>n) {
c=m;m=n;n=c;
}for
(gy=m;gy>=1;gy
--)if
(m%gy==0&&n%gy==0)
break;gb=m*n/gy;printf("gy=%d,gb=%d\n",gy,gb);}2021/10/29132(2)continue語(yǔ)句語(yǔ)句格式:continue;說(shuō)明:只能用于循環(huán)體中,其作用是結(jié)束本次循環(huán),即不再執(zhí)行本次循環(huán)體中continue語(yǔ)句之后的語(yǔ)句,轉(zhuǎn)去判斷循環(huán)條件是否成立。上題程序等同于:main(){ int
n;for
(n=7;n<=100;n++)if
(n%7==0)
printf("%d",n);}2021/10/291334.4.3
循環(huán)嵌套一個(gè)循環(huán)語(yǔ)句的循環(huán)體內(nèi)包含另一個(gè)完整的循環(huán)語(yǔ)句,稱為循環(huán)的嵌套。循環(huán)嵌套有多種形式。如:P75例如:計(jì)算1到10的階乘并輸出,若計(jì)算得的階乘值大于5000,則退出循環(huán),不再繼續(xù)計(jì)算。找出100以內(nèi)的所有素?cái)?shù),并輸出。求1!+2!+…+n!(n值由用戶從鍵盤輸入)。例題(1)的算法流程圖:j
=
1j<=10Y求出
j!j++Yj!<=5000輸出
j!
N
N結(jié)束2021/10/29134分析:這里要注意一點(diǎn),在計(jì)算出了n!后,接著計(jì)算(n+1)!時(shí),不需要再在初值1的基礎(chǔ)上從1一直乘到n,而是可以直接利用剛求每次需要過(guò)的n!的值。所以,定義兩個(gè)變量:j和fact;j用于求階乘的數(shù),fact
用于存放j的階乘值。程序如下:main(){
int
j;
float
fact;
j=1;
fact=1;while(j<=10){
fact=fact*j;if
(fact<=5000){
printf("%d!=%.0f\n",j,fact);
j++;}else
break
}
}2021/10/291352021/10/29136
也可以寫成:main(){int
j;
float
fact;while
(j<=10){
fact=fact*j;if(fact>5000)j=1;fact=1;break
;printf("%d!=%.0f\n",j,fact);j++;}}2021/10/29137小結(jié):循環(huán)程序設(shè)計(jì)中經(jīng)常會(huì)使用窮舉法,即將所有可能出現(xiàn)的情況全部考慮到,在一一驗(yàn)證。例如:求水仙花數(shù)、百錢百雞、求100內(nèi)所有素?cái)?shù)等問(wèn)題。循環(huán)程序設(shè)計(jì)一般先要設(shè)計(jì)好循環(huán)體,即需要重復(fù)運(yùn)行的部分;然后設(shè)計(jì)好循環(huán)條件,循環(huán)條件的設(shè)計(jì)可分為兩種情況:循環(huán)次數(shù)已知、循環(huán)次數(shù)未定,不同情況下循環(huán)條件設(shè)置會(huì)有區(qū)別;最后要注意:千萬(wàn)不能出現(xiàn)死循環(huán)!第五章數(shù)組一維數(shù)組定義與二維數(shù)組定義與字符數(shù)組2021/10/291382021/10/29139數(shù)組的概念:
同一類型的多個(gè)數(shù)據(jù)的有序集合,數(shù)組中的每個(gè)成員稱為數(shù)組元素。注意幾點(diǎn):同一數(shù)組中的所有元素類型相同數(shù)組具有有序性5.1
一維數(shù)組的定義與一維數(shù)組的定義:定義數(shù)組,就是要:規(guī)定數(shù)組的名字(即數(shù)組名),由用戶自己定義,命名規(guī)則和變量的一樣。規(guī)定數(shù)組元素的類型。規(guī)定數(shù)組的大小,即數(shù)組中包含的元素個(gè)數(shù)。定義形式:類型說(shuō)明符 數(shù)組名[常量表達(dá)式];例如:
int
a[10];float
b[5];
double
c[2*3];2021/10/291405.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑工程電梯機(jī)房設(shè)計(jì)要求
- 迎接期末考試廣播稿(14篇)
- 通報(bào)批評(píng)決定范文(12篇)
- 房屋租賃合同格式(34篇)
- 小學(xué)生畢業(yè)的演講稿范文300字(35篇)
- 生產(chǎn)部長(zhǎng)競(jìng)崗述職報(bào)告
- KRC-108-生命科學(xué)試劑-MCE
- Kaempferol-3-O-gentiobioside-Standard-生命科學(xué)試劑-MCE
- 兒童保健科考核方案
- 環(huán)保設(shè)施運(yùn)行維護(hù)管理制度
- 貴州省安順市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)及行政區(qū)劃劃分代碼居民村民委員會(huì)
- 船舶保安職責(zé)-保安意識(shí)考試題庫(kù)(含答案)
- 維克多英語(yǔ)書寫紙A4
- 電商文案策劃與視覺(jué)營(yíng)銷實(shí)戰(zhàn)教案
- 預(yù)防接種人員崗位培訓(xùn)習(xí)題(Ⅰ類培訓(xùn)練習(xí)題庫(kù)共385題)
- 部編人教版四年級(jí)上冊(cè)語(yǔ)文全冊(cè)教學(xué)反思(修訂)
- 書法第一課精品課件
- 體液調(diào)節(jié)與神經(jīng)調(diào)節(jié)的關(guān)系(第2課時(shí))課件 高二生物人教版選擇性必修一
- 畢業(yè)論文-如何寫論文摘要課件
- 股權(quán)收購(gòu)項(xiàng)目盡調(diào)清單
- 《網(wǎng)店運(yùn)營(yíng)與管理》課件(完整版)
評(píng)論
0/150
提交評(píng)論