III. Chương trỡnh C
III.3 Nhập và xuất dữ liệu
Trong phần này chỳng ta giới thiệu cỳ phỏp và ý nghĩa một số hàm cơ bản để nhập dữ
liệu từ thiết bị vào chuẩn là bàn phớm và xuất dữ liệu ra màn hỡnh mỏy tớnh. Để sử dụng cỏc hàm núi chung của thư viện bạn phải bao hàm cỏc tệp tiờu đề (tệp .h) chứa khai bỏo nguyờn mẫu của chỳng vào chương trỡnh.
ắ Một số hàm nhập dữ liệu từ bàn phớm a. Hàm getch, getche nhập 1 ký tự
Cỳ phỏp:
int getch();
int getche();
Chức năng: Hai hàm này thực hiện đợi người dựng nhập một ký tự từ bàn phớm và trả
về một số nguyờn là mó của kớ tựđược bấm, vớ dụ bạn gừ phớm ‘a’ thỡ hàm sẽ trả về 97. Sự khỏc nhau giữa hai hàm là hàm getche hiện kớ tự được nhập lờn màn hỡnh, cũn getch thỡ khụng.
Khi phớm được bấm là phớm mở rộng thỡ hệ thống sẽ đẩy vào bộđệm nhập liệu 2 byte, byte thứ nhất cú giỏ trị 0, byte thứ 2 là mó mở rộng của phớm đú. Vớ dụ khi bạn bấm phớm mũi tờn lờn↑ thỡ hai byte cú giỏ trị là 0 72 và hàm getch hay getche trả về 0, byte cú giỏ trị 72 vẫn cũn lưu trong bộđệm nhập liệu, nếu ta gọi getch hoặc getche sẽ nhận được giỏ trị này.
b. Hàm scanf
Đõy là một trong những hàm nhập dữ liệu phổ biến nhất của C, nú cho phộp nhập nhiều loại dữ liệu (cú cỏc kiểu khỏc nhau). Khi nhập dữ liệu bằng hàm này bạn phải xỏc
định địa chỉ (vựng nhớ, hay biến) để lưu dữ liệu và kiểu của dữ liệu cần nhập.
cỳ phỏp
int scanf(const char * format, ds_cỏc_con_trỏ);
Hàm scanf cho phộp chỳng ta nhập dữ liệu từ bàn phớm theo khuụn dạng được xỏc
định bởi xõu kớ tựformat, dữ liệu nhập vào sẽ lưu vào cỏc biến hoặc vựng nhớ cú địa chỉ
tương ứng là cỏc con trỏ trong ds_cỏc_con_trỏ( cú thể cú nhiều con trỏ, mỗi con trỏ cỏch nhau bởi dấu phẩy).
Vớ dụ: nhập giỏ trị cho 3 biến a cú kiểu int, x cú kiểu float, và b cú kiểu int
Trong cỳ phỏp trờn format là một xõu quy định quy cỏch dữ liệu cần nhập, gồm nhiều
đặc tả dữ liệu tương ứng với cỏc kiểu của con trỏ trong phần ds_cỏc_con_trỏ, cú bao nhiờu con trỏ thỡ cần đỳng bấy nhiờu đặc tả, đặc tả thứ nhất quy định khuụn dạng dữ liệu cho con trỏ thứ nhất, đặc tả thứ 2 quy định khuụn dạng dữ liệu cho con trỏ thứ 2,...
Mỗi đặc tả bắt đầu bằng dấu % cú dạng sau (cỏc thành phần trong [] là tuỳ chọn):
%[*][n]<ký_tự_định_kiểu>
Trong đú
- n là một số nguyờn dương quy định độ dài tối đa (tớnh theo số kớ tự) được nhập cho thành phần tương ứng
- <ký_tự_định_kiểu> là kớ tự quy định kiểu dữ liệu cần nhập vớ dụ bạn muốn nhập số nguyờn kiểu int thỡ kớ tựđịnh kiểu là d, kiểu ký tự là c. Cỏc kớ tự định kiểu khỏc bạn xem bảng sau. Kớ tự định kiểu dữ liệu nhập kiểu con trỏ của đối nhập liệu
d integer int *arg
D, ld integer long *arg
e, E Float float *arg
f Float float *arg
g, G Float float *arg
o Octal int *arg
O Octal long *arg
i Decimal,octal, hex int *arg
u Unsigned int unsigned int *arg
U Unsigned int unsigned long *arg
x Hexadecimal int *arg
X Hexadecimal int *arg
s Character string char arg[]
c Character char *arg
- * đõy cũng là thành phần tuỳ chọn, nếu cú thỡ tỏc dụng của nú là sẽ bỏ qua một thành phần dữ liệu được xỏc định bởi đặc tả này, như vậy sẽ khụng cú đối tương
ứng với đặc tả này. Vớ dụ:
scanf(“%d%*c%d”,&a,&b);
trong dũng này chỳng ta sẽ nhập 1 thành phần (gọi là 1 trường) số nguyờn vào a, sau đú bỏ qua một thành phần là kớ tự, và tiếp theo là một số nguyờn vào b.
• Quy cỏch nhập dữ liệu
Khi chỳng ta nhập dữ liệu từ bàn phớm, kết thỳc nhập bằng Enter (↵), thỡ tất cả
những kớ tự chỳng ta gừ trờn bàn phớm đều được lưu trong vựng đệm nhập dữ liệu (gọi là dũng vào- stdin) - dũng vào kết thỳc bởi (↵), dữ liệu trờn dũng vào này sẽ được cắt thành từng trường tuần tự từ trỏi qua phải và gỏn vào cỏc biến (hoặc vựng nhớ) xỏc
định tương ứng bởi cỏc con trỏ, cỏc phần đó tỏch được sẽ bị loại khỏi dũng vào.
Trước khi tỏch giỏ trị một trường thỡ cỏc khoảng trắng phớa trước của trường nếu cú sẽ bị loại bỏ. Nếu trong đặc tả khụng cú thành phần (n) quy định độ dài tối đa một trường thỡ cỏc trường được xỏc định bởi cỏc ký tự dấu cỏch, tab, enter (gọi chung là khoảng trắng ký hiệu là ) hoặc khi gặp ký tự khụng phự hợp với đặc tả hiện tại.
Nếu trờn dũng vào cú nhiều hơn cỏc thành phần yờu cầu của hàm nhập thỡ cỏc thành phần chưa được nhận vẫn cũn lưu trờn dũng vào.
Vớ dụ:
int a,b; float x;
scanf(“%d%%d%f”,&a,&b, &x); với dũng vào là:
143 535 34 ↵
thỡ :
- khoảng trắng đầu tiờn bị loại bỏ, 143 là trường thứ nhất được gỏn vào a, - hai khoảng trắng bị loại bỏ, 535 là trường thứ hai được gỏn vào b,
Nếu trong đặc tả cú thành phần xỏc định độ rộng tối đa (n) thỡ một trường sẽ kết thỳc hoặc khi gặp khoảng trống, hay kớ tự khụng phự hợp hoặc đó đủđộ dài n
Vớ dụ
int a,b; float x;
scanf(“%d%2d%3f”,&a,&b, &x); với dũng vào là:
143 537 34 ↵
thỡ :
- khoảng trắng đầu tiờn bị loại bỏ, 143 là trường thứ nhất được gỏn vào a, - hai khoảng trắng bị loại bỏ, 53 là trường thứ hai được gỏn vào b,
- một khoảng trắng bị loại bỏ, 7 được gỏn vào x (cũn lại 34↵ trong dũng vào)
Lưu ý:
- Số cỏc đặc tả phải tương ứng với số con trỏ trong danh sỏch con trỏ
- Ký tựđịnh kiểu trong đặc tả phải phự hợp với kiểu của con trỏ cần nhập liệu.
- Dữ liệu nhập từ bàn phớm phải phự hợp với cỏc đặc tả.
- Hàm scanf trả về số nguyờn là số trường được nhập dữ liệu
c. Hàm gets
Cỳ phỏp:
char * gets(char * s);
Chức năng của hàm gets là nhập một xõu kớ tự từ bàn phớm, khỏc với hàm scanf với
đặc tả “%s” kết thỳc nội xõu khi gặp dấu cỏch hoặc enter, tức là xõu khụng thể cú dấu cỏch, hàm gets chỉ kết thỳc khi gặp enter (kớ tự ‘\n’). Xõu kớ tự được ghi vào s (với s là mảng cỏc kớ tự hoặc con trỏ kớ tự), dấu kết thỳc xõu (‘\0’ - kớ tự cú mó 0 ) được tự động thờm vào cuối xõu. Hàm trả vềđịa chỉ của xõu được nhập.
Chỳ ý: hàm gets loại bỏ ký tự Enter(‘\n’) trờn dũng vào nhưng ký tự này khụng được đưa vào s mà tựđộng thờm ký tự kết thỳc xõu (’\0’) vào cuối của s.
ắ Một số hàm xuất dữ liệu ra màn hỡnh a. Hàm printf
Hàm prinntf là hàm in dữ liệu ra màn hỡnh rất đa dạng của ngụn ngữ C. Cũng như
hàm scanf, hàm printf cũng yờu cầu chỳng ta phải cung cấp cỏc giỏ trị và định dạng của dữ liệu cần in thụng qua cỏc đối của hàm.
Cỳ phỏp
int printf (const char * format [, <danh_sỏch_cỏc_giỏ trị>]);
Trong đú: <danh_sỏch_cỏc_giỏ trị> là phần tuỳ chọn, nếu cú thỡ đú là cỏc giỏ trị cần in, cỏc giỏ trị (cú thể là biến, hằng, lời gọi hàm, hay biểu thức núi chung) cỏch nhau bởi dấu phẩy.
Lưu ý: số giỏ trị trong <danh_sỏch_cỏc_giỏ trị> cú thể nhiều hơn số cỏc đặc tả, khi đú cỏc giỏ trị cuối (khụng cú đặc tả tương ứng) sẽ bị bỏ qua.
format là xõu ký tự điều khiển, nhiệm vụ chớnh của nú là điều khiển khuụn dạng thụng tin được in ra màn hỡnh.
Vớ dụ:
Trong format gồm ba loại: cỏc kớ tựđiều khiển, cỏc đặc tả, cỏc kớ tự thường
• Cỏc ký tựđiều khiển
Đõy là cỏc kớ tự đặc biệt, bắt đầu bằng kớ tự \ tiếp theo là 1 kớ tự dựng để điều khiển: chuyển con trỏ màn hỡnh, vị trớ in dữ liệu,..
- \n : chuyển con trỏ màn hỡnh xuống dũng mới - \t : dấu tab
- \b : (backspace) lựi một kớ tự (xoỏ kớ tự trước vị trớ con trỏ hiện tại) • Cỏc ký tự thường
Là những kớ tự khụng thuộc loại điều khiển và đặc tả, cỏc kớ tự này được in ra màn hỡnh đỳng như nú xuất hiện trong format. Ngoài ra cũn cú một vài kớ tựđặc biệt mà khi muốn in ra màn hỡnh chỳng ta phải đặt nú ngay sau kớ tự \, đú là:
- \\ : để in chớnh dấu \ - \’ : in dấu nhỏy đơn(‘) - \\” : in dấu nhỏy kộp (“) • Cỏc đặc tả
Trong format cú thể cú nhiều đặc tả, cỏc đặc tả quy định khuụn dạng dữ liệu cần in ra, mỗi đặc tả cú dạng như sau :
í nghĩa cỏc thành phần
à Thành phần <ký_tự_định_kiểu> đõy là kớ tự quy định kiểu của dữ liệu cần in vớ dụ bạn muốn in một giỏ trị int thỡ <ký_tự_định_kiểu> là d, bạn muốn in một kớ tự thỡ kớ tựđịnh kiểu là c. Cỏc kiểu khỏc được cho trong bảng sau:
Kớ tựđịnh kiểu Kiểu của giỏ trị cần in Khuụn dạng in ra d int số nguyờn hệ 10 i int số nguyờn hệ 10 o int số nguyờn khụng dấu hệ 8 u unsigned int số nguyờn khụng dấu hệ 10 x,X int,unsigned số nguyờn khụng dấu hệ 16
f float số thực (dạng dấu phẩy tĩnh)
e, E float số thực (dấu phẩy tĩnh hoặc kớ phỏp khoa học) c char kớ tự
s char * xõu kớ tự
p con trỏ in giỏ trị con trỏ dạng Segment:Offset hoặc Offset tuỳ mụ hỡnh bộ nhớđược sử dụng
Lưu ý: Cú thể dựng kết hợp ld, lu, lx,.. để định kiểu dữ liệu in ra là số nguyờn dài (long), số nguyờn dài khụng dấu (unsigned long),..
à Thành phần [n[.m]] : n, m là cỏc số nguyờn dương, n quy định độ rộng của thụng tin (tớnh theo số ký tự) được in ra màn hỡnh, m số chữ số cho phần thập phõn (chỉ
dựng cho số thực), nếu cú m thỡ số thực được làm trũn với m chữ số thập phõn. Nếu độ rộng thực sự của giỏ trị cần in < độ rộng được dành cho nú (n) thỡ cỏc dấu trống được thờm vào (bờn trỏi hay bờn phải tuỳ vào sự cú mặt của thành phần [-] hay khụng ).
Lưu ý: cú thể thay số n bằng kớ tự *, khi đú thụng tin sẽ được in ra theo đỳng độ rộng thực sự của nú.
vớ dụ printf(“%5.1f”,1.37); sẽ in ra 1.4 và chiếm 5 vị trớ trờn màn hỡnh, bờn trỏi của số được điền 2 dấu cỏch.
à Thành phần [-]: Xỏc định kiểu căn bờn trỏi hay bờn phải. Khi một giỏ trịđược in ra trờn màn hỡnh, nếu độ rộng thực sự của nú nhỏ hơn độ rộng xỏc định bởi thành phần n, ngầm định chỳng được căn bờn phải (trong vựng n kớ tự trờn màn hỡnh), nếu cú dấu - thỡ dữ liệu được căn trỏi.
Vớ dụ:
Giỏ trị trả về của hàm printf là tổng độ dài thụng tin được in (tớnh theo ký tự).
Vớ dụ 1: chương trỡnh nhập 1 kớ tự từ bàn phớm, in kớ tự và mó của nú ra màn hỡnh
#include <stdio.h> #include <conio.h> void main(){
int c;
printf("\nHay nhap mot ky tu : "); c = getch();
printf("\nban vua nhap ky tu %c, co ma la %d ",c,c); printf("\nbam phim bat ky de ket thuc");
getch(); }
khi thực hiện chương trỡnh trờn chỳng ta sẽđược:
Hay nhap mot ky tu : A bạn nhập
mỏy in ra ban vua nhap ky tu A , co ma la 65
bam phim bat ky de ket thuc
như vậy cựng là giỏ trị c (mó của kớ tự chỳng ta gừ từ bàn phớm), nhưng với đặc tả khỏc nhau sẽ cho chỳng ta khuụn dạng khỏc nhau (trong vớ dụ với đặc tả %d in ra 65, nhưng với %c lại in ra kớ tự A).
Vớ dụ 2: chương trỡnh nhập 2 số nguyờn a, b từ bàn phớm (b !=0), in tổng, hiệu, tớch, thương phần nguyờn a/b
#include <stdio.h> #include <conio.h>
void main() { int a,b,c; printf("\nnhap a, b :"); scanf("%d%d",&a,&b);
printf("\na+b= %5d \na-b= %5d", a+b, a-b); printf("\na*b= %5d \na/b= %5d", a*b, a/b); getch();
}
nhap a, b : 5 2 ↵ a+b= 7 a-b= 3 a*b= 10 a/b= 2 b. Hàm putch Cỳ phỏp: int putch(int ch); Chức năng: Hàm này in kớ tự cú mó là ch ra màn hỡnh tại vị trớ hiện tại của con trỏ, chuyển con trỏ sang phải 1 ký tự, hàm trả về số nguyờn chớnh là mó kớ tự in ra. Vớ dụ: minh hoạ putch 1: #include <stdio.h> 2: #include <conio.h> 3: void main(){ 4: int c; 5: c = 97; 6: printf("\nprint c = %d", c); 7: printf("\nputch c = "); putch(c); 8: c = 354; 9: printf("\nprint c = %d" , c); 10: printf("\nputch c = "); putch(c); 11: getch(); 12: }
khi thực hiện chương trỡnh trờn cỏc bạn sẽ thu được kết quả như sau:
print c = 97 s putch c = a c = 354
print c = 354
putch c = b
Cỏc bạn biết là một kớ tự chỉ cú kớch thước 1 byte, nhưng trong hàm putch lại cú đối là int (2 byte), trong trường hợp giỏ trị của ch >255 thỡ kớ tựđược in ra là kớ tự cú mó ( ch % 256), và đõy cũng là giỏ trị mà putch trả về. Cũng giống như với printf một số kớ tựđặc biệt được coi là ký tựđiều khiển chứ khụng phải kớ tự in ra màn hỡnh.
c. Hàm puts
Cỳ phỏp:
Chức năng: Hàm này in xõu kớ tự s ra màn hỡnh tại vị trớ hiện tại của con trỏ, sau đú tự động chuyển con trỏ sang dũng mới. Trong trường hợp in thành cụng hàm trả về số