第二章C語言編程基礎知識(3 / 3)

【例2-4】利用putchar()函數將字符輸出到顯示終端上。

# include < stdio.h >

main()

{

int a; / * 定義整型變量名 */

a=98; / * 給變量賦值 */

printf("output the character \ n");

putchar(a); / * 輸出字符 * /

}

執行該程序,將把字母b(其ASCII碼為98)輸出在顯示屏上,其輸出形式如下:

output the character

b

【例2-5】把輸入的小寫字母變成大寫的形式,然後顯示在屏幕上。

# include < stdio.h >

main()

{

int c;

while((c =getchar()) ! =EOF)

if( c >= 'a' & & c < = 'z ')

putchar(c - 'a '+ 'A '); / * 小寫變大寫的算法 */

else

putchar(c); / * 大寫保持不變 * /

}

2.7.2 字符串輸入/輸出函數

1.字符串輸入函數gets()

(1)格式

gets(char * s)

(2)功能

該函數從標準輸入文件(一般是鍵盤)讀取下一個字符串,存入s所指向的內存區內。當輸入遇到<CR>字符時,結束串的輸入,並自動將<CR>字符轉換為' \ 0 '(即NULL),存放在輸入串的末尾,使其構成下一個字符串。

(3)參數說明

s是一個字符型指針,它指向所取字符串的首地址。

(4)返回值

正常返回時,取到字符串的首地址。如果遇到文件尾或出錯時返回NULL。NULL定義的形式為“#define NULL 0”,它包含在stdio.h頭文件中。

【例2-6】輸入一個字符串,然後在屏幕上輸出。

# include < stdio.h >

main()

{

char str[100];

if(gets(str) ! = NULL) / * 遇NULL結束輸入* /

printf(" % s \ n",str);

}

如運行此程序,從鍵盤輸入Tsinghua,則在屏幕上會輸出Tsinghua的字符串。

2.字符串輸出函數puts()

(1)格式

int puts(char * s);

(2)功能

將s所指向的字符串輸出到標準輸出文件中,並將末尾字符' \ 0 '變換為<CR>輸出。

(3)參數

s指向要輸出的字符串。

(4)返回值

正常返回值是0,錯誤返回值為EOF。

【例2-7】將輸入的字符串原樣輸出。

# include

main()

{

char * string;

puts("test string I/O");

while(gets(string) ! = NULL)

puts(string);

}

2.7.3 格式化輸入/輸出函數

C語言的輸入/輸出是由係統提供的庫函數完成,C語言的標準函數庫提供了所需的輸入/輸出函數。

1.格式化輸出函數

(1)格式

printf(“輸出格式描述串”,輸出項表列)

(2)功能

該函數按照指定的格式,將輸出項表列中的諸項輸出到標準輸出文件中。

(3)參數說明

輸出格式描述串是由一係列格式轉換說明符組成,格式轉換說明符的描述形式如下:

%[+][-]0 m[.n] 1 <形式字母>

?形式字母。形式字母指定輸出格式,形式字母的種類如表2-8所示。

表2-8 形式字母表

形式字母 輸出格式 使用舉例 輸出結果

d 十進製整型數 int y=25;print("%d",y); 25

x 十六進製整型數 int y=35;printf("%x",y); 23

o 八進製整型數 int y=35;printf("%o",y); 43

u 無符號十進製整型數 int y=35;printf("%u",y); 35

c 單個字符 char c='A''printf("%c",c); A

s 字符串 shatic char s[]="This";printf("%s",s); This

e 指數形式的浮點數 float y =475.3751;printf("%e",y); 4.753751e+002

續 表

形式字母 輸出格式 使用舉例 輸出結果

f 小數形式的浮點數 float y =475.3751;printf("%f",y); 475.375100

g e和f中較短的一種 float y =475.3751;printf("%g",y); 475.3751

% 符號“%”本身 printf("%%"); %

?l。l指定輸出精度。如果形式字母是d、x、o和u,則可指定如下幾類精度:

l:long型輸出精度

h:short精度

缺省時為int型精度

例如:long x =12345678;printf(“%ld”,x);

如果形式字母是e、f和g時,則指定1時為double精度,不指定時為float精度。

?m[.n]。指定輸出長度。如果輸出的是實數,則m表示該項輸出占用字符位置的總長度,n表示小數部分的字符總長度。例如:

float x =3.1415

printf(" % 7.4f ",x);

