Tải bản đầy đủ (.pdf) (11 trang)

Chương 2 Các kiểu dữ liệu cơ bản ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.39 MB, 11 trang )

1
Các kiểu dữ liệu cơ bản
Các kiểu dữ liệu cơ bản
Chương 2
Kiểu tập tin
4
Kiểu mảng và chuỗi
1
Kiểu cấu trúc
2
Kiểu con trỏ
3
Độ phức tạp thuật toán
5
Nội dung
N
N


i dung
i dung
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u chu
u chu



i (String)
i (String)
 Một chuỗi là dãy liên tiếp các ký tự kết thúc bằng
ký tự \0 có mã ASCII bằng 0 (NULL character)
 Trong C chuỗi có tối đa 65535 ký tự
 Các hàm xử lý chuỗi được đặt trong thư viện
string.h của C.
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u chu
u chu


i (String)
i (String)
Khai báo chuỗi: có thể dùng các cách sau
 char S[10]; //Khai báo một chuỗi ký tự S có chiều dài
// tối đa 10 (kể cả kí tự kết thúc)
 char S[]="ABC";// Khai báo một chuỗi ký tự S có chiều
// dài bằng chiều dài của chuỗi "ABC"
// và giá trị khởi đầu của S là "ABC"
 char *S ="ABC";//Giống cách khai báo trên.
C
C

á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C

á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn

Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u chu
u chu


i (String)
i (String)
M
M


t s
t s


thao t
thao t
á
á
c trên chu
c trên chu


i
i
C

C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
 So sánh 2 chuỗi: strcmp

 Sao chép chuỗi: strcpy
 Độ dài chuỗi: strlen
 Kiểm tra 1 chuỗi nằm trong chuỗi kia: strstr
 Cắt 1 từ ra khỏi 1 chuỗi: strtok
 Đổi 1 số ra chuỗi: itoa
 Đổi 1 chuỗi ra số: atoi, atof,
 Nhập một chuỗi: gets
 Xuất một chuỗi: puts
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ch
ch
í
í
nh
nh
2
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u m
u m


ng (Array)
ng (Array)
 Mảng là một tập hợp các biến có cùng tên và
kiểu dữ liệu, được lưu trữ liên tiếp trong bộ nhớ
 Mỗi phần tử được đánh chỉ số (Index), phần tử
đầu tiên có chỉ số là 0
 Trong C, một mảng n chiều có thể coi là mảng 1
chiều trong đó mỗi phần tử là 1 mảng n-1 chiều.
C
C

á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C

á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn

Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u m
u m


ng (Array):
ng (Array):
Khai b
Khai b
á
á
o m
o m


ng
ng
<Kiểu dữ liệu> <Tên biến>[<Số phần tử1>][<Số phần tử2>] ;
Ví dụ, ta có thể khai báo:
 Float a[10]; //khai báo mảng 1 chiều có 10 phần tử
 int a[100][150];//khai báo mảng 2 chiều
 int a[][]={{1, 7, -3, 8, 19},{4, 5, 2, 8, 9},{21, -7, 45, -3, 4}};
C
C
á
á

c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á

c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki

Ki


u h
u h


p (Union)
p (Union)
 Union là một kiểu dữ liệu đặc biệt trong C, nó
tương tự kiểu struct nhưng các phần tử lại dùng
chung một vùng nhớ
 Cách thức truy xuất đến các thành phần trong
kiểu Union giống như kiểu cấu trúc
 Dùng kiểu Union khi cần lưu trữ dữ liệu thay đổi
theo trạng thái
C
C
á
á
c ki
c ki


u d
u d


li
li



u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr



trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u h
u h


p (Union):
p (Union):
Khai b

Khai b
á
á
o ki
o ki


u union
u union
typedef union <tên kiểu union>
{
<KDL> <tên trường>;
<KDL> <tên trường>;
………
}[<Name>];
C
C
á
á
c ki
c ki


u d
u d


li
li



u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
Ví dụ, ta có thể định nghĩa kiểu số sau:
typedef union tagNumber
{
int i;
long l;
}Number;
Number N;
Khi gán N.l=0xFF09 thì thành phần N.i sẽ nhận giá trị là 9
C
C
á
á
c c
c c



u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki



u c
u c


u tr
u tr
ú
ú
c (Structure)
c (Structure)
 Kiểu cấu trúc (hay kiểu mẫu tin) là một tập hợp
