Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 16 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
16
Dung lượng
0,92 MB
Nội dung
Nội dung TRƯỜNG ĐẠI HỌC B\CH KHOA H[ NỘI VIỆN CÔNG NGHỆ THÔNG TIN V[ TRUYỀN THÔNG 9.1 Mảng 9.2 X}u kí tự 9.3 Con trỏ v{ địa (optional) TIN HỌC ĐẠI CƯƠNG Phần Lập trình C Bài Mảng xâu ký tự Nội dung 9.1.1 Kh|i niệm mảng 9.1 Mảng • Tập hợp hữu hạn c|c phần tử kiểu, lưu trữ nhớ • C|c phần tử mảng có tên (l{ tên mảng) ph}n biệt với số cho biết vị trí mảng • Ví dụ: 9.1.1 Kh|i niệm mảng 9.1.2 Khai b|o v{ sử dụng mảng 9.1.3 C|c thao t|c mảng 9.1.4 Tìm kiếm mảng 9.1.5 Sắp xếp mảng 9.2 X}u kí tự – Bảng điểm sinh viên – Vector – Ma trận 9.1.2 Khai b|o v{ sử dụng mảng 9.1.2 Khai b|o v{ sử dụng mảng • Khai b|o mảng (một chiều) • Cấp ph|t nhớ – C|c phần tử mảng cấp ph|t c|c ô nhớ nhớ – Biến mảng lưu trữ địa ô nhớ vùng nhớ cấp ph|t kiểu_dữ_liệu tên_mảng[kích_thước_mảng]; • Trong – kiểu_dữ_liệu: kiểu liệu c|c phần tử mảng – tên_mảng: tên mảng – kích_thước_mảng: số phần tử mảng • Ngôn ngữ C đ|nh số c|c phần tử mảng – Phần tử thứ i mang_nguyen x|c định mang_nguyen[i-1] • Ví dụ int mang_nguyen[10]; // khai b|o mảng 10 phần tử có kiểu liệu int mang_nguyen[0] 9.1.2 Khai b|o v{ sử dụng mảng c[0], c[1], ,c[11] mang_nguyen[9] • Mảng chiều v{ mảng nhiều chiều – Mỗi phần tử mảng l{ mảng => mảng nhiều chiều c[0] -45 c[1] c[2] c[3] c[4] c[5] Các phần tử thuộc kiểu char ……… 9.1.2 Khai b|o v{ sử dụng mảng • Ví dụ khai báo mảng: char c[12]; Khai báo mảng: Tên c, có 12 phần tử, mang_nguyen[1] mang_nguyen 72 15 -89 c[6] c[7] 62 c[8] -3 c[9] c[10] c[11] 64 78 • Ví dụ – int a[6][5] ; mảng a gồm phần tử phần tử l{ mảng gồm số nguyên int – int b[3][4][5]; // mảng b gồm phần tử, phần tử l{ mảng hai chiều gồm phần tử Mỗi phần tử mảng hai chiều l{ mảng gồm số nguyên int b l{ mảng chiều 9.1.2 Khai b|o v{ sử dụng mảng 9.1.2 Khai b|o v{ sử dụng mảng • Khai b|o mảng nhiều chiều • Sử dụng mảng – Truy cập v{o phần tử thông qua tên mảng v{ số phần tử mảng tên_mảng[chỉ_số_phần_tử] – Chú ý: số kiểu_dữ_liệu tên_mảng[size1][size2]…[sizek]; Trong • sizei l{ kích thước chiều thứ i mảng • Ví dụ – int a[4]; – phần tử (thứ nhất) mảng: a[0] – phần tử cuối (thứ tư) mảng: a[3] – a[i]: l{ phần tử thứ i+1 a 10 9.1.2 Khai b|o v{ sử dụng mảng 9.1.3 C|c thao t|c mảng • Ví dụ (tiếp) a Nhập liệu cho mảng • Khởi tạo gi| trị cho mảng khai b|o – int b[3][4]; – phần tử mảng: b[0] l{ mảng chiều – phần tử mảng b[0]: b[0][0] – b[i][j]: l{ phần tử thứ j+1 b[i], b[i] l{ phần tử thứ i+1 b – Ví dụ: • int a[4] = {1,4,6,2}; • float b[ ] = {40.5, 20.1, 100}; • char c[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’}; • int b[2][3]={ {1,2,3}, {4,5,6} }; – Số lượng gi| trị khởi tạo không lớn số lượng phần tử mảng – Nếu số lượng n{y nhỏ hơn, c|c phần tử lại khởi tạo gi| trị – Nếu để trống kích thước mảng số phần tử khởi tạo 11 12 9.1.3 C|c thao t|c mảng 9.1.3 C|c thao t|c mảng a Nhập liệu cho mảng • Nhập liệu từ b{n phím h{m scanf #include #define MONTHS 12 int main(){ int rainfall[MONTHS], i; for ( i=0; i < MONTHS; i++ ){ printf(“Nhap vao phan tu thu %d: “, i+1); scanf("%d", &rainfall[i] ); } return 0; } – int a[10]; – Nhập liệu cho a[1]: scanf(“%d”, & a[1]); – Nhập liệu cho to{n phần tử mảng a => Sử dụng vòng lặp for • Lưu ý – Tên mảng l{ (hằng trỏ) thực phép to|n với tên mảng phép g|n sau đ~ khai b|o 13 14 9.1.3 C|c thao t|c mảng 9.1.3 C|c thao t|c mảng a Nhập liệu cho mảng • Lưu ý #include #include void main(){ int a[100]; int n, i; do{ printf(“\n Cho biet so phan tu cua mang: “); scanf(“%d”,&n); }while (n>100||n khai b|o mảng với kích thước tối đa v{ sử dụng biến lưu số phần tử thực mảng – Ví dụ: Khai b|o mảng số nguyên a có tối đa 100 phần tử Nhập từ b{n phím số phần tử mảng v{ gi| trị c|c phần tử đó… 15 16 9.1.3 C|c thao t|c mảng 9.1.3 C|c thao t|c mảng for(i = 0; i < n; i++){ printf(“a[%d] = ", i); scanf("%d",&a[i]); } getch(); b Xuất liệu mảng – Dùng hàm printf() – Để hiển thị tất c|c phần tử: dùng vòng for • Ví dụ – Hiển thị phần tử – Hiển thị tất c|c phần tử, phần tử dòng – Hiển thị tất c|c phần tử dòng, c|ch vị trí – Hiển thị k phần tử dòng } 17 18 9.1.3 C|c thao t|c mảng 9.1.3 C|c thao t|c mảng #include #define MONTHS 12 int main(){ int rainfall[MONTHS], i; for ( i=0; i < MONTHS; i++ ){ printf(“Nhap vao phan tu thu %d: “, i+1); scanf("%d", &rainfall[i] ); } for ( i=0; i < MONTHS; i++ ) printf( "%5d ” , rainfall[i]); printf("\n"); return 0; } c Tìm gi| trị lớn nhất, nhỏ • Tìm gi| trị lớn – Giả sử phần tử l{ phần tử – Lần lượt so s|nh với c|c phần tử lại – Nếu lớn => so s|nh tiếp – Nếu nhỏ => coi phần tử n{y l{ phần tử lớn v{ tiếp tục so s|nh – Cách làm? • Tìm gi| trị nhỏ nhất: tương tự 19 20 9.1.3 C|c thao t|c mảng 9.1.4 Tìm kiếm mảng max = rainfall[0]; • Bài toán – Cho mảng liệu a v{ gi| trị k – Tìm c|c phần tử mảng a có gi| trị (giống) với k Nếu có in vị trí (chỉ số) c|c phần tử n{y Ngược lại thông b|o không tìm thấy for(i = 1; i < n; i++) if(max < a[i]) max = a[i]; • Cách làm printf("\n Luong mua nhieu nhat la: %d", max); 21 – Duyệt to{n c|c phần tử mảng – Nếu a[i] (giống) k lưu lại số i – Sử dụng biến để x|c định tìm thấy hay không tìm thấy 9.1.4 Tìm kiếm mảng 9.1.4 Tìm kiếm mảng • Phân tích #include #include void main(){ int a[100], chi_so[100]; int n;//n la số phần tử mảng int i, k, kiem_tra; printf(“ Nhap vao so phan tu cua mang: “); scanf(“%d”,&n); printf(“Nhap vao giá trị tim kiem“); scanf(“%d”,&k); – Duyệt to{n c|c phần tử • Vòng lặp for (while, while) – Lưu lại i a[i] (giống) k • Sử dụng mảng lưu số – Biến x|c định tìm thấy hay không tìm thấy • Biến nhận gi| trị • Biến nhận gi| trị >=1 (tìm thấy tăng gi| trị) 23 22 24 9.1.4 Tìm kiếm mảng 9.1.4 Tìm kiếm mảng //Nhap cac phan tu cho mang a //Phan xu ly tim kiem kiem_tra = 0; // Duyệt qua tất phần tử for(i = 0;i 0){ printf(“Trong mang co %d phan tu co gia tri bang %d”,kiem_tra,k); printf(“\nChi so cua cac phan tula:“); for(i = 0;i < kiem_tra;i++) printf(“%3d”,chi_so[i]); } else printf(“\n Trong mang khong co phan tu nao co gia tri bang %d”,k); getch();} 25 26 9.1.5 Sắp xếp mảng 9.1.5 Sắp xếp mảng • Bài toán • Giải thuật xếp – Cho mảng a gồm n phần tử Sắp xếp c|c phần tử mảng a theo thứ tự tăng dần/giảm dần – Sắp xếp thêm dần (insertion sort) – Sắp xếp lựa chọn (selection sort) – Sắp xếp bọt (bubble sort) – Sắp xếp vun đống (heap sort) – Sắp xếp nhanh (quick sort) – Sắp xếp trộn (merge sort) – … 27 28 9.1.5 Sắp xếp mảng 9.1.5 Sắp xếp mảng • Giải thuật xếp lựa chọn • Ý tưởng – Tìm phần tử nhỏ chưa xếp mảng – Đổi chỗ với phần tử phần chưa – Lần xếp thứ • So s|nh a[0] với c|c a[i], i = n-1 a[0] > a[i] => đổi chỗ a[0] v{ a[i] • Thu a[0] l{ phần tử nhỏ – Lần xếp thứ • So s|nh a[1] với c|c a[i], i = n-1 a[1] > a[i] => đổi chỗ a[1] v{ a[i] • Thu a[1] l{ phần tử nhỏ thứ 29 30 9.1.5 Sắp xếp mảng 9.1.5 Sắp xếp mảng • Ý tưởng • A = { 12, 5, 3, }; – Lần xếp thứ k • So sánh a[k-1] với c|c a[i], i = k n-1 a[k-1] > a[i] => đổi chỗ a[k-1] a[i] • Thu a[k-1] l{ phần tử nhỏ thứ k 12 – … – Lần xếp thứ n-1 • So sánh a[n-2] a[n-1] a[n-2] > a[n-1] => đổi chỗ a[n-2] a[n-1] • Thu a[n-2] l{ phần tử nhó thứ n-1 => lại a[n-1] l{ phần tử nhỏ thứ n (lớn nhất) 31 Lượt 12 Lượt 12 Lượt 3 12 32 9.1.5 Sắp xếp mảng 9.1.5 Sắp xếp mảng //Khai bao cac bien int a[100]; int i, j, tmp; //Sap xep for (i = 0; i < n-1; i++) for (j = i+1; j a[j]){ tmp= a[i]; a[i]= a[j]; a[j] = tmp; } • Ví dụ (Trang 168) – Nhập v{o từ b{n phím mảng số nguyên m số phần tử nhập từ b{n phím – Hiển thị c|c phần tử vừa nhập v{o – Sắp xếp mảng m theo thứ tự tăng dần có hiển thị c|c phần tử lượt xếp 33 9.1.5 Sắp xếp mảng 34 9.1.5 Sắp xếp mảng #include #include void main(){ int m[100]; int n; // n la số phần tử mảng int i, j, k; // Nhập giá trị liệu cho mảng m printf(“ Cho biet so phan tu co mang: “); scanf(“%d”,&n); // nhập giá trị cho phần tử for(i = 0;i[...]... 49 9.3 Con trỏ v{ địa chỉ 9. 2.4 C|c h{m xử lý x}u kí tự printf(“\n strcpy(str1,str2) = %s”, strcpy(str1,str2)); printf(“ str1: %s”,str1); printf(“\n str2: %s”,str2); strcpy(str1,”ab”);strcpy(str2,”abc”); printf(“ str1: %s”,str1); printf(“\n str2: %s”,str2); printf(“\n strcmp(str1,str2) = %d”, strcmp(str1,str2)); getch(); } • 9. 3.1 Tổng quan về con trỏ • 9. 3.2 Các phép toán làm việc với con trỏ • 9. 3.3.. .9. 2.2 Khai b|o v{ sử dụng x}u 9. 2.2 Khai b|o v{ sử dụng x}u a Khai báo xâu • Cú pháp char tên_xâu [số_kí_tự_tối_đa]; • Lưu ý: b Truy cập v{o một phần tử của x}u • Cú pháp: tên_xâu [chỉ_số_của_kí_tự] • Ví dụ char quequan[10]; quequan = “Ha noi” ;//x}u n{y có nội dung l{ “Ha noi” – Để lưu trữ một x}u có n kí tự chúng ta cần một mảng có kích thước n+1 • Ví dụ – Để lưu trữ x}u Tin hoc” chúng... *ten_bien_con_tro = 10; 57 58 9. 3.1 Tổng quan về con trỏ • Ví dụ 2: main() { int i = 3, j = 6; int *p1, *p2; p1 = &i; p2 = &j; p1 = p2; } 59 60 15 9. 3.1 Tổng quan về con trỏ • d Con trỏ void – void *ten_bien_con_tro; – Con trỏ đặc biệt, không có kiểu, – Có thể nhận gi| trị l{ địa chỉ của một biến thuộc bất kỳ kiểu dữ liệu n{o – Ví dụ: • • • • void *p, *q; int x = 21; float y = 34.34; p = &x; q = &y; 9. 3.2 C|c phép... phải khai b|o x}u có số phần tử tối đa ít nhất l{ 8 char str [8]; 41 9. 2.3 C|c h{m xử lý kí tự quequan[0] quequan[1] quequan[5] quequan[6] lưu trữ ‘q’ ‘u’ ‘i’ ‘\0’ 42 9. 2.3 C|c h{m xử lý kí tự • int isalpha(int ch): kiểm tra xem kí tự có phải chữ c|i hay không (‘a’…’z’,’A’, ’Z’) • int isdigit(int ch): kiểm tra chữ số (‘0‘,‘1‘, 9 ) • int islower(int ch): kiểm tra chữ thường • int isupper(int ch):... 3; • j = i + 1; • Chương trình dịch sẽ cấp ph|t cho biến đó một số ô nhớ liên tiếp đủ để chứa nội dung của biến Ví dụ một biến số nguyên (int) được cấp ph|t 2 byte • Địa chỉ của một biến chính l{ địa chỉ của byte đầu tiên trong số đó Biến Địa chỉ Giá trị i FFEC 3 j FFEE 4 53 54 9. 3.1 Tổng quan về con trỏ 9. 3.1 Tổng quan về con trỏ • b Kh|i niệm v{ khai b|o con trỏ • To|n tử & và * – To|n tử &: Trả... xuống dòng (‘\n’ 10), đầu dòng (‘\r’ 13), tab ngang (‘\t’ 9) , tab dọc (‘\v’ 11) • Tệp tiêu đề sử dụng: ctype.h • int toupper(int ch): chuyển kí tự thường th{nh kí tự hoa toupper(‘a’) => ‘A’ • int tolower(int ch): chuyển kí tự hoa th{nh kí tự thường tolower(‘B’) => ‘b’ 43 • trả về kh|c 0 nếu đúng, ngược lại trả về 0 44 11 9. 2.3 C|c h{m xử lý kí tự 9. 2.3 C|c h{m xử lý kí tự #include #include... printf(“\n strcmp(str1,str2) = %d”, strcmp(str1,str2)); getch(); } • 9. 3.1 Tổng quan về con trỏ • 9. 3.2 Các phép toán làm việc với con trỏ • 9. 3.3 Sử dụng con trỏ làm việc với mảng 51 13 9. 3.1 Tổng quan về con trỏ 9. 3.1 Tổng quan về con trỏ • a Địa chỉ v{ gi| trị của một biến • a Địa chỉ v{ gi| trị của một biến (tiếp) – Bộ nhớ như một d~y c|c byte nhớ – C|c byte nhớ được x|c định một c|ch duy nhất... x}u thứ hai – puts(tên_xâu); – printf(“%s”,tên_xâu); • char* strcat(char* x}u_đích, char* x}u_nguồn): ghép nối x}u nguồn v{o ngay sau x}u đích • Sự kh|c nhau giữa gets v{ scanf? 47 48 12 9. 2.4 C|c h{m xử lý x}u kí tự 9. 2.4 C|c h{m xử lý x}u kí tựp (ví dụ p183) Tệp tiêu đề: stdlib.h • int atoi(char* str): chuyển một x}u kí tự th{nh một số nguyên tương ứng • int atol(char*str): chuyển th{nh số long int... &i; Biến Địa chỉ Giá trị i FFEC 3 p FFEE FFEC void main() { int i = 3; int *p; p = &i; printf("*p = %d \n",*p); getch(); } – Một con trỏ chỉ có thể trỏ tới một đối tượng cùng kiểu 55 56 14 9. 3.1 Tổng quan về con trỏ 9. 3.1 Tổng quan về con trỏ • c Sử dụng biến con trỏ: • Ví dụ 1: – Một biến con trỏ có thể được g|n bởi: main() { int i = 3, j = 6; int *p1, *p2; p1 = &i; p2 = &j; *p1 = *p2; } • Địa chỉ của... hoa\n”); printf(“Ki tu chu thuong tuong ung %c\n”,tolower(ch)); }else if(islower(ch)){ printf(“Ki tu nay la chu thuong\n”); printf(“Ki tu chu hoa tuong ung %c\n”,toupper(ch)); } getch(); } 45 9. 2.3 C|c h{m xử lý kí tự 9. 2.4 C|c h{m xử lý x}u kí tự V{o ra x}u kí tự • Tệp tiêu đề: stdio.h • Nhập x}u kí tự Tệp tiêu đề: string.h • size_t strlen(char* tên_xâu): trả về độ d{i x}u • char* strcpy(char* x}u_đích, ... a[i], i = k n-1 a[k-1] > a[i] => đổi chỗ a[k-1] a[i] • Thu a[k-1] l{ phần tử nhỏ thứ k 12 – … – Lần xếp thứ n-1 • So sánh a[n-2] a[n-1] a[n-2] > a[n-1] => đổi chỗ a[n-2] a[n-1] • Thu a[n-2] l{ phần... printf(“%3d”,m[k]); } getch(); } 9. 1 Mảng 9. 2 X}u kí tự 9. 2.1 Kh|i niệm x}u kí tự 9. 2.2 Khai b|o v{ sử dụng x}u 9. 2.3 C|c h{m xử lý kí tự 9. 2.4 C|c h{m xử lý x}u 37 38 9. 2.1 Kh|i niệm x}u kí tự 9. 2.1 Kh|i niệm... a[i], i = n-1 a[1] > a[i] => đổi chỗ a[1] v{ a[i] • Thu a[1] l{ phần tử nhỏ thứ 29 30 9. 1.5 Sắp xếp mảng 9. 1.5 Sắp xếp mảng • Ý tưởng • A = { 12, 5, 3, }; – Lần xếp thứ k • So sánh a[k-1] với c|c