% 7.4指出輸出x時,總共占用7個字符位置,其中小數部分占4位,輸出結果是:

b3.1415

其中b表示下一個空白。

如果輸出的是字符串,則m表示輸出字符占用的總字符長度,而n表示實際輸出的字符數。例如:

static char c[]="ABCDE";

printf(" %5.3",c);

則輸出結果是:

bbABC

其中bb表示兩個空白(下同),表示該輸出共占5個字符位置,實際輸出3個字符。

?0。指定不使用的空位置填0(數字零)。如果不指定0時,則不使用的位置為空白。

該項僅對數值輸出時才可指定,對字符串輸出不用指定。例如:

int x=456;

printf(" %05d",x);

二者的輸出形式分別為:

00456

bb456

?[+][-]。指定輸出位置。如果指定“+”缺省時,則輸出字符靠右端。如果指定“-”時,則輸出字符靠左端。例如:

static char str[]="ABC";

printf("% -5s",str);

printf("% +5s",str);

二者的輸出分別為:

ABCbb

bbABC

?%。是一個格式轉換說明符的開始標識記號。

程序員要想按照要求的格式輸出指定的項,就必須弄清楚各種各樣轉換說明符。

4.輸出項表

輸出項表指定要輸出的數據,可以指定多個輸出數據,數據之間用逗號(,)分隔,要輸出的數據可以是變量,也可以是表達式。輸出數據的個數要與格式轉換說明符的個數相一致。例如:

printf("x=% f n=% d s=% s \ n",x,n,s);

其中:輸出項x與格式轉換符% f相對應,以實型格式輸出;輸出項n與格式轉換符%d相對應,以整型格式輸出;輸出項s與格式轉換符%s相對應,以字符串格式輸出;

【例2-8】請指出下麵程序的輸出結果。

main()