các biến khác tên và có thể khác nhau về kiểu
dữ liệu
 Cách thức truy xuất đến các thành phần trong
kiểu cấu trúc: Têncấutrúc.Tênthànhphần
 Dùng kiểu cấu trúc khi muốn lưu trữ thông tin
của các đối tượng phức tạp và đa dạng
C
C
á
á
c ki
c ki


u d
u d



li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú

c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u c
u c


u tr

u tr
ú
ú
c (Structure):
c (Structure):
Khai b
Khai b
á
á
o ki
o ki


u c
u c


u tr
u tr
ú
ú
c
c
typedef struct <tên cấu trúc>
{
<KDL> <tên trường>;
<KDL> <tên trường>;
………
}[<TênKiểucấutrúc>];
C

C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
Ví dụ, ta có thể định nghĩa kiểu cấu

trúc ngày tháng như sau:
typedef struct
{
int ngay;
int thang;
int nam;
}Ngaythang;
Ngaythang N;//khai báo biến
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u c
u c


u tr
u tr
ú
ú
c (Structure):
c (Structure):
Truy xu
Truy xu


t d

t d


li
li


u
u
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c

c


u tr
u tr
ú
ú
c
c
 Cách thức truy xuất đến các thành phần trong kiểu
cấu trúc: Têncấutrúc.Tênthành phần
 Để lấy địa chỉ của một thành phần trong cấu trúc, ta
dùng toán tử &: &Têncấutrúc.Tênthànhphần
Vd: Ngaythang N,M;
printf(“Nhập ngày tháng: ”);
scanf(“%d/%d/%d”,&N.ngay,&N.thang,&N.nam);
M=N;//gán biến cấu trúc N vào biến M
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr

c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u c
u c


u tr
u tr

ú
ú
c (Structure):
c (Structure):
H
H
à
à
m v
m v
à
à
ki
ki


u c
u c


u tr
u tr
ú
ú
c
c
C
C
á
á

c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
 Đối của hàm có thể là:
- Biến mẫu tin: khi đó tham số thực tương ứng là một giá trị mẫu tin
- Tham chiếu mẫu tin: khi đó tham số thực tương ứng là một địa chỉ
mẫu tin

- Con trỏ mẫu tin: khi đó tham số thực là địa chỉ của biến cấu trúc.
 Hàm có thể trả về:
- Giá trị mẫu tin: Ngaythang tênhàm( )
- Con trỏ mẫu tin: Ngaythang *tênhàm( )
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch

í
í
nh
nh
4
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
 Kiểu con trỏ là một kiểu dữ liệu đặc biệt trong C,
có kích thước 2 bytes và dùng để chứa địa chỉ
của một biến đã được cấp phát bộ nhớ
 Khi biến con trỏ chứa địa chỉ của biến A ta nói
nó đang trỏ tới biến (vùng nhớ) A
 Nếu con trỏ chứa giá trị NULL nghĩa là nó không
trỏ đến vùng nhớ nào hết
C
C
á
á
c ki

c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á
c c

c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki



u con tr
u con tr


(Pointer)
(Pointer)
Khai b
Khai b
á
á
o bi
o bi
ế
ế
n con tr
n con tr




Tr
Tr


c ti
c ti
ế
ế

p
p
: <tênki
: <tênki


ucơs
ucơs


> *<tênbi
> *<tênbi
ế
ế
ncontr
ncontr


>;
>;
Vd: int *P,*Q;//khai b
Vd: int *P,*Q;//khai b
á
á
o bi
o bi
ế
ế
n
n



Gi
Gi
á
á
n ti
n ti
ế
ế
p
p
: typedef <ki
: typedef <ki


ucơs
ucơs


T> *<tênki
T> *<tênki


ucontr
ucontr


>;
>;

<tênki
<tênki


ucontr
ucontr


> <tênbi
> <tênbi
ế
ế
ncontr
ncontr


>;
>;
Vd: typedef int *intPointer;//khai b
Vd: typedef int *intPointer;//khai b
á
á
o ki
o ki


u
u
intPointer P,Q;//khai b
intPointer P,Q;//khai b

á
á
o bi
o bi
ế
ế
n
n
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c



u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
Khai b
Khai b
á
á
o bi
o bi
ế
ế
n con tr

n con tr


 Con trỏ void: con trỏ được khai báo kiểu void có
