Bài giảng Lập trình C - Chương 5: Kiểu mảng và xâu kí tự - Ngô Công Thắng

Một mảng xâu kí tự rất hay được sử dụng, chẳng hạn như dùng để lưu trứ danh sách tên, danh sách mật khẩu, danh sách tên tệp Để tạo mảng các biến xâu rõng ra tạo một mảng hai chiều bởi vì xâu kí tự cũng là một mảng và mảng xâu kí tự thực chất là mảng của các mảng.

pdf28 trang | Chia sẻ: huongthu9 | Lượt xem: 614 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C - Chương 5: Kiểu mảng và xâu kí tự - Ngô Công Thắng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 1 Ch ng 5. Ki u m ng và xâu ký tươ ể ả ự I. M ngả II. Xâu ký tự III. Bài t p ch ng 5ậ ươ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 2 I. M ngả 1. Khái ni m v ki u m ngệ ề ể ả 2. Khai báo bi n m ng m t chi uế ả ộ ề 3. Truy nh p các ph n t c a m ng m t chi uậ ầ ử ủ ả ộ ề 4. Kh i t o m ng m t chi uở ạ ả ộ ề 5. M ng nhi u chi uả ề ề 6. Chú ý v ch s c a ph n t m ngề ỉ ố ủ ầ ử ả 7. Vào/ra v i bi n m ngớ ế ả Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 3 I.1. Khái ni m v ki u m ngệ ề ể ả M ng là m t nhóm các bi n n m c nh nhau ả ộ ế ằ ạ có cùng ki u, cùng tên. M i bi n đ c g i là ể ỗ ế ượ ọ m t ph n t . Các ph n t c a m ng đ c truy ộ ầ ử ầ ử ủ ả ượ nh p tr c ti p thông qua tên bi n m ng và ch ậ ự ế ế ả ỉ s .ố S ph n t c a m ng đ c xác đ nh ngay t ố ầ ử ủ ả ượ ị ừ khi đ nh nghĩa ra m ng. Đây là đi m h n ch ị ả ể ạ ế c a m ng b i vì n u không dùng h t các bi n ủ ả ở ế ế ế c a m ng s gây lãng phí b nh .ủ ả ẽ ộ ớ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 4 I.2. Khai báo bi n m ng m t chi uế ả ộ ề Khai báo bi n m ng là xác đ nh tên bi n m ng, ki u ế ả ị ế ả ể ph n t , s chi u và kích th c m i chi u.ầ ử ố ề ướ ỗ ề  Cú pháp khai báo bi n m ng m t chi u:ế ả ộ ề Ki u_ph n_t Tên_bi n_m ng[Kích th c];ể ầ ử ế ả ướ trong đó kích th c là s ph n t c a m ng, ph i cho d i ướ ố ầ ử ủ ả ả ướ d ng h ng ho c bi u th c h ng. Ki u ph n t có th là b t kỳ ạ ằ ặ ể ứ ằ ể ầ ử ể ấ ki u nào.ể Ví d :ụ int a[5]; Ví d này đ nh nghĩa m t bi n m ng có tên là a, ụ ị ộ ế ả ki u ph n t là int, s chi u là m t và kích th c (s ể ầ ử ố ề ộ ướ ố ph n t c a m ng) là 5.ầ ử ủ ả Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 5 I.3. Truy nh p các ph n t c a m ng m t chi uậ ầ ử ủ ả ộ ề Các ph n t c a m ng đ c đánh s . Các s ầ ử ủ ả ượ ố ố này g i là ch s . Ph n t đ u tiên có ch s là ọ ỉ ố ầ ử ầ ỉ ố 0, ph n t th 2 có ch s là 1, M ng có ầ ử ứ ỉ ố ả kích th c n thì ph n t cu i cùng có ch s ướ ầ ử ố ỉ ố n-1. Ví d :ụ n u ta đ nh nghĩa m t bi n m ngế ị ộ ế ả int a[5]; thì ta đ c m t bi n m ng tên là a có 5 ph n ượ ộ ế ả ầ t , ph n t đ u tiên có ch s là 0, ph n t th ử ầ ử ầ ỉ ố ầ ử ứ 5 có ch s là 4.ỉ ố Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 6 I.3. Truy nh p các ph n t c a m ng m t chi uậ ầ ử ủ ả ộ ề M i ph n t c a m ng có th truy nh p tr c ỗ ầ ử ủ ả ể ậ ự ti p thông qua tên bi n m ng và ch s c a nó ế ế ả ỉ ố ủ đ t trong ngo c vuông []. Ch s c a ph n t ặ ặ ỉ ố ủ ầ ử có th cho d i d ng h ng ho c bi u th c.ể ướ ạ ằ ặ ể ứ Ví d :ụ 5 ph n t c a m ng a ví d trên có ầ ử ủ ả ở ụ tên là a[0], a[1], Ta có th dùng các l nh ể ệ sau: a[0]=100; cout<<a[1]; for(int i=0;i<5;++i) scanf(“%d”,&a[i]); Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 7 I.4. Kh i t o m ng m t chi uở ạ ả ộ ề Ta có th kh i t o giá tr cho các ph n t c a ể ở ạ ị ầ ử ủ m ng ngay khi khai báo b ng cách li t kê các ả ằ ệ giá tr kh i t o đ t trong ngo c {}.ị ở ạ ặ ặ Ví d :ụ Các giá tr kh i t oị ở ạ Kích th c m ngướ ả int a[5] = {12, 6, 10, 7, 19}; D u ch m ph yấ ấ ẩ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 8 I.4. Kh i t o m ng m t chi u (ti p)ở ạ ả ộ ề ế N u s giá tr kh i t o ít h n kích th c m ng thì ế ố ị ở ạ ơ ướ ả các ph n t còn l i s đ c kh i t o b ng 0. N u s ầ ử ạ ẽ ượ ở ạ ằ ế ố giá tr kh i t o l n h n kích th c m ng thì trình ị ở ạ ớ ơ ướ ả biên d ch s báo l i.ị ẽ ỗ Ví d :ụ int a[3] = {6,8}; //a[0]=6, a[1]=8, a[2]=0 int a[2] = {8, 6, 9}; //Báo l iỗ V i nh ng m ng đ c kh i t o có th không c n ớ ữ ả ượ ở ạ ể ầ xác đ nh kích th c m ng. Khi đó trình biên d ch s ị ướ ả ị ẽ đ m s giá tr kh i t o và dùng s đó làm kích ế ố ị ở ạ ố th c m ng. ướ ả Ví d :ụ int a[] = {3, 5, 8}; //s đ c m ng có kích th c là 3ẽ ượ ả ướ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 9 I.5. M ng nhi u chi uả ề ề M ng m t chi u là m ng mà các ph n t c a nó đ c ả ộ ề ả ầ ử ủ ượ truy nh p qua m t ch s . M ng nhi u chi u là m ng ậ ộ ỉ ố ả ề ề ả mà các ph n t đ c truy nh p qua nhi u ch s .ầ ử ượ ậ ề ỉ ố  C cho phép khai báo các m ng nhi u chi u v i kích ả ề ề ớ th c m i chi u có th khác nhau. Cú pháp chung nh ướ ỗ ề ể ư sau: Ki u Tên_bi n_m ng[Kích th c chi u 1][Kích th c chi u 2];ể ế ả ướ ề ướ ề Ví d :ụ int a[4][3]; L u ý là m i chi u ph i đ c bao b i c p ngo c []ư ỗ ề ả ượ ở ặ ặ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 10 I.5. M ng nhi u chi u (ti p)ả ề ề ế Đ truy nh p ph n t c a m ng m chi u thì ta ph i ể ậ ầ ử ủ ả ề ả dùng m ch s . Ch s c a m i chi u có giá tr t 0 đ n ỉ ố ỉ ố ủ ỗ ề ị ừ ế kích th c c a chi u đó tr đi 1. Cú pháp chung nh ướ ủ ề ừ ư sau: Tên_bi n_m ng[ch s chi u 1][Ch s chi u 2]ế ả ỉ ố ề ỉ ố ề M ng 2 chi u có th xem nh là m ng m t chi u có ả ề ể ư ả ộ ề các ph n t là m t m ng m t chi u.ầ ử ộ ả ộ ề  Ta cũng có th kh i t o giá tr cho các ph n t c a ể ở ạ ị ầ ử ủ m ng nhi u chi u ngay khi đ nh nghĩa. Ví d :ả ề ề ị ụ int a[2][3] = {{5, 7, 9},{3, 6, 7}}; Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 11 I.6. Chú ý v ch s c a ph n t m ngề ỉ ố ủ ầ ử ả Trình biên d ch C s không báo l i khi ch s ị ẽ ỗ ỉ ố dùng đ truy nh p ph n t c a m ng n m ể ậ ầ ử ủ ả ằ ngoài kho ng cho phép, t c là nh h n 0 ả ứ ỏ ơ ho c l n h n kích th c m ng tr 1. Đi u ặ ớ ơ ướ ả ừ ề này r t nguy hi m b i vì n u ta ghi d li u ấ ể ở ế ữ ệ vào ph n t m ng v i ch s n m ngoài ầ ử ả ớ ỉ ố ằ kho ng cho phép thì có th ghi đè lên d li u ả ể ữ ệ c a các ch ng trình khác đang ch y ho c ủ ươ ạ ặ chính ch ng trình c a ta.ươ ủ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 12 I.7. Vào/ra v i bi n m ngớ ế ả Không dùng đ c l nh printf và scanf ượ ệ v i c bi n m ng, ch dùng đ c v i ớ ả ế ả ỉ ượ ớ t ng ph n t c a m ng. Ví d :ừ ầ ử ủ ả ụ int a[5]; for(int i=0;i<5;++i) {printf("Nhap vao phan tu thu %d: ”, i+1); scanf(“%d”,&a[i]); } for(int i=0;i<5;++i) printf(“%d ”,a[i]); Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 13 Bài t pậ 1. Cho dãy s nguyên aố 1, a2, a3,, an. S p x p ắ ế dãy s tăng d n t trái qua ph i.ố ầ ừ ả 2. Cho dãy s aố 1, a2, a3,, an. Tính t ng và ổ trung bình c ng các s d ng mà chia h t ộ ố ươ ế cho 3. 3. Cho ma tr n nguyên có m hàng, n c t. Tính ậ ộ t ng và trung bình c ng các ph n t d ng ổ ộ ầ ử ươ ch n. Đ a ma tr n đã nh p và các k t qu ra ẵ ư ậ ậ ế ả màn hình. Ma tr n đ a ra ph i theo hàng, ậ ư ả c t.ộ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 14 II. Xâu ký tự 1. Khái ni m v ki u xâu ký tệ ề ể ự 2. Khai báo bi n xâu ký tế ự 3. Kh i t o bi n xâu ký tở ạ ế ự 4. Vào/ra v i bi n xâuớ ế 5. Các hàm chu n x lý xâu ký tẩ ử ự 6. M ng xâu ký tả ự Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 15 II.1. Khái ni m v ki u xâu ký tệ ề ể ự Xâu ký t là m t dãy ký t có ký t cu i cùng ự ộ ự ự ố là ký t r ng. Ký t r ng có giá tr s là 0 và ự ỗ ự ỗ ị ố vi t là '\0'.ế Xâu ký t đ c C l u tr nh m t m ng ký ự ượ ư ữ ư ộ ả t , nó cho phép truy nh p vào t ng ký t c a ự ậ ừ ự ủ xâu nh truy nh p vào t ng ph n t c a ư ậ ừ ầ ử ủ m ng. Tuy nhiên, trong m t s tr ng h p C ả ộ ố ườ ợ xem xâu ký t nh nh ng ki u d li u c b n. ự ư ữ ể ữ ệ ơ ả Ví d , có th nh p vào và đ a ra c bi n xâu ụ ể ậ ư ả ế b ng l nh scanf và printf.ằ ệ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 16 II.2. Khai báo bi n xâu ký tế ự Khai báo bi n xâu ký t là xác đ nh tên bi n xâu và ế ự ị ế s ký t c c đ i có th ch a trong bi n xâu.ố ự ự ạ ể ứ ế  Cú pháp khai báo bi n xâu ký t gi ng cú pháp khai ế ự ố báo bi n m ng m t chi u:ế ả ộ ề char Tên_bi n_xâu[S ký t c c đ i + 1];ế ố ự ự ạ Ví d :ụ char s[16]; trong đó s ký t c c đ i cho d i d ng h ng ho c ố ự ự ạ ướ ạ ằ ặ bi u th c h ng.ể ứ ằ  Bi n xâu có th ch a các xâu ký t có đ dài khác ế ể ứ ự ộ nhau. Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 17 II.3. Kh i t o bi n xâuở ạ ế Khi đ nh nghĩa bi n xâu ta có th kh i t o ị ế ể ở ạ cho nó. D i đây là 2 cách kh i t o:ướ ở ạ  Kh i t o nh bi n m ng:ở ạ ư ế ả char str[6] = {'D', 'H', 'N', 'N', 'I', '\0'};  Kh i t o b ng h ng xâu:ở ạ ằ ằ char str[6] = "DHNNI"; H ng xâu là m t dãy ký t đ t gi a 2 d u ằ ộ ự ặ ữ ấ ph y kép. Khi vi t h ng xâu ta không vi t ẩ ế ằ ế ký t '\0', ký t này s đ c trình biên d ch ự ự ẽ ượ ị thêm vào. H ng xâu r ng là h ng xâu ằ ỗ ằ không có ký t nào "".ự Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 18 II.3. Kh i t o bi n xâu (ti p)ở ạ ế ế  L u ý là khi kh i t o cho bi n xâu b ng h ng xâu ư ở ạ ế ằ ằ thì s ký t c c đ i c a bi n xâu ph i l n h n s ký ố ự ự ạ ủ ế ả ớ ơ ố t c a h ng xâu ít nh t là 1, b i vì trình biên d ch s ự ủ ằ ấ ở ị ẽ đ a thêm vào bi n xâu m t ký t r ng. Ví d :ư ế ộ ự ỗ ụ char str[5] = "DHNNI"; //Sai char str[6] = "DHNNI"; //Đúng  Cũng gi ng nh bi n m ng, khi kh i t o cho bi n ố ư ế ả ở ạ ế xâu thì có th không c n xác đ nh s ký t c c đ i, ể ầ ị ố ự ự ạ khi đó trình biên d ch s xác đ nh s ký t c c đ i ị ẽ ị ố ự ự ạ b ng s ký t c a h ng xâu c ng thêm 1. Ví d :ằ ố ự ủ ằ ộ ụ char str[] = "DHNNI"; Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 19 II.4. Vào/ra v i bi n xâuớ ế Có th dùng l nh printf và scanf v i c bi n ể ệ ớ ả ế xâu. Ví d :ụ char str[11]; printf(“%s”,str); scanf(“%s”,str); scanf ch nh p vào đ c các xâu ký t không ỉ ậ ượ ự có d u cách.ấ S d ng gets(Bi n xâu) đ nh p vào xâu ký ử ụ ế ể ậ t có c d u cách. Ví d : gets(str);ự ả ấ ụ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 20 II.5. Các hàm chu n x lý xâu ký tẩ ử ự C có m t th vi n hàm làm vi c v i xâu ký t ộ ư ệ ệ ớ ự là string.lib. Mu n s d ng các hàm này ta ố ử ụ ph i khai báo s d ng:ả ử ụ #include Hàm l y đ dài c a xâu: ấ ộ ủ strlen(s) cho đ dài ộ c a xâu s (không tính ký t '\0'). Ví d : ủ ự ụ strlen(“08T1A”) => 5 Hàm copy xâu: strcpy(s1, s2) copy xâu s2 vào bi n xâu s1, s2 có th là h ng xâu ho c ế ể ằ ặ bi n xâu.ế Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 21 II.5. Các hàm chu n x lý xâu ký t (ti p)ẩ ử ự ế Hàm n i xâu: ố strcat(s1,s2) n i xâu s2 vào cu i bi n ố ố ế xâu s1, s2 có th là h ng xâu ho c bi n xâu, bi n ể ằ ặ ế ế xâu s1 ph i có s ký t c c đ i đ ch a các ký t s2 ả ố ự ự ạ ủ ứ ự khi thêm vào. Hàm so sánh xâu: strcmp(s1,s2) so sánh hai xâu s1 và s2 theo mã ASCII, có phân bi t ch hoa ch ệ ữ ữ th ng. Hàm tr v m t giá tr int:ườ ả ề ộ ị < 0 n u s1 < s2ế ==0 n u s1 == s2ế > 0 n u s1 > s2ế Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 22 II.5. Các hàm chu n x lý xâu ký t (ti p)ẩ ử ự ế Hàm đ o xâu: ả strrev(s) đ o ng c các ký t ả ượ ự trong xâu s, đ u v cu i, cu i v đ u.ầ ề ố ố ề ầ Hàm chuy n ch th ng thành ch hoa: ể ữ ườ ữ strupr(s) chuy n các ch cái th ng trong xâu ể ữ ườ s thành ch hoa, các ch khác không thay ữ ữ đ i.ổ Hàm chuy n ch hoa thành ch th ng: ể ữ ữ ườ strlwr(s) chuy n các ch cái hoa trong xâu s ể ữ thành ch th ng, các ch khác không thay ữ ườ ữ đ i.ổ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 23 II.6. M ng xâu ký tả ự M t m ng xâu ký t r t hay đ c s d ng, ch ng ộ ả ự ấ ượ ử ụ ẳ h n nh dùng đ l u tr danh sách tên, danh sách ạ ư ể ư ữ m t kh u, danh sách tên t p,ậ ẩ ệ Đ t o m ng các bi n xâu r ng ta t o m t m ng hai ể ạ ả ế ỗ ạ ộ ả chi u b i vì xâu ký t cũng là m t m ng và m ng ề ở ự ộ ả ả xâu ký t th c ch t là m ng c a các m ng.ự ự ấ ả ủ ả Ví d : đ l u tr 5 h tên, m i h tên có t i đa 20 ụ ể ư ữ ọ ỗ ọ ố ký t ta đ nh nghĩa m ng xâu nh sau:ự ị ả ư char names[5][21]; Đo n ch ng trình d i đây ạ ươ ướ cho phép ng i s d ng nh p vào các h tên đ l u ườ ử ụ ậ ọ ể ư trong m ng trên.ả Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 24 II.6. M ng xâu ký t (ti p)ả ự ế for(int i=0;i<5;++i) { printf("Nhap vao mot ho ten (an enter de thoat): “); gets(names[i]); if(strlen(names[i])==0) break; } Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 25 II.6. M ng xâu ký t (ti p)ả ự ế Ta cũng có th kh i t o m ng xâu ngay khi ể ở ạ ả đ nh nghĩa gi ng nh các m ng khác. Ví d :ị ố ư ả ụ char Thu[7][] = {"Thu Hai", "Thu Ba", "Thu Tu", "Thu Nam", "Thu Sau", "Thu Bay", "Chu Nhat"}; Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 26 Bài t p ch ng 5ậ ươ  Bài 1. Vi t ch ng trình nh p vào m t dãy n s ế ươ ậ ộ ố nguyên, hãy s p x p dãy s này theo th t không ắ ế ố ứ ự gi m b ng ph ng pháp s p x p ch n.ả ằ ươ ắ ế ọ  Bài 2. Hình vuông kỳ o b c n đ c đ nh nghĩa là ả ậ ượ ị m t ma tr n vuông c p n sao cho:ộ ậ ấ  Ch a đ nứ ủ 2 s t nhiên đ u tiên (1, 2, 3,, nố ự ầ 2)  T ng các s trên t ng hàng b ng t ng các s trên t ng c t ổ ố ừ ằ ổ ố ừ ộ b ng t ng các s trên đ ng chéo chính b ng t ng các s ằ ổ ố ườ ằ ổ ố trên đ ng chéo ph .ườ ụ Vi t ch ng trình nh p vào s t nhiên l n, đ a ra ế ươ ậ ố ự ẻ ư màn hình m t hình vuông kỳ o b c n l đó.ộ ả ậ ẻ Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 27 Bài t p ch ng 6 (ti p)ậ ươ ế Ví d d i đây là 2 hình vuông kỳ o b c 3 ụ ướ ả ậ và b c 5:ậ 8 1 6 3 5 7 4 9 2 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 Bài gi ng Ngôn ng C - Ch ng 5 GV. Ngô Công Th ngả ữ ươ ắ 28 Bài t p ch ng (ti p)ậ ươ ế  Bài 3. Vi t ch ng trình nh p vào m t s t nhiên n, ế ươ ậ ộ ố ự đ a ra màn hình s nh phân t ng ng d i d ng ư ố ị ươ ứ ướ ạ xâu ký t .ự  Bài 4. Hai t x và y g i là anagram v i nhau n u ừ ọ ớ ế m i ký t c a t này cũng có m t trong t kia ỗ ự ủ ừ ặ ừ (không phân bi t ch hoa ch th ng) và h n n a ệ ữ ữ ườ ơ ữ s l ng t ng lo i ký t xu t hi n trong hai t là ố ượ ừ ạ ự ấ ệ ừ b ng nhau. Ví d các t sau là anagram c a nhau: ằ ụ ừ ủ read, dear, dare. Vi t ch ng trình nh p vào 2 t x ế ươ ậ ừ và y r i ki m tra xem chúng có ph i là anagram c a ồ ể ả ủ nhau không.

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_lap_trinh_c_chuong_5_kieu_mang_va_xau_ki_tu_ngo_co.pdf