chr là một biến ký tự chứa giá trị cần tìm. Hàm trả về con trỏ trỏ đến giá trị tìm được đầu tiên trong chuỗi, hoặc NULL nếu không tìm gặp thấy Các hàm về chuỗi tt... Mở một tập tin
Trang 1ThS Đỗ Đình Trang
KỸ THUẬT LẬP TRÌNH
dodinhtrang@gmail.com
Trang 2ThS Đỗ Đình Trang
CHƯƠNG 4 : CHUỖI
dodinhtrang@gmail.com
Trang 3 Các biến và hằng kiểu chuỗi:
phải được khai báo trước khi sử dụng
Một hằng chuỗi là một dãy các ký tự nằm trong dấu nháy kép
Mỗi ký tự trong một chuỗi được lưu trữ như là một phần tử của mảng
Trang 4 Có thể gán giá trị cho chuỗi ký tự bằng những cách sau:
char arr_str[7] = {`H', `e', `l', `l', `o', `!', `\0'};
char str[7] = "Hello!";
char str[] = "I like C.";
char *ptr_str = "I teach myself C.";
Trang 5 Chuỗi có thể được lưu và truy cập bằng cách sử dụng con trỏ kiểu ký tự.
Một con trỏ kiểu ký tự trỏ đến một chuỗi được khai báo như sau:
char *ptr_str;
ptr_str = "A character string.";
Khai báo chuỗi (tt)
ptr_str = `x'; /* Sai */
*ptr_str = `x'; /* Đúng */
Trang 6 Các hàm này là một phần của thư viện nhập/xuất chuẩn tên stdio.h
Hàm gets() dùng để đọc các ký tự từ một giao tiếp nhập chuẩn (stdin) Cú
pháp : gets(str); trong đó str là một mảng ký tự đã được khai báo
Hàm puts() dùng để xuất các ký tự cho một giao tiếp xuất chuẩn (stdout)
Cú pháp : puts(str);
Trang 7int i=0, delt = `a' - `A';
}
Trang 8 Các thao tác Nhập/Xuất chuỗi có định dạng
Có thể sử dụng các hàm scanf() và printf() để nhập và hiển thị các
Trang 9 Các hàm này có thể tìm thấy trong tập tin string.h
strlen(char *str): Xác định chiều dài của chuỗi str
char str1[] = {`A', ` `,`s', `t', `r', `i', `n', `g', ` `,`c', `o', `n', `s', `t', `a',
`n', `t', `\0'};
char str2[] = "Another string constant";
char *ptr_str = "Assign a string to a pointer.";
printf(“str1 is: %d bytes\n", strlen(str1)); // 17
printf(“str2 is: %d bytes\n", strlen(str2)); // 23
printf(“ptr_str is: %d bytes\n",strlen(ptr_str)); // 29
Trang 10 chr là một biến ký tự chứa giá trị cần tìm.
Hàm trả về con trỏ trỏ đến giá trị tìm được đầu tiên trong chuỗi, hoặc NULL nếu không tìm gặp thấy
Các hàm về chuỗi (tt)
Trang 11else printf("%c does not occur in
%s\n", chr, str2);
getch();
}
Các hàm về chuỗi – Ví dụ về strchr()
Trang 13{ char name1[15] = "Geena";
char name2[15] = "Dorothy";
char name3[15] = "Shania";
char name4[15] = "Geena";
Trang 14 str1 và str2 là hai chuỗi đã được khai báo và khởi tạo.
Hàm sao chép giá trị str2 vào str1 và trả về chuỗi str1
Nối 2 chuỗi vào nhau: strcat()
Cú pháp: strcat(str1, str2);
str1 và str2 là hai chuỗi đã được khai báo và khởi tạo.
Các hàm về chuỗi (tt)
Trang 15{ char hotelname1[15] = "Sea View";
char hotelname2[15] = "Sea Breeze";
Trang 16}
Các hàm về chuỗi – Ví dụ về strcat()
Trang 17ThS Đỗ Đình Trang
dodinhtrang@gmail.com
Trang 18 Tập tin biểu thị một thiết bị cụ thể có thể trao đổi thông tin được
Nó có thể là tập tin trên đĩa, màn ảnh, máy in, băng từ.
Khi tiếp cận, phải có động tác mở tập tin; khi không dùng nữa, phải đóng lại.
Có 2 kiểu nhập xuất trên tập tin:
Kiểu văn bản (text file)
Kiểu nhị phân (binary file)
Trang 19 Khai báo này cho biết fptr là một con trỏ trỏ đến một FILE
Định nghĩa và khai báo (tt)
Trang 20 Mở một tập tin văn bản: fopen()
FILE *fopen(const char *filename, const char *mode);
filename là con trỏ trỏ đến chuỗi ký tự chứa một tên tập tin
hợp lệ và cũng có thể chứa cả phần mô tả đường dẫn
mode xác định cách thức tập tin được mở
Các chế độ hợp lệ mà một tập tin có thể mở:r Chế độ Mở một tập tin văn bản để đọcÝ nghĩa
w Tạo một tập tin văn bản để ghi
a Nối vào một tập tin văn bản r+ Mở một tập tin văn bản để đọc/ghi w+ Tạo một tập tin văn bản để đọc/ghi
Trang 22 fclose() trả về 0 nếu đóng thành công
Bất kỳ giá trị trả về nào khác 0 đều cho thấy có lỗi xảy ra
Có thể dùng fcloseall() để đóng tất cả các tập tin đang
cùng mở, và nó trả về số tập tin đã đóng hoặc trả về EOF nếu thất bại
Các tập tin văn bản (tt)
Trang 23char filename[]= "haisu.txt";
int reval = SUCCESS;
if ((fptr = fopen(filename, "r"))
==NULL)
{printf("Cannot open %s.\n", filename);
reval = FAIL;
}
else { printf("The value of fptr: 0x%p\n", fptr);
printf("Ready to close the file.");
fclose(fptr);
} return reval;
Trang 24 int fputc(int ch, FILE *fp);
fp là một con trỏ tập tin trả về bởi hàm fopen()
ch là ký tự cần ghi
ch được khai báo là kiểu int, nhưng nó được hàm fputc() chuyển đổi
thành kiểu unsigned char.
Hàm fputc() ghi một ký tự vào stream đã định tại vị trí hiện hành
của con trỏ định vị trí bên trong tập tin và sau đó tăng con trỏ này lên.
Nếu fputc() thành công, nó trả về ký tự đã ghi, ngược lại nó trả về
Các tập tin văn bản (tt)
Trang 25 int fgetc (FILE *fp);
fp là một con trỏ tập tin kiểu FILE trả về bởi hàm fopen().
Hàm fgetc() trả về ký tự kế tiếp của vị trí hiện hành trong
stream input, và tăng con trỏ định vị trí bên trong tập tin lên
Ký tự đọc được là một ký tự kiểu unsigned char và được chuyển thành kiểu int.
Nếu đã đến cuối tập tin, fgetc() trả về EOF.
Các tập tin văn bản (tt)
Trang 26 Chương trình sau đây nhận các ký tự từ bàn phím và ghi chúng vào
một tập tin cho đến khi người dùng nhập ký tự ‘@’ Sau khi người
dùng nhập thông tin vào, chương trình sẽ hiển thị nội dung ra màn hình
Các tập tin văn bản (tt)
Trang 27}
do {
ch = fgetc (fp);
putchar(ch) ;} while (ch!=EOF);
getch();
fclose(fp);
}
Các tập tin văn bản (tt)
Trang 28 Nhập xuất chuỗi: fputs() và fgets()
int fputs(const char *str, FILE *fp);
Viết toàn bộ chuỗi vào stream.
Trả về EOF nếu xảy ra lỗi
char *fgets(char *str, int length, FILE *fp);
Đọc một chuỗi từ stream đã cho cho đến khi đọc được một ký tự sang
dòng mới hoặc sau khi đã đọc được length-1 ký tự
Hàm trả về một con trỏ trỏ đến chuỗi nếu thành công và NULL nếu
Các tập tin văn bản (tt)
Trang 29wb Tạo một tập tin nhị phân để ghi
ab Nối vào một tập tin nhị phânr+b Mở một tập tin nhị phân để đọc/ghiw+b Tạo một tập tin nhị phân để đọc/ghia+b Nối vào một tập tin nhị phân để đọc/ghi
Trang 30 fp là một con trỏ tập tin trỏ đến một tập tin đang mở
Ghi một tập tin nhị phân: fwrite()
size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);
size_t: được dùng như một số nguyên dương
buffer: là một con trỏ trỏ đến thông tin sẽ được ghi vào tập tin
Các tập tin nhị phân (tt)
Trang 31 fp: là một con trỏ tập tin trỏ đến một stream đã được mở trước đó
Các tập tin mở cho những thao tác này phải mở ở chế độ nhị phân
Hàm này trả về số lượng các đối tượng đã ghi vào tập tin nếu
thao tác ghi thành công Nếu giá trị này nhỏ hơn count thì đã
xảy ra lỗi.
Hàm ferror() (sẽ được thảo luận trong phần tới) có thể được dùng để xác định lỗi
Các tập tin nhị phân (tt)
Trang 32 Dùng để đọc bất kỳ kiểu dữ liệu nào
size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp);
buffer: là con trỏ trỏ đến vùng nhớ sẽ nhận dữ liệu từ tập tin.
num_bytes: Số byte phải đọc hoặc ghi.
count: xác định có bao nhiêu mục (mỗi mục dài num_bytes) được đọc
hoặc ghi.
fp là một con trỏ tập tin trỏ đến một stream đã được mở trước đó Các
tập tin đã mở cho những thao tác này phải mở ở chế độ nhị phân.
Các tập tin nhị phân (tt)
Trang 33 Các hàm fread() và fwrite() thường được gọi là các hàm
đọc hoặc ghi không định dạng
Chương trình sau đây ghi vào và sau đó đọc ngược ra một
số kiểu double, một số kiểu int và một số kiểu long từ tập
tin trên đĩa Lưu ý rằng nó sử dụng hàm sizeof() để xác
định độ dài của mỗi kiểu dữ liệu.
Các tập tin nhị phân (tt)
Trang 34fwrite (&d, sizeof(double), 1, fp);
fwrite (&i, sizeof(int), 1, fp);
fwrite (&li, sizeof(long), 1,fp);
if ((fp = fopen ("jak", "rb+")) == NULL )
{ printf("Cannot open file");
exit(1);
} fread (&d, sizeof(double), 1, fp); fread(&i, sizeof(int), 1, fp);
fread (&li, sizeof(long), 1, fp); printf ("%f %d %ld", d, i, li); fclose (fp);
Các tập tin nhị phân – Ví dụ
Trang 35 feof(): dùng để chỉ ra cuối tập tin khi tập tin được mở cho các thao tác nhị phân.
rewind(): đặt lại vị trí của con trỏ định vị trí về đầu tập tin.
ferror(): xác định liệu một thao tác trên tập tin có sinh lỗi hay không.
remove(): xóa một tập tin đã cho.
fflush(): làm sạch và chép các buffer ra ngoài Nếu một tập tin được mở để đọc, thì vùng đệm
nhập của nó sẽ trống, trong khi một tập tin được mở để ghi thì vùng đệm xuất của nó được ghi vào tập tin
fseek(): có thể được sử dụng để đặt lại vị trí của con trỏ định vị bên trong tập tin.
Hệ thống nhập xuất có vùng đệm cũng bao gồm hai hàm fprintf() và fscanf(), hai hàm này tương tự như hàm printf() và scanf(), ngoại trừ chúng thao tác trên tập tin
Trang 36 Thiết lập một tập tin văn bản chứa các số nguyên từ 1 đến 1000,
đọc lại tập tin và chọn ra các số nguyên tố vào một tập tin khác
Trang 37 Mở tập tin, đọc các số từ tập tin, đồng thời tăng m.
Tính số chiều n của ma trận vuông, khởi tạo n = 0, sau đó lặp lại nếu n*n < m thì tăng n, nếu n*n >
m thì kết thúc lặp.
Dùng hàm rewind để trở lại đầu tập tin.
Đọc lại tập tin và in các số, sử dụng biến đếm d để in ra số phần tử, nếu d = n thì xuống dòng (sau mỗi hàng d gán trở lại bằng 0)
BÀI TẬP
Trang 38ThS Đỗ Đình Trang
CHƯƠNG 6 : KIỂU CẤU TRÚC VÀ KIỂU HỢP
dodinhtrang@gmail.com
Trang 39 Là kiểu dữ liệu khai báo các hằng integer có định danh.
Cấu trúc như sau:
enum tag_name {enumeration_list} variable_list;
tag_name và variable_list là không bắt buộc.
Ví dụ:
enum automobile {sedan, pick_up, sport_utility};
enum language {human=100, animal=50, computer};
enum days{SUN, MON, TUE, WED, THU, FRI, SAT};
Kiểu dữ liệu enum
Trang 40int money_units[5] = {dollar,
quarter, dime, nickel, penny};
} printf("\n");
Trang 41 typedef int TWO_BYTE;
Với định nghĩa trên, ta có thể khai báo:
TWO_BYTE i, j;
Trang 42typedef char BIT8;
typedef int BIT16;
void Convert2Upper(PTR_STR str1, PTR_STR str2)
{ BIT16 i;
for (i=0; str1[i]; i++){
if ((str1[i] >= `a') &&(str1[i] <= `z')) str2[i] = str1[i] - DELT;
else str2[i] = str1[i];
} str2[i] = `\0';
Trang 43STRING moon = {"Whatever we wear", "we
become beautiful”, "moon viewing!"};
}for (i=0; i<ITEM_NUM; i++){printf("\n%s", str[i]);
free (str[i]);
}return term;
}
Ví dụ về kiểu typedef (tt)
Whatever we wear
we become beautifulmoon viewing!
WHATEVER WE WEAR
WE BECOME BEAUTIFULMOON VIEWING!
Trang 44 Các thành phần được truy nhập thông qua tên
Khai báo: struct struct_tag { data_type1 variable1;
data_type2 variable2;
data_type3 variable3;
};
- struct_tag là tên cấu trúc
- Các thành phần trong {}
là các kiểu dữ liệu được tập hợp
Trang 45nghĩa biến cấu trúc
struct [tên cấu trúc]
{ khai báo các thành phần;
}danh sách các biến cấu trúc;
Ví dụ:
struct hocsinh {
char hoten[20]; float diem;
} hs, dshs[100]; Kiểu cấu trúc (tt)
Trang 47 Tham chiếu các phần tử cấu trúc
Trang 48 1,
“B Smith”
};
Trang 50 Định nghĩa biến kiểu hợp
union automobile sedan,
} sedan, pick_up, sport_utility;
Tham chiếu các phần tử kiểu hợp
Dùng dấu chấm (.) hoặc -> như cấu trúc
Kiểu hợp (tt)
Trang 51 Viết một chương trình C để cài đặt một hệ thống quản lý kho Hãy lưu trữ
mã số, tên hàng, giá cả và số lượng đang có của mỗi món hàng trong một cấu trúc Nhập chi tiết của 5 món hàng vào một mảng các cấu trúc và hiển thị tên từng món hàng và tổng giá trị của nó Ở cuối chương trình , hãy hiển thị tổng giá trị của kho hàng.
Viết một chương trình C để lưu trữ các tên và điểm số của 5 sinh viên trong một mảng cấu trúc Hãy sắp xếp mảng cấu trúc theo thứ tự điểm số giảm dần Hiển thị 3 điểm số cao nhất
Bài tập tự làm