




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
項目二小型計算器任務(wù)1數(shù)據(jù)輸入/輸出的順序執(zhí)行任務(wù)2運算符判斷的選擇執(zhí)行任務(wù)3主菜單選擇的循環(huán)執(zhí)行
本項目主要涉及小型計算器的數(shù)據(jù)的輸入與輸出、菜單的顯示和選擇及簡單計算。通過本任務(wù)的學(xué)習(xí)應(yīng)掌握C語言的三種程序結(jié)構(gòu)(順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu))和九種控制語句、數(shù)據(jù)類型、運算符及表達(dá)式的計算,并逐步理解和分析問題、尋找解決問題的路徑,最后進(jìn)行代碼設(shè)計。知識目標(biāo):
掌握C語言的結(jié)構(gòu)化(順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu))的程序設(shè)計方法。
掌握C程序的基本輸入/輸出語句和九種控制語句。
深刻理解選擇結(jié)構(gòu)中if語句和switch語句的功能及使用方法。
深刻理解循環(huán)結(jié)構(gòu)中while語句、do-while語句和for語句的功能及使用方法。
掌握運算符及表達(dá)式的計算。
理解選擇語句的嵌套和循環(huán)語句的嵌套。
理解各種選擇語句之間的異同點以及各種循環(huán)語句之間的異同點。能力目標(biāo):
能夠以多種循環(huán)方法及創(chuàng)新意識完成小型計算器的三個子任務(wù)。
能夠進(jìn)行協(xié)作分工,發(fā)揮團(tuán)隊合作精神。
能初步掌握“小型計算器”系統(tǒng)的實現(xiàn)。
任務(wù)1數(shù)據(jù)輸入/輸出的順序執(zhí)行
一、任務(wù)情境
“小型計算器”是一個非常實用的小工具,它首先要接收用戶輸入的數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行計算處理,最后輸出計算結(jié)果給用戶。其中對數(shù)據(jù)進(jìn)行計算處理將在下一任務(wù)中學(xué)習(xí)和解決,而接收用戶輸入的數(shù)據(jù)并將計算結(jié)果輸出給用戶將是本任務(wù)要學(xué)習(xí)和處理的內(nèi)容。
開發(fā)程序的目的是為了處理數(shù)據(jù),原始數(shù)據(jù)需要用戶的輸入,程序處理后的數(shù)據(jù)要由系統(tǒng)輸出給用戶?!靶⌒陀嬎闫鳌蓖瑯右残枰獢?shù)據(jù)的輸入和輸出。用C語言開發(fā)程序,數(shù)據(jù)是如何進(jìn)行輸入/輸出的呢?C語言本身不提供輸入/輸出語句,輸入和輸出操作是由輸入/輸出函數(shù)來實現(xiàn)的。因此,掌握C語言程序數(shù)據(jù)的輸入/輸出函數(shù)的應(yīng)用,就掌握了數(shù)據(jù)進(jìn)出計算機(jī)系統(tǒng)的方法。本任務(wù)可以采用C語言的標(biāo)準(zhǔn)輸出/輸入函數(shù)(printf/scanf函數(shù))分別來實現(xiàn)。二、相關(guān)知識
從程序流程的角度來看,程序可以分為三種基本結(jié)構(gòu),即順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。這三種基本結(jié)構(gòu)可以組成所有的復(fù)雜程序。C語言提供了多種語句來實現(xiàn)這些程序結(jié)構(gòu)。下面介紹這些基本語句及其在順序結(jié)構(gòu)中的應(yīng)用,使大家對C程序有一個初步的認(rèn)識和學(xué)習(xí)。
C語句可分為以下五類:
(1)表達(dá)式語句:表達(dá)式語句由表達(dá)式加上“;”組成。其一般形式為:
表達(dá)式;
執(zhí)行表達(dá)式語句就是計算表達(dá)式的值。
例如:
x=y+z;賦值語句
y+z;加法運算語句,但計算結(jié)果不能保留,無實際意義
i++;自增1語句,i值增1
(2)函數(shù)調(diào)用語句:由函數(shù)名、實際參數(shù)加上“;”組成。其一般形式為:
函數(shù)名(實際參數(shù)表);
執(zhí)行函數(shù)語句就是調(diào)用函數(shù)體并把實際參數(shù)賦予函數(shù)定義中的形式參數(shù),然后執(zhí)行被調(diào)函數(shù)體中的語句,求取函數(shù)值(在后面函數(shù)中再詳細(xì)介紹)。
例如:
printf("CProgram");調(diào)用庫函數(shù),輸出字符串
(3)控制語句:控制語句用于控制程序的流程,以實現(xiàn)程序的各種結(jié)構(gòu)方式。它們由特定的語句定義符組成。C語言有九種控制語句,可分成以下三類:
①條件判斷語句:包括if語句、switch語句;
②循環(huán)執(zhí)行語句:包括dowhile語句、while語句、for語句;
③轉(zhuǎn)向語句:包括break語句、goto語句、continue語句、return語句。
(4)復(fù)合語句:把多個語句用括號({})括起來組成的一個語句稱為復(fù)合語句。在程序中應(yīng)把復(fù)合語句看成是單條語句,而不是多條語句。
例如:
{x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
是一條復(fù)合語句。
復(fù)合語句內(nèi)的各條語句都必須以分號結(jié)尾,在“}”外不能加分號。
(5)空語句:只由分號組成的語句稱為空語句??照Z句是什么也不執(zhí)行的語句。在程序中空語句可用來作空循環(huán)體。
例如:
while(getchar()!=‘\n’)
;
本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語句。
1.賦值語句
1)賦值表達(dá)式
由賦值運算符將一個變量和一個表達(dá)式連接起來的式子稱為“賦值表達(dá)式”。其作用是求出賦值號右側(cè)的“表達(dá)式”的值,然后賦給賦值號左側(cè)的變量。其一般形式為:
變量=表達(dá)式
例如:
x=5 該賦值語句的作用是把常量5賦給變量x
x=3+5 該賦值語句的作用是把表達(dá)式“3+5”的結(jié)果8賦給變量x注意:
①在賦值號“=”右邊的表達(dá)式也可以又是一個賦值表達(dá)式。例如:
x=(y=5) 等價于x=y=5,即等價于y=5,x=5
該賦值語句的作用是先把常量5賦給變 量y,再把“y=5”
這個賦值表達(dá)式的值5賦給變量x
x=(y=5)+(z=6) 等價于z=6,y=5,x=y+z
該賦值語句的作用是先求“z=6”這個賦值表達(dá)式的值為6,
再求“y=5”這個賦值表達(dá)式的值為5,最后把5+6的值11
賦給變量x②在賦值號“=”之前加上其他運算符,可以構(gòu)成復(fù)合運算符。例如:
x+=3等價于x=x+3
該賦值語句的作用是先使x加3,再賦給x
x*=y+8等價于x=x*(y+8)
該賦值語句的作用是使x乘以(y+8),再賦給x
x+=x-=x*x(x=5)等價于x=x+(x=x-(x*x))
該賦值語句的作用是先進(jìn)行“x-=x*x”的運算,它等價于
x?=?x?-?(x*x),則x的值為5?-?25?=?-20;再進(jìn)行 “x+?=?-20”的運算,它等價于x?=?x?+?(-20),則x的值 為?-20?+?(-20)?=-40,最后是將-40賦值給了x③如果賦值運算符兩側(cè)的類型一致,則直接進(jìn)行賦值。如果類型不一致,但都是數(shù)值型或字符型,則在賦值時要進(jìn)行類型轉(zhuǎn)換,最終轉(zhuǎn)換成賦值號左側(cè)變量的類型。例如:
i=3.789(i定義為整型變量) 先對符點數(shù)3.789取整(舍去小數(shù)部 分),然后將整數(shù)3賦給整型變量i
i=30(i定義為單精型變量) 先將整數(shù)3轉(zhuǎn)換成30.00000,然后將單 精數(shù)30.00000賦給單精型變量i
i=‘a(chǎn)’(i定義為整型變量) 字符型數(shù)據(jù)?‘a(chǎn)’?賦給整型變量時,將
字符?'a'?的ASCII碼97賦給整型變量i
2)賦值語句
賦值語句是由賦值表達(dá)式加上一個分號構(gòu)成的,在C語言中,賦值語句是用得最多的語句。例如:
x=3;
注意:
①賦值表達(dá)式是一種表達(dá)式,它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方,而賦值語句則不能。例如:
if((x=y+5)>0)z=x;合法 語句的功能是:若表達(dá)式x=y+5大于0則z=x
if((x=y+5;)>0)z=x; 非法 因為x=y+5;是語句,所以不能出現(xiàn)在表達(dá)式中②給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其他同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結(jié)尾。例如:
inta=5,b,c;
inta=b=c=5; 錯誤在變量說明中,不允許連續(xù)給多 個變量賦初值
inta=5,b=5,c=5;正確
2.printf函數(shù)(輸出數(shù)據(jù)函數(shù))
【例2.1.1】引例:用printf函數(shù)輸出由“*”組成的直角三角形。
*
***
*****
*******
*********
(1)?printf函數(shù)的功能:向計算機(jī)系統(tǒng)默認(rèn)的輸出設(shè)備(一般指終端或顯示器)輸出一個或多個任意類型的數(shù)據(jù)。
(2)?printf函數(shù)的一般格式:
printf(“格式字符串”[,輸出項表]);
printf函數(shù)格式示意圖見圖2-1-1。①格式字符串?!案袷阶址币卜Q“轉(zhuǎn)換控制字符串”,是用雙引號括起來的字符串,可以包含以下三種字符串:
·格式說明符:由“%”和格式字符組成,如?%d、%f等,它的作用是將輸出的數(shù)據(jù)轉(zhuǎn)換成為指定的格式輸出。格式說明總是由“%”字符開始。
·轉(zhuǎn)義字符:例如例2.1.1中printf函數(shù)中的“\n”就是轉(zhuǎn)義字符,輸出時產(chǎn)生一個“回車換行”操作。
·普通字符:除格式說明符和轉(zhuǎn)義字符之外的其他字符。格式字符串中的普通字符,輸出時按原樣輸出。如例2.1.1printf("*\n")函數(shù)中雙引號內(nèi)的空格和“*”就是普通字符。圖2-1-1printf函數(shù)格式示意圖②輸出項表。輸出項表是可選項,它是需要輸出的一些數(shù)據(jù),可以是常量、變量和表達(dá)式。多個輸出的數(shù)據(jù)之間用逗號分開。下面程序中的printf函數(shù)都是合法的。
【例2.1.2】?printf函數(shù)的使用。
#include<stdio.h>
main()
{intx=5;
?printf("Howareyou!\n"); //?"\n"?是轉(zhuǎn)義字符,表示換行
printf("%d%d\n",5+5,x); //?"%d"?控制輸出項格式
printf("x=%dy=%d\n",x,x+3); //?"x="?和?"y="?是普通字符原樣輸出
}
程序運行結(jié)果:
Howareyou!
105
x=5y=8
(3)注意:“格式字符串”中的格式說明符必須與“輸出項表”中輸出項的數(shù)據(jù)類型一致,且個數(shù)相同,否則會引起輸出錯誤。
(4)格式說明符。在輸出時,對不同類型的數(shù)據(jù)要使用不同的格式說明符。常用的幾種格式說明符有:
①d格式符:按十進(jìn)制整型數(shù)據(jù)的實際長度輸出。例如:
printf(“%d\n”,3+2);
輸出整數(shù)5。②c格式符:用來輸出一個字符。例如:
printf(“%c\n”,’a’);
輸出字符a。
在C語言中,0~255范圍內(nèi)的整數(shù)可以按字符形式輸出,此時系統(tǒng)會將該整數(shù)作為ASCII碼轉(zhuǎn)換成相應(yīng)的字符輸出。反之,字符數(shù)據(jù)也可以用整數(shù)形式(該字符的ASCII碼)輸出。【例2.1.3】?C語言格式符的使用。
#include<stdio.h>
main()
{charc=‘a(chǎn)’;
inti=97;
printf(“c=%c,%d\n”,c,c);
printf(“i=%d,%c”,i,i);
}
程序運行結(jié)果:
c=a,97
i=97,a③s格式符:用來輸出一個字符串。例如:
printf(“%s”,“HELLO!”);
輸出字符串“HELLO!”(不包括雙引號)。④f格式符:以小數(shù)形式輸出單精度和雙精度實數(shù)。
【例2.1.4】?f格式符的使用。使用?%f時,如果不指定字符寬度,則由系統(tǒng)自動指定,使整數(shù)部分全部輸出,并輸出6位小數(shù),但不要認(rèn)為全部數(shù)字都是有效數(shù)字。
#include<stdio.h>
voidmain()
{
floatx=123.456;
doubley,z;
y=1111111111111.111111111;
z=2222222222222.222222222;
printf(“%f\n”,x);
printf(“y+z=%f\n”,y+z);
}程序運行結(jié)果:
123.456001
y+z=3333333333333.333010
本程序的輸出結(jié)果中,數(shù)據(jù)123.456001和3333333333333.333010中的001和010都是無意義的,因為它們超出了有效數(shù)字的范圍(單精度的有效數(shù)字為7位,雙精度的有效數(shù)字一般為16位)。⑤e格式符:以指數(shù)形式輸出單精度和雙精度實數(shù)。
對于實數(shù),也可使用格式符?%e,以規(guī)范化的指數(shù)形式輸出:整數(shù)部分占1位,小數(shù)點占1位,尾數(shù)中的小數(shù)部分占5位;指數(shù)部分占4位(如e-03),其中e占1位,指數(shù)符號占1位,指數(shù)占2位,共計11位。
例如:
doublex=123.456;
printf(“%e”,x);
VC的輸出結(jié)果為1.234560e+002(不同系統(tǒng)輸出結(jié)果略有差異)。
3.scanf函數(shù)(格式輸入函數(shù))
(1)?scanf函數(shù)功能:按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。
(2)?scanf函數(shù)的一般格式:
scanf(“格式控制字符串”,地址表列);
例如:
scanf(“%d\n”,&a);
①格式控制字符串:作用與printf函數(shù)相同,但不能顯示提示字符串。②地址表列:作用是給出各變量的地址。地址是由地址運算符“&”后跟變量名組成的。例如:
scanf(“%d\n”,&a);合法
scanf(“%d\n”,a);非法
&a表示變量a的地址。這個地址就是編譯系統(tǒng)在內(nèi)存中給a變量分配的地址。應(yīng)該把變量的值和變量的地址這兩個不同的概念區(qū)別開來。變量的地址是C編譯系統(tǒng)分配的,用戶不必關(guān)心具體的地址是多少。
(3)注意:
scanf函數(shù)在本質(zhì)上雖然也是給變量賦值,但必須寫變量的地址,如&a,而不應(yīng)該是變量名。在賦值表達(dá)式中給變量賦值時,如:
a=567
則變量的地址和變量值的關(guān)系是:a為變量名,567是變量的值,&a是變量a的地址。
在賦值號左邊的是變量名,不能寫地址。&是一個取地址運算符,&a是一個表達(dá)式,其功能是求變量的地址?!纠?.1.5】
#include<stdio.h>
main()
{
inta,b,c;
printf(“inputa,b,c\n”);
scanf(“%d%d%d”,&a,&b,&c);
printf(“a=%d,b=%d,c=%d”,a,b,c);
}在本例中,由于scanf函數(shù)本身不能顯示提示串,故先用printf語句在屏幕上輸出提示,請用戶輸入a、b、c的值。執(zhí)行scanf語句,則退出VC屏幕進(jìn)入用戶屏幕,等待用戶輸入。用戶輸入789后按下回車鍵,此時,系統(tǒng)又將返回VC屏幕。在scanf語句的格式串中由于沒有非格式字符在“%d%d%d”之間作輸入時的間隔,因此在輸入時要用一個以上的空格或回車鍵作為每兩個輸入數(shù)之間的間隔。如:
789↙
或
7↙
8↙
9↙
下面對其進(jìn)行格式說明:
①如果相鄰兩個格式指示符之間不指定分隔符(如逗號、冒號等),則相應(yīng)的兩個輸入數(shù)據(jù)之間至少用一個空格分開,或者用Tab鍵分開,或者輸入一個數(shù)據(jù)后按回車,然后再輸入下一個數(shù)據(jù)。例如:
scanf(“%d%d”,&x,&y);
假設(shè)將10輸入給x,20輸入給y,則正確的輸入操作為:
1020↙
或
10↙
20↙
②“格式字符串”中出現(xiàn)的普通字符(包括轉(zhuǎn)義字符)務(wù)必原樣輸入。例如:
scanf(“%d,%d”,&x,&y);
在兩個%d之間有一個逗號,是普通字符,正確的輸入操作為:
10,20↙
為改善人機(jī)交互,同時簡化輸入操作,在設(shè)計輸入操作時,一般先用printf函數(shù)輸出一個提示信息,再用scanf函數(shù)進(jìn)行數(shù)據(jù)輸入。例如:將
scanf(“x=%d,y=%d\n”,&x,&y);
改為:
printf(“x=”);scanf(“%d”,&x);
printf("y=");scanf("%d",&y);
可以改善用戶界面,做到界面友好,提高程序的可操作性。③輸入數(shù)據(jù)時,遇到以下情況時,系統(tǒng)認(rèn)為該數(shù)據(jù)結(jié)束:
遇到空格,或者回車鍵,或者Tab鍵。
遇到輸入域?qū)挾冉Y(jié)束。例如?“%3d”,只取3列。
遇到非法輸入。例如,在輸入數(shù)值數(shù)據(jù)時,遇到字母等非數(shù)值符號(數(shù)值符號僅由數(shù)字字符0~9、小數(shù)點和正負(fù)號構(gòu)成)。④使用格式說明符“%c”輸入單個字符時,空格和轉(zhuǎn)義字符均作為有效字符被接收。例如:
scanf(“%c%c%c”,&ch1,&ch2,&ch3);
printf(“ch1=%c,ch2=%c,ch3=%c\n”,ch1,ch2,ch3);
假設(shè)輸入:
A□B□C↙
則系統(tǒng)將字母?'A'?賦值給ch1,空格?'□'?賦值給ch2,字母?'B'賦值給ch3。正確的輸入方法應(yīng)當(dāng)是ABC↙。
三、任務(wù)實施
本任務(wù)采用C語言的標(biāo)準(zhǔn)輸入函數(shù)(scanf)來實現(xiàn)“小型計算器”數(shù)據(jù)的輸入,標(biāo)準(zhǔn)輸出函數(shù)(printf)來實現(xiàn)數(shù)據(jù)的輸出。使用變量存放接收的數(shù)據(jù),并且在接收數(shù)據(jù)之前首先要定義各變量的類型?!靶⌒陀嬎闫鳌敝袛?shù)據(jù)的輸入和輸出在任務(wù)2的實現(xiàn)里有具體的程序代碼,大家可以參考,但是由于程序中的處理過程較為復(fù)雜,為了便于大家更好地學(xué)習(xí)這部分的內(nèi)容,下面我們實現(xiàn)一個簡單的兩個數(shù)進(jìn)行四則運算的計算器,這與項目二“小型計算器”的原理是一樣的。
在下述程序中使用了system函數(shù),由于這個函數(shù)是一個庫函數(shù),所以在程序的開始用預(yù)編譯命令“#include”將有關(guān)的頭文件“<stdlib.h>”包含到用戶源文件中。四、知識拓展
1.單個字符的輸入、輸出函數(shù)
用scanf函數(shù)和printf函數(shù)輸入、輸出數(shù)據(jù)時,在格式字符串中加上不同的格式說明符,可以輸入、輸出各種類型的數(shù)據(jù)。但putchar函數(shù)和getchar函數(shù)只能輸出、輸入一個字符型數(shù)據(jù)。
(1)?putchar函數(shù)(字符輸出函數(shù))。putchar函數(shù)是字符輸出函數(shù),其功能是在顯示器上輸出單個字符。其一般形式為:
putchar(字符變量)
例如:
putchar(‘B’); (輸出大寫字母B)
putchar(x);(輸出字符變量x的值)
putchar(‘\101’); (也是輸出字符A)
putchar(‘\n’); (換行)
注意:對控制字符執(zhí)行控制功能,不會在屏幕上顯示。使用本函數(shù)前必須用文件包含命令:
#include<stdio.h>
或#include"stdio.h"【例2.1.6】輸出單個字符。
#include<stdio.h>
main()
{
chara=‘B’,b=‘o’,c=‘k’;
putchar(a);putchar(b);putchar(b);putchar(c);putchar(‘\t’);
putchar(a);putchar(b);
putchar(‘\n’);
putchar(b);putchar(c);
}
(2)?getchar函數(shù)(鍵盤輸入函數(shù))。getchar函數(shù)的功能是從鍵盤上輸入一個字符。其一般形式為:
getchar();
通常把輸入的字符賦予一個字符變量,構(gòu)成賦值語句,如:
charc;
c=getchar();【例2.1.7】輸入單個字符。
#include<stdio.h>
voidmain(){
charc;
printf(“inputacharacter\n”);
c=getchar();
putchar(c);
}使用getchar函數(shù)還應(yīng)注意以下問題:
①getchar函數(shù)只能接收單個字符,輸入數(shù)字也按字符處理。輸入多于一個字符時,只接收第一個字符。
②使用本函數(shù)前必須包含文件?“stdio.h”。
③程序最后兩行可用下面兩行的任意一行代替:
putchar(getchar());
printf("%c",getchar());
2.數(shù)據(jù)輸入/輸出的概念及在C語言中的實現(xiàn)
(1)所謂輸入/輸出,是以計算機(jī)為主體而言的。
(2)本項目介紹的是向標(biāo)準(zhǔn)輸出設(shè)備顯示器輸出數(shù)據(jù)的語句。
(3)因為在C語言中,所有的數(shù)據(jù)輸入/輸出都是由庫函數(shù)完成的,故輸入/輸出都是函數(shù)語句。
(4)在使用C語言庫函數(shù)時,要用預(yù)編譯命令?#include將有關(guān)頭文件包含到源文件中。使用標(biāo)準(zhǔn)輸入/輸出庫函數(shù)時要用到?"stdio.h"?文件,因此源文件開頭應(yīng)有以下預(yù)編譯命令:#include<stdio.h>或?#include"stdio.h"。
3.較復(fù)雜的輸入/輸出格式控制
在前面討論了簡單的輸入/輸出格式,這能滿足最基本的要求,但是用戶有時會對輸出數(shù)據(jù)的格式有較高的要求,譬如指定輸出數(shù)據(jù)的寬度、小數(shù)位數(shù)、上下行數(shù)據(jù)按小數(shù)點對齊、用八進(jìn)制數(shù)或十六進(jìn)制數(shù)輸出等。這就需要用到較復(fù)雜的輸入/輸出格式控制。下面介紹的內(nèi)容都是一些具體的規(guī)定,可以不在課堂上逐一講授,而由學(xué)生自學(xué),尤其是通過上機(jī)實踐去掌握這些內(nèi)容。讀者不必死記,在用到時查一下,會用即可。
1)輸出數(shù)據(jù)格式控制
除了必備知識里所介紹的基本的格式控制外,還可以用下面的一些格式符和附加字符。
①%md:用來指定輸出數(shù)據(jù)的寬度,m是指定的寬度。如果數(shù)據(jù)實際的位數(shù)小于m,則左端補(bǔ)以空格;若大于m,則按實際位數(shù)輸出。例如:
printf(“%4d,%4d”,a,b);
若a=123,b=12345,則輸出結(jié)果為:
□123,12345
輸出a時占4列,數(shù)值本身占3列,左側(cè)補(bǔ)一空格。指定b也是4列,但b的值為5位,故按5列輸出,這是為了保證數(shù)據(jù)的正確性。②%1d:對于int型數(shù)據(jù)占2字節(jié)的系統(tǒng),在輸出長整型數(shù)據(jù)時要在格式字符d前面加一個英文字母l。例如:
longa=135790;/*定義a為長整型變量*/
因為?%d只適用于范圍為?-32?768~32?767的整型數(shù)據(jù),故超過此范圍的整數(shù),應(yīng)該用%1d輸出。一個int型數(shù)據(jù)可以用%d或%1d格式輸出。
對于長整型數(shù)據(jù)也可以指定字段寬度,如將上面printf函數(shù)中的“%1d”改為“%81d”,則輸出為:
□□l35790
如果用的是VisualC++6.0,則由于int型和long型數(shù)據(jù)都占4個字節(jié),因此用%d可以輸出int型和long型數(shù)據(jù),不必要用%1d。③%o:以八進(jìn)制整數(shù)形式輸出。內(nèi)存中八進(jìn)制輸出的數(shù)值是不帶符號的,即把符號位也作為八進(jìn)制數(shù)的一部分輸出。
請看下面的例子:
inta=-1;
printf(“%d,%o”,a,a);
輸出結(jié)果為:
-1,37777777777④%x:以十六進(jìn)制形式輸出整數(shù)。由于符號位也作為了十六進(jìn)制數(shù)的一部分,故同樣不會出現(xiàn)負(fù)的十六進(jìn)制數(shù),例如:
inta=-1;
printf(“%d,%x”,a,a);
輸出結(jié)果為:
-1,ffffffff
⑤%u:以十進(jìn)制形式輸出unsigned型數(shù)據(jù)。例如:
inta=-1;
printf(“%u”,a);
輸出結(jié)果為:
4294967295
請讀者自己分析。⑥%mc:用來指定輸出字符數(shù)據(jù)的寬度m。例如:
c=‘a(chǎn)’;
printf("%3c",c);
則輸出“□□a”,即c變量輸出占3列,前2列補(bǔ)空格。⑦%ms:指定輸出的字符串占m列。如果字符串本身長度大于m,則突破m的限制,將字符串全部輸出;若串長小于m,則在左端補(bǔ)空格。
%-ms:如果串長小于m,則在m列范圍內(nèi),字符串向左靠,右端補(bǔ)空格。
%m.ns:輸出占m列,但只取字符串中左端的n個字符。這n個字符輸出在m列的右側(cè),左端補(bǔ)空格。
%-m.ns:n個字符輸出在m列范圍的左側(cè),右端補(bǔ)空格。如果n>m,則m自動取n值,即保證n個字符正常輸出?!纠?.1.8】類型轉(zhuǎn)換字符s的使用。
程序代碼:
#include<stdio.h>
voidmain()
{
printf(“%s\n%5s\n%-10s\n”,“Internet”,“Internet”,“Internet”);
printf(“%10.5s\n%-10.5s\n%3.5s\n”,“Internet”,“Internet”,“Internet”);
}
程序運行結(jié)果:
Internet
Internet
Internet□□
□□□□□Inter
Inter□□□□□
Inter
注意:系統(tǒng)輸出字符和字符串時,不輸出單引號或雙引號。⑧?%m.nf:指定輸出的實數(shù)共占m列,其中有n位小數(shù)。如果數(shù)值長度小于m,則左端補(bǔ)空格。
%-m.nf與%m.nf基本相同,只是前者使輸出的數(shù)值向左端靠,右端補(bǔ)空格。
【例2.1.9】類型轉(zhuǎn)換字符f的使用。
程序代碼:
#include<stdio.h>
voidmain()
{
floatf=123.456;
doubled1,d2;
d1=1111111111111.111111111;
d2=2222222222222.222222222;
printf(“%f\n%12f\n%12.2f\n%-12.2f\n%.2f\n”,f,f,f,f,f);
printf(“d1+d2=%f\n”,d1+d2);
}程序運行結(jié)果:
123.456001
□□123.456001
□□□□□□123.46
123.46□□□□□□
123.46
d1+d2=3333333333333.333010
%f不指定字符寬度,由系統(tǒng)自動指定,使整數(shù)部分全部輸出,并輸出6位小數(shù),但不要認(rèn)為全部數(shù)字都是有效數(shù)字。
本例程序的輸出結(jié)果中,數(shù)據(jù)123.456001和3333333333333.333010中的001和010都是無意義的,因為它們超出了有效數(shù)字的范圍(單精度的有效數(shù)字為7位,雙精度的有效數(shù)字一般為16位)。⑨%m.ne和?%-m.ne:n指擬輸出的數(shù)據(jù)的小數(shù)部分(又稱尾數(shù))的小數(shù)位數(shù)。若f=123.456,則
printf(“%e□□%10e□□%10.2e□□%.2e□□%-10.2e”,f,f,f,f,f);
輸出如下:
1.234560e+002□□1.234560e+002□□□1.23e+002□□l.23e+002□□l.23e+002□
第2個輸出項按?%10e輸出,即只指定了m=10,未指定n。凡未指定n,則自動使n=6,因此整個數(shù)據(jù)長13列,若超過給定的10列,則按實際長度輸出。第3個數(shù)據(jù)共占10列,小數(shù)部分占2列。第4個數(shù)據(jù)按“%.2e”格式輸出,只指定n=2,未指定m,此時自動使m等于數(shù)據(jù)應(yīng)占的長度,這里為9列。第5個數(shù)據(jù)應(yīng)占10列,數(shù)值只有9列,由于是“%-10.2e”,故數(shù)值向左靠,右端補(bǔ)一個空格。⑩%g:讓系統(tǒng)根據(jù)數(shù)值的大小,自動選擇?%f或?%e格式且不輸出無意義的零。例如:
floatf=123.456;
printf(“%f\n%e\n%g\n”,f,f,f);
輸出結(jié)果為:
123.456001
1.23456e+002
123.456
以上介紹了各種格式符,現(xiàn)歸納如表2-l-1所示。在格式說明中,在%和上述格式字符間可以插入附加格式說明字符(又稱修飾符),見表2-1-2。注意:如果想輸出字符“%”,則應(yīng)該在“格式控制”字符串中連續(xù)用兩個?%?表示,如:
printf(“%f%%”,1.0/3);
輸出:
0.333333%
2)輸入數(shù)據(jù)格式控制
與printf函數(shù)中的格式說明相似,輸入數(shù)據(jù)格式控制以?%?開始,以一個格式字符結(jié)束,中間可以插入附加格式說明字符。表2-1-3列出了scanf用到的格式字符。表2-1-4列出scanf可以用的附加格式說明字符(修飾符)。說明:
①對unsigned型變量所需的數(shù)據(jù),可以用?%u、%d或?%o、%x格式輸入。
②可以指定輸入數(shù)據(jù)所占的列數(shù),系統(tǒng)自動按它截取所需數(shù)據(jù)。例如:
scanf(“%3d%3d”,&a,ab);
如果輸入如下信息:
123456↙
系統(tǒng)自動將123賦給變量a,456賦給變量b。此方法也可用于字符型。例如:
scanf(“%3c”,&ch);
如果從鍵盤連續(xù)輸入3個字符“abc”,由于ch只能容納一個字符,故系統(tǒng)就把第一個字符‘a(chǎn)’賦給字符變量ch。③如果在?%?后有一個附加說明符“*”,則表示跳過它指定的列數(shù)。例如:
scanf(“%2d%*3d%2d”,&a,&b);
如果輸入如下信息:
1234567↙
系統(tǒng)會將“12”賦給整型變量a,%*3d表示讀入3位整數(shù)但不賦給任何變量,然后再讀入2位整數(shù),把“67”賦給整型變量b。也就是說,第2個數(shù)據(jù)“345”被跳過。在利用現(xiàn)成的一批數(shù)據(jù)時,有時不需要其中某些數(shù)據(jù),可用此法“跳過”它們。④輸入數(shù)據(jù)時不能規(guī)定精度。例如:
scanf(“%7.2f”,&a);
是不合法的,不能企圖用這樣的scanf函數(shù)輸入數(shù)據(jù)1234567,而使a的值為12345.67。
五、任務(wù)小結(jié)
學(xué)會書寫C語句是學(xué)習(xí)編寫C程序的基礎(chǔ)。C語句有幾種不同的類型,初學(xué)者難以掌握的是復(fù)合語句的書寫方法。
C語言中的輸入/輸出數(shù)據(jù)方法,是借助于輸入/輸出庫函數(shù)來實現(xiàn)的。因此,一定要注意輸入/輸出函數(shù)的格式、參數(shù)類型與個數(shù)。要求能夠理解格式化輸入/輸出函數(shù)的格式控制符等相關(guān)概念與應(yīng)用方法,特別是要注意字符類型的數(shù)據(jù)與其他類型數(shù)據(jù)混合輸入時的特點。
任務(wù)2運算符判斷的選擇執(zhí)行
一、任務(wù)情境
“小型計算器”是一種非常實用、常見的小工具,它的核心功能是進(jìn)行簡單的算術(shù)運算。在用戶輸入需要進(jìn)行計算的數(shù)值和運算符后,計算器首先對運算符進(jìn)行判斷,然后根據(jù)不同的運算符分別進(jìn)行相對應(yīng)的加、減、乘、除四種算術(shù)運算的處理,并計算出結(jié)果。運算符的判斷是“小型計算器”項目中最重要的部分,對于用戶輸入的需要計算的數(shù)值來說,進(jìn)行不同的運算就會得到不同的結(jié)果,因此必須對輸入的運算符做出正確的判斷才能保證計算結(jié)果的正確性?!靶⌒陀嬎闫鳌笨梢栽O(shè)計加、減、乘、除四種算術(shù)運算的處理過程,根據(jù)對輸入運算符的判斷,然后選擇相應(yīng)的處理過程進(jìn)行計算。在程序結(jié)構(gòu)的設(shè)計上,這需要分支結(jié)構(gòu),即有選擇的結(jié)構(gòu),而順序結(jié)構(gòu)已經(jīng)不能滿足該任務(wù)的需求,所以我們考慮在“小型計算器”中使用C語言的三種程序結(jié)構(gòu)(順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu))中的選擇結(jié)構(gòu)進(jìn)行程序設(shè)計。二、相關(guān)知識
選擇結(jié)構(gòu)是C語言的三種基本結(jié)構(gòu)之一,又稱為分支結(jié)構(gòu),它可以根據(jù)指定的條件是否滿足,選擇給定的幾組操作中的其中一組。C語言提供了“if語句”和“switch語句”兩種選擇結(jié)構(gòu)控制語句。
1.?if語句
實現(xiàn)選擇結(jié)構(gòu)最常用的方法是采用if語句。if語句用于判定所給定的條件是否滿足,程序根據(jù)判定的結(jié)果決定所執(zhí)行的操作。
(1)?if語句的三種形式。if語句有三種基本形式,其中第二種形式最為常用。
①if(表達(dá)式)語句
執(zhí)行過程:計算“表達(dá)式”的值,當(dāng)“表達(dá)式”的值為真時,執(zhí)行“語句”。其執(zhí)行過程如圖2-2-1所示。圖2-2-1第一種形式的if語句流程圖
【例2.2.1】輸出兩個數(shù),按從小到大的順序輸出這兩個數(shù)。
分析:本程序要求從鍵盤上輸入兩個數(shù),對兩個數(shù)比較大小,并按順序在屏幕上輸出兩個數(shù)。②if(表達(dá)式)
語句1;
else
語句2;
執(zhí)行過程:計算“表達(dá)式”的值,如果“表達(dá)式”的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。其執(zhí)行過程如圖2-2-2所示。圖2-2-2第二種形式的if語句流程圖
【例2.2.2】輸出a、b中較大的那個數(shù)。
分析:這是if語句最常用的形式,使用if形式也可以實現(xiàn)輸出a、b中較大的那個數(shù),但是if-else形式的可讀性更強(qiáng)、結(jié)構(gòu)更清晰。
【例2.2.3】使用程序驗證“角谷猜想”。
分析:日本的一位中學(xué)生發(fā)現(xiàn)一個奇妙的“定理”,請角谷教授證明,而教授無能為力,于是產(chǎn)生角谷猜想。猜想的內(nèi)容是:任給一個自然數(shù),若為偶數(shù)則除以2,若為奇數(shù)則乘3加1,得到一個新的自然數(shù)后按照上面的法則繼續(xù)演算,若干次后得到的結(jié)果必然為1??梢杂贸绦蝌炞C,題目中的自然數(shù)分偶數(shù)和奇數(shù),是按照各自不同的法則進(jìn)行演算的,所以在“角谷猜想”中使用了選擇結(jié)構(gòu)進(jìn)行程序設(shè)計。③if(表達(dá)式1)語句1;
elseif(表達(dá)式2)語句2;
elseif(表達(dá)式3)語句3;
…
elseif(表達(dá)式m)語句m;
else語句n;
執(zhí)行過程:本格式又稱為多分支選擇語句,前兩種形式的if語句一般都用于兩個分支的情況。依次判斷各個表達(dá)式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。其執(zhí)行過程如圖2-2-3所示。圖2-2-3第三種形式的if語句流程圖
【例2.2.4】判斷某一年是否是閏年。
分析:閏年的條件是:①能被4整除,但不能被100整除的年份;②能被100整除,又能被400整除的年份。不符合這兩個條件之一的年份都不是閏年。本題中需要采取多次判斷,逐步縮小范圍。首先判斷year能否被4整除,如果不能則不是閏年。如果能被4整除,還要繼續(xù)判斷year能否被100整除,如果不能被100整除則是閏年。如果能被100整除,還要繼續(xù)被400整除,如果能被400整除則為閏年,否則不是閏年。這需要使用多分支選擇結(jié)構(gòu),本題使用第三種形式的多分支if語句實現(xiàn)。
(2)注意:
①在if和else后面可以只有一條簡單語句,也可以是復(fù)合語句,如果是復(fù)合語句,則必須使用花括號({})括起來。
②在if語句中,條件判斷表達(dá)式必須用括號括起來,分號是C語句的結(jié)束符,是必備的成分,無論哪個if和else后面的語句都必須有分號。
③else語句必須與if語句配對使用,else是if語句的一部分。
④if語句的表達(dá)式可以是任意類型的表達(dá)式(如整型、實型、字符型、指針類型的表達(dá)式等),在執(zhí)行if語句時先對表達(dá)式進(jìn)行計算,若表達(dá)式的值為0,則條件為假;若表達(dá)式的值為非0,則條件為真。例如:
if(‘b’)printf(“%d”,‘b’);
上述語句中if后的表達(dá)式為字符“b”,對字符求值則得出其ASCII碼值為98,只要表達(dá)式的值不是0,就執(zhí)行輸出語句。執(zhí)行結(jié)果為輸出“98”。
2.if語句的嵌套
在if語句中又包含一個或多個if語句時稱為if語句的嵌套。
(1)其一般形式如下:
if(表達(dá)式)
if(表達(dá)式)語句1;
else?語句2;
else
if(表達(dá)式)語句3;
else?語句4;
(2)注意:
①else總是與它前面最近的if配對。
②一般情況下,if與else的數(shù)目相同。如果if與else的數(shù)目不相同,為實現(xiàn)程序設(shè)計者的目的,可以用花括號來確定配對關(guān)系。
例如:
if(表達(dá)式1)
{if(表達(dá)式2)語句1;}
else語句2;
說明:這時?{}?限定了內(nèi)嵌的if語句的范圍,因此else與第1個if匹配。如果沒有{},則else與第2個if匹配。
【例2.2.5】按照以下函數(shù),輸入一個x值,輸出一個對應(yīng)的y值。分析:本程序通過判斷輸入x值的范圍,來確定輸出y的值。首先輸入x,如果x?<?0,則y?=?-1;否則,如果x?=?0,則y?=?0;如果x?>?0,則y?=?1。最后輸出y值。使用if語句的嵌套來實現(xiàn)。3.?switch語句
switch語句是多分支選擇語句,它可以實現(xiàn)多種情況的選擇結(jié)構(gòu)。
(1)其一般形式為:
switch(表達(dá)式)
{
case常量表達(dá)式1:語句1;
case常量表達(dá)式2:語句2;
…
case常量表達(dá)式n:語句n;
default:語句n+1;
}
(2)執(zhí)行過程:首先計算switch后表達(dá)式的值,并逐一與case后的常量表達(dá)式值相比較,如果兩者的值相等,則執(zhí)行該case冒號后的語句;如果兩者的值均不相同,則執(zhí)行default后的語句。
(3)注意:
①switch后表達(dá)式的類型,可以是整型、字符型或枚舉類型,其他類型不允許使用。
②case后常量表達(dá)式的類型應(yīng)與switch后表達(dá)式的類型一致。
③case后常量表達(dá)式的值必須互不相同,否則會出現(xiàn)互相矛盾的現(xiàn)象。
④在case后,允許有多個語句,可以不用{}括起來。⑤多個case可以共享一組執(zhí)行語句。例如:
switch(score)
{case96:
case97:
case98:
?case99:printf(“成績優(yōu)異\n”);
……
⑥特別注意:在用swtich語句實現(xiàn)多分支選擇結(jié)構(gòu)時,如果switch后表達(dá)式的值與case后的常量表達(dá)式值相等,就執(zhí)行case后面的語句。但是,執(zhí)行完這些語句后不會自動結(jié)束,會繼續(xù)執(zhí)行下一個case子句。所以,應(yīng)在每個case子句最后加一個break語句,使其跳出switch結(jié)構(gòu)。
【例2.2.6】輸入一個1~7之間的數(shù)字,輸出對應(yīng)星期的英文。
分析:通過鍵盤輸入1~7之間的7個數(shù),對應(yīng)一星期中的7天。如輸入“1”則輸出星期一的英文“Monday”,當(dāng)輸入的數(shù)小于1或者大于7的話則輸出“error”。這是一道多分支選擇結(jié)構(gòu)程序設(shè)計題,除了用if語句實現(xiàn)以外還可以用switch語句實現(xiàn)。圖2-2-4例2.2.6程序運行結(jié)果圖三、任務(wù)實施
通過對C語言選擇結(jié)構(gòu)的學(xué)習(xí),我們可以對“小型計算器”中運算符的判斷進(jìn)行設(shè)計。首先,要選定選擇結(jié)構(gòu);接著,在選擇結(jié)構(gòu)中,要選擇switch語句來實現(xiàn)。因為要表示四種(加減乘除)以上條件的選擇,對比選擇結(jié)構(gòu)中的if語句和switch語句,如果選用if語句,則只能用if語句的第三種形式或者if語句的嵌套形式,但當(dāng)嵌套的if語句比較多時,程序冗長且可讀性降低。所以我們可以直接用switch語句來實現(xiàn)多種情況的選擇結(jié)構(gòu)。
四、知識拓展
在任務(wù)2學(xué)習(xí)的選擇結(jié)構(gòu)中,需要先判斷選擇條件的真假,然后執(zhí)行不同的分支。而選擇條件在程序中一般是用一個式子來表示的,即C語言中的表達(dá)式。下面我們主要學(xué)習(xí)三種表達(dá)式:關(guān)系表達(dá)式、邏輯表達(dá)式和條件表達(dá)式。
2)關(guān)系表達(dá)式
用關(guān)系運算符將兩個表達(dá)式連接起來的表達(dá)式,稱為關(guān)系表達(dá)式。連接的表達(dá)式可以是算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式或字符表達(dá)式。關(guān)系表達(dá)式的值是“真”和“假”,用“1”和“0”表示。
例如:
a+b>c-d
'a'+1<c
5>0 表達(dá)式的值為真(1)
2>(5>4) 表達(dá)式的值為真(1)
0!=(5==4) 表達(dá)式的值為假(0)
(a=3)>(b=5) 表達(dá)式的值為假(0)
3==2==1+5 表達(dá)式的值為假(0)
2.邏輯運算符與邏輯表達(dá)式
選擇條件在C語言中不僅是由關(guān)系表達(dá)式組成的,還可以由邏輯表達(dá)式組成。邏輯運算與關(guān)系運算結(jié)果相同,有且只有兩個值,分別是“1”和“0”。當(dāng)某一事件由兩個或兩個以上的條件來約束時,就得使用邏輯運算。
1)邏輯運算符
C語言中提供了三種邏輯運算符:
●?&& 與運算
●?|| 或運算
●?! 非運算
優(yōu)先級的關(guān)系可表示如下:!(非)算術(shù)運算符關(guān)系運算符&&和||賦值運算符按照運算符的優(yōu)先順序可以得出:a>b&&c>d 等價于(a>b)&&(c>d)!b==c||d<a 等價于((!b)==c)||(d<a)a+b>c&&x+y<b 等價于
((a+b)>c)&&((x+y)<b)
2)邏輯表達(dá)式
用邏輯運算符連接起來的表達(dá)式,稱為邏輯表達(dá)式。邏輯表達(dá)式的值是一個邏輯值,即真(1)或假(0)。邏輯運算符兩側(cè)的運算對象不但可以是0或1,還可以是0或非0的整數(shù),系統(tǒng)以0或非0來判斷它們?yōu)檎婊蚣佟1?-2-1列出了一般情況下的邏輯運算結(jié)果。例如:
0&&1 表達(dá)式的值為假(0)
0||1 表達(dá)式的值為真(1)
5||0 表達(dá)式的值為真(1)
5>0&&4>2 表達(dá)式的值為真(1)
5>0||5>8 表達(dá)式的值為真(1)
!(5>0) 表達(dá)式的值為假(0)
!2*!0 表達(dá)式的值為假(0)
!!!0
表達(dá)式的值為真(1)
3.條件運算符及表達(dá)式
1)條件運算符
條件運算符為“??:”,它是一個三目運算符,即要求有三個參與運算的量。
2)條件表達(dá)式
由條件運算符組成的表達(dá)式稱為條件表達(dá)式,一般形式為:
表達(dá)式1?表達(dá)式2:表達(dá)式3
如果表達(dá)式1的值為真,則以表達(dá)式2的值作為條件表達(dá)式的值,否則以表達(dá)式2的值作為整個條件表達(dá)式的值。條件表達(dá)式通常用于賦值語句。例如:
if(x>y)max=x;
elsemax=y;
可用條件表達(dá)式寫為:
max=(x>y)?x:y;
執(zhí)行該語句的語義是:如x?>?y為真,則把x賦予max,否則把y賦予max。
3)注意
①條件運算符的運算優(yōu)先級低于關(guān)系運算符和算術(shù)運算符,但高于賦值運算符。例如:
max=(a>b)?a:b 等價于 max=a>b?a:b
②條件運算符???和?:?是一對運算符,不能分開單獨使用。
③條件運算符的結(jié)合方向是自右至左。例如:
a>b?a:c>d?c:d 等價于
a>b?a:(c>d?c:d)④條件表達(dá)式中,表達(dá)式1的類型可以與表達(dá)式2和表達(dá)式3的類型不一致。例如:
a??‘X’:‘Y’
表達(dá)式2和表達(dá)式3的類型也可以不一致。例如:a為整型或?qū)嵭妥兞?,而X、Y為字符型變量,此時條件表達(dá)式的類型為二者中較高的類型。例如:
a>b?2:2.5
此時,如果a>b為真,則條件表達(dá)式的值為2,但由于2.5是實型,比整型高,因此,把表達(dá)式1轉(zhuǎn)換成實型2.0。五、任務(wù)小結(jié)
本任務(wù)主要是學(xué)習(xí)使用選擇語句實現(xiàn)“小型計算器”中運算符的判斷。在任務(wù)學(xué)習(xí)中,主要使學(xué)生掌握選擇結(jié)構(gòu)程序設(shè)計的概念、if語句、switch語句的格式及功能。選擇結(jié)構(gòu)是C語言的三種程序結(jié)構(gòu)之一,是使用C語言進(jìn)行程序設(shè)計的重要部分。
任務(wù)3主菜單選擇的循環(huán)執(zhí)行
一、任務(wù)情境
本任務(wù)使用while循環(huán)、do-while循環(huán)的嵌套和switch語句來實現(xiàn)項目主菜單的循環(huán)選擇執(zhí)行。由于循環(huán)選擇執(zhí)行項目菜單是一種比較復(fù)雜的結(jié)構(gòu),所以,為了便于學(xué)習(xí),本任務(wù)重點實現(xiàn)主菜單的循環(huán)選擇執(zhí)行,即主菜單實現(xiàn)循環(huán)選擇,子菜單的循環(huán)選擇暫不實現(xiàn)。
用戶在使用“小型計算器”時,要根據(jù)不同的要求,進(jìn)入不同的界面進(jìn)行相應(yīng)的操作,以實現(xiàn)用戶對主菜單的選擇。如:需要進(jìn)行計算時進(jìn)入計算界面進(jìn)行操作,需要退出計算時進(jìn)入退出界面進(jìn)行操作等。在設(shè)計“小型計算器”中的主菜單時,我們首先考慮使用C語言的三種程序結(jié)構(gòu)(順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu))的哪一種來實現(xiàn)。由于主菜單是一個選擇執(zhí)行設(shè)計,首先,順序結(jié)構(gòu)的程序控制權(quán)不在用戶手中,而在程序開發(fā)人員的手中,“小型計算器”程序中,對主菜單的控制權(quán)應(yīng)當(dāng)在用戶手中,所以在實際項目實施過程中使用順序結(jié)構(gòu)選擇調(diào)用菜單的方法是很少見的。其次,使用任務(wù)2中學(xué)習(xí)的選擇結(jié)構(gòu)if-else可以對“小型計算器”的主菜單進(jìn)行程序設(shè)計,但是選擇結(jié)構(gòu)雖然能實現(xiàn)用戶選擇執(zhí)行菜單功能,但每執(zhí)行一個菜單后,程序就結(jié)束了,而用戶往往需要程序在沒有被用戶結(jié)束之前都能被操作。綜上所述,要實現(xiàn)上述功能,必須使用循環(huán)結(jié)構(gòu)。在實際問題中,常常需要進(jìn)行大量的重復(fù)處理,循環(huán)結(jié)構(gòu)可以使我們只寫很少的語句,而讓計算機(jī)反復(fù)執(zhí)行,從而完成大量重復(fù)的操作。二、相關(guān)知識
1.while語句
(1)?while語句用來實現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)。其一般形式如下:
while(條件表達(dá)式)
{
語句;
}圖2-3-1while語句流程圖
(2)執(zhí)行過程:計算表達(dá)式為“真”(非0)時,執(zhí)行while語句中的內(nèi)嵌語句(即循環(huán)體)。重復(fù)上述過程,直到表達(dá)式的結(jié)果值為“假”(等于0)時,退出循環(huán)。然后執(zhí)行while語句的后續(xù)語句。其執(zhí)行過程如圖2-3-1所示。
(3)語句特點:首先判斷循環(huán)條件,然后執(zhí)行循環(huán)體語句。所以循環(huán)的次數(shù)一般不能事先確定,需要根據(jù)循環(huán)條件(表達(dá)式的值)來判定,如果開始時循環(huán)條件就為假,則循環(huán)體一次也不執(zhí)行(執(zhí)行0次)。循環(huán)格式while(1)表示無限循環(huán)。除非在循環(huán)體中有退出語句,否則將導(dǎo)致程序錯誤。
(4)注意:
①循環(huán)體可以是一條簡單語句。如果包含一個以上語句,應(yīng)該用花括號({})括起來,以復(fù)合語句的形式出現(xiàn)。否則,while語句的范圍只到while后面的第一個分號處。
②?while語句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,只要表達(dá)式的值為真(非0),即可繼續(xù)循環(huán)。
③對于有些問題,無法事先知道循環(huán)該執(zhí)行多少次,此時,就可以考慮使用while循環(huán)。
【例2.3.1】用while語句求圖2-3-2求解流程圖【例2.3.2】求任意兩個正整數(shù)的最大公約數(shù)和最小公倍數(shù)。2.?do-while語句
(1)?do-while語句用來實現(xiàn)“直到型”循環(huán)結(jié)構(gòu),其一般形式如下:
do
{
語句;
}
while(表達(dá)式);
(2)執(zhí)行過程:首先執(zhí)行一次循環(huán)體語句,然后判斷表達(dá)式的結(jié)果,如果結(jié)果為“真”(非0),則重復(fù)執(zhí)行循環(huán)體語句。直到表達(dá)式的結(jié)果值為“假”(等于0)時,退出循環(huán)。然后執(zhí)行do-while循環(huán)后面的語句。其執(zhí)行過程如圖2-3-3所示。圖2-3-3do-while語句執(zhí)行過程
(3)語句特點:先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。循環(huán)的次數(shù)不能確定,需要根據(jù)循環(huán)條件(表達(dá)式的值)來判定需要循環(huán)的次數(shù)。但是不論循環(huán)條件是否成立,循環(huán)體至少要被執(zhí)行一次。這是與while循環(huán)的不同之處。
(4)注意:
①do-while結(jié)構(gòu)的表達(dá)式的后面必須有分號。
②對于有些問題,無法事先知道循環(huán)該執(zhí)行多少次,此時,就可以考慮使用do-while循環(huán)?!纠?.3.3】用do-while語句求例2-3-4求解流程圖
while和do-while循環(huán)的比較:在上面的例2.3.1和例2.3.3中,分別使用while循環(huán)和do-while循環(huán)實現(xiàn)了?的求解問題。我們發(fā)現(xiàn):同一個問題既可以用while循環(huán)處理,也可以用do-while循環(huán)處理,兩者是可以相互轉(zhuǎn)換的。但是,兩者在具體運用時還是有區(qū)別的。在一般情況下,用while語句和用do-while語句處理同一問題時,若兩者的循環(huán)體部分是一樣的,則它們的結(jié)果也一樣。但是如果while后面的表達(dá)式一開始就為假(0值),則兩者循環(huán)的結(jié)果是不同的。因為do-while循環(huán)不論表達(dá)式真假至少執(zhí)行一次循環(huán)體,而while循環(huán)后面的表達(dá)式一開始就為假(0值)時,不執(zhí)行循環(huán)體。當(dāng)然,while循環(huán)和do-while循環(huán)有共同點,也有區(qū)別,兩者還可以結(jié)合使用,下面我們就結(jié)合while循環(huán)和do-while循環(huán)來解決“常勝將軍”的問題:有21根火柴,兩人輪流取,每人每次可以取走1至4根,不可多取,也不能不取,誰取到最后一根火柴誰輸。編寫該程序后進(jìn)行人機(jī)對弈,要求人先取,計算機(jī)后取,此時計算機(jī)一方為“常勝將軍”。
人機(jī)對弈時,有21根火柴,人機(jī)輪流取,要求人先取,計算機(jī)后取,在計算機(jī)后取的情況下,要想使計算機(jī)成為“常勝將軍”,必須找出取勝的關(guān)鍵。根據(jù)本題的要求加以總結(jié)得出:后走一方取子的數(shù)量與對方剛才一步取子的數(shù)量之和相等時,就可以保證最后一個子是留給先取子的那個人的,因此可以保證計算機(jī)一方為“常勝將軍”。本任務(wù)可以采用循環(huán)結(jié)構(gòu)實現(xiàn),首先使用while循環(huán)實現(xiàn)對人機(jī)取火柴的次數(shù)控制,在循環(huán)體中使用do-while循環(huán)確保接收正確的取火柴數(shù)目輸入。不管你每次取走的火柴數(shù)為幾,最終都會在屏幕上顯示“Youlose!”。
3.for語句
(1)?for語句是使用最廣泛、最靈活的一種循環(huán)語句。其一般形式如下:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{語句序列;}
其最易理解的形式如下:
for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)
{語句序列;}
{語句序列;}
其中:
表達(dá)式1:通常為賦值表達(dá)式,用來確定循環(huán)結(jié)構(gòu)中控制循環(huán)次數(shù)的變量的初始值,實現(xiàn)循環(huán)控制變量的初始化。
表達(dá)式2:通常為關(guān)系表達(dá)式或邏輯表達(dá)式,用來判斷循環(huán)是否繼續(xù)進(jìn)行,將循環(huán)控制變量與某一值進(jìn)行比較,以決定是否退出循環(huán)。
表達(dá)式3:通常為表達(dá)式語句,用來描述循環(huán)控制變量的變化,多數(shù)情況下用自增/自減表達(dá)式(復(fù)合加/減語句)實現(xiàn)對循環(huán)控制變量的修改。
循環(huán)體(語句序列):當(dāng)循環(huán)條件滿足時應(yīng)該執(zhí)行的語句序列。
(2)執(zhí)行過程:
①計算表達(dá)式1的值,為循環(huán)控制變量賦初值。
②計算表達(dá)式2的值,如果其值為“真”則執(zhí)行循環(huán)體語句,否則退出循環(huán),執(zhí)行for循環(huán)后的語句。
③如果執(zhí)行了循環(huán)體語句,則在每一次執(zhí)行循環(huán)體結(jié)束時,都要計算一次表達(dá)式3的值,調(diào)整循環(huán)控制變量。而后返回第②步重新計算表達(dá)式2的值,依此重復(fù)過程,直到表達(dá)式2的值為“假”時,退出循環(huán)。其執(zhí)行過程如圖2-3-5所示。
(3)語句特點:for循環(huán)語句不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且還可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它功能強(qiáng)大,使用靈活、方便,完全可以代替while語句。圖2-3-5for語句執(zhí)行流程
(4)注意:
①for語句的循環(huán)體可以是簡單語句或復(fù)合語句。若只有一條語句,則可以省略{}。
②for語句一般形式中的表達(dá)式1、2、3可以省略,但“;”不能缺省。各種省略情況下面會進(jìn)行詳細(xì)講解。【例2.3.4】用for語句求。
(5)for語句的省略形式。for循環(huán)中的“表達(dá)式1(循環(huán)變量賦初值)”、“表達(dá)式2(循環(huán)條件)”和“表達(dá)式3(循環(huán)變量增量)”都是選擇項,即可以缺省,但“;”不能缺省。
●省略了“表達(dá)式1(循環(huán)變量賦初值)”,表示不對循環(huán)控制變量賦初值。
●省略了“表達(dá)式2(循環(huán)條件)”,表示不做其他處理時便成為死循環(huán)。
例如:
for(i=1;;i++)sum=sum+i;
相當(dāng)于:
i=1;
while(1)
{sum=sum+i;
i++;}
●省略了“表達(dá)式3(循環(huán)變量增量)”,則不對循環(huán)控制變量進(jìn)行操作,這時可在語句序列中加入修改循環(huán)控制變量的語句。
例如:
for(i=1;i<=100;)
{sum=sum+i;
i++;}
●省略了“表達(dá)式1(循環(huán)變量賦初值)”和“表達(dá)式3(循環(huán)變量增量)”。例如:
for(;i<=100;)
{sum=sum+i;
i++;}
相當(dāng)于:
while(i<=100)
{sum=sum+i;
i++;}●?3個表達(dá)式都可以省略。
例如:
for(;;)
相當(dāng)于:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工自愿離職協(xié)議書
- 車輛掛靠運輸協(xié)議
- 知識產(chǎn)權(quán)交易轉(zhuǎn)讓合同
- 中介委托服務(wù)合同
- 電子數(shù)據(jù)交易平臺合作協(xié)議書
- 基于可再生能源的城市規(guī)劃與建設(shè)合作協(xié)議
- 房地產(chǎn)銷售聯(lián)合代理合同協(xié)議書
- 低碳環(huán)保技術(shù)與產(chǎn)品推廣應(yīng)用方案
- 普通短期貨物運輸合同
- 企業(yè)數(shù)字化轉(zhuǎn)型與供應(yīng)鏈優(yōu)化合作協(xié)議
- GB/T 554-1996帶纜樁
- 馬工程教材《公共財政概論》PPT-第四章 政府消費支出
- GB/T 20313-2006建筑材料及制品的濕熱性能含濕率的測定烘干法
- 拉擠樹脂及其成型工藝介紹課件
- 山東省中考物理總復(fù)習(xí) 八上 第6講 質(zhì)量與密度
- 2023年南京信息職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試筆試模擬試題及答案解析
- 10KV供配電工程施工方案設(shè)計
- 商務(wù)部專員績效考核指標(biāo)量表
- (完整)PEP人教版小學(xué)生英語單詞四年級上冊卡片(可直接打印)
- 面神經(jīng)疾病課件
- 基本公共衛(wèi)生服務(wù)項目績效考核的課件
評論
0/150
提交評論