thể chứa địa chỉ của bất kỳ kiểu nào. Tuy nhiên
trước khi sử dụng phải ép về một kiểu cụ thể
Vd: int X; float Y;
void *P;
P=&X; //P trỏ đến X
(float*) P=&Y;
(float*) P=&Y;
//P tr
//P tr


đ
đ
ế
ế
n Y
n Y
(int*) P=&X;
(int*) P=&X;
//P tr
//P tr


đ
đ
ế

ế
n X
n X
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú

ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í

í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
C
C
á
á
c thao t
c thao t
á
á
c
c
 Gán địa chỉ một biến cho con trỏ
tênbiếncontrỏ = &tênbiếncầnlấyđịachỉ;
tênbiếncontrỏ = NULL;
Ví dụ:

 Chứa địa chỉ của mảng 1 chiều:
int *P , A[10]; > P = A;
 Chứa địa chỉ của mảng 2 chiều:
float *P, B[3][4]; > P = (float*) B;
 Chứa địa chỉ của 1 biến cấu trúc:
struct HocSinh *P, hs; > P = &hs;
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c



u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ch
ch
í
í
nh
nh
5
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
C
C
á
á
c thao t
c thao t
á
á
c
c

 Truy xuất nội dung 1 biến do biến con trỏ trỏ đến
Cú pháp:*tênbiếncontrỏ
Lưu ý: toán tử * và & có cùng độ ưu tiên
Ví dụ: int X, *P;
X=10; P=&X; //P trỏ đến X
printf(“Giá trị X là: %d”,X);
printf(“Giá trị do P trỏ đến: %d”,*P);
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c



u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
C
C
á
á
c ph
c ph
é
é
p to
p to

á
á
n
n
 So sánh địa chỉ chứa trong hai con trỏ, dùng
toán tử == hoặc !=
 Khi sử dụng con trỏ trên mảng, ta có thể thực
hiện các phép toán sau
 Cộng địa chỉ con trỏ: pt + i
==>Cộng địa chỉ vùng nhớ lưu trong pt với i*sizeof(T)
 Trừ hai con trỏ: pt1-pt2
==>số phần tử có kích thước sizeof(T) giữa 2 địa chỉ.
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c

ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b



nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
Con tr
Con tr


v

v
à
à
m
m


ng 1 chi
ng 1 chi


u
u
 Tên mảng là hằng địa chỉ của phần tử đầu tiên trong
mảng, có thể thực hiện phép cộng địa chỉ với tên mảng.
Khi đó (A+i) tương ứng với &A[i]
 Ta cũng có thể sử dụng con trỏ trên mảng với các phép
toán sau
 Lấy địa chỉ phần tử thứ i : &A[i]
 Cộng địa chỉ
Vd: int i, *p, A[3]={10,20,30}; p=A;// hoặc p=&A[0];
for (i=0;i<3;i++) printf(“A[%d]=%d”,i,*(A+i));
for (i=0;i<3;i++) printf(“A[%d]=%d”,i,*(p+i));
C
C
á
á
c ki
c ki



u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c



u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki



u con tr
u con tr


(Pointer)
(Pointer)
Con tr
Con tr


v
v
à
à
m
m


ng 2 chi
ng 2 chi


u
u
 Tên mảng là hằng địa chỉ của phần tử đầu tiên trong
mảng, có thể thực hiện phép cộng địa chỉ với tên mảng.
Khi đó (A+i) tương ứng với &A[i][0]
Vd: float A[3][2]; ta có A ứng với &A[0][0];
(A+1) ứng với &A[1][0]; (A+2) ứng với &A[2][0]
 Ta cũng có thể sử dụng con trỏ trên mảng với các phép

toán sau
 Lấy địa chỉ phần tử A[i][j] : p+i*sốcột+j
 Cộng địa chỉ
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú

ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í

í
nh
nh
6
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
Con tr
Con tr


v
v
à
à
m
m


ng 2 chi

ng 2 chi


u
u
Vd: int i,j,k;
float *p, A[3][3];
p=(float*)A;// hoặc p=(float*)&A[0][0];
for (i=0;i<3;i++) //In theo mảng 2 chiều
for (j=0;j<3;j++)
printf(“A[%d][%d]=%d”,i,j,*(p+i*3+j));
for (k=0;k<3*3;k++) //In theo mảng 1 chiều
printf(“A[%d]=%d”,k,*(p+k));
C
C
á
á
c ki
c ki


u d
u d


li
li


u c

u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b

trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u con tr
u con tr


