《C語言程序設(shè)計-項目教學(xué)教程》課件-第2章_第1頁
《C語言程序設(shè)計-項目教學(xué)教程》課件-第2章_第2頁
《C語言程序設(shè)計-項目教學(xué)教程》課件-第2章_第3頁
《C語言程序設(shè)計-項目教學(xué)教程》課件-第2章_第4頁
《C語言程序設(shè)計-項目教學(xué)教程》課件-第2章_第5頁
已閱讀5頁,還剩150頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論