Bài giảng Ngôn ngữ lập trình - Nguyễn Thị Bích Ngân
Tóm tắt Bài giảng Ngôn ngữ lập trình - Nguyễn Thị Bích Ngân: ...x xxxf 35 123)( 2 5 x xxxxg 8. Tình diện tích hình tròn. 9. Nhập vào 2 số nguyên a,b. Tìm số lớn nhất trong 2 số. 10. Nhập vào 5 số nguyên. Tính trung bình cộng 5 số đó. Ngôn ngữ lập trình 30 CHƯƠNG 3. CÁC LỆNH ĐIỀU KHIỂN 3.1 Câu lệnh 3.1.1 Lệnh đơn Một câu lệnh đ...này được cố định trong bộ nhớ và được tham chiếu bằng tên diem. Như vậy, khi ta khai báo int num[5]; thì num là mảng 1 chiều có 5 phần tử số nguyên, mỗi số nguyên cần 2 byte. Do đó, bộ nhớ cần cho mảng num là: 5*2= 10 bytes, và những phần tử của mảng này được chứa trong vùng nhớ liên tục. ...4. Xây dựng hàm nhập mảng a gồm n phần tử số nguyên phân biệt thỏa: Không chứa số nguyên tố lớn hơn 200. Các số không nguyên tố có thứ tự giảm. 15. Viết hàm tìm phần tử lớn nhất trong mảng số nguyên n phần tử. 16. Viết hàm tìm phần tử nhỏ nhất trong mảng số nguyên n phần tử. Ngôn ngữ l...
ể đọc Ngôn ngữ lập trình 109 fBIN = fopen(“D:\\Z\\TEST.BIN”,”r+b”); // Mở để đọc/ghi fBIN = fopen(“D:\\Z\\TEST.BIN”,”ab”); // Mở để ghi thêm (append) vào cuối //Xử lý lỗi if(fTXT == NULL) { printf(“Loi mo file = %d. Noi dung = %s”,errno,strerror(errno)); return 0; } Lưu ý : Thao tác đọc /ghi không thể thực hiện liền nhau, cần phải có một thao tác fseek hay rewind ở giữa. Ta xét ví dụ sau: FILE*fBIN; fBIN = fopen(“D:\\z\\TEST.BIN”.”r+b”);// Mở để update int x; while(fread(&x,sizeof(x),1,fBIN)) if(x == 0) { x++; fseek(fBIN,-sizeof(x),SEEK_CUR); fwrite(&x, sizeof(x),1, fBIN); } fclose(fBIN); Kết quả: Chỉ update được 1 phần tử Ví dụ về truy xuất dữ liệu ở chế độ text n = fscanf(fTXT,”%d,%f,%s”,&Item,&fItem,szItem); // trả về số phần tử đọc được if(n < 3 || n ==EOF) { printf(“Không đọc được số phần tử cần thiết. M lỗi = %d”,errno); // Các xử lý đặc biệt } n = fprintf(fTXT,“%d,%f,%s”,&Item,&fItem,szItem);//trả về số byte ghi được; if(n < sizeof(Item)+sizeof(fItem)+strlen(szItem) || ) { printf(“Ghi không thành công. M lỗi = %d”,errno); Ngôn ngữ lập trình // Các xử lý đặc biệt } Ví dụ về truy xuất dữ liệu ở chế độ binary n = fread(&Item, sizeof(Item), nItemRead, fBIN);//trả về số phần tử đọc được if(n < nItemRead) { printf(“Không đọc được số phần tử cần thiết. M lỗi = %d”,errno); // Các xử lý đặc biệt } n = fwrite(&Item, sizeof(Item), nItemWrite, fBIN);//trả về số byte đọc được if(n < nItemWrite) { printf(“Ghi không thành công. M lỗi = %d”,errno); // Các xử lý đặc biệt } Ví dụ sau sẽ thực hiện việc cập nhật SAI một phần tử khi quản lý bằng con trỏ fread(&Item,sizeof(Item),1,f); Item ++; // cập nhật phần tử Item fwrite(&Item,sizeof(Item),1,f); Ví dụ về đóng file sau khi xử lý Đóng từng file: Ngôn ngữ lập trình 111 fclose(fTXT); fclose(fBIN); Đóng tất cả các file đang mở: fcloseall(); Ví dụ sau sẽ cho thấy việc không bảo toàn dữ liệu khi không đóng file char szFileName[] = “D:\\z\\TEST.BIN”; Ghi dữ liệu lên file FILE*f = fopen(szFileName,”wb”); for( i = 0; i < n; i++) fwrite(&i,sizeof(i),1,f); Đọc dữ liệu từ file i = 0; f = fopen(szFileName,”rb”); while(fread(&i,sizeof(i),1,f)) i++; printf(“%d”,i); fclose(f); Kết quả: (tùy thuộc vào hệ thống) n = 100 i = 0 n = 500 i = 256 n = 513 i = 512 n = 1000 i = 768 Ngôn ngữ lập trình 112 Bài tập chương 7 1. Cho một tập tin chứa chi tiết của nhân viên như Mã NV, tên, tuổi, lương cơ bản và trợ cấp. Thực hiện các yêu cầu sau: Viết các câu lệnh để tạo tập tin Employee.dat và nhận các giá trị Mã NV, tên, tuổi, lương cơ bản và trợ cấp vào các field. Gán chi tiết vào các biến sau đó lần lượt gán vào các field. Sau khi tạo tập tin Employee, Hãy liệt k tất cả các mẩu tin của tập tin này. Liệt kê các nhân viên có lương bằng 1000. Cập nhật lại tiền trợ cấp cho tất cả các nhân viên thành 300 nếu lương cơ bản nhỏ hơn 2000 ngược lại lên 500. Xóa các mẩu tin trong tập tin Employee căn cứ vào mã nhân viên nhập vào. Tìm các nhân viên trong tập tin Employee theo mã nhân viên, hiển thị thông tin đầy đủ của nhân viên khi tìm thấy. Liệt kê các bộ sưu liệu được sử dụng của chương trình. 2. Viết chương trình tìm độ dài của file (nhớ mở file dạng nhị phân). 3. Viết chương trình đọc một file text và xóa các dòng trống nếu có trong file. 4. Viết chương trình cắt bỏ các dòng thừa, cắt bỏ các khoảng trống thừa, đổi các kí tự đầu mỗi từ ra chữ hoa của một file text. 5. Lập chương trình tạo một tập tin chứa các giá trị ngẫu nhiên. Sắp xếp chúng và lưu trữ sang một tập tin khác. 6. Viết chương trình tính số lần xuất hiện của một kí tự chữ cái trong một tập tin văn bản. 7. Viết chương trình tính số từ có trong một tập tin văn bản. 8. Viết chương trình nối hai tập tin văn bản với nhau thành một tập tin văn bản. Ngôn ngữ lập trình 113 9. Viết chương trình nhập dữ liệu của các nhân viên của một cơ quan và lưu vào file. Sau đó thực hiện các câu lệnh sau: Nhập vào một số thứ tự, sửa dữ liệu của nhân viên theo thứ tự này, lưu lại nhân viên này vào file. Viết các hàm thực hiện các câu lệnh sau: Tìm lương thấp nhất của cơ quan. Tìm lương trung bình của cơ quan. In ra danh sách nhân viên. In ra những người có lương cao nhất. In ra những người có lương thấp nhất. 10. Viết chương trình quản lý lớp học bằng array. Mỗi học sinh được mô tả bằng: mã số (int), họ(8 kí tự), tên lĩt(24 kí tự), tên( 8 kí tự), điểm toán, lý, hóa. Lưu học sinh này vào file HOCSINH.DAT. Chương trình có các chức năng sau: Thêm vào một học sinh. Xóa một học sinh. Xuất danh sách các học sinh (không có điểm). Xuất danh sách học sinh có xếp hạng, nếu cùng hạng thì sắp theo tên. 11. Viết chương trình tìm độ dài của file (nhớ mở file dạng nhị phân). 12. Viết chương trình đọc một file text và xóa các dòng trống nếu có trong file. 13. Viết chương trình cắt bỏ các dòng thừa, cắt bỏ các khoảng trống thừa, đổi các kí tự đầu mỗi từ ra chữ hoa của một file text. 14. Lập chương trình tạo một tập tin chứa các giá trị ngẫu nhiên. Sắp xếp chúng và lưu trữ sang một tập tin khác. 15. Viết chương trình tính số lần xuất hiện của một kí tự chữ cái trong một tập tin văn bản. 16. Viết chương trình tính số từ có trong một tập tin văn bản. Ngôn ngữ lập trình 114 17. Viết chương trình nối hai tập tin văn bản với nhau thành một tập tin văn bản. 18. Viết chương trình nhập dữ liệu của các nhân viên của một cơ quan và lưu vào file. Sau đó thực hiện các câu lệnh sau: Nhập vào một số thứ tự, sửa dữ liệu của nhân viên theo thứ tự này, lưu lại nhân viên này vào file. Viết các hàm thực hiện các câu lệnh sau: Tìm lương thấp nhất của cơ quan. Tìm lương trung bình của cơ quan. In ra danh sách nhn viên. In ra những người có lương cao nhất. In ra những người có lương thấp nhất. 19. Viết chương trình quản lý lớp học bằng array. Mỗi học sinh được mô tả bằng: mã số (int), họ (8 kí tự), tên lót (24 kí tự), tên (8 kí tự), điểm toán, lý, hóa. Lưu học sinh này vào file HOCSINH.DAT. Chương trình có các chức năng sau : Thêm vào một học sinh Xóa một học sinh Xuất danh sách các học sinh (không có điểm) Xuất danh sách học sinh có xếp hạng, nếu cùng hạng thì sắp theo tên. Ngôn ngữ lập trình 115 MỘT SỐ HÀM CHUẨN TRONG C 1. File ctype.h : Xử lý kí tự Các hàm sau sẽ thực hiện việc kiểm tra, trả về là 0 nếu sai, trả về giá trị khác 0 nếu đúng. int isalpha(int c) : Kiểm tra c có phải là kí tự chữ hay không ? (A Z, a z) int isascii(int c) : Kiểm tra c có phải là kí tự ASCII hay không ?(0 127) int iscntrl(int c) : Kiểm tra c có phải là kí tự điều khiển hay không? int isdigit(int c) : Kiểm tra c có phải là kí tự số 0 9 int isgraph(int c) : Kiểm tra c có phải là kí tự in được, trừ khoảng trống. int islower(int c) : Kiểm tra c có phải là kí tự thường hay không ? int isprintf(int c) : Kiểm tra c có phải là kí tự in được int ispunct(int c) : Kiểm tra c có phải là kí tự điều khiển hay khoảng trống int isspace(int c) : Kiểm tra c có phải là kí tự khoảng trống? int isuppper(int c) : Kiểm tra c có phải là kí tự hoa ? (A Z) + Các hàm toán học double acos(double x) : Tính arc cosince(x) double asin(double x) : Tính arc sine(x) double atan(double x) : Tính arc tangent(x) double atan2(double x, double y) : Tính arc tangent(x/y) double ceil(double x) : Trả về số nguyên(có kiểu double) nhỏ nhất và không nhỏ hơn x double cos(double x) : Tính cosine(x), x : radian Ngôn ngữ lập trình 116 double cosh(double x) : Tính Hãyoerbolic cosine(x) double exp(double x) : Tính ex double fabs(double x) : Tính | x | double floor(double x) : Trả về số nguyên lớn nhất và không lớn hơn x double fmod(double x, double y) : Trả về số dư(kiểu double) của phép chia nguyên x/y double frexp(double x, int*exponent) Chia x làm thành phần định trị(mantisa) và luỹ thừa(exponent) của 2 ( x = a*2exponent) trả về giá trị a double ldexp(double x, int exp): Ngược lại với frexp, trả về x*2exp double log(double x) : Trả về giá trị log Neper của x double log10(double x) : Trả về giá trị log 10 của x double modf(double x, double*intptr) Chia x thnh phần lẻ(fractional – kết quả của hàm) v phần nguyên double pow(double x, doubley): Tính xy double sin(double x) : Tính since(x), x:radian double sinh(double x) : Tính Hãyperbolic của x double sqrt(double x) : Tính căn bậc 2 của x double tan(double x) : Tính tangent của x double tanh(double x) : Tính Hãyperbolic tangent của x + Các hàm xuất nhập chuẩn: a. Các hàm xuất nhập dữ liệu thông thường int getchar(void) : Nhập một kí tự từ bên phím (stdin) Ngôn ngữ lập trình 117 int putchar(int c) : Xuất kí tự ra màn hình (stdout) char* gets(char*s) : Nhập một chuỗi kí tự từ bên phím int puts(const char*s) : Xuất một chuỗi kí tự ra màn hình(có xuống dòng) int printf(const char * format, [argument, ]) Xuất dữ liệu có định dạng ra màn hình int scanf(const char * format, [address, ]) Nhập dữ liệu có định dạng ra màn hình int sprintf(char*buffer,const char*format[argument, ]); Xuất dữ liệu có định dạng sang 1 chuỗi int sscanf(const char*buffer, const char*format[argument, ]) Đọc một chuỗi int vprintf(const char * format, va_list arlist);Xuất dữ liệu định dạng dùng danh sách đối số int vscanf(const char * format, va_list arlist); Nhập dữ liệu định dạng dùng danh sách đối số int vsprintf(char * buffer,const char*format, va_list arlist);Xuất dữ liệu định dạng ra chuỗi dùng danh sách đối số int vsscanf(const char * buffer,const char*format, va_list arlist);Nhập dữ liệu định dạng vào chuỗi dùng danh sách đối số b. Xuất nhập file void clearerr(FILE*stream) : Xóa thông báolỗi int fclose(FILE*stream) : Đóng file int fcloseall(void) : Đóng tất cả các file đang mở FILE*fdopen(int handle, char*type) : Gán 1 dòng(stream) cho file handle Ngôn ngữ lập trình 118 FILE*fopen(const char*filename, char*type): Mở một file FILE*freopen(const char*filename,const char * mode,FILE*stream); Mở một file mới và gán cho 1 hfile handle đ mở. Mở một file với chế độ dùng chung _fsopen: #include #include FILE*_fsopen(const char*filename, const char*mode,int shflg); int feof(FILE*stream) : Kiểm tra hết file(Macro) int ferror(FILE*stream) : Kiểm tra có lỗi hay không int fflush(FILE*stream) : Ghi buffer của dòng(stream) ln file int fgetc(FILE*stream) : Lấy kí tự từ file int fputc(int c, FILE*stream) : Ghi kí tự c ln file int fgetchar(void) : Lấy kí tự từ thiết bị nhập chuẩn(stdin) int fputchar(int c) : Xuất lí tự ra thiết bị xuất chuẩn(stdout) int getpos(FILE*stream, fpos_t*pos): Lấy vị trí hiện hnh int fsetpos(FILE*stream, const fpos_t*pos) Ấn định vị trí file hiện hành char* fgets(char*s, int n, FILE*stream) : Lấy một chuỗi từ file int fputs(const char*s, FILE*stream): Ghi một chuỗi ln file int fileno(FILE*stream) : Lấy file handle int fflushall(void) : Xố các buffer của dòng nhập Ngôn ngữ lập trình 119 Ghi các buffer của dòng xuất lên file int fprintf(FILE*stream, const char*format, [ , argument, ]) Ghi kết xuất có định dạng lên file int fscanf(FILE*stream, const char*format, [ , address, ]) Đọc dữ liệu có định dạng từ file size_t fread(void *ptr, size_t size, size n, FILE*stream); :Đọc dữ liệu từ file size_t fwrite(const void *ptr, size_t size, size n, FILE*stream); :Ghi dữ liệu lên file int fseek(FILE*stream, long offset, int whence): Nhẩy đến vị trí offset trong file kể từ vị trí whence long ftell(FILE*stream) : Lấy vị trí file hiện hình int getw(FILE*stream) : Đọc một số nguyên từ file int putw(int w, FILE*stream) : Xuất một số nguyên từ file void perror(const char*s) : Xuất một thông báo lỗi hệ thống int remove(const char*filename) : Macro xóa một file int rename(const char*oldname, const char*newname) Đổi tên một file void rewind(FILE*stream) : Đưa con trỏ về đầu file int rmtmp(void) : Xoá các file tạm đã mở Gán buffer cho một file: void setbuf(FILE*stream, char buf) int setvbuf(FILE*stream, char*buf, int type, size_t size) FILE*tmpfile(void) : Mở một file tạm nhị phân Ngôn ngữ lập trình 120 char* tempnam(char*dir, char *prefix) : Tạo một file có tên duy nhất trong thư mục int unget(int c, FILE*stream) : Trả kí tự về cho file int unlink(const char*filename) : Xóa một file Tạo thông báo: char*_strerror(const char*s); char*strerror(int errnum); + Các hàm tiện ích a. Đổi số thành chuỗi Đổi số thực thành chuỗi, lấy ndig số hạng, dec số lẻ, đưa dấu vào biến sign char*ecvt(double value, int ndig, int *dec, int *sign); char*fcvt(double value, int ndig, int *dec, int *sign); char*itoa(int value, char*string, int radix); char*ltoa(long value, char*string, int radix); char*utoa(unsigned long value, char*string, int radix); char*gcvt(double value, int ndec, char*buf); b. Đổi chuổi thành số double atof(const char*s); long double _atold(const char*s); int atoi(const char*s); double strtod(const char *s, char**endptr); Ngôn ngữ lập trình 121 long strtol(const char *s, char**endptr, int radix); long double strtold(const char *s, char**endptr); unsigned long strtoul(const char *s, char**endptr, int radix); c. Xử lý số Lấy trị tuyệt đối số nguyên, số thực, số phức: int abs(int x); complex: double abs(complex x); double cabs(struct complex z); long double cabsl(struct _complex z); double fabs(double x); long double fabsl(long double @E(x)); long int labs(long int x); d. Tạo số ngẫu nhiên void randomize(void); : Khởi động cơ chế lấy số ngẫu nhiên int rand(void); : Lấy số ngẫu nhiên từ 0 đến RAND_MAX Lấy số ngẫu nhiên từ 0 đến num – 1 Macro : random(num); Function: int random(int num); Lấy số ngẫu nhiên từ 0 đến seed void srand(unsigned seed); e. Cấp phát và thu hồi bộ nhớ: Ngôn ngữ lập trình 122 Hàm xin cấp phát một vùng nhớ có size bytes/ nbytes void * malloc(size_t size); void far*farmalloc(unsigned long nbytes); Hàm xin cấp phát một vùng nhớ cho nitems phần tử, mỗi phần tử có size bytes void * calloc(size_t nitems, size_t size); void far*farcalloc(unsigned long nitems, unsigned long size); Hàm xin cấp phát lại vùng nhớ lúc trước đã cấp phát rồi ở địa chỉ oldblock với kích thước mới là size, có copy nội dung cũ sang vùng nhớ mới. void * realloc(void * oldblock, size_t size); void far* farrealloc(void far* oldblock, unsigned long nbytes); Hàm trả về bộ nhớ cho hệ thống void * free(void*block); void far* farfree(void far*block); + Xử lý string Copy một khối bộ nhớ n bytes từ src sang dest void *memcácpy(void *dest, const void *src, int c, size_t n); void *memcpy (void *dest, const void *src, size_t n); void *memmove(void *dest, const void *src, size_t n); void far * far _fmemcácpy(void far *dest, const void far *src, int c, size_t n); void far * far _fmemcpy (void far *dest, const void far *src, Ngôn ngữ lập trình 123 size_t n); ▒ Tìm kiếm kí tự c trong khối bộ nhớ s(n byte) void *memchr (const void *s, int c, size_t n); void far * far _fmemchr(const void far *s, int c, size_t n); So sánh n byte đầu tiên giữa hai chuỗi s1 và s2, hàm memicmp so sánh nhưng không phân biệt chữ hoa và chữ thường int memcmp (const void *s1, const void *s2, size_t n); int memicmp(const void *s1, const void *s2, size_t n); int far _fmemcmp (const void far *s1, const void far *s2, size_t n); int far _fmemicmp(const void far *s1, const void far *s2, size_t n); Cho n byte đầu tiên của s đều là kí tự c void *memset (void *s, int c, size_t n); void far * far _fmemset(void far *s, int c, size_t n); Nối chuỗi src vo chuỗi dest char *strúcat(char *dest, const char *src); char far * far _fstrúcat(char far *dest, const char far *src); Tìm địa chỉ vị trí xuất hiện đầu tiên của kí tự c trong chuỗi s char *strúchr(const char *s, int c); char far * far _fstrúchr(const char far *s, int c); So sánh hai chuỗi, strúcmpi, _fstricmp, stricmp không phân biệt chữ hoa và chữ thường int strúcmp(const char *s1, const char*s2); Ngôn ngữ lập trình 124 int strúcmpi(const char *s1, const char *s2) int stricmp(const char *s1, const char *s2); int far _fstrúcmp(const char far *s1, const char far *s2); int far _fstricmp(const char far *s1, const char far *s2); Copy chuỗi src sang chuỗi dest char *strúcpy(char *dest, const char *src); char far * _fstrúcpy(char far *dest, const char far *src); Tìm đoạn trong chuỗi s1 không chứa các kí tự có trong s2 size_t strúcspn(const char *s1, const char *s2); size_t far _fstrúcspn(const char *s1, const char far *s2); Tìm đoạn trong chuỗi s1 có chứa các kí tự có trong s2 size_t strspn(const char *s1, const char *s2); size_t far _fstrspn(const char far *s1, const char far *s2); Copy một chuỗi sang vị trí khc char *strdup(const char *s); char far * far _fstrdup(const char far *s); Tìm độ dài của chuỗi size_t strlen(const char *s); size_t far _fstrlen(const char far *s); Đổi một chuỗi thành chuỗi chữ thường char *strlwr(char *s); Ngôn ngữ lập trình 125 char far * far _fstrlwr(char far *s); Đổi một chuỗi thành chuỗi chữ hoa char *strupr(char *s); char far * far _fstrupr(char far *s); Nối một đoạn của chuỗi src vào chuỗi dest char *strêncat(char *dest, const char *src, size_t maxlen); char far * far _fstrêncat(char far *dest, const char far *src, size_t maxlen); So snh hai chuỗi int strúcmp(const char *s1, const char*s2); int far _fstrúcmp(const char far *s1, const char far *s2); So sánh hai chuỗi, không phân biệt chuỗi hoa và chuỗi thường int strúcmpi(const char *s1, const char *s2) int stricmp(const char *s1, const char *s2); int far _fstricmp(const char far *s1, const char far *s2); Copy tối đa maxlen kí tự từ chuỗi src sang chuỗi dest char *strêncpy(char *dest, const char *src, size_t maxlen); char far * far _fstrêncpy(char far *dest, const char far *src size_t maxlen); Cho n byte của chuỗi s l kí tự ch char *strênset(char *s, int ch, size_t n); char far * far _fstrênset(char far *s, int ch, size_t n); Ngôn ngữ lập trình 126 Tìm xuất hiện đầu tiên của kí tự bất kỳ của chuỗi s2 trong chuỗi s1 char *strpbrk(const char *s1, const char *s2); char far *far _fstrpbrk(const char far *s1, const char far *s2); Tìm xuất hiện cuối cùng của kí tự c trong chuỗi s char *strrchr(const char *s, int c); char far * far _fstrrchr(const char far *s, int c); Đảo chuỗi char *strrev(char *s); char far * far _fstrrev(char far *s); Thiết lập tất cả chuỗi s đều mang kí tự ch char *strset(char *s, int ch); char far * far _fstrset(char far *s, int ch); Tìm xuất hiện đầu tiên của chuỗi s2 trong s1 char *strstr(const char *s1, const char *s2); char far * far _fstrstr(const char far *s1, const char far *s2); Tìm từ đầu tiên trong s1 không có mặt trong s2 char *strtok(char *s1, const char *s2); char far * far _fstrtok(char far *s1, const char far *s2); Ngôn ngữ lập trình 127 TÀI LIỆU THAM KHẢO [1] Ngôn ngữ lập trình, Khoa CNTT, trường ĐH CNTP TPHCM, 2003 [2] Nguyễn Thanh Thủy (chủ biên), Nhập môn lập trình ngôn ngữ C, Nhà xuất bản Khoa học và Kỹ thuật, 2005. [3] Brian.W.Kernighan, Dennis M.RitChie, C Programming Language, 2nd Edition, Prentice Hall Software Series, [4]. : The C Book, Mike Banahan, Declan Brady and Mark Doran (the online version). [5] Nguyễn Đình Tê, Hoàng Đức Hải, Giáo trình Lý thuyết và bài tập ngôn ngữ C Tập 1, Nhà xuất bản Giáo dục, 1999. [6] Nguyễn Đình Tê, Hoàng Đức Hải, Giáo trình Lý thuyết và bài tập ngôn ngữ C Tập 2, Nhà xuất bản Giáo dục, 1999. [7] Nguyễn Thanh Thủy và Nguyễn Quang Huy, Bài tập lập trình ngôn ngữ C, Nhà xuất bản Khoa học và Kỹ thuật, 1999. [8] Đặng Thành Tín, Tin Học II, Nhà xuất bản Giáo dục.
File đính kèm:
- bai_giang_ngon_ngu_lap_trinh_nguyen_thi_bich_ngan.pdf