Các chuỗi trong C được cài đặt như là các mảng ký tự kết thúc bởi ký tự NULL ‘\0’ Các biến và hằng kiểu chuỗi: Các biến chuỗi được sử dụng để lưu trữ một chuỗi các ký tự và phải đượ
Trang 1ThS Đỗ Đình Trang
KỸ THUẬT LẬP TRÌNH
dodinhtrang@gmail.com
Trang 2ThS Đỗ Đình Trang
CHƯƠNG 4 : CHUỖI
Trang 3 Các chuỗi trong C được cài đặt như là các mảng ký tự kết thúc bởi ký tự NULL (‘\0’)
Các biến và hằng kiểu chuỗi:
Các biến chuỗi được sử dụng để lưu trữ một chuỗi các ký tự và phải được khai báo trước khi sử
dụng
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 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 thao tác nhập/xuất (I/O) chuỗi trong C được thực hiện bằng cách gọi các hàm
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
str là một mảng ký tự đã được khai báo
Trang 7int i=0, delt = `a' - `A';
}
Trang 8 Các thao tác Nhập/Xuất chuỗi có định dạng
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 13{ char name1[15] = "Geena";
char name2[15] = "Dorothy";
char name3[15] = "Shania";
char name4[15] = "Geena";
int i;
clrscr();
i = strcmp(name1,name2);
printf("%s compared with %s returned
%d\n", name1, name2, i);
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()
str1 và str2 là hai chuỗi đã được khai báo và khởi tạo.
Hàm này sẽ thực hiện nối chuỗi str2 vào sau chuỗi str1
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
CHƯƠNG 5: Tập tin
dodinhtrang@gmail.com
Trang 18 Kiểu văn bản (text file)
Kiểu nhị phân (binary file)
Trang 20 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ở
Chế độ Ý nghĩa
r Mở một tập tin văn bản để đọc
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
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
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;
printf("The value of fptr: 0x
%p\n", fptr);
printf("Ready to close the file.");
fclose(fptr);
}return reval;
Trang 24 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.
tập tin và sau đó tăng con trỏ này lên.
Các tập tin văn bản (tt)
Trang 25 fp là một con trỏ tập tin kiểu FILE trả về bởi hàm fopen().
bên trong tập tin lên
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 Viết toàn bộ chuỗi vào stream.
Trả về EOF nếu xảy ra lỗi
Đọ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 xảy ra lỗi.
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ân r+b Mở một tập tin nhị phân để đọc/ghi w+b Tạo một tập tin nhị phân để đọc/ghi a+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ở
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
num_bytes: số byte phải đọc hoặc ghi
Các tập tin nhị phân (tt)
Trang 31 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
này nhỏ hơn count thì đã xảy ra lỗi.
Các tập tin nhị phân (tt)
Trang 32 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 33cuối tập tin hoặc xảy ra lỗi Hàm feof() và hàm ferror() có thể được dùng để xác định nguyên nhân
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đệ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.
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 Viết một chương trình để nhập dữ liệu vào một tập tin và in nó theo thứ tự ngược lại.
Viết một chương trình để truyền dữ liệu từ một tập tin này sang một tập tin khác, loại bỏ tất
cả các nguyên âm (a, e, i, o, u) Loại bỏ các nguyên âm ở dạng chữ hoa lẫn chữ thường Hiển thị nội dung của tập tin mới
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 Tạo một tập tin văn bản chứa n * n số thực, đọc và in ra theo dạng ma trận vuông (giả sử số
n không cho trước)
m thì kết thúc lặp.
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
Trang 39 Là kiểu dữ liệu khai báo các hằng integer có định danh.
enum tag_name {enumeration_list} variable_list;
tag_name và variable_list là không bắt buộc.
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 40{ enum units{penny = 1, nickel = 5,
dime = 10, quarter = 25, dollar = 100};
int money_units[5] = {dollar, quarter, dime, nickel, penny};
char *unit_name[5] = { “dollar(s)”,
“quarter(s)”, “dime(s)”, “nickel(s)”,
printf("\n");
Trang 41 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 43for (i=0; i<ITEM_NUM; i++){
str[i] = malloc((strlen(moon[i])+1) * sizeof(BIT8));
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 beautiful moon viewing!
WHATEVER WE WEAR
WE BECOME BEAUTIFUL MOON VIEWING!
Trang 44 Là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau
Các thành phần được truy nhập thông qua tên
struct struct_tag { data_type1 variable1;
Trang 45char 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 49 Là khối bộ nhớ dùng lưu trữ dữ liệu
với kiểu khác nhau
Trang 50 Định nghĩa biến kiểu hợp
} sedan, pick_up, sport_utility;
Tham chiếu các phần tử kiểu hợp
Kiểu hợp (tt)
Trang 51 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