(Pointer)
(Pointer)
Con tr
Con tr



v
v
à
à
ki
ki


u c
u c


u tr
u tr
ú
ú
c
c
 Lấy địa chỉ của một phần tử trong cấu trúc ta
dùng toán tử &
Vd :struct Ngay{ int ngay,thang,nam;}X;
struct Ngay *p;
p=&X; //p trỏ đến cấu trúc X
 Để truy xuất giá trị của pt trong cấu trúc ta có thể
 Cách 1: *(p).ngay, *(p).thang, *(p).nam
 Cách 2: pngay, pthang, pnam
C
C
á
á

c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C
á
á

c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki

Ki


u con tr
u con tr


(Pointer)
(Pointer)
Con tr
Con tr


h
h
à
à
m
m
 Là con trỏ dùng để chứa địa chỉ của hàm
 Khai báo hàm và con trỏ hàm phải trung khớp với nhau
về các đối số và kiểu dữ liệu trả về
 Trước khi dùng phải gán tên hàm cho con trỏ hàm
Vd : int Hoanvi( int *x, int *y); //khai báo hàm
int (*p)( int*, int*)=Hoanvi; //khai báo con trỏ hàm
int x=2, y=3;
Hoanvi(&x, &y); //dùng tên hàm
p(&x, &y); //dùng con trỏ hàm
C
C

á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C

á
á
c c
c c


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ch
ch
í
í
nh
nh
3/11/2010
www.lhu.edu.vn

Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
 Ưu điểm của RAM: truy xuất nhanh
 Nhược điểm của RAM: kích thước hạn chế,
không lưu trữ thông tin khi mất điện
 Giải pháp: lưu trữ trên bộ nhớ ngoài (ổ đĩa)
 Ưu: kích thước lớn, lưu trữ lâu dài
 Nhược: truy xuất chậm do sử dụng thiết bị cơ khí
C
C
á
á
c ki
c ki


u d
u d


li

li


u c
u c
ó
ó
c
c


u tr
u tr
ú
ú
c
c
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b

trên b


nh
nh


ngo
ngo
à
à
i
i
7
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
 Có 2 loại tập tin
 Tập tin văn bản (Text file)
 Tập tin nhị phân (Binary file)

 Các bước làm việc với tập tin
1. Khai báo biến tập tin
2. Mở tập tin
3. Truy xuất nội dung tập tin
4. Đóng tập tin
 Trong C, các hàm xử lý tập tin có trong thư viện stdio.h
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c



u tr
u tr
ú
ú
c
c
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à

i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư
c bư


c thao t
c thao t
á
á
c trên t
c trên t



p tin
p tin
1. Khai báo biến tập tin: FILE *ContrỏFile;
 File được kết thúc bởi ký tự có mã 26 (EOF)
2. Mở tập tin: ContrỏFile = fopen (char *têntậptin, char *kiểu);
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à

i
i
Mở file để đọc ghi. Nếu file cũ thì nối thêm,nếu không thì tạo mới“a+”
Mở file để ghi thêm vào cuối file“a”
Mở file mới đọc hoặc ghi.“w+”
Mở file mới để ghi. Nếu file đã có sẽ bị xóa“w”
Mở để sửa“r+”
Mở để đọc. Nếu không có File sẽ báo lỗi“r”
Mở tập tin kiểu văn bản“t”
Mở tập tin kiểu nhị phân“b”
Ý nghiãKiểu
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư
c bư



c thao t
c thao t
á
á
c trên t
c trên t


p tin
p tin
V
V
í
í
d
d


:
:
FILE *fp;
FILE *fp;
fp = fopen(
fp = fopen(


C:
C:

\
\
\
\
DSHS.DBF
DSHS.DBF


,
,


wb
wb


);
);
if ( fp == 0 )
if ( fp == 0 )
{
{
perror(
perror(


Loi Mo File:
Loi Mo File:



);
);
exit(1);
exit(1);
}
}
C
C
á
á
c ki
c ki


u d
u d


li
li


u c
u c
ó
ó
c
c



u tr
u tr
ú
ú
c
c
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à

i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư
c bư


c thao t
c thao t
á
á
c trên t
c trên t



p tin
p tin
3. Truy xuất dữ liệu file văn bản
 File văn bản: đặc điểm ký tự xuống hàng gồm CR(13) và LF(10),
