intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Kỹ thuật lập trình C: Chương 6 - ThS. Trần Quang Hải Bằng

Chia sẻ: Cxzvscv Cxzvscv | Ngày: | Loại File: PDF | Số trang:20

70
lượt xem
7
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Chương 6 Các kiểu dữ liệu nâng cao nằm trong bài giảng kỹ thuật lập trình C nhằm trình bày về các nội dung chính: kiểu con trỏ, kiểu mảng, kiểu cấu trúc và hợp, kiểu file và truy xuất file... bài giảng trình bày đầy đủ và chi tiết về kiểu dữ liệu nâng cao, mời các bạn tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Kỹ thuật lập trình C: Chương 6 - ThS. Trần Quang Hải Bằng

  1. K THU T L P TRÌNH C Chương 6: Các ki u d li u nâng cao bangtqh@hotmail.com 04/2010 Các ki u d li u nâng cao • Ki u con tr • Ki u m ng • Ki u C u trúc (struct) và h p (union) • Ki u File – Và truy xu t file bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 2
  2. 04/2010 Ki u con tr (pointer) • Đ a ch (address) – V i m i bi n có các khái ni m: • Tên bi n, ki u bi n, giá tr bi n – Ví d : • int i = 1; • Bi n i ki u s nguyên có giá tr là 1 • Máy tính c p phát m t vùng nh 2 byte liên t c đ lưu tr giá tr c a bi n i – Đ a ch bi n là s th t c a byte đ u tiên trong dãy các byte liên t c nhau máy dành đ lưu tr giá tr bi n – Đ l y đ a ch bi n, s d ng toán t “&” • Ví d : &i – Lưu ý, máy tính phân bi t các ki u đ a ch : đ a ch ki u int, đ a ch ki u float, đ a ch ki u long, … bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 3 04/2010 Ki u con tr (pointer) • Con tr (pointer) – Là m t bi n dùng đ ch a đ a ch – Có nhi u lo i con tr tương ng v i các ki u đ a ch khác nhau • Ch ng h n, con tr ki u int tương ng đ a ch ki u int, … – Cú pháp khai báo con tr ki u_d _li u *tên_con_tr ; – Ví d int i, j, *pi, *pj; pi = &i; /* pi là con tr ch a ñ a ch bi n i */ pj = &j; /* pj là con tr ch a ñ a ch bi n j */ bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 4
  3. 04/2010 Ki u con tr (pointer) • Gi s có – px là con tr ñ n bi n x, thì các cánh vi t x và *px là tương đương nhau • Ví d int x, y, *px, *py; px = &x; py = &y; x = 3; /* tương đương v i *px = 3 */ y = 5; /* tương đương v i *py = 5 */ /* Các câu l nh dư i đây là tương ñương: */ x = 10*y; *px = 10*y; x = 10*(*py); *px = 10*(*py); bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 5 04/2010 Ki u m ng • M ng 1 chi u (xem l i slide chương 4) • M ng nhi u chi u – Ví d , khai báo m ng 2 chi u int a[4][10]; //là m ng có 4 hàng, 10 c t – Truy c p các ph n t c a m ng nhi u chi u a[0][0], a[0][1], a[i][j]… – Ví d khác float arr[3][4][5]; char arrc[4][4]; bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 6
  4. 04/2010 Ki u m ng bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 7 04/2010 Ki u m ng – Bài t p 1. Vi t chương trình ki m tra xem ma tr n Anxn có ph i là ma tr n tam giác không ? 2. Vi t chương trình tìm trung bình c ng c a các ph n t âm thu c ma tr n Amxn 3. Cho 1 s nguyên N (l và ≥ 3). Hãy đi n vào ma tr n Anxn các giá tr t 1 n2 sao cho tr n đó th a mãn đi u ki n. T ng m i hàng = T ng m i c t = T ng m i đư ng chéo. 4. Vi t chương trình tính đ nh th c c a ma tr n vuông Anxn bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 8
  5. 04/2010 Ki u c u trúc (struct) • Ki u c u trúc cho phép t o ra ki u d li u m i g m các ph n t d li u có ki u khác nhau nhưng liên k t v i nhau • Ki u c u trúc (structure) còn đư c g i là ki u b n ghi (record) • Ki u c u trúc g m nhi u thành ph n d li u khác nhau • Các thành ph n d li u đư c g i là các trư ng (field) • Dùng t khóa struct ñ ñ nh nghĩa ki u c u trúc bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 9 04/2010 Ki u c u trúc (struct) • Ví d : dùng ki u c u trúc mô t d li u là ñ a ch – Đ a ch g m các thông tin: s nhà, tên đư ng, tên thành ph struct dia_chi{ int so_nha; char duong[40]; char thanh_pho[30]; } ong_A, ba_B; • Ho c có th khai báo các bi n c u trúc tr c ti p không c n khai báo tên c u trúc struct { int so_nha; char duong[40]; char thanh_pho[30]; }ong_A, ba_B; bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 10
  6. 04/2010 Ki u c u trúc (struct) • Ho c ch khai báo ki u c u trúc struct dia_chi{ int so_nha; char duong[40]; char thanh_pho[30]; }; • Sau đó khai báo các bi n struct dia_chi ong_A, ba_B; bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 11 04/2010 Ki u c u trúc (struct) • Khai báo ki u c u trúc l ng nhau typedef struct { char ho_ten[40]; struct dia_chi noi_o; char gioi_tinh; } nhan_su; • Khai báo bi n nhan_su p; bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 12
  7. 04/2010 Ki u c u trúc (struct) • Truy c p ph n t c a c u trúc tên_bi n_c u_trúc.tên_trư ng • Ví d p.ho_ten p.o_tai.so_nha p.o_tai.duong p.o_tai.thanh_pho p.gioi_tinh puts(p.ho_ten); bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 13 04/2010 Ki u c u trúc (struct) • Gán c u trúc: có 2 cách – Gán hai bi n c u trúc cho nhau – Gán các thành ph n (trư ng) tương ng c a hai c u trúc • Ví d struct dia_chi d1, d2; d1 = d2; Ho c d1.so_nha = d2.so_nha; d1.duong = d2.duong; d1.thanh_pho = d2.thanh_pho; bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 14
  8. 04/2010 Ki u c u trúc (struct) • M ng c u trúc – Khai báo m ng g m các ph n t có ki u c u trúc – Ví d nhan_su mang_nhan_su[100]; – S d ng for (i = 0; i < 100; i++) puts(mang_nhan_su[i].ho_ten); bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 15 04/2010 Ki u c u trúc (struct) • Hàm có tham s ki u c u trúc bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 16
  9. 04/2010 Ki u h p (union) • Ki u h p (union) cho phép chia s cùng m t vùng b nh cho các bi n khác nhau • Nh m ti t ki m b nh • S d ng t khóa union ñ ñ nh nghĩa ki u h p • Ví d Máy dành 2 byte ñ lưu tr union union_type{ khai báo trên int i; C hai ph n t i và ch dùng chung vùng nh 2 byte char ch; T i m i th i ñi m ch m t }; trong hai thành ph n i ho c ch ñư c s d ng bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 17 04/2010 Ki u h p (union) • Khai báo bi n ki u h p union union_type x; • Truy c p các ph n t ki u h p như ki u c u trúc x.i x.ch bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 18
  10. 04/2010 Ki u File (t p) • Các thao tác trên file – M file, Đóng file, ð c d li u file, Ghi d li u, … • Ngôn ng C ñ nh nghĩa (trong stdio.h) – C u trúc ki u t p FILE – Mã k t thúc t p EOF (-1) – Các hàm thao tác trên file • Khai báo con tr file FILE *pf; bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 19 04/2010 Ki u File (t p) • C u trúc chung c a m t file trên đĩa – M t file là g m các byte có giá tr t 0 đ n 255 – S byte là kích thư c (size) c a file – Khi đ c cu i file thì ta nh n đư c mã k t thúc file EOF • T p tin chia làm hai lo i – T p tin văn b n (text) – T p tin nh phân (binary) bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 20
  11. 04/2010 Dòng ch y (stream) • Trư c khi m t file đư c đ c hay ghi, m t c u trúc d li u đư c g i là dòng ch y ph i đư c liên k t v i nó • M t dòng ch y là m t con tr tr ñ n m t c u trúc. • Có 3 dòng ch y ñư c m ra cho b t kỳ m t chương trình C nào – stdin (standard input): ñư c n i v i bàn phím đ ñ c – stdout (standard output), stderr (standard error): ñư c n i v i màn hình đ ghi • Ch c năng c a dòng ch y: – T o ra m t vùng đ m (buffer) gi a chương trình đang ch y và t p tin trên đĩa – Làm gi m vi c chương trình truy c p tr c ti p thi t b ph n c ng bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 21 04/2010 Ki u File (t p) – M file • Mu n thao tác trên t p trư c h t ph i m t p • M t p v i hàm fopen FILE *fopen(const char *name, const char *mode) – Hàm tr v con tr ñ n c u trúc file ho c dòng ch y tương ng, n u không thành công tr v NULL • name: tên file c n m • mode: Ch ñ m “w”: m ñ ghi “r”: m ñ ñ c “a”: m ñ ghi vào cu i t p bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 22
  12. 04/2010 Ki u File (t p) – ðóng file • Ph i đóng file khi không làm vi c v i nó n a • Dùng hàm fclose int fclose(FILE *fp) – fp là dòng ch y hay con tr t p c n đóng – Hàm tr v 0 n u thành công, ngư c l i tr v EOF • Ví d fclose(file_dang_mo); bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 23 04/2010 Ki u File (t p) • Ví d m /đóng file bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 24
  13. 04/2010 Ki u File (t p) • Báo l i h th ng – Dùng hàm perror void perror(const char *str) – Ví d : bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 25 04/2010 Ki u File (t p) • Đ c ký t file – C cung c p hai hàm getc và fgetc int getc(FILE *fp) int fgetc(FILE *fp) – Hai hàm có ch c năng như nhau, đ c ký t t file ng v i dòng ch y fp, tr v mã ASCII c a ký t ñ c đư c n u thành công, ngư c l i tr v EOF • Ghi ký t vào file – C cung c p hai hàm putc và fputc int putc(int ch, FILE *fp) int fputc(int ch, FILE *fp) – Hai hàm có ch c năng như nhau, ghi ký t có mã ASCII là ch % 256 lên file ng v i dòng ch y fp, tr v mã ASCII ký t ñư c ghi n u thành công, ngư c l i tr v EOF bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 26
  14. 04/2010 Ví d copy file (1) bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 27 04/2010 Ki u File (t p) • Đ c/Ghi chu i ký t trên file – Đ c chu i ký t fgets char* fgets(char *s, int n, FILE *fp) – Hàm đ c t ng chu i ký t có ñ dài l n nh t là n trên file tr b i fp vào chu i s – Hàm tr v con tr ñ n vùng nh ch a chu i ký t ñư c đ c n u thành công, ngư c l i tr v NULL – Ghi chu i ký t fputs int fputs(const char *s, FILE *fp) – Ghi chu i ky t s lên file ñư c tr b i fp – N u thành công tr v mã ký t cu i cùng đư c ghi, ngư c l i tr v EOF bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 28
  15. 04/2010 Ví d copy file (2) bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 29 04/2010 Ki u File (t p) • Đ c d li u trên file theo ñ nh d ng – Đ c d li u theo đ nh d ng fscanf int fscanf(FILE *fp, const char *chu i_đi u_khi n, [danh_sách_đ i]) – Đ c d li u t file tr b i fp theo ñ nh d ng chu i đi u khi n vào danh cách các đ i, s d ng tương t hàm scanf bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 30
  16. 04/2010 Ki u File (t p) • Ghi d li u theo ñ nh d ng fprintf int fprintf(FILE *fp, const char *chu i_đi u_khi n, [danh_sách_đ i]) – Ghi d li u vào t p tr b i fp theo ñ nh d ng chu i đi u khi n và t danh cách các đ i, s d ng tương t hàm printf bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 31 04/2010 Ki u File (t p) • Ngoài các hàm đư c trình bày trên, C còn cung c p nhi u hàm khác – T tìm hi u các hàm: • fcloseall, • ferror, • feof, • unlink, • remove, • fseek, • … bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 32
  17. 04/2010 Ki u File (t p) • C còn cho phép thao tác trên các file nh phân – Truy c p file m t cách ng u nhiên d dàng – D li u có th ñ c ghi t ng kh i (blocks) – File nh phân và file văn b n có s khác nhau khi x lý mã chuy n dòng (newline) và mã k t thúc file (end of file) – H u h t các hàm dùng cho file văn b n đ u đư c s d ng cho file nh phân, ngo i tr các hàm fgets, fputs – Khi s d ng hàm fopen s d ng thêm tùy ch n “b” ñ m file d ng nh phân. – Ngoài ra, C cung c p thêm m t s hàm đ c ghi riêng cho t p nh phân bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 33 04/2010 bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 34
  18. 04/2010 Ki u File (t p) • V n đ v i mã k t thúc file – Mã k t thúc file đ i v i ki u văn b n là 26 (Ctrl+Z) – Khi đ c các ký t c a file trong ki u văn b n, n u g p file t này thì giá tr EOF ñư c tr v và k t thúc vi c đ c – Ki u file nh phân không không coi mã k t thúc file là 26 – Đ ñ c t t c các file t c a t p, nên đ c trong ki u nh phân bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 35 04/2010 Ki u File (t p) • V n đ v i mã chuy n dòng (newline) – Đ i v i ki u văn b n • Khi ghi vào file mã chuy n dòng ‘\n’, thì hai ký t đư c ghi vào file là ‘\r’ và ‘\n’ (ký t ‘\r’ chuy n v c t đ u tiên và ‘\n’ chuy n sang dòng m i) • Khi đ c hai ký t ‘\r’ và ‘\n’ thì ñư c nh n bi t là ký t ‘\n’ – Đ i v i ki u nh phân • Khi ghi vào file ‘\n’, thì ch ký t ‘\n’ ñư c ghi vào file bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 36
  19. 04/2010 Ki u File (t p) • Ví d V n đ v i mã chuy n dòng (newline) … FILE *bf, *tf; … tf = fopen(“txtfile”, “w”); 4 ký t ñư c ghi vào file: fprintf(“hi\n”); ‘h’, ‘i’, ‘\r’, ‘\n’ … bf = fopen(“binfile”, “wb”); 3 ký t ñư c ghi vào file: fprintf(“hi\n”); ‘h’, ‘i’, ‘\n’ … bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 37 04/2010 Ki u File (t p) • Các hàm ch đ c/ghi theo ki u nh phân Hàm Ý nghĩa int putw(int n, FILE *fp) Ghi m t s nguyên (2 bytes) lên file int getw(FILE *fp) Đ c m t s nguyên (2 bytes) t file Ghi n m u tin kích thư c size t vùng int fwrite(void *ptr, int size, int n, FILE *fp) nh tr b i ptr lên file fp, hàm tr v s m u tin th c s ghi Đ c n m u tin kích thư c size t file int fread(void *ptr, int size, int n, FILE *fp) fp lên vùng nh tr b i ptr, hàm tr v s m u tin th c s ñư c đ c Thư ng đư c dùng đ đ c/ghi các fread và fwrite m u tin là c u trúc, s th c, … bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 38
  20. 04/2010 Ki u File (t p) Gi s file input.dat có c u trúc như sau: – Dòng 1 và dòng 2: M i dòng ghi 01 s nguyên (l n lư t là M và N) – T dòng 3 đ n cu i file: M i dòng ghi N s nguyên (các s ghi cách nhau m t d u cách) Anh/Ch hãy vi t chương trình cho phép: – Đ c các giá tr có trong file input.dat vào ma tr n s nguyên AMxN – Tính và in ra màn hình giá tr l n nh t (max) c a m i c t trong ma tr n trên. bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 39 04/2010 bangtqh@hotmail.com K thu t l p trình C - Ki u D li u nâng cao 40
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2