bài giảng môn Cấu trúc dữ liệu và giải thuật
Trang 1Ch ươ ng 1
T NG QUAN V C U TRÚC D LI U VÀ GI I THU T Ổ Ề Ấ Ữ Ệ Ả Ậ
I-GI I THI U Ớ Ệ :
• Vi c vi t m t chệ ế ộ ương trình đ đi u khi n máy tính th c hi n các công vi c qu n lýể ề ể ự ệ ệ ả
c a ngủ ườ ử ụi s d ng, đáp ng các yêu c u tính toán , tìm ki m , th ng kê , l u tr v…ứ ầ ế ố ư ữv… là m t v n đ không ph i đ n gi n ộ ấ ề ả ơ ả
• Vi c đ u tiên ngệ ầ ườ ử ụi s d ng ph i d a trên yêu c u th c t , thông qua các thông tinả ự ầ ự ế
c a đ i t ng và các nghi p v chuyên môn x lý trong h th ng c n qu n lý, đ đápủ ố ượ ệ ụ ử ệ ố ầ ả ể
ng yêu c u l u tr , tính toán và x lý tìm ki m thông kê v…v…Thông tin c a h th ng
s đẽ ượ ổ ức t ch c thành các c u trúc d li u phù h p, các gi i thu t t i u , sau đó v nấ ữ ệ ợ ả ậ ố ư ậ
d ng các k thu t , k năng đ chuy n hóa các yêu c u trên thành các chụ ỹ ậ ỹ ể ể ầ ương trìnhthông qua m t s ngôn ng l p trình, đ có th x lý độ ố ữ ậ ể ể ử ược trên máy tính đáp ng đứ ượ ccác yêu c u qu n lý thông tin c a ngầ ả ủ ườ ử ụi s d ng
II-C U TRÚC D LI U Ấ Ữ Ệ :
• C u trúc d li u là mô hình thông tin d li u bi u di n thông tin các đ iấ ữ ệ ữ ệ ể ễ ố
tượng d liêu trong h th ng th c t Tùy theo tính ch t x lý, thu c tính mô t c a m iữ ệ ố ự ế ấ ử ộ ả ủ ỗ
đ i tố ượng, mà c u trúc d li u có th đấ ữ ệ ể ượ ổ ức t ch c khác nhau
• C u trúc d li u đấ ữ ệ ượ ổ ức t ch c tuân th theo các qui t c v ki u d li u , kíchủ ắ ề ể ữ ệ
thước và ràng bu c d li u, đ có th t ch c l u tr và x lý trên máy tính m t cáchộ ữ ệ ể ể ổ ứ ư ữ ử ộ
d ng các c u trúc d li u thích h p nh t, sao cho v a có th ph n nh đ y đ thông tin v aự ấ ữ ệ ợ ấ ừ ể ả ả ầ ủ ừ
có th d dàng x lý tính toán trên máy tính.ể ễ ử
• Xây d ng các thao tác x lý d li u (gi i thu t):ự ử ữ ệ ả ậ
T các yêu c u x lý th c t , c n tìm ra các gi i thu t từ ầ ử ự ế ầ ả ậ ươ ứng ng đ xác đ nh trình t cácể ị ựthao tác máy tính ph i thi hành đ cho k t qu mong mu n.ả ể ế ả ố
• Vi c xây d ng c u trúc d li u và gi i thu t là 2 công vi c quan tr ng quan h và bệ ự ấ ữ ệ ả ậ ệ ọ ệ ổ sung cho nhau C u trúc d li u t ch c đ y đ , chính xác thì vi c xây d ng gi i thu t trấ ữ ệ ổ ứ ầ ủ ệ ự ả ậ ở nên d dàng ễ
• V i m t c u trúc d li u đã ch n s có nh ng gi i thu t tớ ộ ấ ữ ệ ọ ẽ ữ ả ậ ương ng phù h p, khi c uứ ợ ấ trúc có s thay đ i thự ổ ường thì gi i thu t ph i thay đ i theo ả ậ ả ổ
Trang 2• M t c u trúc d li u t t s giúp cho gi i thu t x lý trên nó có th phát huy tác d ng t tộ ấ ữ ệ ố ẽ ả ậ ử ể ụ ố
h n, có th đáp ng nhanh, gi i thu t r ràng đ n gi n và d hi u ơ ể ứ ả ậ ỏ ơ ả ễ ể
• S thành công c a m t chự ủ ộ ương trình tin h c chính là s k t h p ch t ch gi a c u trúcọ ự ế ợ ặ ẽ ữ ấ
d li u và gi i thu t Th hi n qua công th c sau :ữ ệ ả ậ ể ệ ứ
C u trúc d li u + Gi i thu t = Ch ấ ữ ệ ả ậ ươ ng trình
• Ph n ánh đúng th c t : Đây là tiêu chu n quan tr ng nh t, quy t đ nh tính đúng đ nả ự ế ẩ ọ ấ ế ị ắ
c a toàn b bài toán C n xem xét k lủ ộ ầ ỹ ưỡng cũng nh d trù các tr ng thái bi n đ i c aư ự ạ ế ổ ủ
d li u trong chu trình s ng đ có th ch n c u trúc d li u l u tr th hi n chính xácữ ệ ố ể ể ọ ấ ữ ệ ư ữ ể ệ
đ i tố ượng th c t ự ế
Ch ng h n c n l u ý vi c ch n ki u d li u cho các bi n : Ví d bi u di n thông tinẳ ạ ầ ư ệ ọ ể ữ ệ ế ụ ể ễNHAN VIEN có thành ph n TUOI nên ch n ki u unsign char thay vì ch n char ho c int ,ầ ọ ể ọ ặthành ph n LUONG chon ki u unsign long thay vì ch n int , long ho c float.ầ ể ọ ặ
Có nhi u bi n d li u có th phù h p trong hi n t i, nh ng khi m r ng chề ế ữ ệ ể ợ ệ ạ ư ở ộ ương trình đễ đáp ng cho yêu c u phát tri n c a h th ng các bi n này tr nên không phù h p.ứ ầ ể ủ ệ ố ế ở ợ
• Phù h p v i các thao tác trên đó : Tiêu chu n này giúp tăng tính hi u qu c a bài toán,ợ ớ ẩ ệ ả ủ
vi c xây d ng và phát tri n các gi i thu t đ n gi n, t nhi n h n, chệ ự ể ả ậ ơ ả ự ệ ơ ương trình đ t hi uạ ệ
qu cao h n v t c đ x lý ả ơ ề ố ộ ử
Ch ng h n chẳ ạ ương trình qu n lý nhân viên có liên quan đ n l u tr ( ki u file) , các thao tácả ế ư ữ ể
c a chủ ương trình là các vi c thệ ương xuyên là : Thêm, Xóa , S a , Tìm , Duy t danh sách …ử ệ
Do đó n u t ch c c u trúc d li u x lý tr c ti p các công vi c trên ki u FILE thì gi iế ổ ứ ấ ữ ệ ử ự ế ệ ể ả thu t s ph c t p, t c đ x lý ch m vì luôn ph i làm vi c trên b nh ngoài Trongậ ẽ ứ ạ ố ộ ử ậ ả ệ ộ ớ
trường h p này k t h p v i t ch c d li u là danh sách (dãy c u trúc , danh sách liên k t )ợ ế ợ ớ ổ ứ ữ ệ ấ ế
s d ng b nh trong , vi c x lí s nhanh h n , danh sách s nh n thông tin b t đ uử ụ ộ ớ ệ ử ẽ ơ ẽ ậ ắ ầ
chương trình t danh sách FILE và x lý cho đ n khi k t thúc chừ ử ế ế ương trình danh sách sẽ
đượ ổ ứ ư ạc t ch c l u l i trên file trước khi k t thúc.ế
• Ti t ki m tài nguyên h th ng : Khi xây d ng c u trúc d li u ch nên s d ng tàiế ệ ệ ố ự ấ ữ ệ ỉ ử ụnguyên h th ng v a đ đ m nhi m đệ ố ừ ủ ả ệ ược ch c năng c a nó Thông thứ ủ ường có 2 lo i tàiạnguyên thường đượ ưc l u tâm đó là CPU và b nh Tùy theo yêu c u x lý, n u y u tộ ớ ầ ử ế ế ố
x lý c n nhanh ti t ki m th i gian thì tài nguyên b nh c n s d ng t i u và ngử ầ ế ệ ờ ộ ớ ầ ử ụ ố ư ượ c
• Ki u d li u để ữ ệ ược xác đ nh là m t b <V,O> v i : V là t p các giá tr h pị ộ ộ ớ ậ ị ợ
l mà đ i t ng có th l u tr và O là t p các thao tác x lý có th th c thi trên đ iệ ố ượ ể ư ữ ậ ử ể ự ố
tượng
Ví d : Ki u s nguyên int : Trong đó s g m m t t p các giá tr nguyên có giá tr t -32768ụ ể ố ẽ ồ ộ ậ ị ị ừcho đ n +32767 và t p này cho phép th c hi n đế ậ ự ệ ược các phép tóan s h c + - * / %, cácố ọphép tóan quan h < <= > >= != == Trong khi đó ki u chu i không cho phép s d ng cácệ ể ỗ ử ụphép tóan s h c này… ố ọ
• Trong các ngôn ng l p trình ki u d li u đữ ậ ể ữ ệ ược phân làm các lo i sau :ạ
Ki u d li u c b n : Là các ki u d li u mà các ngôn ng l pể ữ ệ ơ ả ể ữ ệ ữ ậ trình đã đ nh nghĩa s n Ch ng h n nh : Ki u s nguyên , s th c, kí t , lu n lý …ị ẵ ẳ ạ ư ể ố ố ự ự ậ
Trang 3 Ki u có c u trúc :Là ki u d li u do ngể ấ ể ữ ệ ườ ử ụi s d ng đ nh nghĩaị
ki u khi dùng, tùy theo mô t thông tin c a đ i tể ả ủ ố ượng có các ki u đ nh nghĩa khácể ịnhau G m các ki u nh : Chu i, dãy, c u trúc , union, t p tin…ồ ể ư ỗ ấ ậ
Ngoài ra còn có ki u qu n lí đ a ch ô nh : Ki u con tr (pointer).ể ả ị ỉ ớ ể ỏ
• Ví d : unsign int diem;ụ
Int tong,tich; float luong; char hoten[30],diachi[50]; Int day[30];
• Là các lo i d li u đ n gi n , không có c u trúc Chúng thạ ữ ệ ơ ả ấ ường là các giá tr vôị
hương nh s nguyên, s th c, kí t , các giá tr logic ….Do tính thông d ng và đ n gi nư ố ố ự ự ị ụ ơ ả
mà các lo i d li u này trong các ngôn ng l p trình đã đạ ữ ệ ữ ậ ược xây d ng s n nh cácự ẵ ưthành ph n c a ngôn ng đ gi m nh công vi c cho ngầ ủ ữ ể ả ẹ ệ ườ ậi l p trình
• V i các ki u c b n trong nhi u trớ ể ơ ả ề ường h p không th bi u di n đ y đ thông tin b nợ ể ể ễ ầ ủ ả
ch t s v t c a đ i tấ ự ậ ủ ố ượng th c t , do đó yêu c u ph i có ki u mà sao cho khi s d ngự ế ầ ả ể ử ụ
ngườ ử ụi s d ng có th t đ nh các ki u phù h p d a trên ki u c b n Đa s các ngôn ngể ự ị ể ợ ự ể ơ ả ố ữ
l p trình đ u cài đ t s n m t s ki u có c u trúc c b n và cung c p c ch cho ngậ ề ặ ẵ ộ ố ể ấ ơ ả ấ ơ ế ườ ậ i l ptrình viên có th t đ nh nghĩa ki u d li u m i.ể ự ị ể ữ ệ ớ
• Ki u d li u do ngể ữ ệ ườ ử ụi s d ng đ nh nghĩa ki u khi dùng, tùy theo mô t thông tin c aị ể ả ủ
đ i tố ượng có các ki u đ nh nghĩa khác nhau G m các ki u nh : Chu i, dãy, c u trúc ,ể ị ồ ể ư ỗ ấunion, t p tin…ậ
Trang 4• Gi i thu t là các bả ậ ướ ể ảc đ gi i quy t v n đ bài toán M t v n đ có th có nhi uế ấ ề ộ ấ ề ể ề
phương pháp gi i quy t, tuy nhiên tùy thuôc vào t ng yêu c u có th l a ch n phả ế ừ ầ ể ự ọ ương phápphù h p.ợ
• Trong các chương trình x lý trên máy tính, tùy thu c vào yêu c u c n t i u b nhử ộ ầ ầ ố ư ộ ớ
ho c t i u v th i gian x lý mà m t v n đ có th đặ ố ư ề ờ ử ộ ấ ề ể ược gi i quy t b ng nhi u gi i thu tả ế ằ ề ả ậ khác nhau
• Đ vi t m t chể ế ộ ương trình ng d ng hi u qu vi c xác đ nh c u trúc d li u và gi iứ ụ ệ ả ệ ị ấ ữ ệ ả thu t t i u là v n đ quan tr ng Gi i thu t có th ph thu c vào c u trúc d li u t ch c,ậ ố ư ấ ề ọ ả ậ ể ụ ộ ấ ữ ệ ổ ứ tuy nhiên vi c l a ch n gi i thu t phù h p tùy theo yêu c u th c t ệ ự ọ ả ậ ợ ầ ự ế
• Trong vi c phân tích và thi t k h th ng , qua vi c kh o sát phân tích các gi i thu t cóệ ế ế ệ ố ệ ả ả ậ
th để ược bi u di n b ng các l u đ đ l u l i k t qu phân tích, đ ng th i làm n n t ngể ễ ằ ư ồ ể ư ạ ế ả ồ ờ ề ả cho vi c xây d ng chệ ự ương trình
2 Các b ướ c phân tích gi i thu t:: ả ậ
• Xác đ nh các đ c tr ng d li u s đị ặ ư ữ ệ ẽ ược làm d li u nh p xu t tính toán ữ ệ ậ ấ
• Xác đ nh các thao tác c n x lý , các thao tác tr u t ng có th đ tách bi t vi cị ầ ử ừ ượ ể ể ệ ệ phân tích v i vi c cài đ t.ớ ệ ặ
• Phân tích toán h c các gi i thu t nh m tìm ra các giá tr trung bình v th i gian vàọ ả ậ ằ ị ề ờ
trường h p x u nh t cho các đ i lợ ấ ấ ạ ượng c b n Nghĩa là th i gian x u nh t và t i u nh tơ ả ờ ấ ấ ố ư ấ trong các trường h p.ợ
Trang 5Ch ươ ng 2 CÁC KI U D LI U CÓ C U TRÚC Ể Ữ Ệ Ấ
I KI U M NG Ể Ả :
1 Khái ni m ệ :
M ng là m t ki u d li u bao g m nhi u ph n t có cùng ki u , khi l u tr m ngả ộ ể ữ ệ ồ ề ầ ử ể ư ữ ả
đượ ưc l u trên m t dãy các ô nh k ti p nhau , do đó thông qua v trí ô nh (ch s ) ta có thộ ớ ế ế ị ớ ỉ ố ể truy xu t 1 ph n t c a dãy ấ ầ ử ủ
Cú pháp khai báo : Khai báo tr c ti p ( không có tên ki u ):ự ế ể
<Tên ki u c s > <tên bi n m ng> [ đ l n ] ể ơ ở ế ả ộ ớ ;
Khai báo gián ti p : ế typedef <tên ki u c s > <tên bi n m ng> [ đ l n ] ; ể ơ ở ế ả ộ ớ
Truy xu t giá tr bi n m ng s d ng cú pháp ấ ị ế ả ử ụ <Tên bi n>(ch s ) ế ỉ ố
Ví d ụ : typedef int day[50] ;
int a[5] ; day h ; Float b[10] ;
printf("Day phan tu da nhap : ");
for (i=1;i<=n;i++) printf("%4d",a[i]);
tongchan=tongchan + a[i];
} printf("\n");
printf("Tong cac so chan: %d
tongle=tongle + a[i];
} printf("\n");
printf("Tong cac so le: %d \n",tongle);
getch();
}
Ch ươ ng 3
Trang 6II KI U C U TRÚC (RECORD) Ể Ấ
1 Khái ni m ệ :
Trong th c t thông tin qu n lý không ch là m t giá tr , m t thành ph n (bi n ki u cự ế ả ỉ ộ ị ộ ầ ế ể ơ
b n) ho c nhi u giá tr nh ng m t ki u (bi n dãy), mà đây đ i tả ặ ề ị ư ộ ể ế ở ố ượng có th bao g m nhi uể ồ ề thông tin thành ph n và m i thành ph n có th thu c các ki u khác nhau Ch ng h n c u trúcầ ỗ ầ ể ộ ể ẳ ạ ấ
l u tr thông tin sinh viên g m các thành ph n : masv , tên sinh viên , tu i , phái , đ a ch , h cư ữ ồ ầ ổ ị ỉ ọ
b ng Trong trổ ường h p này C cho phép khai báo s d ng ki u c u trúc.ợ ử ụ ể ấ
Ki u d li u c u trúc là ki u d li u mà d li u bao g m nhi u thành ph n , m iể ữ ệ ấ ể ữ ệ ữ ệ ồ ề ầ ỗ thành ph n có th thu c các ki u d li u khác nhau ầ ể ộ ể ữ ệ
Khai báo : struct <Tên ki u c u trúc> ể ấ
{ <Tên ki u1 > <bi n 1,bi n 2 > ; ể ế ế <Tên ki u2> <bi n 1,bi n2 > ể ế ế ; …………
• Ki u dãy là ki u d li u mà m t bi n bao g m nhi u ph n t cùng ki u , ki u c u trúc làể ể ữ ệ ộ ế ồ ề ầ ử ể ể ấ
ki u mà bi n là m t ph n t g m nhi u thành ph n thu c các ki u khác nhau Trong th c t m tể ế ộ ầ ử ồ ề ầ ộ ể ự ế ộ danh sách bao g m nhi u đ i tồ ề ố ượng , thông tin m i đ i t ng g m nhi u thành ph n là công vi cỗ ố ượ ồ ề ầ ệ
• Chú ý : Khi nh p d li u cho dãy c u trúc , đ i v i các thành ph n thu c ki u nguyên vàậ ữ ệ ấ ố ớ ầ ộ ể
th c, ta không th nh p tr c ti p thông qua &<tên bi n c u trúc>.<tên bi n tp> , mà ph iự ể ậ ự ế ế ấ ế ả
nh p thông qua bi n trung gian trung gian, sau đó gán l i ậ ế ạ
Trang 7c a thành ph n mà có kích thủ ầ ướ ớc l n nh t Chính v y trong h p các thành ph n dùng chungấ ậ ợ ầ
m t vùng nh c a thành ph n có kích thộ ớ ủ ầ ướ ớc l n nh t hay nói cách khác cùng m t vùng nhấ ộ ớ
có th truy xu t dể ấ ưới các d ng khác nhau ạ
Khai báo : union <Tên ki u c u trúc> ể ấ
{ <Tên ki u1 > <bi n 1,bi n 2 > ; ể ế ế <Tên ki u2> <bi n 1,bi n2 > ể ế ế ; …………
Vi c dùng ki u union r t thu n l i khi c n s d ng các c u trúc d li u mà n i dung c aệ ể ấ ậ ợ ầ ử ụ ấ ữ ệ ộ ủ
nó thay đ i tùy theo tr ng thái Ví d đ khai thông tin v m t con ngổ ạ ụ ể ề ộ ười ta có th khai báoể
m t ki u d li u nh sau:ộ ể ữ ệ ư
Struct hoso
{
Char hoten[30]; Int namsinh; Char noisinh[50];
Char gioitinh; //0 :N , 1 :Namữ
Char ttgd; //0 :Không có gia đình, 1 :Có gia đình
Nh v y tùy theo ngư ậ ười mà ta xét là nam hay n mà ta s truy xu t thông tin qua thành ph nữ ẽ ấ ầ
có tên là tenvo hay tenchong
Trang 9IV KI U T P TIN Ể Ậ
1. KHÁI NI M: Ệ
• Ki u t p tin là ki u d li u mà d li u là m t t p các ph n t cùng ki u , để ậ ể ữ ệ ữ ệ ộ ậ ầ ử ể ượ ổ ứ c t ch c
l u tr b nh ngoài (thi t b l u tr : Đĩa t , quang … ) ư ữ ở ộ ớ ế ị ư ữ ừ
• Khai báo : Có th khai báo tr c ti p ho c gián ti p ể ự ế ặ ế
- Tr c ti p : ự ế FILE *<Bi n t p tin> ; ế ậ
- Gián ti p : ế typedef FILE *<ki u t p tin> ; ể ậ <ki u t p tin> <bi n t p tin> ; ể ậ ế ậ
Ví d : FILE *f1,*f2 ; /* Khai báo 2 bi n file f1,f2 */ụ ế
typedef FILE *taptin ; /* Khai báo ki u file taptin */ể
taptin f1,f2; /* Khai báo 2 bi n file f1,f2 */ế
• Ki u t p tin g m 2 lo i : file văn b n và file nh phân (c u trúc)ể ậ ồ ạ ả ị ấ
• Ki u file văn b n là lo i ki u file mà d li u là m t văn b n g m nhi u dòng m i dòngể ả ạ ể ữ ệ ộ ả ồ ề ỗ
là m t chu i kí t Độ ỗ ự ượ ưc l u tr dữ ướ ại d ng mã Ascii do đó có th truy xu t để ấ ượ ằc b ng b t kìấ
ph n m m văn b n nào.ầ ề ả
• Ki u file nh phân (còn g i là file có c u trúc ) là ki u file mà d li u bao g m nhi uể ị ọ ấ ể ữ ệ ồ ề
ph n t cùng ki u , đầ ử ể ượ ưc l u tr dữ ướ ại d ng mã nh phân Do đó ch có th truy xu t b ng cácị ỉ ể ấ ằhàm file
2. CÁC B ƯỚ C X LÍ KI U FILE Ử Ể :
Đ x lý file b t bu c ph i tuân th các thao tác nh sau :ể ử ắ ộ ả ủ ư
• M file (ở fopen)
• X lí file g m các thao tác nh đ c (ử ồ ư ọ fread , fgetc), ghi (fwrite , fputc) ,ki m tra (ể feof , ferror
) , di chuy n con tr file (ể ỏ rewind , fseek , ftell) , làm s ch vùng đ m ( ạ ệ fflush ,fflushall) , xóa file (unlink ).
• Đóng file (fclose , fcloseall)
3. CÁC HÀM X LÍ FILE Ử :
a) Hàm m file ở :
<bi n file > =fopen ( <tên file> , <h ng ki u file > ) ế ằ ể
M file và gán tên file cho bi n file , thông qua bi n file đáp ng các ch c năng truy xu t trênở ế ế ứ ứ ấfile
<tên file > : G m đồ ường d n đĩa th m c và tên t p tin x lí ẫ ổ ư ụ ậ ủ
<h ng ki u file > ằ ể : G m các giá tr sau :ồ ị
“rt” : M t p tin ki u văn b n đ đ c , n u t p tin ch a có s có l i ở ậ ể ả ể ọ ế ậ ư ẽ ỗ
“wt” : M t p tin ki u văn b n m i đ ghi , n u t p tin đã t n t i s xóa cũ đở ậ ể ả ớ ể ế ậ ồ ạ ẽ ể ghi n i dung m i ộ ớ
“at” : M t p tin ki u văn b n đã có đ ghi thêm n i dung vào , n u t p tinở ậ ể ả ể ộ ế ậ
ch a t n t i s t o t p tin m i đ ghi n i dung ư ồ ạ ẽ ạ ậ ớ ể ộ
“rb” : M t p tin ki u nh phân đ đ c , n u t p tin ch a t n t i s báo l i ở ậ ể ị ể ọ ế ậ ư ồ ạ ẽ ỗ
“wb” : M t p tin ki u nh phân m i đ ghi , n u t p tin đã t n t i s xóa cũở ậ ể ị ớ ể ế ậ ồ ạ ẽ
đ ghi n i dung m i ể ộ ớ
“ab” : M t p tin ki u nh phân đã có đ ghi thêm n i dung vào , n u t p tinở ậ ể ị ể ộ ế ậ
ch a t n t i s t o t p tin m i đ ghi n i dung ư ồ ạ ẽ ạ ậ ớ ể ộ
“r+t” : M t p tin ki u văn b n đ đ c/ghi n i dung , n u t p tin ch a t n t iở ậ ể ả ể ọ ộ ế ậ ư ồ ạ
s có l i ẽ ỗ
Trang 10 “w+t” : M t p tin ki u văn b n đ đ c/ghi n i dung , n u t p tin đã t n t i sở ậ ể ả ể ọ ộ ế ậ ồ ạ ẽ
Ví d : FILE *f1,*f2 ; char tenfile1[30],tenfile2[30];ụ
Printf(“nhap ten file van ban : “); gets(tenfile1) ;f1=fopen(tenfile1,”rt”) ;
Printf(“nhap ten file sinh vien : “); gets(tenfile2) ;f1=fopen(tenfile2,”rb”) ;
b) Hàm ghi n i dung lên file ộ :
• Ghi n i dung lên file văn b n : ộ ả
fputc( <bi n kí t > , <bi n file>) ế ự ế
Ví d : FILE *f ; char c; ụ
f=fopen(“c:\vanban.txt”,”wt”) ; c=getchar(); fput(c,f );
• Ghi n i dung lên file nh phân :ộ ị
fwrite(&<bi n>, <kich thuoc bien> , <n> , <bi n file>) ế ế
&<bi n> : Là bi n tr ch đ n vùng nh ch a n i dung ghi vào file ế ế ỏ ỉ ế ớ ứ ộ
<kich thuoc bien> : Là kích thước bi n ghi file ế
<n> : S c u trúc c n ghi ố ấ ầ
Hàm s tr v giá tr b ng s c u trúc th c s ghi đẽ ả ề ị ằ ố ấ ự ự ược
Ví d : fwrite(&nv,sizeof(nv),1,f ) ; ụ
c) Hàm đ c n i dung vào file ọ ộ :
• Đ c n i dung t file văn b n ra bi n kí t : ọ ộ ừ ả ế ự
<bi n kí t > = fgetc( <bi n file>) ế ự ế
Ví d : FILE *f ; char c; ụ
f=fopen(“c:\vanban.txt”,”rt”) ; c=fgetc(f );
• Đ c n i dung t file nh phân ra bi n :ọ ộ ừ ị ế
fread(&<bi n>, <kich thuoc bien> , <n> , <bi n file>) ế ế
&<bi n> : Là bi n tr ch đ n vùng nh ch a n i dung đ c t file ế ế ỏ ỉ ế ớ ứ ộ ọ ừ
<kich thuoc bien> : Là kích thước bi n ế
f) Hàm ki m tra l i file ể ỗ : ferror(<bi n file>) ; ế
Hàm ki m tra l i khi thao tác trên t p tin Tr v giá tr 0 n u không có l i , ngể ỗ ậ ả ề ị ế ỗ ượ ạc l i hàm tr giáả
tr khác 0 ị
g) Hàm ki m tra cu i file ể ố : feof(<bi n file>) ; ế
Trang 11Hàm ki m tra con tr file cu i file ch a Tr v giá tr khác 0 n u cu i file , ngể ỏ ở ố ư ả ề ị ế ố ượ ạc l i hàm trả giá tr b ng 0 ị ằ
h) Hàm chuy n v trí tr file ể ị ỏ :
• Chuy n con tr v đ u fileể ỏ ề ầ : rewind (<bi n file>) ; ế
• Tr v v trí hi n t i c a con tr file :ả ề ị ệ ạ ủ ỏ ftell (<bi n file>) ; ế
• Chuy n con tr file đ n v trí c n thi t :ể ỏ ế ị ầ ế
fseek(<bi n file>,<so byte>,<vi tri xuat phat>) ế
- <so byte> : Ch đ nh s byte c n di chuy n ỉ ị ố ầ ể
- <vi tri xuat phat> : Xác đ nh v trí mà vi c d ch chuy n b t đ u Có các giá trị ị ệ ị ể ắ ầ ị sau : SEEK_SET ( ho c 0) :Xu t phát di chy n xu ng t đ u file –ặ ấ ể ố ừ ầSEEK_CUR (ho c 1) :Xu t phát t v trí hi n t i c a con tr , đi xu ng cu iặ ấ ừ ị ệ ạ ủ ỏ ố ố file n u <so byte> dế ương , ngượ ạ ầc l i đ u file n u <so byte> âm - SEEK_ENDế(ho c 2) :Xu t phát t cu i file ặ ấ ừ ố
i) Hàm đóng t p tin ậ :
1 Hàm đóng t p tin đang m :ậ ở fclose (<bi n file>) ; ế
2 Hàm đóng t t c các t p tin đang m :ấ ả ậ ở fcloseall () ;
j) Hàm xóa t p tin ậ : unlink(<tên file>) ;
Bài t p ậ :
Vi t ch ng trình qu n lí h s và l ng c a nhân viên ế ươ ả ồ ơ ươ ủ
Thông tin yêu c u g m : ầ ồ
Lý l ch nhân viên : ị
Mã nhân viên (8 ký t ) – Tên nhân viên (30 kí t ) – Tình tr ng gia đình ( 1 kí t D:đã ự ự ạ ự
có gia đình, C:ch a có gia đình ) – S con ( nguyên <=20) – Trình đ văn hóa ( 2 kí t : ư ố ộ ự C1:c p 1, C2:c p 2, C3:c p 3, DH:đ i h c, CH:cao h c) – L ng c b n (nguyên ấ ấ ấ ạ ọ ọ ươ ơ ả
<=1000000)
B ng ch m công_l ả ấ ươ ng:
Tháng (nguyên <20) – Năm ( nguyên <10000) – S ngày nghĩ có phép ( nguyên ố
<28) – S ngày nghĩ không phép (nguyên <28) – S ngày làm thêm (nguyên <28) – ố ố
K t qu công vi c (2 kí t : T:T t, TB:Đ t , K:Kém) – L ng th c lãnh trong tháng ế ả ệ ự ố ạ ươ ự (th c ) ự
Quy t c tính l ng nh sau: ắ ươ ư
L ng th c lãnh=L ươ ự ươ ng căn b n + Ph tr i ả ụ ộ
Trong đó n u: ế
- S con >2 Ph tr i=+5% l ng c b n ố ụ ộ ươ ơ ả
- Trình đ văn hóa =DH (CH) Ph tr i=+5%(10%) l ng c b n ộ ụ ộ ươ ơ ả
- Làm thêm Ph tr i=+4% l ng c b n / ngày ụ ộ ươ ơ ả
- Nghĩ không phép Ph tr i=-5% l ng c b n / ngày ụ ộ ươ ơ ả
- S con >2 Ph tr i=5% l ng c b n ố ụ ộ ươ ơ ả
Trang 12• Thông qua bi n con tr có th ti p c n đế ỏ ể ế ậ ược các giá tr c a bi n ị ủ ế
• Khai báo : <Ki u t p tin> * <Tên bi n con tr > ể ậ ế ỏ ;
Ví d : int *xcontro ; /* Khai báo bi n xcontro đ tr đ n m t bi n nguyên */ụ ế ể ỏ ế ộ ế
float *ycontro ; /* Khai báo bi n ycontro đ tr đ n m t bi n th c */ế ể ỏ ế ộ ế ự
char *ccontro ; /* Khai báo bi n ccontro đ tr đ n kí t */ế ể ỏ ế ự
II. TRUY XU T V I BI N CON TR Ấ Ớ Ế Ỏ :
• Đ truy xu t giá tr c a m t bi n con tr ta s d ng phép toán m t ngôi * : ể ấ ị ủ ộ ế ỏ ử ụ ộ *<tên
bi n tr > ế ỏ
Ví d : *xcontro , *ycontro …ụ
• Đ xác đ nh đ a ch c a m t bi n ta s d ng phép toán m t ngôi & : ể ị ị ỉ ủ ộ ế ử ụ ộ &<tên bi n> ế
Ví d : int x,y ; &x , &y , &xcontro , &ycontro …ụ
Ví d : int x, y ; int *px ;ụ
Phép gán : px=&x ; y=*px k t qu s gán giá tr c a bi n x cho bi n y ế ả ẽ ị ủ ế ế
Tương đương v i phép gán : y=x ;ớ
L nh px=&x ; y=*px +1 tệ ương đương v i y=x+1;ớ
L nh px=&x ; *px=0 tệ ương đương l nh gán x=0 ;ệLênh *px+=1 ho c *px++ t ng đặ ươ ương x=x+1 ho c x++ặ
printf("chuong trinh minh hoa truy cap gia tri kieu con tro\n");
printf("nhap so nguyen a :"); scanf("%d",&a);
printf("nhap so nguyen b :"); scanf("%d",&b);
printf("nhap so thuc c :"); scanf("%f",&c);
printf("gia tri bien a=%d , dia chi bien a=%d \n",a,&a);
pa=&a;
printf("gia tri bien a=%d , dia chi bien a=%d \n",*pa,pa);
pb=&b;
Trang 13printf("gia tri bien b=%d , dia chi bien b=%d \n",*pb,pb);
printf("gia tri moi bien c=%f , dia chi bien c=%d \n",*pc,&c);
printf("gia tri moi bien c=%f \n",c);
Ví d :ụ float a[20] ; phép toán &a[12] s cho đ a ch c a ph n t a[12] trong m ng.ẽ ị ỉ ủ ầ ử ả
• Khi khai báo m ng , trong chả ương trình tên m ng đả ược xem là m t h ng đ a ch ộ ằ ị ỉ
Ví d : khi khai báo float a[10] ; thì a s là h ng đ a ch ụ ẽ ằ ị ỉ
Trong C cú pháp : a t ươ ng đ ươ ng v i &a[0] ớ
a + i t ươ ng đ ươ ng v i &a[i] ớ *(a + i) t ươ ng đ ươ ng v i a[i] ớ
• Khai báo : float a[20] , *tro ;
- Phép gán : tro=&a[k] ; thì tro +i s tr đ n ph n t th a[k+i]ẽ ỏ ế ầ ử ứ
- khi gán : tro=a thì các cách vi t sau có giá tr nh nhau : ế ị ư
a[i] <-> *(a +i) <-> p[i] <-> *(p+i)
• Ví d : S d ng ki u con tr nh p vào m t dãy – in dãy và tính t ng các ph n t ụ ử ụ ể ỏ ậ ộ ổ ầ ử
printf("nhap so phan tu day :");scanf("%d",&n);
for (i=1 ;i<=n;i++)
{printf("nhap phan tu a[%d]=",i);
scanf("%f",&tro[i]); } /* co the viet scanf(“%f”,tro + i ) ; */
printf("Day da nhap :");
for (i=1 ;i<=n;i++)
printf("%6.2f",tro[i]); /* co the viet printf(“%6.2f”,*(tro + i )); */
printf("\n");
tong=0;
for (i=1 ;i<=n;i++)
tong=tong+tro[i]; /* co the viet tong=tong + *(tro + i ) ; */
printf("tong cac phan tu Day da nhap :%6.2f",tong);
getch();
}