khi đọc CR + LF  trả về ký tự “\n”, khi ghi ký tự “\n”  CR + LF
 Đọc ghi dữ liệu tuần tự
 Ghi dữ liệu
• int putc ( int ch, FILE *fp);
• int fputc (int ch, FILE *fp);
• int fputs (const char *Str, FILE *fp);
• int fprintf (FILE *fp, const char *dk, các biểu thức);
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ngo
ngo
à
à
i
i
8
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư
c bư



c thao t
c thao t
á
á
c trên t
c trên t


p tin
p tin
3. Truy xuất dữ liệu file văn bản
 Đọc dữ liệu
• int getc (FILE *fp) ;
• int fgetc (FILE *fp) ;
• char *fgets (char * Str, int n, FILE *fp);
• int fscanf (FILE *fp, const char *dk, địa chỉ các biến);
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b



nh
nh


ngo
ngo
à
à
i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư

c bư


c thao t
c thao t
á
á
c trên t
c trên t


p tin
p tin
3. Truy xuất dữ liệu file nhị phân
 File nhị phân: không có ký tự xuống dòng, mỗi lần đọc ghi theo
một khối byte (Record)
 Đọc ghi dữ liệu tại vị trí Record bất kỳ
 Ghi các Record vào File:
int fwrite(void *ptr, int sizeofItem, int n, FILE *fp);
 Đọc các Record trên File:
int fread (void *ptr, int sizeofItem, int n, FILE *fp);
C
C


u tr
u tr
ú
ú
c lưu tr

c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à
i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)

C
C
á
á
c bư
c bư


c thao t
c thao t
á
á
c trên t
c trên t


p tin
p tin
3. Truy xuất dữ liệu file nhị phân
 Kiểm tra cuối file:
int feof (FILE *fp);
 Vị trí con trỏ byte:
long ftell (FILE *fp);
 Di chuyển đầu đọc File:
void rewind (FILE *fp);
int fseek (FILE *fp, long sốbyte, int vịtríxuấtphát);
 Đánh dấu vị trí đầu đọc ghi:
int fgetpos (FILE *fp, fpos_t *vịtrí);
C
C



u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à
i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki



u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư
c bư


c thao t
c thao t
á
á
c trên t
c trên t


p tin
p tin
3. Truy xuất dữ liệu file nhị phân
 Quay lại vị trí đã đánh dấu:
int fsetpos(FILE * fp, fpos_t *vịtrí);
 Đổi tên / di chuyển file :
int rename (const char *OldFile, const char *NewFile);

 Xóa tập tin:
int remove (const char * path);
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à
i
i
9
3/11/2010

www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c bư
c bư


c thao t
c thao t
á
á
c trên t
c trên t


p tin
p tin

4. Đóng tập tin
 int fclose (FILE *fp);
Nếu có lỗi hàm cho EOF ngược lại cho giá trị 0.
 int fcloseall ( );
Nếu có lỗi cho EOF nếu không cho số file được đóng.
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à
i

i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c v
c v
í
í
d
d


int main(int n, char * a[]) //n là số đối số trên dòng lệnh kể cả
//tên chương trình a[0]
{ FILE *fp; char c; int sobyte=0;
if (n != 2) { puts("Loi cu phap: "); exit(1); }

fp = fopen(a[1], "wt");
while (( c = getchar()) != EOF) //hàm getchar() trả về EOF
{ putc( c, fp); sobyte++; } //khi có lỗi hoặc ấn F6
printf("\n\t 1 file copy \t\t %d bytes ", sobyte);
fclose(fp);
}
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo
à
à

i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c v
c v
í
í
d
d


int main(int n, char * a[])
{ FILE *fp; char st[80]; int sobyte=0;
if (n != 2) { puts("Loi cu phap: "); exit(1); }

fp = fopen(a[1], "wt");
while ( gets(st)) != NULL) //hàm gets(st) trả về NULL khi có lỗi
{ fputs( st, fp); fputs("\n", fp); //hoặc ấn F6
sobyte+=strlen(st);
}
printf("\n\t 1 file copy \t\t %d bytes ", sobyte);
fclose(fp);
}
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh


ngo
ngo

à
à
i
i
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Ki
Ki


u t
u t


p tin (File)
p tin (File)
C
C
á
á
c v
c v
í
í
d
d


typedef struct pointtype Polygol[10];

