該章內容:這章咱們學習三大結構之一:順序結構,它是程序從上往下順序執行,是程序運行最簡單的方式。printf和scanf函數使用和特例是必考知識。本章是考試的重點章節。
學習方法:從簡單的順序結構題目入手,逐步把難度加大,對比記憶printf和scanf函數。函數
第一節 表達式與語句
知識點:語句和表達式之間的聯繫;分號的使用;複合語句學習
重要程度:★★★spa
一、表達式與語句3d
「 表達式 「 + 」 ;「 = 」語句 」。例如:ci
賦值表達式字符串 |
賦值語句io |
算術表達式編譯 |
算術語句table |
自加表達式class |
自加語句 |
x=9 |
X=9; |
x+y |
x+y; |
i++ |
i++; |
從圖中能夠很清楚的看見,表達式和語句的區別就是一個有分號,一個沒有分號。這個分號是考試的重點,尤爲是在上機考試的改錯題目,最喜歡不寫分號,咱們要加一個分號!
二、空語句與複合語句
;
一、這個分號也是一個語句,稱爲「空語句」。「空語句」表示程序執行時不產生任何動做。注意:隨意使用空語句會致使邏輯上出現錯誤,須要慎用。
二、所謂複合語句,就是把好幾個語句複合到一塊兒,那麼用什麼符號把多個語句複合到一塊兒來?咱們要記住是用花括號「{」把多個語句括起來組成了一個複合語句。
複合語句具體形式:{語句1;語句2;…… 語句n;}
三、順序結構
程序中的多個語句按照語句從上往下出現的前後次序順序逐條執行,這種執行方式是最基本的執行方式,稱爲順序結構,是三大基本結構之一。
記住一句話:看到順序結構就想到從上往下。
第二節 數據輸出
考 點:pirntf函數的使用;printf兩個參數的使用方法;格式說明符號對應的意思;
重要程度:★★★★(每一年必考)
printf函數和scanf函數都是庫函數,printf和scanf都不是關鍵字,他們只是預約義標識符。
一、printf函數第一個參數講解
例1:printf("x=%d,y=%d",1,2);
第一個部分是用雙引號括起來!第二部分是兩個數據「1,2」,數據之間是用逗號隔開的。
第一部分的雙引號中就有兩種信息:一種是原樣輸出,一種是格式說明。其中原樣輸出的說明信息是「x= ,y= 」,包括第一個%d以後的逗號也是原樣輸出。雙引號中還有兩個%d,這兩個%d就是格式轉換說明,用於指定第二部分數據「1,2」的輸出格式爲整型。這裏第一個「%d」對應第一個數字1,第二個「%d」對應第二個數字2,所以咱們能夠在屏幕上看到:x=1,y=2。
例2:printf(「the result is %d」,123);
這個程序中運行結果是能夠在屏幕上看到:the result is 123。那麼原樣輸出的說明信息是「the result is」,第一個部分的%d是要把輸出數據列表的123以整型的格式輸出。
例3:printf("x=%d,y%d",1,2);
這個程序運行的結果是能夠在屏幕上看到:x=1,y2。那麼咱們能夠看到比例一中的第一部分,咱們少了個等號「=」,因此咱們在輸出時候,原樣輸出的信息就沒有等號「=」。
二、printf函數第二個參數講解
printf函數第二個參數能夠是常量數據,也能夠是變量,也能夠是表達式。
例4:printf("x=%d",1); 輸出數據列表是常量 屏幕顯示:x=1
printf("x=%d",x); 輸出數據列表是變量 若x爲9,屏幕顯示:x=9
printf("x=%d",x+y); 輸出數據列表是表達式 若x+y爲12,屏幕顯示:x=12
第二個要記住的:各個數據之間用逗號分隔開。
第三個要記住:輸出數據的個數與輸出控制中的格式轉換說明的個數相等,而且在順序上要一一對應且類型匹配。注意一點:若是類型不匹配,這時系統並不報錯,但不能獲得正確的結果。
例5:printf("%d,%f",9.87,2);
這裏是不會報錯的,可是得不到正確的結果,由於,第一個格式說明「%d」表示要把輸出數據按整數形式輸出,而它對應要輸出數據倒是實數9.87,對應出錯了。第二個格式說明「%f」是要把輸出數據按實數形式輸出,而第二個要輸出的數據倒是整數2,顯然不匹配。
在輸出控制中,格式說明的個數(也就是第一部分%d的個數)應與第二部分輸出項的輸出數據個數相同。
狀況一:格式說明的個數 < 輸出項的個數。處理方式:多於的輸出項不予輸出;
狀況一的例子:printf("%d,%d",2,3,4);的輸出結果爲2,3。數據4不會被輸出。
狀況二:格式說明的個數 > 輸出項的個數,處理方式:對多於的格式說明將輸出不定值。
狀況二的例子:printf("%d,%d",2);的輸出結果爲2,772。第二個數據是不定值。
例6:有如下程序(常考題型)
main( )
{ int a=888,b=999;
printf("%d\n",a,b);
}
程序運行後的輸出結果是
A)錯誤信息 B)999 C)888 D)888,999
分析:在printf語句中,格式控制的格式說明只有一個「%d」,可是而輸出列表項有兩項「888,999」,即a和b。因爲只有一個%d,輸出的結果只有一個,即printf函數的第二部分中第一個出現的變量a的值。則正確的答案是:C。
三、printf函數中的格式說明
前面的例子中屢次出現了由「%」加上一個字符的組成的格式轉換說明,它是做爲printf的輸出控制的。這個是必定要牢記的,是考試的重點!
表1 格式說明對應的輸出數據格式
格式說明 |
輸出數據格式 |
%d或%i |
輸出有符號的十進制整型數 |
%f |
輸出單精度或雙精度數且小數點後有6位小數數位 |
%c |
輸出一個字符 |
%o |
輸出八進制無符號形式整型數(不帶前導0) |
%x或%X |
輸出十六進制無符號形式整型數(不帶前導0x或0X) |
%#o |
輸出八進制無符號形式整型數(帶前導0) |
%#x或%#X |
輸出十六進制無符號形式整型數(帶前導0x或0X) |
%u |
輸出無符號的十進制整數 |
%e或%E |
以[-]m.ddddde±xx或[-]m.ddddde±XX的形式輸出單精度或雙精度數。d的個數由精度決定。系統隱含的精度爲6, d的個數隱含爲5。 |
說明:
1) 對於長整型數據的輸出,必定要在%和d之間加上英文小寫字母l,即格式%ld。
2) 對於雙精度數據的輸出,必定要在%和f或e之間加上英文小寫字母l, 即格式%lf或%le。
3) 用表1所列出的格式說明時,系統自動決定輸出數據所佔的寬度,並採用右對齊的方式。
常考題型:
例7: 如有如下程序段(注意:n所賦的是八進制數)
int x=32767,y=032767;
printf("%d,%o\n",x,y);
執行後輸出結果是
A) 32767,032767 B) 32767,32767 C) 32767,77777 D) 32767,077777
分析:整型變量x和y分別存放的是十進制整數32767和八進制整數32767。在printf語句中,把x和y兩個變量分別按%d(十進制有符號的形式)和%o(八進制無符號形式)形式輸出。那麼獲得的結果應該是32767,32767,即答案B正確。
例8:同例7類似,只是在printf函數中的%o之間加上#,變爲%#o。
int x=32767,y=032767;
printf("%d,%#o\n",x,y);
那麼該例子獲得的結果爲:32767,032767, 能夠看到%o與%#o之間的區別。就是一個不要輸出八進制中前導的0,而另一個是要輸出前導的0。
例9:如有如下程序段
int i=0xabc,j=0xabc;
i-=j;
printf("%X\n",i);
printf("%#X\n",i);
執行後輸出結果是
A) 0X0 B) 0x0 C) 0 D) 0XABC
0 0 0x0 0xABC
分析:第一行:整型變量i和j裏面存放的都是十六進制整數abc。第二行:執行i-=j;語句,i值變爲0。第三行:在printf語句中,把i存放的整數0以%X(十六進制無符號形式)形式輸出,獲得的結果是0,第四行:把i存放的整數0以%#X形式輸出,獲得的結果是0x0。因此正確答案是C。
例10:若變量a,b已定義爲int類型並賦值22和66,要求用printf函數以a=22,b=66的形式輸出,請寫出完整的輸出語句______。
分析:根據題目要求,變量a、b要求以int類型輸出,從表1中可知:輸出時應使用格式說明%d來對應整型,同時輸出的形式爲a=21,b=55,那麼也就是有一部分的內容要原樣輸出。這些內容是「a= ,b=」,因此在輸出控制的雙引號內,咱們寫上代碼「a=%d,b=%d」。最後,整個須要輸出語句爲:printf("a=%d,b=%d",a,b);
重要說明:(考得不多)
1) 在%和格式字符之間加入一個整數來控制輸出數據所佔的寬度,如%5d,
狀況一:整數指定的寬度大於實際輸出數據的寬度。處理方式:數據的輸出採用右對齊的方式,左邊自動補空格;
狀況二:整數指定的寬度小於實際輸出數據的寬度。處理方式:以輸出數據的實際寬度輸出。
表2舉例說明了未指定寬度和指定寬度時的對比結果。
表2 未指定寬度和指定寬度時的輸出數據對比結果(「 」表明空格)
輸出語句 |
輸出結果 |
printf("%d",625); |
625 |
printf("%2d",625); |
625 |
printf("%5d",625); |
625 |
printf("%f",1.25); |
1.250000 |
printf("%6f",1.25); |
1.250000 |
printf("%12f",1.25); |
1.250000 |
說明:在輸出時,小數點佔一位,對於float和double類型必定要保證小數後是六位,不足的補0。
2) 在%和格式字符f之間加入「整數1.整數2」來控制輸出數據的格式時,如%3.2f。
「整數1」指定整個輸出數據佔的總寬度。「整數2」指定輸出實數的小數部分的個數。
狀況一:當實際輸出數據的小數個數 > 「整數2」指定的個數時。處理方式:截去多餘的數據,並對截去的第一位小數作四捨五入處理。
狀況二:當實際輸出數據的小數個數 <「整數2」指定的個數時。處理方式:在小數的右邊添0 補足。
重要的一句話:碰到「整數1.整數2」形式,首先用「整數2」處理小數部分,處理完後,在用「整數1」處理整個數據,包括已經處理好的小數部分。
表3 「%整數1.整數2f」的輸出格式(「 」表明空格)
輸出語句 |
輸出結果 |
printf("%3.3f",3.1415); |
3.142 |
printf("%3.5f",3.1415); |
3.14150 |
printf("%9.5 f",3.1415); |
3.14150 |
printf("%3.0 f",3.1415); |
3 |
3)%o和%#o之間及%x和%#x之間的區別。有#號的時候,八進制要輸出前導0,十六進制要輸出前導0x,可是有一點:輸出前必定要把十進制轉換成須要輸出的十六進制或者八進制。(注意:#號對其它格式字符一般不起做用)。
表4 輸出的八進制數、十六進制數前分別添加0、0x
輸出語句 |
輸出結果 |
printf("%o",254); |
376 |
printf("%#o",254); |
0376 |
printf("%x",254); |
fe |
printf("%#x",254); |
0xfe |
其它使用說明:
1) 輸出「%」字符的方法,應該在格式控制中用兩個連續的「%」,即「%%」來表示,也就是要
在格式控制中出現兩個連續的「%」。
例11:printf("%%d",255);不會輸出整數255。由於「%%」的意圖是要輸出一個「%」,這個時候「d」會看成一個字符按原樣輸出。同時,因爲這時由於沒有格式說明,整數254沒法輸出到屏幕上。輸出到屏幕上的結果爲「%d」。
例12:printf("%%%d",255); 「%%」意圖輸出一個「%」,後面的「%d」是格式說明,對應後面的255。那麼這個時候輸出的結果是爲%255。
2) 注意格式說明會致使結果不一樣。
printf(「%d」,65); 把65以整型輸出,獲得結果是65。
printf(「%c」,65); 把65以字符形式輸出,獲得結果是大寫字母A。
3) int的輸出的格式說明:%d
float輸出的格式說明:%f
char 輸出的格式說明:%c
字符串輸出的格式說明:%s
double 輸出的格式說明:%lf
long int 輸出的格式說明:%ld
第三節 數據輸入
考 點:scanf函數的使用;scanf兩個參數的使用方法;格式說明符號對應的意思;
重要程度:★★★★
一、scanf函數的具體介紹
scanf函數的功能:使變量得到數值。
1)「輸入控制」的含義與printf函數的「輸出控制」相同,其做用是指定輸入時的數據轉換格式。
2)「輸入數據列表」的含義:是一個或者多個合法的地址表達式。
二、scanf函數中的格式說明
scanf函數與printf函數的格式說明有很大的相同之處:
表5 格式說明對應的輸入數據格式
格式說明 |
輸入數據格式 |
%d |
輸入十進制整型數 |
%i |
輸入整型數,輸入時可帶前導0的八進制整數和帶前導0x的十六進制整數 |
%c |
輸入一個字符 |
%o |
輸入一個八進制整型數 |
%x |
輸入一個十六進制整型數 |
%u |
輸入一個無符號的十進制整型數 |
%f |
以帶小數點的形式或指數形式輸入單精度或雙精度數 |
重要說明:
1) 從鍵盤中輸入的數據是多個,不是一個的時候。輸入的多個數值數據之間必須用分隔符(包
括空格符、製表符和回車符)隔開。
例如:
int x, y, z;
scanf("%d%d%d",&x,&y,&z);
如今要對x, y, z三個整型變量分別輸入100 200 300
則數據的輸入形式可以下幾種:
方法一:100<空格符>200<空格符>300<回車>
方法二:100<空格符><空格符>200<空格符>300<回車>
方法三:100<製表符>200<製表符300<回車>
方法四:100<回車>
200<回車>
300<回車>
這四種方式都是正確的。主要是在各個數據之間用分隔符隔開,分隔符符號有:包括空格符、製表符和回車符三種。
錯誤的輸入: 100,200,300<回車>
2)重要的一點:scanf函數中第一個參數中,格式說明的類型必須和scanf函數中第二個參數輸入項的類型一一對應匹配。若是類型不匹配,系統是不會給出出錯信息,運行的結果是得不到正確的輸入數據。如:
int a;
scanf(「%f」,&a);因爲咱們規定int格式說明爲%d,因此這裏%f就錯了!
3)當輸入長整型數據(long)時,必須使用%ld格式;輸入double數據時,必須使用%lf或%le,不然不能獲得正確數據,例如:
long a; scanf(「%lf」,&a); |
long a; scanf(「%f」,&a) |
格式正確,變量a能夠獲得正確數據。 |
格式不對,變量a得不到 正確數據。 |
4)與printf函數類似,在scanf函數中的格式字符前能夠用一個整數指定輸入數據所佔的寬度,但對實數不能指定小數的位數,例如:
int a; scanf(「%3d」,&a); |
float a; scanf(「%5f」,&a); |
把鍵盤連續敲入的三個數據做爲一個總體數據賦值給變量a。 輸入: 12345 <回車> 變量a的結果爲123 |
這裏的處理,變量a是得不 到正確的數據,實數不能指定小數的位數。 輸入: 123456.78<回車> 獲得錯誤的結果 |
5)注意一點:輸入控制中,格式說明的個數與輸入項的個數應該相同。
狀況一:格式說明的個數 < 輸入項的個數。處理方式:系統自動結束輸入,多餘的數據沒有被讀入,但做爲下一個輸入操做的輸入數據;
狀況二:格式說明的個數 > 輸入項的個數。處理方式:系統會自動結束輸入。例如:
int x, y, z; scanf("%d%d",&x,&y,&z); |
int x, y, z; scanf("%d %d %d",&x,&y,); |
鍵盤輸入下面數據: 10<間隔符>20<間隔符>30<回車> 因爲在輸入控制中只有兩個格式說明%d,則只能對x和y變量分別輸入10和20,而30不能被讀入,只能做爲之後其它輸入的輸入數據。 |
鍵盤輸入下面數據: 10<間隔符>20<間隔符>30<回車> 因爲輸入項多於格式說明的個數,變量x,y得到正確的數據以後,系統會自動結束輸入。多出的那個%d不起做用。 |
6)考試的重點:跳過輸入數據的方法。具體形式爲:在格式字符與%之間加入一個「*」,這樣會使輸入過程跳過某個輸入的數據。例如以下的程序:
int x, y, z; scanf("%d%*d%d%d",&x,&y,&z); |
int x, y, z; scanf("%d%d%*d%d",&x,&y,&z); |
鍵盤輸入下面數據: 10<間隔符>20<間隔符>30<間隔符>40<回車> 則系統會把10賦給變量x,跳過數據20,把30賦給變量y,把40賦值給變量z。 最後能夠得知:x=10,y=30,z=40;數據20被跳過 |
鍵盤輸入下面數據: 10<間隔符>20<間隔符>30 <間隔符>40<回車>則系統 會把10賦給變量x,把20 賦給變量y,跳過數據30, 把40賦值給變量z。 最後能夠得知:x=10,y=20,z=40; 數據30被跳過 |
7)考試的重點(必考):若在scanf函數的第一個參數的輸入控制串中含有其餘的字符,則在輸入時要求一一對應的位置原樣輸入這些字符。例如:
int x, y, z; scanf("x=%d,y=%d,z=%d",&x,&y,&z); |
int x, y, z; scanf("%d,%d,%d",&x,&y,&z); |
要求按照以下的形式輸入: x=20,y=30,z=40<回車> scanf函數的第一參數:"x=%d,y=% d,z=%d",之間有x=,y=,z=,因此輸入的時候,這些符號在鍵盤輸入時候不能夠少。不然獲得數據不正確。 |
要求按照以下的形式輸入: 20,30,40<回車> scanf函數的第一參數:"%d,%d,%d",之間是有逗號的,因此輸入的時候,逗號不能夠缺乏。不然獲得數據不正確。 |
重要注意:
1)scanf的輸入分隔符有三種,不包含逗號。在使用鍵盤輸入數據時,不能以逗號做爲分隔符。若是須要以逗號做分隔符,則應該在格式控制字符串中使用逗號,例如
scanf("%d, %d, %d",&x,&y,&z); |
scanf("%d%d, %d",&x,&y,&z); |
因爲在以上三個%d之間有逗號隔開,因此正確的輸入爲: 10, 20, 30<回車> |
因爲在以上後兩個%d之間有逗號隔開,前兩個%d之間沒有逗號因此正確的輸入爲: 10<.分隔符>20, 30<回車> |
2)通常狀況下,咱們操做scanf函數的時候,scanf的格式控制字符串中不要包含其它非格式控制符,不然每每容易讓人混淆,也很可貴到正確的數據。也就是說,在scanf中通常只使用格式控制符。不要出現:scanf(" the data is %d",&a);這樣的寫法,最簡單、最佳的操做寫法如:scanf(" %d",&a)。
3)使用scanf時,若是數據輸入未能完成,則程序一直等待鍵盤輸入,此時用戶應該完成數據輸入。也就是說,程序從上往下順序結構運行,當運行到scanf函數的時候,就會中止,等待你從鍵盤輸入數據給指定的變量,這個和前面學的賦值語句有相同的功能。若是在未輸入數據的狀況下鍵入回車,程序是沒有任何反映,好像死機了同樣。這時,只要用戶輸入數據便可。
4)其實經過scanf函數給變量賦值和直接使用賦值語句給變量賦值,都能使變量的值發生改變,但兩者具備本質區別。
|
使用scanf語句給變量輸入數值 |
使用賦值符號「=」語句給變量賦值 |
實現語句 |
scanf(「%d’,&x); |
x=10; |
獲值方式 |
使用鍵盤動態的給指定的某個變量賦值。 |
將某一個固定的值在程序源代碼中用賦值語句寫死, |
運行結果 |
每次編譯運行後,變量可從鍵盤賦不一樣的值,獲得不一樣的運行結果。 |
每次編譯運行後,用戶沒法改變該變量的值,每次執行的結果均相同。 |