Bài 6:Nhập và Xuất trong C [Lý Thuyết]
Mục tiêu:
Kết thúc bài học này,
bạn có thể:
Ø Hiểu các hàm nhập xuất có định dạng scanf() và
printf()
Ø Sử dụng các hàm nhập xuất ký tự getchar() và
putchar().
Giới thiệu
Trong bất kỳ ngôn ngữ
lập trình nào, việc nhập giá trị cho các biến và in chúng ra sau khi xử lý có
thể được làm theo hai cách:
1. Thông qua phương tiện nhập/xuất
chuẩn (I / O).
2. Thông qua những tập tin.
Trong phần này ta sẽ nói
về chức năng nhập và xuất cơ bản. Nhập và xuất (I/O) luôn là các thành phần
quan trọng của bất kỳ chương trình nào. Ðể tạo tính hữu ích, chương trình của
bạn cần có khả năng nhập dữ liệu vào và hiển thị lại những kết quả của nó.
Trong C, thư viện chuẩn
cung cấp những thủ tục cho việc nhập và xuất. Thư viện chuẩn có những hàm quản
lý các thao tác nhập/xuất cũng như các thao tác trên ký tự và chuỗi. Trong bài
học này, tất cả những hàm nhập dùng để đọc dữ liệu vào từ thiết bị nhập chuẩn
và tất cả những hàm xuất dùng để viết kết quả ra thiết bị xuất chuẩn. Thiết bị
nhập chuẩn thông thường là bàn phím. Thiết bị xuất chuẩn thông thường là màn
hình (console). Nhập và xuất ra có thể được định hướng đến tập tin hay từ tập
tin thay vì thiết bị chuẩn. Những tập tin có thể được lưu trên đĩa hay trên bất
cứ thiết bị lưu trữ nào khác. Dữ liệu đầu ra cũng có thể được gửi đến máy in.
6.1
Tập tin tiêu đề <stdio.h>
Trong các ví dụ trước,
ta đã từng viết dòng mã sau:
#include <stdio.h>
Ðây là lệnh tiền xử lý (preprocessor
command). Trong C chuẩn, ký hiệu # nên đặt tại cột đầu tiên. stdio.h là
một tập tin và được gọi là tập tin tiêu đề (header). Nó chứa
các macro cho nhiều hàm nhập và xuất được dùng trong C. Hàm printf(), scanf(), putchar() và getchar() được thiết kế theo cách gọi các macro trong tập
tin stdio.h để thực thi các công việc tương ứng.
6.2
Nhập và xuất trong C (Input and Output)
Thư viện chuẩn trong C
cung cấp hai hàm để thực hiện các yêu cầu nhập và xuất có định dạng. Chúng là:
·
printf() – Hàm xuất có định dạng.
·
scanf() – Hàm nhập có định dạng.
Những hàm này gọi là
những hàm được định dạng vì chúng có thể đọc và in dữ liệu ra theo các định
dạng khác nhau được điều khiển bởi người dùng. Bộ định dạng qui định dạng
thức mà theo đó giá trị của biến sẽ được nhập vào và in ra.
6.2.1 printf()
Chúng ta đã quen thuộc với hàm này qua các phần trước. Ở đây, chúng ta sẽ xem
chúng chi tiết hơn. Hàm printf() được
dùng để hiển thị dữ liệu trên thiết bị xuất chuẩn – console (màn hình). Dạng
mẫu chung của hàm này như sau:
printf("control string", argument list);
Danh sách tham số
(argument list) bao gồm các hằng, biến, biểu thức hay hàm và được phân cách
bởi dấu phẩy. Cần phải có một lệnh định dạng nằm trong chuỗi điều khiển (control
string) cho mỗi tham số trong danh sách. Những lệnh định dạng
phải tương ứng với danh sách các tham số về số lượng, kiểu dữ liệu và thứ tự.
Chuỗi điều khiển phải luôn được đặt bên trong cặp dấu nháy kép“”, đây
là dấu phân cách (delimiters). Chuỗi điều khiển chứa một hay nhiều hơn
ba thành phần dưới đây :
§ Ký tự văn bản (Text characters) – Bao gồm các ký tự có thể in ra được và
sẽ được in giống như ta nhìn thấy. Các khoảng trắng thường được dùng trong việc
phân chia các trường (field) được xuất ra.
§ Lệnh định dạng - Định nghĩa cách thức các mục dữ liệu trong danh
sách tham số sẽ được hiển thị. Một lệnh định dạng bắt đầu với một ký hiệu % và
theo sau là một mã định dạng tương ứng cho mục dữ liệu. Dấu % được
dùng trong hàm printf() để chỉ ra các đặc tả chuyển đổi. Các
lệnh định dạng và các mục dữ liệu tương thích nhau theo thứ tự và kiểu từ trái
sang phải. Một mã định dạng thì cần thiết cho mọi mục dữ liệu cần in ra.
§ Các ký tự không in được – Bao gồm phím tab, dấu khoảng trắng và
dấu xuống dòng.
Mỗi lệnh định dạng gồm
một hay nhiều mã định dạng. Một mã định dạng bao gồm ký hiệu % và một bộ định kiểu. Bảng 6.1 liệt kê các mã định dạng khác
nhau được hỗ trợ bởi câu lệnh printf():
Ðịnh
dạng
|
printf()
|
scanf()
|
Ký tự đơn (Single Character)
|
%c
|
%c
|
Chuỗi (String)
|
%s
|
%s
|
Số nguyên có dấu (Signed decimal
integer)
|
%d
|
%d
|
Số thập phân có dấu chấm động
(Floating point)
|
%f
|
%f hoặc %e
|
Số thập phân có dấu chấm động -
Biểu diễn phần thập phân
|
%lf
|
%lf
|
Số thập phân có dấu chấm động -
Biểu diễn dạng số mũ
|
%e
|
%f hoặc %e
|
Số thập phân có dấu chấm động
(%f hoặc %e, con số nào ít hơn)
|
%g
|
|
Số nguyên không dấu (Unsigned
decimal integer)
|
%u
|
%u
|
Số thập lục phân không dấu (Dùng
“ABCDEF”)
(Unsigned hexadecimal integer)
|
%x
|
%x
|
Số bát phân không dấu (Unsigned
octal integer)
|
%o
|
%o
|
Bảng 6.1: Mã định dạng trong printf ()
Trong bảng trên, c,
d, f, lf, e, g, u, s, o và x là bộ định kiểu.
Các quy ước in cho các
mã định dạng khác nhau được tổng kết trong Bảng 6.2:
Mã
định dạng
|
Quy
ước in ấn
|
%d
|
Các con
số trong số nguyên.
|
%f
|
Phần số nguyên của số sẽ được in
nguyên dạng. Phần thập phân sẽ chứa 6 con số. Nếu phần thập phân của con số
ít hơn 6 số, nó sẽ được thêm các số không (0) bên phải hay gọi là làm tròn
phía bên phải.
|
%e
|
Một con số bên trái dấu chấm thập
phân và 6 con số bên phải giống như %f.
|
Bảng 6.2: Quy ước in
Bởi vì các ký hiệu %,\
và “ được dùng đặc biệt
trong chuỗi điều khiển, nếu chúng ta cần in các ký hiệu này lên màn hình, chúng
phải được dùng như trong Bảng 6.3:
\\
|
In
ký tự \
|
\ “
|
In
ký tự “
|
%%
|
In
ký tự %
|
Bảng 6.3: Các ký tự đặc biệt trong chuỗi điều khiển
Bảng dưới đây đưa ra vài
ví dụ sử dụng chuỗi điều khiển và mã định dạng khác nhau.
Số
|
Câu
lệnh
|
Chuỗi
điều khiển
|
Nội
dung mà chuỗi điều khiển chứa đựng
|
Danh
sách tham số
|
Giải
thích danh sách tham số
|
Hiển
thị trên màn hình
|
1.
|
printf("%d", 300);
|
%d
|
Chỉ chứa lệnh định dạng
|
300
|
Hằng
số
|
300
|
2.
|
printf("%d", 10+5);
|
%d
|
Chỉ chứa lệnh định dạng
|
10
+ 5
|
Biểu
thức
|
15
|
3.
|
printf("Good Morning
Mr. Lee.");
|
Good
Morning Mr. Lee.
|
Chỉ là các ký tự văn bản
|
Không
có (Nil)
|
Không
có
|
Good
Morning Mr. Lee.
|
4.
|
int count =
100;
printf("%d", count);
|
%d
|
Chỉ chứa lệnh định dạng
|
Count
|
Biến
|
100
|
5.
|
printf("\nhello");
|
\nhello
|
Chỉ là các ký tự văn bản và ký tự
không in được.
|
Không
có
|
Không
có
|
Hello
(Trên
dòng mới)
|
6.
|
#define str "Good
Apple"
……..
printf("%s", str);
|
%s
|
Chỉ chứa lệnh định dạng
|
Str
|
Hằng
chuỗi
|
Good
Apple
|
7.
|
……..
int count,stud_num;
count = 0;
stud_num = 100;
printf("%d %d\n",
count, stud_num);
|
%d
%d
|
Chỉ chứa lệnh định dạng và trình
tự thoát ra
|
count,
stud_num
|
Hai
biến
|
0,
100
|
Bảng 6.4 : Chuỗi điều khiển và mã định dạng
Ví dụ 6.1 :
Ðây là một chương trình
đơn giản dùng minh họa cho một chuỗi có thể được in theo lệnh định dạng. Chương
trình này cũng hiển thị một ký tự đơn, số nguyên và số thực (a single
character, integer, và float).
#include
<stdio.h>
#include
<conio.h>
main()
{
int a = 10;
float b = 24.67892345;
char ch = 'A';
printf("\nInteger
data = %d", a);
printf("\nFloat Data = %f", b);
printf("\nCharacter = %c", ch);
printf("\nThis prints the string");
printf("%s", "\nThis also prints a string");
getch();
}
Kết quả chương trình như sau: