Các kiểu dữ liệu chuẩn trong C 7.2... Các kiểu dữ liệu chuẩn trong C 7.2... Biểu thức quan hệ: – L{ những biểu thức trong đó có sử dụng c|c to|n tử quan hệ so s|nh như lớn hơn, nhỏ hơn,
Trang 1TRƯỜ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 Số nguyên không
dấu
2 byte 0 65.535
short int Số nguyên
có dấu
2 byte -32.768 32.767
int Số nguyên có dấu 2 byte -32.768 32.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 Số nguyên không
dấu
4 byte 0
4,294,967,295
long Số nguyên có dấu 4 byte -2,147,483,648
2,147,483,647
float Số thực dấu phẩy
động,
độ chính x|c đơn
4 byte 3.4E-38
3.4E+38
double Số thực dấu phẩy
động,
độ chính x|c kép
8 byte 1.7E-308
1.7E+308
long double Số thực dấu phẩy
động,
độ chính x|c kép
mở rộng
10 byte 3.4E-4932
1.1E+4932
4
Trang 2Nộ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_bien 1 , …, ten_bien N ;
• 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;
6
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;
Hoặc:
kieu_du_lieu bien 1 =gia_tri 1 , bien N =gia_tri N ;
• Ví dụ:
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:
– Ví dụ:
#define MAX_SINH_VIEN 50
#define CNTT “Cong nghe thong tin”
#define DIEM_CHUAN 23.5
8
Trang 37.2.2 Khai b|o hằng
• C|ch 2: Dùng từ khóa const :
– Cú pháp:
const kieu_du_lieu ten_hang = gia_tri;
– Ví dụ:
const int MAX_SINH_VIEN = 50;
const char CNTT[20] = “Cong nghe thong tin”;
const float DIEM_CHUAN = 23.5;
9
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 khai báo
– Trong chương trình, KHÔNG thể thay đổi được
gi| trị của hằng
– #define l{ chỉ thị tiền xử lý (preprocessing 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
10
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)
– Ví dụ:
• 3 * 3.7
• 8 + 6/3
• a + b – c // Với a, b, c l{ c|c biến thuộc một
kiểu dữ liệu số n{o đó
12
Trang 47.3.1 C|c loại biểu thức
• b Biểu thức logic:
– 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)
– 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
7.3.1 C|c loại biểu thức
• c Biểu thức quan hệ:
– L{ những biểu thức trong đó có sử dụng c|c to|n tử quan hệ so s|nh như lớn hơn, nhỏ hơn, bằng nhau, kh|c nhau…
– Chỉ có thể nhận gi| trị l{ một trong 2 gi| trị Đúng (TRUE) hoặc Sai (FALSE)
Biểu thức quan hệ l{ một trường hợp riêng của biểu thức logic
14
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
Trang 57.3.1 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 nữa như phép g|n, phép lấy địa chỉ…
19
7.4.1 Phép to|n số học
20
Trang 67.4.2 Phép toán trên bit (bitwise)
21
1) 1)
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
Trang 77.4.5 Phép toán gán
• Cú pháp
tên_biến = biểu_thức;
• Lấy gi| trị của biểu_thức gán cho tên_biến
• Ví dụ:
int a, b, c;
a = 3;
b = a + 5;
c = a * b;
25
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
28
Trang 8Ví 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:
– <tên biến> = <tên biến> + 1;
<tên biến>++;
– <tên biến> = <tên biến> - 1;
<tên biến> ;
– Ví dụ:
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
Trang 97.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ỉ
• & <tên biến>;
– Ví dụ: int a = 2006;
&a; // co gia tri la 158 hay 9E
33
.
.
D6 07
.
157 158 159 160
1
a
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
• Ngược lại
– 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
• Cú pháp:
(<kiểu dữ liệu mới>) <biểu thức>;
34
7.5.3 Phép to|n chuyển đổi kiểu bắt buộc (2)
• Ví dụ:
#include <stdio.h>
#include <conio.h>
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();
}
35
• Kết quả
li = 1193046; i = 13398
f = 123.456000; i = 123
7.7.4 Biểu thức điều kiện
• Cú pháp
– 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
• 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ụ:
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<y) ? x : y; //z sẽ có giá trị bằng giá trị
// nhỏ nhất trong 2 số x và y
36
Trang 10Nộ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 <stdio.h>
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ự
– Một số hiệu ứng hiển thị đặc biệt như xuống dòng, sang trang,…
39
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 thị dữ liệu ra m{n hình m|y tính
–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
Trang 11a Mục đích v{ cú ph|p (3)
• Ví dụ: Chương trình sau
#include <conio.h>
#include <stdio.h>
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:
– C|c kí tự thông thường: Được hiển thị ra m{n hình
– 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 hiển thị đặc biệt như xuống dòng (‘\n’) hay sang trang (‘\f’)…
42
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
Trang 12Nhóm kí tự định dạng
Kiểu dữ liệu Kết quả
%c int, char Kí tự đơn lẻ
%i, %d int, char Số thập ph}n
%o int, char Số b|t ph}n
(không có 0 đằng trước)
%x, %X int, char Số hexa
(chữ thường/chữ hoa)
%u unsigned
int/char
Số thập ph}n
45
b Một số nhóm định dạng phổ biến
Nhóm kí tự định dạng
Kiểu dữ liệu Kết quả
%ld, %li long Số thập ph}n
%lo long Số b|t ph}n
(không có 0 đằng trước)
%lx, %LX long Số hexa
(chữ thường/chữ hoa)
%lu unsigned long Số thập ph}n
46
b Một số nhóm định dạng phổ biến (2)
Nhóm kí tự định dạng
Kiểu dữ liệu Kết quả
%s char [] Hiển thị x}u kí tự
kết thúc bởi ‘\0’
%f float/double Số thực dấu phẩy
tĩnh
%e, %E float/double Số thực dấu phẩy
động
47
c Một số nhóm định dạng phổ biến (3) c Độ rộng hiển thị - số nguyên
• Đối với số nguyên hoặc ký tự hoặc xâu ký tự:
– Có dạng %md, với m l{ số nguyên không }m – Ví dụ: Có số a = 1234
Lệnh:
printf("%5d",a);//danh 5 cho de hien thi a printf(“\n%5d",34);
Cho ra kết quả:1234
34
( kí hiệu cho dấu c|ch đơn (space) )
48
Trang 13c Độ 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ả:
49
c Độ rộng hiển thị - số thực
• m, n l{ 2 số nguyên không }m
Trong đó:
– m vị trí để hiển thị số thực – n vị trí trong m vị trí đó để hiển thị phần thập phân
50
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
– Ví dụ: a=1000
printf(“So a la: %1d”, a);
– Kết quả:
52
Trang 14d Căn lề phải, lề tr|i
• Căn lề phải:
– Khi hiển thị dữ liệu, mặc định C căn lề phải
• Căn lề trái:
– Nếu muốn căn lề tr|i khi hiển thị dữ liệu ta chỉ cần thêm dấu trừ - v{o ngay sau dấu %
53
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
• Cú pháp:
scanf(xau_dinh_dang[,danh_sach_dia_chi]);
• Ví dụ:
int a; float b;
scanf(“%d %f”, &a, &b);
55
a Mục đích v{ cú ph|p (3)
• Xau_dinh_dang:
– Gồm c|c ký tự được qui định cho từng loại dữ liệu được nhập v{o
– Ví dụ: Với dữ liệu định nhập v{o l{ kiểu nguyên thì x}u định dạng l{ : %d
• Danh_sach_dia_chi:
– Bao gồm c|c địa chỉ của c|c biến (to|n tử &), ph}n t|ch nhau bởi dấu phẩy (,)
56
Trang 15a 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
Nhóm kí tự định dạng
Kiểu dữ liệu Chú thích
%c char Kí tự đơn lẻ
%d int Số thập ph}n
%o int Số b|t ph}n
%x int Số hexa
%u unsigned int Số thập ph}n
58
b Một số nhóm định dạng phổ biến
Nhóm kí tự định dạng
Kiểu dữ liệu Chú thích
%s char* Nhập x}u kí tự kết
thúc bởi ‘\0’
%f float Số thực dấu phẩy
tĩnh
%ld long Số nguyên
%lf double Số thực dấu phẩy
tĩnh
c Một số nhóm định dạng phổ biến (3) Ví dụ
#include <conio.h>
#include <stdio.h>
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
Trang 16Ví 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ụ
• 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
62
c Một số quy tắc cần lưu ý
• Quy tắc 1: Khi đọc số
– H{m scanf() quan niệm rằng mọi kí tự số, dấu chấm (‘.’) đều l{ kí tự hợp lệ
– 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ố
63
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
64