TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
TIN HỌC ĐẠI CƯƠNG Phần 3. Lập trình C
Bài 7. Kiểu dữ liệu và biểu thức trong C
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến
2
7.1. C|c kiểu dữ liệu chuẩn trong C
Kiểu dữ liệu Ý nghĩa
Kích thước Miền dữ liệu
unsigned char Kí tự
1 byte
0 255
char
Kí tự
1 byte
-128 127
unsigned int
2 byte
065.535
Số nguyên không dấu
short int
2 byte
-32.76832.767
Số nguyên có dấu
int
Số nguyên có dấu 2 byte
-32.76832.767
3
7.1. C|c kiểu dữ liệu chuẩn trong C
Kiểu dữ liệu Ý nghĩa
Kích thước Miền dữ liệu
unsigned long
4 byte
Số nguyên không dấu
0 4,294,967,295
Số nguyên có dấu
4 byte
long
float
4 byte
-2,147,483,648 2,147,483,647 3.4E-38 3.4E+38
double
8 byte
1.7E-308 1.7E+308
long double
10 byte
3.4E-4932 1.1E+4932
Số thực dấu phẩy động, độ chính x|c đơn Số thực dấu phẩy động, độ chính x|c kép Số thực dấu phẩy động, độ chính x|c kép mở rộng
4
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến
5
7.2.1. Khai b|o v{ khởi tạo biến
• Một biến trước khi sử dụng phải được khai b|o • Cú pháp khai báo:
kieu_du_lieu ten_bien; Hoặc: kieu_du_lieu ten_bien1, …, ten_bienN;
6
• Ví dụ: Khai b|o một biến x thuộc kiểu số nguyên 2 byte có dấu (int), biến y, z,t thuộc kiểu thực 4 byte (float) như sau: int x; float y,z,t; x = 3; y = x + 1;
7.2.1. Khai b|o v{ khởi tạo biến (2)
Kết hợp khai b|o v{ khởi tạo • Cú pháp:
kieu_du_lieu ten_bien = gia_tri_ban_dau;
• Ví dụ:
Hoặc: kieu_du_lieu bien1=gia_tri1, bienN=gia_triN;
int a = 3;// sau lenh nay bien a se co gia tri bang 3 float x = 5.0, y = 7.6; // sau lenh nay x co gia
// tri 5.0, y co gia tri 7.6
7
7.2.2. Khai b|o hằng
• Cách 1: Dùng từ khóa #define:
– Cú pháp: #define ten_hang gia_tri – Ví dụ:
#define MAX_SINH_VIEN 50 #define CNTT “Cong nghe thong tin” #define DIEM_CHUAN 23.5
8
7.2.2. Khai b|o hằng
• C|ch 2: Dùng từ khóa const :
const kieu_du_lieu ten_hang = gia_tri;
– Cú pháp:
9
– Ví dụ: const int MAX_SINH_VIEN = 50; const char CNTT[20] = “Cong nghe thong tin”; const float DIEM_CHUAN = 23.5;
7.2.2. Khai b|o hằng
• Chú ý:
– Gi| trị của c|c hằng phải được x|c định ngay khi
– Trong chương trình, KHÔNG thể thay đổi được
khai báo.
gi| trị của hằng.
– #define l{ chỉ thị tiền xử lý (preprocessing
10
directive) • Dễ đọc, dễ thay đổi • Dễ chuyển đổi giữa c|c nền tảng phần cứng hơn • Tốc độ nhanh hơn
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến
11
7.3.1. C|c loại biểu thức
• a. Biểu thức số học:
– L{ biểu thức m{ gi| trị của nó l{ c|c đại lượng số
học (số nguyên, số thực).
– C|c to|n tử l{ c|c phép to|n số học (cộng, trừ, nh}n, chia…), c|c to|n hạng l{ c|c đại lượng số học (số, biến, hằng).
• 3 * 3.7 • 8 + 6/3 • a + b – c // Với a, b, c l{ c|c biến thuộc một
– Ví dụ:
kiểu dữ liệu số n{o đó.
12
7.3.1. C|c loại biểu thức
• b. Biểu thức logic:
– C|c phép to|n logic gồm có • AND: VÀ logic, kí hiệu l{ && • OR: HOẶC logic, kí hiệu l{ || • NOT: PHỦ ĐỊNH, kí hiệu l{ !
13
– L{ biểu thức m{ gi| trị của nó l{ c|c gi| trị logic, tức l{ một trong hai gi| trị: Đúng (TRUE) hoặc Sai (FALSE). • Gi| trị nguyên kh|c 0: Đúng (TRUE), • Gi| trị 0: Sai (FALSE).
7.3.1. C|c loại biểu thức
• c. Biểu thức quan hệ:
to|n tử quan hệ so s|nh như lớn hơn, nhỏ hơn, bằng nhau, kh|c nhau…
– L{ những biểu thức trong đó có sử dụng c|c
Đúng (TRUE) hoặc Sai (FALSE)
– Chỉ có thể nhận gi| trị l{ một trong 2 gi| trị
Biểu thức quan hệ l{ một trường hợp riêng
14
của biểu thức logic.
7.3.1. C|c loại biểu thức
• Ví dụ về biểu thức quan hệ:
15
7.3.1. C|c loại biểu thức
• Ví dụ về biểu thức logic:
16
Sử dụng biểu thức
• L{m vế phải của lệnh g|n. • L{m to|n hạng trong c|c biểu thức kh|c. • L{m tham số thực trong lời gọi h{m. • L{m chỉ số trong c|c cấu trúc lặp for,
while, do while.
• L{m biểu thức kiểm tra trong c|c cấu trúc rẽ
nhánh if, switch.
17
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến
18
7.4. Các phép toán trong C
• Bao gồm:
– Nhóm c|c phép to|n số học – Nhóm c|c phép to|n quan hệ – Nhóm các phép toán logic – Nhóm các phép toán thao tác trên bit – Ngo{i ra C còn cung cấp một số phép to|n kh|c
19
nữa như phép g|n, phép lấy địa chỉ…
7.4.1. Phép to|n số học
20
7.4.2. Phép toán trên bit (bitwise)
1) 1)
21
7.4.2. Phép toán trên bit
22
7.4.3. Phép to|n quan hệ
23
7.4.4. Phép toán logic
24
7.4.5. Phép toán gán
tên_biến = biểu_thức;
• Cú pháp • Lấy gi| trị của biểu_thức gán cho tên_biến • Ví dụ:
25
int a, b, c; a = 3; b = a + 5; c = a * b;
7.4.5. Phép toán gán
• Biểu thức g|n l{ biểu thức nên nó cũng có gi| trị. • Gi| trị của biểu thức g|n bằng gi| trị của biểu_thức: Có thể g|n gi| trị của biểu thức g|n cho một biến kh|c hoặc sử dụng như một biểu thức bình thường
• Ví dụ:
int a, b, c; a = b = 2007; c = (a = 20) * (b = 30);
26
7.4.5. Phép toán gán
• Phép to|n g|n thu gọn: x = x + y; giống như x += y;
• Dạng lệnh g|n thu gọn n{y còn |p dụng
được với c|c phép to|n kh|c: +, -, *, /, %, >>, <<, &, |, ^
27
7.4.6. Thứ tự ưu tiên c|c phép to|n
Muc
Cac toan tu
Trat tu ket hop
() [] . -> ++ -- (ha
1
2
3
4
5
6
7
8
9
10
11
12
13
14
28
Ví dụ
• a < 10 && 2 * b < c • ( a < 10 ) && ( ( 2 * b ) < c )
29
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu với các biến
30
7.5.1. C|c phép to|n tăng giảm một đơn vị
• Tăng hoặc giảm một đơn vị cho biến:
–
int a = 5; float x = 10; a++; // tương đương với a = a + 1; x--; // tương đương với x = x – 1;
31
Tiền tố v{ hậu tố
• Tiền tố: Thay đổi gi| trị của biến trước khi sử dụng • Hậu tố: Tính to|n gi| trị của biểu thức bằng gi| trị ban đầu của biến, sau đó mới thay đổi gi| trị của biến • Ví dụ:
int a, b, c; a = 3; // a bang 3 b = a++;// Dang hau to // b bằng 3; a bằng 4 c = ++b;// Dang tien to // b bằng 4, c bằng 4;
32
7.5.2. Phép to|n lấy địa chỉ biến (&)
• Biến thực chất l{ một vùng nhớ được đặt tên (l{ tên của
biến) trên bộ nhớ của m|y tính.
• Mọi ô nhớ trên bộ nhớ m|y tính đều được đ|nh địa chỉ. Do
đó mọi biến đều có địa chỉ
• &
– Ví dụ: int a = 2006;
&a; // co gia tri la 158 hay 9E
33
7.5.3. Phép to|n chuyển đổi kiểu bắt buộc
• Chương trình dịch sẽ tự động chuyển đổi kiểu – char int long int float
double long double
– Số nguyên long int 50,000 không phải l{ một số nguyên kiểu int vì phạm vi biểu diễn của kiểu int l{ từ (-32,768 đến 32,767). Phải ép kiểu
• Ngược lại
• Cú pháp:
() ;
34
7.5.3. Phép to|n chuyển đổi kiểu bắt buộc (2)
• Ví dụ:
#include
#include
void main()
{
long int li; int i; float f; clrscr();
li = 0x123456; f = 123.456;
i = (int) li;
printf(“\n li = %ld; i = %d”,li, i);
i = (int) f;
printf(“\n f = %f; i = %d”,f, i);
getch();
}
li = 1193046; i = 13398 f = 123.456000; i = 123
35
• Kết quả
7.5.4. Biểu thức điều kiện
• Cú pháp
• Gi| trị của biểu_thức_2 nếu biểu_thức_1 có gi| trị
kh|c 0 (tương ứng với gi| trị logic ĐÚNG),
• Ngược lại: Gi| trị của biểu_thức_3 nếu biểu_thức_1 có
gi| trị bằng 0 (tương ứng với gi| trị logic SAI).
• Ví dụ:
– biểu_thức_1 ? biểu_thức_2 : biểu_thức_3 – Gi| trị của biểu thức điều kiện
float x, y, z; // khai báo biến
x = 3.8; y = 7.6; //gán giá trị cho các biến x, y
z = (x
// nhỏ nhất trong 2 số x và y
36
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu
37
7.6. C|c lệnh v{o ra dữ liệu
• C cung cấp 2 h{m v{o ra cơ bản:
– printf()
– scanf()
• Muốn sử dụng 2 h{m printf() và
scanf() ta cần khai b|o tệp tiêu đề
stdio.h:
#include
Hoặc
#include “stdio.h”
38
7.6.1. Hàm printf
a. Mục đích và cú pháp:
• Mục đích:
– Hiển thị ra m{n hình c|c loại dữ liệu cơ bản
như: Số, kí tự v{ x}u kí tự
dòng, sang trang,…
39
– Một số hiệu ứng hiển thị đặc biệt như xuống
a. Mục đích v{ cú ph|p (2)
• Cú pháp:
printf(xau_dinh_dang [, danh_sach_tham_so]);
–xau_dinh_dang: Qui định c|ch thức hiển
–danh_sach_tham_so: Danh s|ch c|c biến sẽ
được hiển thị gi| trị lên m{n hình theo c|ch
thức được qui định trong xau_dinh_dang.
40
thị dữ liệu ra m{n hình m|y tính.
a. Mục đích v{ cú ph|p (3)
• Ví dụ: Chương trình sau
#include
#include
void main()
{ int a = 5;
float x = 1.234;
printf(“Hien thi mot so nguyen %d và mot
so thuc %f”,a,x);
getch();
}
• Sẽ cho ra kết quả:
Hien thi mot so nguyen 5 va mot so thuc 1.234000
41
a. Mục đích v{ cú ph|p (4)
• Trong xau_dinh_dang chứa:
hình.
– C|c kí tự thông thường: Được hiển thị ra m{n
– C|c nhóm kí tự định dạng: X|c định quy c|ch
hiển thị c|c tham số trong phần
danh_sach_tham_so.
– C|c kí tự điều khiển: Dùng để tạo c|c hiệu ứng
42
hiển thị đặc biệt như xuống dòng (‘\n’) hay sang
trang (‘\f’)…
a. Mục đích v{ cú ph|p (5)
• Mỗi nhóm kí tự định dạng chỉ dùng cho một
kiểu dữ liệu
Ví dụ: %d dùng cho kiểu nguyên
%f dùng cho kiểu thực
• Nếu giữa nhóm kí tự định dạng v{ tham số
tương ứng không phù hợp với nhau thì sẽ
hiển thị ra kết quả không như ý.
43
a. Mục đích v{ cú ph|p (6)
• danh_sach_tham_so phải phù hợp với c|c
nhóm kí tự định dạng trong xau_dinh_dang
về:
– Số lượng
– Kiểu dữ liệu
– Thứ tự
44
b. Một số nhóm định dạng phổ biến
Kiểu dữ liệu Kết quả
Nhóm kí tự
định dạng
%c int, char Kí tự đơn lẻ
%o
int, char
%i, %d int, char Số thập ph}n
%x, %X int, char
Số b|t ph}n
(không có 0 đằng trước)
Số hexa
(chữ thường/chữ hoa)
Số thập ph}n
%u
45
unsigned
int/char
b. Một số nhóm định dạng phổ biến (2)
Kiểu dữ liệu Kết quả
Nhóm kí tự
định dạng
%ld, %li long Số thập ph}n
%lo long
%lx, %LX long
46
%lu unsigned long Số b|t ph}n
(không có 0 đằng trước)
Số hexa
(chữ thường/chữ hoa)
Số thập ph}n
c. Một số nhóm định dạng phổ biến (3)
Kiểu dữ liệu Kết quả
Nhóm kí tự
định dạng
%s char []
%f float/double
%e, %E float/double
47
Hiển thị x}u kí tự
kết thúc bởi ‘\0’
Số thực dấu phẩy
tĩnh
Số thực dấu phẩy
động
c. Độ rộng hiển thị - số nguyên
– Có dạng %md, với m l{ số nguyên không }m
– Ví dụ: Có số a = 1234
• Đối với số nguyên hoặc ký tự hoặc xâu ký tự:
Lệnh:
printf("%5d",a);//danh 5 cho de hien thi a
printf(“\n%5d",34);
48
Cho ra kết quả: 1234
34
( kí hiệu cho dấu c|ch đơn (space) )
c. Độ rộng hiển thị - số nguyên (2)
• Ví dụ:
printf("\n%3d %15s %3c", 1, "nguyen van a", 'g');
printf("\n%3d %15s %3c", 2, "tran van b", 'k');
• Kết quả:
1
2
nguyen van a
tran van b
g
k
49
c. Độ rộng hiển thị - số thực
• m, n là 2 số nguyên không âm
%m.nf
Trong đó:
– m vị trí để hiển thị số thực, bao gồm cả kí tự '.‘,
‘-’
– n vị trí trong m vị trí đó để hiển thị phần thập
50
phân.
c. Độ rộng hiển thị - số thực (2)
• Ví dụ:
printf("\n%f",17.345);
printf("\n%.2f",17.345);
printf("\n%7.2f",17.345);
• Kết quả:
17.345000
17.34
17.34
51
c. Độ rộng hiển thị - Chú ý
• Khi số chỗ cần thiết để hiển thị nội dung dữ
liệu lớn hơn trong định dạng:
– Tự động cung cấp thêm chỗ mới để hiển thị chứ
không cắt bớt nội dung của dữ liệu.
printf(“So a la: %1d”, a);
– Ví dụ: a=1000
So a la: 1000
52
– Kết quả:
d. Căn lề phải, lề tr|i
• Căn lề phải:
• Căn lề trái:
– Khi hiển thị dữ liệu, mặc định C căn lề phải
– Nếu muốn căn lề tr|i khi hiển thị dữ liệu ta chỉ
53
cần thêm dấu trừ - v{o ngay sau dấu %.
d. Căn lề phải, lề tr|i (2)
• Ví dụ:
printf("\n%-3d %-15s %.2f %-3c", 9, "nguyen
van a", 7.5, 'g');
printf("\n%-3d %-15s %.2f %-3c", 10, “nguyen
ha", 6.75, 'k');
• Kết quả:
9 nguyen van a 7.50 g
10 nguyen ha 6.75 k
54
7.6.2. Hàm scanf
a. Mục đích và cú pháp:
• Mục đích:
– Hàm scanf() dùng để nhập dữ liệu từ bàn phím
scanf(xau_dinh_dang[,danh_sach_dia_chi]);
int a; float b;
• Cú pháp:
• Ví dụ:
scanf(“%d %f”, &a, &b);
55
a. Mục đích v{ cú ph|p (3)
• Xau_dinh_dang:
liệu được nhập vào.
– Gồm các ký tự được qui định cho từng loại dữ
– Ví dụ: Với dữ liệu định nhập vào là kiểu nguyên
• Danh_sach_dia_chi:
thì xâu định dạng là : %d
– Bao gồm các địa chỉ của các biến (toán tử &),
56
phân tách nhau bởi dấu phẩy (,)
a. Mục đích v{ cú ph|p (4)
• danh_sach_dia_chi phải phù hợp với các
nhóm kí tự định dạng trong xau_dinh_dang
về:
– Số lượng
– Kiểu dữ liệu
– Thứ tự
57
b. Một số nhóm định dạng phổ biến
Chú thích
Ví dụ
Kiểu dữ
liệu
Nhóm kí
tự
định dạng
%c
char
Kí tự đơn lẻ
char x;
scanf(“%c”, &x);
%d
int
Số thập ph}n
int x;
scanf(“%d”, &x);
%o
int
Số bát phân
int x;
scanf(“%o”, &x);
%x
int
Số hexa
int x;
scanf(“%x”, &x);
%u
Số thập phân unsigned int x;
unsigned
int
scanf(“%u”, &x);
58
c. Một số nhóm định dạng phổ biến (3)
Kiểu dữ liệu Chú thích
Nhóm kí tự
định dạng
%s char*
%f float
%ld
%lf long
double
59
Nhập x}u kí tự kết
thúc bởi ‘\0’
Số thực dấu phẩy
tĩnh
Số nguyên
Số thực dấu phẩy
tĩnh
Ví dụ
#include
#include
void main()
{
// khai bao bien
int a; float x;
char ch; char str[30];
// Nhap du lieu
printf(“Nhap vao mot so nguyen”);
scanf(“%d”,&a);
printf(“\n Nhap vao mot so thuc”);
scanf(“%f”,&x);
60
Ví dụ
printf(“\n Nhap vao mot ki tu”);
fflush(stdin); scanf(“%c”,&ch);
printf(“\n Nhap vao mot xau ki tu”);
fflush(stdin); scanf(“%s”,str);
// Hien thi du lieu vua nhap vao
printf(“\n Nhung du lieu vua nhap vao”);
printf(“\n So nguyen: %d”,a);
printf(“\n So thuc : %.2f”,x);
printf(“\n Ki tu: %c: ”,ch);
printf(“\n Xau ki tu: %s”,str);
getch();
61
}
Ví dụ
62
• Kết quả:
Nhap vao mot so nguyen: 2007
Nhap vao mot so thuc: 17.1625
Nhap vao mot ki tu: b
Nhap vao mot xau ki tu: ngon ngu lap trinh C
Nhung du lieu vua nhap vao
So nguyen: 2007
So thuc: 17.16
Ki tu: b
Xau ki tu: ngon
c. Một số quy tắc cần lưu ý
• Quy tắc 1: Khi đọc số
chấm (‘.’) đều l{ kí tự hợp lệ.
– H{m scanf() quan niệm rằng mọi kí tự số, dấu
63
– Khi gặp c|c dấu ph}n c|ch như tab, xuống dòng
hay dấu c|ch (space bar) thì scanf() sẽ hiểu l{
kết thúc nhập dữ liệu cho một số
c. Một số quy tắc cần lưu ý (tiếp)
• Quy tắc 2: Khi đọc kí tự:
Hàm scanf() cho rằng mọi kí tự có trong bộ
đệm của thiết bị vào chuẩn đều là hợp lệ, kể
cả các kí tự tab, xuống dòng hay dấu cách.
Phần mềm
(viết bằng C)
64
c. Một số quy tắc cần lưu ý (tiếp)
• Quy tắc 3: Khi đọc xâu kí tự:
+ Hàm scanf() nếu gặp các kí tự dấu trắng, dấu
tab hay dấu xuống dòng thì nó sẽ hiểu là kết thúc
nhập dữ liệu cho một xâu kí tự.
+ Trước khi nhập dữ liệu kí tự hay xâu kí tự ta nên
Phần mềm C
người dùng
gõ kí tự '8'
Bộ đệm bàn
phím
scanf("%c:\", &x);
A
B
C
8
65
dùng lệnh fflush(stdin) để xóa bộ đệm.
7.6.3. C|c lệnh v{o ra kh|c
• Hàm gets():
Dùng để nhập v{o từ b{n phím một x}u kí tự bao gồm cả
dấu c|ch, điều m{ h{m scanf() không l{m được.
gets (biến_xâu_kí_tự);
• Cú pháp :
• Ví dụ:
char str[30];
printf(“Nhap vao mot xau ki tu:”);
fflush(stdin); gets(str);
66
7.6.3. C|c lệnh v{o ra kh|c (2)
• Hàm puts():
Hiển thị ra m{n hình nội dung x}u_kí_tự v{ sau đó đưa con
trỏ xuống dòng mới.
puts(xâu_kí_tự);
• Cú pháp:
• Ví dụ:
puts(“Nhap vao xau ki tu:”);
• Tương đương với:
printf(“%s\n”, “Nhap vao xau ki tu:“);
Hoặc printf(“Nhap vao xau ki tu:\n”);
67
7.6.3. C|c lệnh v{o ra kh|c (3)
• H{m getch(): thường dùng để chờ người sử
dụng ấn một phím bất kì rồi sẽ kết thúc
chương trình.
• Cú pháp
getch();
• Sử dụng h{m gets(), puts(), cần
khai b|o tệp tiêu đề stdio.h
• Sử dụng h{m getch(), cần khai b|o tệp
tiêu đề conio.h
• (Hàm tương tự getchar())
68
7.6.3. C|c lệnh v{o ra kh|c (4)
• Ví dụ:
#include
#include
void main()
{
char str[30];
puts(“Hay cho biet ho ten ban:”);
fflush(stdin); gets(str);
printf(“Xin chao ”);
puts(str);
puts(“An phim bat ki de ket thuc...”);
getch();
}
69
C|c lệnh nhập xuất kh|c
• Kết quả:
Hay cho biet ho ten ban:
ngon ngu lap trinh C
Xin chao ngon ngu lap trinh C
An phim bat ki de ket thuc ...
70
// nhỏ nhất trong 2 số x và y
36
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C 7.2. Khai báo và khởi tạo biến, hằng 7.3. Biểu thức trong C 7.4. Các phép toán trong C 7.5. Một số toán tử đặc trưng 7.6. Các lệnh vào ra dữ liệu
37
7.6. C|c lệnh v{o ra dữ liệu
• C cung cấp 2 h{m v{o ra cơ bản:
– printf() – scanf()
• Muốn sử dụng 2 h{m printf() và
scanf() ta cần khai b|o tệp tiêu đề
stdio.h:
#include
Hoặc
#include “stdio.h”
38
7.6.1. Hàm printf
a. Mục đích và cú pháp: • Mục đích:
– Hiển thị ra m{n hình c|c loại dữ liệu cơ bản
như: Số, kí tự v{ x}u kí tự
dòng, sang trang,…
39
– Một số hiệu ứng hiển thị đặc biệt như xuống
a. Mục đích v{ cú ph|p (2)
• Cú pháp:
printf(xau_dinh_dang [, danh_sach_tham_so]); –xau_dinh_dang: Qui định c|ch thức hiển
–danh_sach_tham_so: Danh s|ch c|c biến sẽ được hiển thị gi| trị lên m{n hình theo c|ch thức được qui định trong xau_dinh_dang.
40
thị dữ liệu ra m{n hình m|y tính.
a. Mục đích v{ cú ph|p (3)
• Ví dụ: Chương trình sau
#include
so thuc %f”,a,x);
getch(); } • Sẽ cho ra kết quả: Hien thi mot so nguyen 5 va mot so thuc 1.234000
41
a. Mục đích v{ cú ph|p (4)
• Trong xau_dinh_dang chứa:
hình.
– C|c kí tự thông thường: Được hiển thị ra m{n
– C|c nhóm kí tự định dạng: X|c định quy c|ch
hiển thị c|c tham số trong phần danh_sach_tham_so.
– C|c kí tự điều khiển: Dùng để tạo c|c hiệu ứng
42
hiển thị đặc biệt như xuống dòng (‘\n’) hay sang trang (‘\f’)…
a. Mục đích v{ cú ph|p (5)
• Mỗi nhóm kí tự định dạng chỉ dùng cho một
kiểu dữ liệu
Ví dụ: %d dùng cho kiểu nguyên %f dùng cho kiểu thực • Nếu giữa nhóm kí tự định dạng v{ tham số tương ứng không phù hợp với nhau thì sẽ hiển thị ra kết quả không như ý.
43
a. Mục đích v{ cú ph|p (6)
• danh_sach_tham_so phải phù hợp với c|c
nhóm kí tự định dạng trong xau_dinh_dang về: – Số lượng – Kiểu dữ liệu – Thứ tự
44
b. Một số nhóm định dạng phổ biến
Kiểu dữ liệu Kết quả
Nhóm kí tự định dạng
%c int, char Kí tự đơn lẻ
%o
int, char
%i, %d int, char Số thập ph}n
%x, %X int, char
Số b|t ph}n (không có 0 đằng trước) Số hexa (chữ thường/chữ hoa) Số thập ph}n
%u
45
unsigned int/char
b. Một số nhóm định dạng phổ biến (2)
Kiểu dữ liệu Kết quả
Nhóm kí tự định dạng
%ld, %li long Số thập ph}n
%lo long
%lx, %LX long
46
%lu unsigned long Số b|t ph}n (không có 0 đằng trước) Số hexa (chữ thường/chữ hoa) Số thập ph}n
c. Một số nhóm định dạng phổ biến (3)
Kiểu dữ liệu Kết quả
Nhóm kí tự định dạng
%s char []
%f float/double
%e, %E float/double
47
Hiển thị x}u kí tự kết thúc bởi ‘\0’ Số thực dấu phẩy tĩnh Số thực dấu phẩy động
c. Độ rộng hiển thị - số nguyên
– Có dạng %md, với m l{ số nguyên không }m – Ví dụ: Có số a = 1234
• Đối với số nguyên hoặc ký tự hoặc xâu ký tự:
Lệnh: printf("%5d",a);//danh 5 cho de hien thi a printf(“\n%5d",34);
48
Cho ra kết quả: 1234 34 ( kí hiệu cho dấu c|ch đơn (space) )
c. Độ rộng hiển thị - số nguyên (2)
• Ví dụ: printf("\n%3d %15s %3c", 1, "nguyen van a", 'g'); printf("\n%3d %15s %3c", 2, "tran van b", 'k'); • Kết quả:
1 2
nguyen van a tran van b
g k
49
c. Độ rộng hiển thị - số thực
• m, n là 2 số nguyên không âm
%m.nf
Trong đó:
– m vị trí để hiển thị số thực, bao gồm cả kí tự '.‘,
‘-’
– n vị trí trong m vị trí đó để hiển thị phần thập
50
phân.
c. Độ rộng hiển thị - số thực (2)
• Ví dụ: printf("\n%f",17.345); printf("\n%.2f",17.345); printf("\n%7.2f",17.345); • Kết quả:
17.345000 17.34 17.34
51
c. Độ rộng hiển thị - Chú ý
• Khi số chỗ cần thiết để hiển thị nội dung dữ
liệu lớn hơn trong định dạng: – Tự động cung cấp thêm chỗ mới để hiển thị chứ
không cắt bớt nội dung của dữ liệu.
printf(“So a la: %1d”, a);
– Ví dụ: a=1000
So a la: 1000
52
– Kết quả:
d. Căn lề phải, lề tr|i
• Căn lề phải:
• Căn lề trái:
– Khi hiển thị dữ liệu, mặc định C căn lề phải
– Nếu muốn căn lề tr|i khi hiển thị dữ liệu ta chỉ
53
cần thêm dấu trừ - v{o ngay sau dấu %.
d. Căn lề phải, lề tr|i (2)
• Ví dụ: printf("\n%-3d %-15s %.2f %-3c", 9, "nguyen
van a", 7.5, 'g');
printf("\n%-3d %-15s %.2f %-3c", 10, “nguyen
ha", 6.75, 'k');
• Kết quả: 9 nguyen van a 7.50 g 10 nguyen ha 6.75 k
54
7.6.2. Hàm scanf
a. Mục đích và cú pháp: • Mục đích:
– Hàm scanf() dùng để nhập dữ liệu từ bàn phím
scanf(xau_dinh_dang[,danh_sach_dia_chi]);
int a; float b;
• Cú pháp: • Ví dụ: scanf(“%d %f”, &a, &b);
55
a. Mục đích v{ cú ph|p (3)
• Xau_dinh_dang:
liệu được nhập vào.
– Gồm các ký tự được qui định cho từng loại dữ
– Ví dụ: Với dữ liệu định nhập vào là kiểu nguyên
• Danh_sach_dia_chi:
thì xâu định dạng là : %d
– Bao gồm các địa chỉ của các biến (toán tử &),
56
phân tách nhau bởi dấu phẩy (,)
a. Mục đích v{ cú ph|p (4)
• danh_sach_dia_chi phải phù hợp với các
nhóm kí tự định dạng trong xau_dinh_dang về: – Số lượng – Kiểu dữ liệu – Thứ tự
57
b. Một số nhóm định dạng phổ biến
Chú thích
Ví dụ
Kiểu dữ liệu
Nhóm kí tự định dạng
%c
char
Kí tự đơn lẻ
char x; scanf(“%c”, &x);
%d
int
Số thập ph}n
int x; scanf(“%d”, &x);
%o
int
Số bát phân
int x; scanf(“%o”, &x);
%x
int
Số hexa
int x; scanf(“%x”, &x);
%u
Số thập phân unsigned int x;
unsigned int
scanf(“%u”, &x);
58
c. Một số nhóm định dạng phổ biến (3)
Kiểu dữ liệu Chú thích
Nhóm kí tự định dạng
%s char*
%f float
%ld %lf long double
59
Nhập x}u kí tự kết thúc bởi ‘\0’ Số thực dấu phẩy tĩnh Số nguyên Số thực dấu phẩy tĩnh
Ví dụ
#include
#include
void main()
{
// khai bao bien int a; float x; char ch; char str[30]; // Nhap du lieu printf(“Nhap vao mot so nguyen”); scanf(“%d”,&a); printf(“\n Nhap vao mot so thuc”); scanf(“%f”,&x);
60
Ví dụ
printf(“\n Nhap vao mot ki tu”); fflush(stdin); scanf(“%c”,&ch); printf(“\n Nhap vao mot xau ki tu”); fflush(stdin); scanf(“%s”,str); // Hien thi du lieu vua nhap vao printf(“\n Nhung du lieu vua nhap vao”); printf(“\n So nguyen: %d”,a); printf(“\n So thuc : %.2f”,x); printf(“\n Ki tu: %c: ”,ch); printf(“\n Xau ki tu: %s”,str); getch();
61
}
Ví dụ
62
• Kết quả: Nhap vao mot so nguyen: 2007 Nhap vao mot so thuc: 17.1625 Nhap vao mot ki tu: b Nhap vao mot xau ki tu: ngon ngu lap trinh C Nhung du lieu vua nhap vao So nguyen: 2007 So thuc: 17.16 Ki tu: b Xau ki tu: ngon
c. Một số quy tắc cần lưu ý
• Quy tắc 1: Khi đọc số
chấm (‘.’) đều l{ kí tự hợp lệ.
– H{m scanf() quan niệm rằng mọi kí tự số, dấu
63
– Khi gặp c|c dấu ph}n c|ch như tab, xuống dòng hay dấu c|ch (space bar) thì scanf() sẽ hiểu l{ kết thúc nhập dữ liệu cho một số
c. Một số quy tắc cần lưu ý (tiếp)
• Quy tắc 2: Khi đọc kí tự: Hàm scanf() cho rằng mọi kí tự có trong bộ đệm của thiết bị vào chuẩn đều là hợp lệ, kể cả các kí tự tab, xuống dòng hay dấu cách.
Phần mềm (viết bằng C)
64
c. Một số quy tắc cần lưu ý (tiếp)
• Quy tắc 3: Khi đọc xâu kí tự: + Hàm scanf() nếu gặp các kí tự dấu trắng, dấu tab hay dấu xuống dòng thì nó sẽ hiểu là kết thúc nhập dữ liệu cho một xâu kí tự.
+ Trước khi nhập dữ liệu kí tự hay xâu kí tự ta nên
Phần mềm C
người dùng gõ kí tự '8'
Bộ đệm bàn phím
scanf("%c:\", &x);
A B C 8
65
dùng lệnh fflush(stdin) để xóa bộ đệm.
7.6.3. C|c lệnh v{o ra kh|c
• Hàm gets(): Dùng để nhập v{o từ b{n phím một x}u kí tự bao gồm cả
dấu c|ch, điều m{ h{m scanf() không l{m được.
gets (biến_xâu_kí_tự);
• Cú pháp : • Ví dụ:
char str[30]; printf(“Nhap vao mot xau ki tu:”); fflush(stdin); gets(str);
66
7.6.3. C|c lệnh v{o ra kh|c (2)
• Hàm puts(): Hiển thị ra m{n hình nội dung x}u_kí_tự v{ sau đó đưa con
trỏ xuống dòng mới.
puts(xâu_kí_tự);
• Cú pháp: • Ví dụ: puts(“Nhap vao xau ki tu:”); • Tương đương với: printf(“%s\n”, “Nhap vao xau ki tu:“); Hoặc printf(“Nhap vao xau ki tu:\n”);
67
7.6.3. C|c lệnh v{o ra kh|c (3)
• H{m getch(): thường dùng để chờ người sử dụng ấn một phím bất kì rồi sẽ kết thúc chương trình.
• Cú pháp
getch();
• Sử dụng h{m gets(), puts(), cần
khai b|o tệp tiêu đề stdio.h
• Sử dụng h{m getch(), cần khai b|o tệp
tiêu đề conio.h
• (Hàm tương tự getchar())
68
7.6.3. C|c lệnh v{o ra kh|c (4)
• Ví dụ:
#include
#include
void main()
{
char str[30];
puts(“Hay cho biet ho ten ban:”);
fflush(stdin); gets(str);
printf(“Xin chao ”);
puts(str);
puts(“An phim bat ki de ket thuc...”);
getch();
}
69
C|c lệnh nhập xuất kh|c
• Kết quả: Hay cho biet ho ten ban: ngon ngu lap trinh C Xin chao ngon ngu lap trinh C An phim bat ki de ket thuc ...
70