Polygol P;
void main(void)
{
FILE *fp;
char c; int n,i;
fp = fopen("c:\\dagiac.dat","rt");
fscanf(fp,"%d",&n);
printf("%d\n",n);
for (i=0; i<n; i++) fscanf(fp,"%d %d",&P[i].x,&P[i].y);
fclose(fp);
}
C
C


u tr
u tr
ú
ú
c lưu tr
c lưu tr


trên b
trên b


nh
nh



ngo
ngo
à
à
i
i
10
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Th
Th


i gian th
i gian th


c hi
c hi


n c
n c


a thu
a thu



t to
t to
á
á
n
n


L
L
à
à
s
s


l
l


nh c
nh c


n thi
n thi
ế
ế
t m

t m
à
à
m
m
á
á
y t
y t
í
í
nh th
nh th


c hi
c hi


n khi ch
n khi ch


y
y
chương tr
chương tr
ì
ì
nh s

nh s


d
d


ng thu
ng thu


t to
t to
á
á
n
n


Th
Th


i gian th
i gian th


c hi
c hi



n m
n m


t chương tr
t chương tr
ì
ì
nh l
nh l
à
à
m
m


t h
t h
à
à
m
m
không âm c
không âm c


a k
a k
í

í
ch thư
ch thư


c d
c d


li
li


u v
u v
à
à
o, ký hi
o, ký hi


u T(n),
u T(n),
T(n)
T(n)


0
0



n
n


0
0


Thông thư
Thông thư


ng ch
ng ch


quan tâm đ
quan tâm đ
ế
ế
n th
n th


i gian th
i gian th


c hi

c hi


n
n
trong trư
trong trư


ng h
ng h


p x
p x


u nh
u nh


t
t
Đ
Đ
á
á
nh gi
nh gi
á

á
đ
đ


ph
ph


c t
c t


p thu
p thu


t to
t to
á
á
n
n
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
T
T



l
l


tăng c
tăng c


a h
a h
à
à
m (Growth Rate)
m (Growth Rate)


Cho hai h
Cho hai h
à
à
m không âm T
m không âm T
1
1
(n) v
(n) v
à
à
T
T

2
2
(n)
(n)


T
T
1
1
(n) c
(n) c
ó
ó
t
t


l
l


gia tăng gi
gia tăng gi


ng như T
ng như T
2
2

(n) n
(n) n
ế
ế
u t
u t


n t
n t


i c
i c
á
á
c h
c h


ng
ng
s
s


c v
c v
à
à

n
n
0
0
: T
: T
1
1
(n)
(n)


c.T
c.T
2
2
(n) v
(n) v


i m
i m


i n
i n


1
1

V
V
í
í
d
d


: T
: T
ì
ì
m t
m t


l
l


gia tăng c
gia tăng c


a h
a h
à
à
m T
m T

1
1
(n) =(n+1)
(n) =(n+1)
2
2
Ta th
Ta th


y
y
T
T
1
1
(n) =n
(n) =n
2
2
+2n+1
+2n+1


n
n
2
2
+2n
+2n

2
2
+n
+n
2
2
=4n
=4n
2
2
v
v


i m
i m


i n
i n


1
1


ch
ch



n c=4, n
n c=4, n
0
0
=1
=1 , ta nói
T
T
1
1
(n) =(n+1)
(n) =(n+1)
2
2
c
c
ó
ó
t
t


l
l


tăng như
tăng như
T
T

2
2
(n) =n
(n) =n
2
2
Đ
Đ
á
á
nh gi
nh gi
á
á
đ
đ


ph
ph


c t
c t


p thu
p thu



t to
t to
á
á
n
n
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Đ
Đ


ph
ph


c t
c t


p c
p c


a thu
a thu


t to

t to
á
á
n (Complexity)
n (Complexity)


Cho hai h
Cho hai h
à
à
m T
m T
1
1
(n) v
(n) v
à
à
T
T
2
2
(n)
(n)


T
T
1

1
(n) c
(n) c
ó
ó
đ
đ


ph
ph


c t
c t


p l
p l
à
à
T
T
2
2
(n) n
(n) n
ế
ế
u t

u t


n t
n t


i c
i c
á
á
c h
c h


ng s
ng s


c v
c v
à
à
n
n
0
0
: T
: T
1

1
(n)
(n)


c.T
c.T
2
2
(n) v
(n) v


i m
i m


i n
i n


n
n
0
0


Ký hi
Ký hi



u: T
u: T
1
1
(n) =
(n) =
O(
O(
T
T
2
2
(n)
(n)
)
)
đ
đ


