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