{

int x,y,z; / * 定義整型變更名 */

x = 10; / * 變量初始化 * /

y = 15; / * 變量初始化 * /

z = 25; / * 變量初始化 * /

printf("output-result:\ n"); / *屏幕輸出打印提示 * /

printf("x = % d y = % d z =% d \ n",x,y,z; / * ,輸出結果 * /

prntf("x + y = % d \ n x + y + z = % d \ n",x + y + z); / * 輸出計算結果 * /

}

其輸出結果為:

output - result:

x = 10 y = 15 z = 25

x + y = 25

x + y + z = 50

此例可以看出,輸出格式轉換說明符不僅規定了輸出項的輸出格式,也規定了其輸出位置,例如y的值輸出在“y = ”之後。另外還看出輸出項可以是表達式。

2.格式化輸入函數

(1)格式

scanf(“格式描述串”,輸入項表列);

(2)功能

該函數從標準輸入設備(通常是鍵盤)按照指定的格式為指定的輸入項輸入數據。如果有多個輸入項時,從鍵盤上輸入的各個數據之間可以用空格、TAB鍵或回車作為分隔符。

(3)參數說明

與printf()類似,格式描述串也是由一係列“格式轉換說明”所組成。每個格式轉換說明符的完整描述如下:

% m[.n]1<形式字母>

?形式字母,有d、o、x、c、e和f,含義同printf()中的描述。

?l。指定輸入數據的精度。在形式字母d、o、x、c和f前可指定l,則表示輸入long型或double型精度。如果指定h,則表示精度為short。

?m[.n]。表示輸入數據的長度,含義類似printf()中所述。對於字符串輸入可限製輸入串的長度。如scanf(“% 20s”,str);表示輸入串不能超過20個字符。

?輸入分隔符的指定。輸入分隔符可用以下兩種方法指定:

?在格式轉換說明符之間用空格字符(空格、TAB和<CR>作分隔符。

?在格式轉換說明符之間用字符作分隔符。

例如:

scanf(“%d:%d:%f",& x,&y,&z);

從鍵盤輸入以下內容:

35:45:4.45<CR>

其中35賦給x,45賦給y,4.45賦給z。又如:

scanf(" %4d %2d % d",&x,&y,&z);

鍵盤輸入以下內容時:

20531754

其中2053賦給x,01賦給y,754賦給z。

(4)輸入項表

輸入項表指定輸入項。如果多個輸入項,則輸入項之間用逗號隔開。輸入項必須以形式給出。例如:

float x;

char string[20];

scanf(" % f % s",x,string);

此例是錯誤的。因為,x不是以地址形式給出。下例說明scanf()函數的功能。

【例2-9】請給出下麵程序的輸入並指出其輸出結果。

main()

{

int a,b,c; / * 定義整型變量名 * /

float average; / * 定義實型變量名 * /

printf(" \ n please input a,b,c:"); / * 輸入提示 * /

scanf(" % d % d % d,&a,&b,&c,); / * 讀入數據 * /

printf(" \ n a = % d b= % d c= % d",a,b,c); / * 輸出a、b和c的值 * /

average=(a+b+c)/3; / * 計算平均值 * /

printf(" \ n average = % f ",average); / * 輸出平均值 * /

}

該程序以人機對話方式為變量a、b和c輸入數據,並顯示該輸入數據和計算的平均值。它的某次執行情況如下:

please input a,b,c:75 85 95<CR>

a =75b=85c=95

average = 85.0

【例2-10】本例要求掌握不同輸入格式下數據的輸入方式。

# include < stdio.h >

main()

{

char a,b,c,d,e / * 定義字符型變量 * /

int m,n,u,v; / * 定義整型變量 * /

a=' N ';b=' a '; c= 'm ';d='e '; / * 初始化字符變量 * /

putchar(a);

putchar(b);

putchar(c);

putchar(d);

putchar(' \ n ');

putchar(a);putchar(' \ n ');

putchar(b); putchar(' \ n ');

putchar(c); putchar(' \ n ');

putchar(d); putchar(' \ n ');

printf("Please input a character ,and then press ENTER key ! \ n");

e=getchar()

printf("The character inputed is ");

putchar(e);

putchar( ' \ n ');

printf("請輸入兩個整型數,然後按回車鍵!\ n");

printf("請注意,兩個整型數之間用<空格>隔開 \ n");

scanf(" % d % d,& m,& n);

printf("The two datas inputed are");

printf(" % d and % d \ n",m,n);

printf("--------------------------------------------------------------- \ n");

printf("請輸入兩個整型數,然後按回車鍵!\ n");

printf(請注意,兩個整型數之間用<逗號>隔開 \ n");

scanf(" % d % d ,& u, & v);

printf("The two datas inputed are");

printf(" % d and % d \ n",u,v);

printf("--------------------------------------------------------------- \ n");

printf("請輸入兩個整型數,然後按回車鍵!\ n");

printf("請注意,兩個整型數之間用<:>隔開 \ n");

scanf(" % d: % d,& u, & v);

printf("The two datas inputed are ");

printf(" %d and %d \ n",u,v);

}

從以上的程序可以知道,用scanf()函數進行輸入時,輸入格式要嚴格根據輸入格式中定義的方式進行,尤其是當連續輸入若幹個整型數(其他類型的數據也一樣)時,如果控製格式符沒有任何其他符號時,一定要用一個“空格”分隔開,否則係統將無法確認輸入的數據,例如,要連續輸入123和456兩個數,如果不用空格分隔開這兩個數,那就變成123456,係統無法區分輸入的是12和3456,還是1和23456,更不能理解用戶的意圖——輸入123和456兩個數。輸入格式中有“空格”時,那就必須輸入兩個空格來分隔兩個數,其中下一個空格是用來與格式控製符中的空格匹配,另一個空格用來分隔兩個數。此外,當在格式控製符中用“:”來分隔兩個數時,用戶在輸入數據時,就必須在兩個數據之間用“:”來分隔這兩個數,以實現輸入的數據格式與格式控製符匹配。用戶可以把【例2-10】運行一遍,以更好地了解和體會格式控製符在輸入和輸出過程中的作用。

【例2-11】求解ax2 +bx + c = 0的根,假設b2 - 4ac >= 0。

# include "math.h" / * 由於程序中用到sqrt()這個開平方函數,必須有此語句* /

# include "stdio.h"

main()

{

float a,b,c,disc,x1,x2,p,q; / * 定義數據類型,a,b和c是言和的係數,x1、x2為

方程的根 * /

scanf(" % f % f % f",& a,& b,& c); / * 輸入方程的三個係數 * /

printf("a= % f \ nb=% f\ nc=% f\ n",a,b,c); / * 輸出已輸入的係數,確認輸入是否正

確 * /

disc = b * b - 4 * a * c;

p = -b/(2 * a);

q= sqrt(disc)/(2 * a);

x1=p + q; / * 第一個根 */

x2=p - q; / * 第二個根 * /

printf("\ n\ nx1= %5.2f\ nx2= % 5.2f \ n",x1,x2); / * 輸出計算結果 * /

}

2.8 小 結

(1)數據類型

C語言提供了豐富的數據類型,不同的數據類型決定了數據所準許的操作以及不同的存儲形式和表示形式。任何數據(不論常量和變量)都屬於某種數據類型。

(2)數據的存儲形式

不同類型的數據其存儲形式也不相同。為了理解不同類型數據之間的轉換,弄清其存儲形式。

?字符型數據。下一個字符占用下一個字節,其值就是其所在字符集中的編碼,對ASCII字符集,就是其ASCII編碼。例如'a'的編碼是97,其內存表示形式為01100001。

?整型數。整型數分為短整型數、整型數和長整型數,一般而言短整型數和整型數都占兩個字節,長整型數占4個字節。最高二進製位是符號位,正數用原碼形式表示,負數以補碼形式表示。

於是,125的short、int和long的表示形式分別為:

short,int 0 000 000 001 111 101

long 00 000 000 000 000 000 000 000 001 111 101

-125的存儲形式為:

short,int 1 111 111 110 000 011

long 11 111 111 111 111 111 111 111 110 000 011

整型數又分為符號型和無符號型,有符號型的存儲形式同short、int和long。

無符號型整型數則把最高二進製位視為有效數據,而不是符號位,於是它表示的範圍要比有符號型大一倍。

?實數。實數分float和double兩種類型,它們分別占用4個字節和8字節。

(3)數據的表示形式

數據的表示形式就是在程序中的書寫形式。不同類型的數據有不同的表示形式。字符常量是以單引號括住的單個字符,例如'a'、'A'和'3'等。字符串常量是用雙引號括起來的一串字符,例如:“This is a string”。

十進製整型數的表示形式是:[-]nn…n,其中n是0~9之間的數字。

八進製整型數的表示形式是:0nn…n,其中n的取值域是0、1…7,開頭的0是數字0。

十六進製數的表示形式是:0xnn…n,其中n的取值域是0、1…、A~F(或a~f),開頭0x是數字0和字母x(或大寫X)。實數的表示形式有兩種:小數形式和指數形式。另外,對整型數來說,如果在常量的後邊加上一個l,則認為是long型整型數。讀者要弄清數的表示形式,才能寫出正確的程序。

(4)變量

數據有常量和變量,變量是其值在程序執行過程中不斷發生變化的量,每個變量都有一個名字,名字的命名規則同用戶定義標識符。變量是和內存單元相關聯的,其對應的內存是在編譯時(對全局變量和靜態變量)或程序執行時(對於局部變量)分配的。為了分配存儲,所有的變量必須先定義或說明,然後才能引用。對全局變量而言,同一個變量在整個程序中隻能定義一次,但是可以說明多次;定義是要分配內存的,而說明並不分配內存;如果一個變量是在x源文件的開頭定義,則它在y源文件中隻需說明就可引用,而在x源文件中不需再說明就可使用。

(5)運算符和表達式

C語言的特點之一是有豐富而書寫靈活的運算符,這些運算符都有結合性和優先級。表達式的處理規則就是按照運算符的優先規則和結合性來決定的。所以讀者必須理解其優先級和結合性才能寫出正確的表達式。

(6)數據類型轉換

在一個表達式中,參與操作的各操作對象的數據類型可能不一致,這就需進行數據類型轉換。

轉換有顯示轉換和隱式轉換,顯示轉換也叫強製類型轉換;隱式轉換是按照規定的轉換規則自動進行的。

(7)C語言的輸入/輸出由專門的函數來完成。

習 題

1.C語言的數據類型有哪些?

2.什麼是常量?在C語言中,常量有哪幾三種?

3.字符常量與字符串常量有什麼區別?

4.寫出以下程序的運算結果。

main()

{char c1 = 'a'; c2 = 'b'; c3 = 'c'; c4 ='101';c5 = '\116';

printf ("a%cb%c\tc%c\tabc

",c1,c2,c3 );

printf ("\t\b%c %c", c4, c5);

}

5.求下麵算術表達式的值。

(1)x+a%3*(int)(x+y)%2/4

設x=2.5, a=7, y =4.7

(2)(float)(a+b)/2 + (int)x % (int)y

a=2,b=3,x=3.5,y=2.5

6.寫出程序運算結果。

main()

{int i,j,m.n;

i= 8; j=10;

m= + + i;n = j + +;

printf("%d,%d,%d,%d",i,j,m,n);

}