c l
c l
à
à


ô c
ô c



a T
a T
2
2
(n)
(n)




Thông thư
Thông thư


ng T
ng T
2
2
(n) l
(n) l
à
à
d
d


ng h
ng h
à

à
m đã bi
m đã bi
ế
ế
t như
t như
: log
: log
2
2
n, n,
n, n,
nlog
nlog
2
2
n, n
n, n
2
2
, n
, n
3
3
, 2
, 2
n
n
, n!, n

, n!, n
n
n

Đ
Đ
á
á
nh gi
nh gi
á
á
đ
đ


ph
ph


c t
c t


p thu
p thu


t to
t to

á
á
n
n
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
Đ
Đ


ph
ph


c t
c t


p c
p c


a thu
a thu


t to
t to
á

á
n (Complexity)
n (Complexity)
Đ
Đ
á
á
nh gi
nh gi
á
á
đ
đ


ph
ph


c t
c t


p thu
p thu


t to
t to
á

á
n
n
O(1)
n
T(n)
11
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
C
C
á
á
ch t
ch t
í
í
nh đ
nh đ


ph
ph


c t
c t



p c
p c


a thu
a thu


t to
t to
á
á
n (Complexity)
n (Complexity)


Qui t
Qui t


c nhân
c nhân
:
:


Cho hai đo
Cho hai đo



n chương tr
n chương tr
ì
ì
nh P1v
nh P1v
à
à
P2
P2
l
l


ng nhau
ng nhau
; T1(n) = O(f(n)),
; T1(n) = O(f(n)),
T2(n) = O(g(n)) th
T2(n) = O(g(n)) th
ì
ì
th
th


i gian th
i gian th



c hi
c hi


n c
n c


a đo
a đo


n hai đo
n hai đo


n chương
n chương
tr
tr
ì
ì
nh đ
nh đ
ó
ó
l
l
à
à

T(n) = O(
T(n) = O(
f(n).g(n)
f(n).g(n)
)
)


Qui t
Qui t


c c
c c


ng
ng
:
:


Cho hai đo
Cho hai đo


n chương tr
n chương tr
ì
ì

nh P1 v
nh P1 v
à
à
P2
P2
n
n


i ti
i ti
ế
ế
p nhau
p nhau
; v
; v
à
à
T1(n)=O(f(n)), T2(n)=O(g(n)) th
T1(n)=O(f(n)), T2(n)=O(g(n)) th
ì
ì
th
th


i gian th
i gian th



c hi
c hi


n c
n c


a đo
a đo


n hai
n hai
chương tr
chương tr
ì
ì
nh đ
nh đ
ó
ó
l
l
à
à
T(n)=O(
T(n)=O(

max(f(n),g(n))
max(f(n),g(n))
)
)
Đ
Đ
á
á
nh gi
nh gi
á
á
đ
đ


ph
ph


c t
c t


p thu
p thu


t to
t to

á
á
n
n
3/11/2010
www.lhu.edu.vn
Chương 2 Các kiểu dữ liệu cơ bản
C
C
á
á
ch t
ch t
í
í
nh đ
nh đ


ph
ph


c t
c t


p c
p c



a thu
a thu


t to
t to
á
á
n (Complexity)
n (Complexity)
void BubleSort(int a[], int N )
void BubleSort(int a[], int N )
{
{
int
int
i, j, tepm;
i, j, tepm;
{1}
{1}
for (i = 0 ; i<N
for (i = 0 ; i<N
-
-
1 ; i++)
1 ; i++)
{2}
{2}
for (j =N

for (j =N
-
-
1; j >i ; j
1; j >i ; j


)
)
{3}
{3}
if(a[j]< a[j
if(a[j]< a[j
-
-
1])
1])
// n
// n
ế
ế
u sai v
u sai v


tr
tr
í
í
th

th
ì
ì
đ
đ


i ch
i ch


{4}
{4}
{
{
temp = a[j];
temp = a[j];
{5}
{5}
a[j] = a[j
a[j] = a[j
-
-
1];
1];
{6}
{6}
a[j
a[j
-

-
1] = temp;
1] = temp;
}
}
}
}


đ
đ


ph
ph


c t
c t


p l
p l
à
à
O(n
O(n
2
2
)

)
Đ
Đ
á
á
nh gi
nh gi
á
á
đ
đ


ph
ph


c t
c t


p thu
p thu


t to
t to
á
á
n

n

×