Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
472,9 KB
Nội dung
KỸ THUẬT LẬP TRÌNH C Chương 6: Các kiểu liệu nâng cao bangtqh@hotmail.com 04/2010 Các kiểu liệu nâng cao • • • • Kiểu trỏ Kiểu mảng Kiểu Cấu trúc (struct) 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 04/2010 Kiểu trỏ (pointer) • Địa (address) – Với biến 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ị • Máy tính cấp phát vùng nhớ byte liên tục để lưu trữ giá trị biến i – Địa biến số thứ tự byte dãy byte liên tục máy dành để lưu trữ giá trị biến – Để lấy địa biến, sử dụng toán tử “&” • Ví dụ: &i – Lưu ý, máy tính phân biệt kiểu địa chỉ: địa kiểu int, địa kiểu float, địa kiểu long, … bangtqh@hotmail.com Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 04/2010 Kiểu trỏ (pointer) • Con trỏ (pointer) – Là biến dùng để chứa địa – Có nhiều loại trỏ tương ứng với kiểu địa khác • Chẳng hạn, trỏ kiểu int tương ứng địa kiểu int, … – Cú pháp khai báo trỏ kiểu_dữ_liệu *tên_con_trỏ; – Ví dụ int i, j, *pi, *pj; pi = &i; /* pi trỏ chứa ñịa biến i */ pj = &j; /* pj trỏ chứa ñịa biến j */ bangtqh@hotmail.com Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 04/2010 Kiểu trỏ (pointer) • Giả sử có – px trỏ ñến biến x, cánh viết x *px tương đương • Ví dụ int x, y, *px, *py; px = &x; py = &y; x = 3; /* tương đương với *px = */ y = 5; /* tương đương với *py = */ /* Các câu lệnh tương ñương: */ x = 10*y; *px = 10*y; x = 10*(*py); *px = 10*(*py); Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao bangtqh@hotmail.com 04/2010 Kiểu mảng • Mảng chiều (xem lại slide chương 4) • Mảng nhiều chiều – Ví dụ, khai báo mảng chiều int a[4][10]; //là mảng có hàng, 10 cột – Truy cập phần tử 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 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 04/2010 Kiểu mảng – Bài tập Viết chương trình kiểm tra xem ma trận Anxn có phải ma trận tam giác không ? Viết chương trình tìm trung bình cộng phần tử âm thuộc ma trận Amxn Cho số nguyên N (lẻ ≥ 3) Hãy điền vào ma n2 cho trận thỏa trận Anxn giá trị từ mãn điều kiện Tổng hàng = Tổng cột = Tổng đường chéo Viết chương trình tính định thức 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 04/2010 Kiểu cấu trúc (struct) • Kiểu cấu trúc cho phép tạo kiểu liệu gồm phần tử liệu có kiểu khác liên kết với • Kiểu cấu trúc (structure) gọi kiểu ghi (record) • Kiểu cấu trúc gồm nhiều thành phần liệu khác • Các thành phần liệu gọi 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 04/2010 Kiểu cấu trúc (struct) • Ví dụ: dùng kiểu cấu trúc mô tả liệu ñịa – Địa gồm 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 khai báo 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 04/2010 Kiểu cấu trúc (struct) • Hoặc 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 biến struct dia_chi ong_A, ba_B; Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao bangtqh@hotmail.com 11 04/2010 Kiểu cấu trúc (struct) • Khai báo kiểu cấu trúc lồng 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 04/2010 Kiểu cấu trúc (struct) • Truy cập phần tử 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ó cách – Gán hai biến cấu trúc cho – Gán thành phần (trường) tương ứng 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 04/2010 Kiểu cấu trúc (struct) • Mảng cấu trúc – Khai báo mảng gồm 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 04/2010 Kiểu hợp (union) • Kiểu hợp (union) cho phép chia vùng nhớ cho biến khác • Nhằm tiết kiệm nhớ • Sử dụng từ khóa union ñể ñịnh nghĩa kiểu hợp • Ví dụ union union_type{ int i; char ch; }; bangtqh@hotmail.com Máy dành byte ñể lưu trữ khai báo Cả hai phần tử i ch dùng chung vùng nhớ byte Tại thời ñiểm hai thành phần i ch ñược sử dụng 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 phần tử kiểu hợp 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 04/2010 Kiểu File (tệp) • Các thao tác file – Mở file, Đóng file, ðọc liệu file, Ghi 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 file • Khai báo 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 file đĩa – Một file gồm byte có giá trị từ đến 255 – Số byte kích thước (size) file – Khi đọc cuối file ta nhận mã kết thúc file EOF • Tệp tin chia làm hai loại – Tệp tin vă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 04/2010 Dòng chảy (stream) • Trước file đọc hay ghi, cấu trúc liệu gọi dòng chảy phải liên kết với • Một dòng chảy trỏ trỏ ñến cấu trúc • Có dòng chảy ñược mở cho chương trình C – stdin (standard input): ñược nối với bàn phím để ñọc – stdout (standard output), stderr (standard error): ñược nối với hình để ghi • Chức dòng chảy: – Tạo vùng đệm (buffer) chương trình chạy tệp tin đĩ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 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ả trỏ ñến cấu trúc file dòng chảy tương ứng, không thành công trả 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 04/2010 Kiểu File (tệp) – ðóng file • Phải đóng file không làm việc với • Dùng hàm fclose int fclose(FILE *fp) – fp dòng chảy hay trỏ tệp cần đóng – Hàm trả thành công, ngược lại trả 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 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 fgetc int getc(FILE *fp) int fgetc(FILE *fp) – Hai hàm có chức nhau, đọc ký tự từ file ứng với dòng chảy fp, trả mã ASCII ký tự ñọc thành công, ngược lại trả EOF • Ghi ký tự vào file – C cung cấp hai hàm putc fputc int putc(int ch, FILE *fp) int fputc(int ch, FILE *fp) – Hai hàm có chức nhau, ghi ký tự có mã ASCII ch % 256 lên file ứng với dòng chảy fp, trả mã ASCII ký tự ñược ghi thành công, ngược lại trả EOF bangtqh@hotmail.com Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 26 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ự file – Đọc chuỗi ký tự fgets char* fgets(char *s, int n, FILE *fp) – Hàm đọc chuỗi ký tự có ñộ dài lớn n file trỏ fp vào chuỗi s – Hàm trả trỏ ñến vùng nhớ chứa chuỗi ký tự ñược đọc thành công, ngược lại trả 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ỏ fp – Nếu thành công trả mã ký tự cuối ghi, ngược lại trả EOF bangtqh@hotmail.com Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 28 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 liệu file theo ñịnh dạng – Đọc liệu theo định dạng fscanf int fscanf(FILE *fp, const char *chuỗi_điều_khiển, [danh_sách_đối]) – Đọc liệu từ file trỏ fp theo ñịnh dạng chuỗi điều khiển vào danh cách đố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 04/2010 Kiểu File (tệp) • Ghi liệu theo ñịnh dạng fprintf int fprintf(FILE *fp, const char *chuỗi_điều_khiển, [danh_sách_đối]) – Ghi liệu vào tệp trỏ fp theo ñịnh dạng chuỗi điều khiển từ danh cách đố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 hàm trình bày trên, C cung cấp nhiều hàm khác – Tự tìm hiểu 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 04/2010 Kiểu File (tệp) • C cho phép thao tác file nhị phân – Truy cập file cách ngẫu nhiên dễ dàng – Dữ liệu ñọc ghi khối (blocks) – File nhị phân file văn có khác xử lý mã chuyển dòng (newline) mã kết thúc file (end of file) – Hầu hết hàm dùng cho file văn sử dụng cho file nhị phân, ngoại trừ 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 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 04/2010 Kiểu File (tệp) • Vấn đề với mã kết thúc file – Mã kết thúc file kiểu văn 26 (Ctrl+Z) – Khi đọc ký tự file kiểu văn bản, gặp file tự giá trị EOF ñược trả kết thúc việc đọc – Kiểu file nhị phân không không coi mã kết thúc file 26 – Để ñọc tất file tự tệp, nên đọc 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 • Khi ghi vào file mã chuyển dòng ‘\n’, hai ký tự ghi vào file ‘\r’ ‘\n’ (ký tự ‘\r’ chuyển cột ‘\n’ chuyển sang dòng mới) • Khi đọc hai ký tự ‘\r’ ‘\n’ ñược nhận biết ký tự ‘\n’ – Đối với kiểu nhị phân • Khi ghi vào file ‘\n’, 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 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”); fprintf(“hi\n”); ký tự ñược ghi vào file: ‘h’, ‘i’, ‘\r’, ‘\n’ … bf = fopen(“binfile”, “wb”); fprintf(“hi\n”); ký tự ñược ghi vào file: ‘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 đọc/ghi theo kiểu nhị phân Hàm Ý nghĩa int putw(int n, FILE *fp) Ghi số nguyên (2 bytes) lên file int getw(FILE *fp) Đọc số nguyên (2 bytes) từ file int fwrite(void *ptr, int size, int n, FILE *fp) Ghi n mẫu tin kích thước size từ vùng nhớ trỏ ptr lên file fp, hàm trả số mẫu tin thực ghi int fread(void *ptr, int size, int n, FILE *fp) Đọc n mẫu tin kích thước size từ file fp lên vùng nhớ trỏ ptr, hàm trả số mẫu tin thực ñược đọc fread fwrite bangtqh@hotmail.com Thường dùng để đọc/ghi mẫu tin cấu trúc, số thực, … Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 38 04/2010 Kiểu File (tệp) Giả sử file input.dat có cấu trúc sau: – – Dòng dòng 2: Mỗi dòng ghi 01 số nguyên (lần lượt M N) Từ dòng đến cuối file: Mỗi dòng ghi N số nguyên (các số ghi cách dấu cách) Anh/Chị viết chương trình cho phép: – – Đọc giá trị có file input.dat vào ma trận số nguyên AMxN Tính in hình giá trị lớn (max) cột ma 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 [...]... 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 % 2 56 lên... (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... 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 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... 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:... 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 04/2010 Ví dụ copy file (2) bangtqh@hotmail.com Kỹ. .. 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,... bangtqh@hotmail.com Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 32 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... 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... 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)... 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 ... 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 04/2010... Tổng c t = Tổng đường chéo Viết chương trình tính định th c 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 04/2010 Kiểu c u tr c (struct) • Kiểu c u tr c cho... ñư c nối với hình để ghi • Ch c dòng chảy: – Tạo vùng đệm (buffer) chương trình chạy tệp tin đĩ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