Xem mẫu

  1. Updatesofts.com Ebooks Team Xâu kí t Trong t t c các chương trình chúng ta ñã th y cho ñ n gi , chúng ta ch s d ng các bi n ki u s , ch dùng ñ bi u di n các s . Nhưng bên c nh các bi n ki u s còn có các xâu kí t , chúng cho phép chúng ta bi u di n các chu i kí t như là các t , câu, ño n văn b n... Cho ñ n gi chúng ta m i ch dùng chúng dư i d ng h ng ch ch a quan tâm ñ n các bi n có th ch a chúng. Trong C++ không có ki u d li u cơ b n ñ lưu các xâu kí t . ð có th th a mãn nhu c u này, ngư i ta s d ng m ng có ki u char. Hãy nh r ng ki u d li u này (char) ch có th lưu tr m t kí t ñơn, b i v y nó ñư c dùng ñ t o ra xâu c a các kí t ñơn. Ví d , m ng sau (hay là xâu kí t ): char jenny [20]; có th lưu m t xâu kí t v i ñ dài c c ñ i là 20 kí t . B n có th tư ng tư ng nó như sau: Kích thư c c c ñ i này không c n ph i luôn luôn dùng ñ n. Ví d , jenny có th lưu xâu Vì các m ng kí t có th lưu các xâu kí t ng n hơn "Hello" hay "Merry christmas". ñ dài c a nó, trong C++ ñã có m t quy ư c ñ k t thúc m t n i dung c a m t xâu kí t b ng m t kí t null, có th ñư c vi t là '\0'. Chúng ta có th bi u di n jenny (m t m ng có 20 ph n t ki u char) khi lưu tr xâu kí t "Hello" và "Merry Christmas" theo cách sau: Chú ý r ng sau n i dung c a xâu, m t kí t null ('\0') ñư c dùng ñ báo hi u k t thúc xâu. Nh ng ô màu xám bi u di n nh ng giá tr không xác ñ nh. Kh i t o các xâu kí t . Vì nh ng xâu kí t là nh ng m ng bình thư ng nên chúng cũng như các m ng khác. Ví d , n u chúng ta mu n kh i t o m t xâu kí t v i nh ng giá tr xác ñ nh chúng ta có th làm ñi u ñó tương t như v i các m ng khác: Trang 48
  2. Updatesofts.com Ebooks Team char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; Tuy nhiên, chúng ta có th kh i t o giá tr cho m t xâu kí t b ng cách khác: s d ng các h ng xâu kí t . Trong các bi u th c chúng ta ñã s d ng trong các ví d trong các chương trư c các h ng xâu kí t ñ xu t hi n vài l n. Chúng ñư c bi u di n trong c p ngo c kép ("), ví d : "the result is: " là m t h ng xâu kí t chúng ta s d ng m t s ch . Không gi ng như d u nháy ñơn (') cho phép bi u di n h ng kí t , c p ngo c kép (") là h ng bi u di n m t chu i kí t liên ti p, và cu i chu i m t kí t null ('\0') luôn ñư c t ñ ng thêm vào. Vì v y chúng ta có th kh i t o xâu mystring theo m t trong hai cách sau ñây: char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' }; char mystring [] = "Hello"; Trong c hai trư ng h p m ng (hay xâu kí t ) mystring ñư c khai báo v i kích thư c 6 kí t : 5 kí t bi u di n Hello c ng v i m t kí t null. Trư c khi ti p t c, tôi c n ph i nh c nh b n r ng vi c gán nhi u h ng như vi c s d ng d u ngo c kép (") ch h p l khi kh i t o m ng, t c là lúc khai báo m ng. Các bi u th c trong chương trình như: mystring = "Hello"; mystring[] = "Hello"; là không h p l , c câu l nh dư i ñây cũng v y: mystring = { 'H', 'e', 'l', 'l', 'o', '\0' }; V y hãy nh : Chúng ta ch có th "gán" nhi u h ng cho m t m ng vào lúc kh i t o nó. Nguyên nhân là m t thao tác gán (=) không th nh n v trái là c m t m ng mà ch có th nh n m t trong nh ng ph n t c a nó. Vào th i ñi m kh i t o m ng là m t trư ng h p ñ c bi t, vì nó không th c s là m t l nh gán m c dù nó s d ng d u b ng (=). Gán giá tr cho xâu kí t Vì v trái c a m t l nh gán ch có th là m t ph n t c a m ng ch không th là c m ng, chúng ta có th gán m t xâu kí t cho m t m ng ki u char s d ng m t phương pháp như sau: mystring[0] = 'H'; mystring[1] = 'e'; Trang 49
  3. Updatesofts.com Ebooks Team mystring[2] = 'l'; mystring[3] = 'l'; mystring[4] = 'o'; mystring[5] = '\0'; Nhưng rõ ràng ñây không ph i là m t phương pháp th c t . ð gán giá tr cho m t xâu kí t , chúng ta có th s d ng lo t hàm ki u strcpy (string copy), hàm này ñư c ñ nh nghĩa trong string.h và có th ñư c g i như sau: strcpy (string1, string2); L nh này copy n i dung c a string2 sang string1. string2 có th là m t m ng, con tr hay m t h ng xâu kí t , b i v y l nh sau ñây là m t cách ñúng ñ gán xâu h ng "Hello" cho mystring: strcpy (mystring, "Hello"); Ví d : J. Soulie // setting value to string #include #include int main () { char szMyName [20]; strcpy (szMyName,"J. Soulie"); cout
  4. Updatesofts.com Ebooks Team { char szMyName [20]; setstring (szMyName,"J. Soulie"); cout
  5. Updatesofts.com Ebooks Team xâu kí t thay cho cin.getline. Ví d , trong chươn trình c a chúng ta, khi chúng ta mu n nh n d li u t ngư i dùng chúng ta có th vi t: cin >> mybuffer; l nh này s làm vi c như nó có nh ng h n ch sau mà cin.getline không có: • Nó ch có th nh n nh ng t ñơn (không nh n ñư c c câu) vì phương th c này s d ng kí t tr ng(bao g m c d u cách, d u tab và d u xu ng dòng) làm d u hi u k t thúc.. • Nó không cho phép ch ñ nh kích thư c cho b ñ m. Chương trình c a b n có th ch y không n ñ nh n u d li u vào l n hơn kích c c a m ng ch a nó. Vì nh ng nguyên nhân trên, khi mu n nh p vào các xâu kí t b n nên s d ng cin.getline thay vì cin >>. Chuy n ñ i xâu kí t sang các ki u khác. Vì m t xâu kí t có th bi u di n nhi u ki u d li u khác như d ng s nên vi c chuy n ñ i n i dung như v y sang d ng s là r t h u ích. Ví d , m t xâu có th mang giá tr "1977"nhưng ñó là m t chu i g m 5 kí t (k c kí t null) và không d gì chuy n thành m t s nguyên. Vì v y thư vi n cstdlib (stdlib.h) ñã cung c p 3 macro/hàm h u ích sau: • atoi: chuy n xâu thành ki u int. • atol: chuy n xâu thành ki u long. • atof: chuy n xâu thành ki u float. T t c các hàm này nh n m t tham s và tr v giá tr s (int, long ho c float). Các hàm này khi k t h p v i phương th c getline c a cin là m t cách ñáng tin c y hơn phương th c cin>> c ñi n khi yêu c u ngư i s d ng nh p vào m t s : Enter price: 2.75 // cin and ato* functions Enter quantity: 21 #include Total price: 57.75 #include int main () { char mybuffer [100]; float price; int quantity; cout
  6. Updatesofts.com Ebooks Team return 0; } Các hàm ñ thao tác trên chu i Thư vi n cstring (string.h) không ch có hàm strcpy mà còn có nhi u hàm khác ñ thao tác trên chu i. Dư i ñây là gi i thi u lư t qua c a các hàm thông d ng nh t: strcat: char* strcat (char* dest, const char* src); G n thêm chu i src vào phía cu i c a dest. Tr v dest. strcmp: int strcmp (const char* string1, const char* string2); So sánh hai xâu string1 và string2. Tr v 0 n u hai xâu là b ng nhau. strcpy: char* strcpy (char* dest, const char* src); Copy n i dung c a src cho dest. Tr v dest. strlen: size_t strlen (const char* string); Tr v ñ dài c a string. Chú ý: char* hoàn toàn tương ñương v i char[] Trang 53
  7. Updatesofts.com Ebooks Team Con tr Chúng ta ñã bi t các bi n chính là các ô nh mà chúng ta có th truy xu t dư i các tên. Các bi n này ñư c lưu tr t i nh ng ch c th trong b nh . ð i v i chương trình c a chúng ta, b nh máy tính ch là m t dãy g m các ô nh 1 byte, m i ô có m t ñ a ch xác ñ nh. M t s mô hình t t ñ i v i b nh máy tính chính là m t ph trong m t thành ph . Trên m t ph t t c các ngôi nhà ñ u ñư c ñánh s tu n t v i m t cái tên duy nh t nên n u chúng ta nói ñ n s 27 ph Tr n Hưng ð o thì chúng ta có th tìm ñư c nơi ñó mà không l m l n vì ch có m t ngôi nhà v i s như v y. Cũng v i cách t ch c tương t như vi c ñánh s các ngôi nhà, h ñi u hành t ch c b nh thành nh ng s ñơn nh t, tu n t , nên n u chúng ta nói ñ n v trí 1776 trong b nh chúng ta bi t chính xác ô nh ñó vì ch có m t v trí v i ñ a ch như v y. Toán t l y ñ a ch (&). Vào th i ñi m mà chúng ta khai báo m t bi n thì nó ph i ñư c lưu tr trong m t v trí c th trong b nh . Nói chung chúng ta không quy t ñ nh nơi nào bi n ñó ñư c ñ t - th t may m n r ng ñi u ñó ñã ñư c làm t ñ ng b i trình biên d ch và h ñi u hành, nhưng m t khi h ñi u hành ñã gán m t ñ a ch cho bi n thì chúng ta có th mu n bi t bi n ñó ñư c lưu tr ñâu. ði u này có th ñư c th c hi n b ng cách ñ t trư c tên bi n m t d u và (&), có nghĩa là "ñ a ch c a". Ví d : ted = &andy; s gán cho bi n ted ñ a ch c a bi n andy, vì khi ñ t trư c tên bi n andy d u và (&) chúng ta không còn nói ñ n n i dung c a bi n ñó mà ch nói ñ n ñ a ch c a nó trong b nh . Gi s r ng bi n andy ñư c ñ t ô nh có ñ a ch 1776 và chúng ta vi t như sau: andy = 25; fred = andy; ted = &andy; k t qu s gi ng như trong sơ ñ dư i ñây: Trang 54
  8. Updatesofts.com Ebooks Team Chúng ta ñã gán cho fred n i dung c a bi n andy như chúng ta ñã làm r t l n nhi u khác trong nh ng ph n trư c nhưng v i bi n ted chúng ta ñã gán ñ a ch mà h ñi u hành lưu giá tr c a bi n andy, chúng ta v a gi s nó là 1776. Nh ng bi n lưu tr ñ a ch c a m t bi n khác (như ted trong ví d trư c) ñư c g i là con tr . Trong C++ con tr có r t nhi u ưu ñi m và chúng ñư c s d ng r t thư ng xuyên, Ti p theo chúng ta s th y các bi n ki u này ñư c khai báo như th nào. Toán t tham chi u (*) B ng cách s d ng con tr chúng ta có th truy xu t tr c ti p ñ n giá tr ñư c lưu tr trong bi n ñư c tr b i nó b ng cách ñ trư c tên bi n con tr m t d u sao (*) - ñây có th ñư c d ch là "giá tr ñư c tr b i". Vì v y, n u chúng ta vi t: beth = *ted; (chúng ta có th ñ c nó là: "beth b ng giá tr ñư c tr b i ted" beth s mang giá tr 25, vì ted b ng 1776 và giá tr tr b i 1776 là 25. B n ph i phân bi t ñư c r ng ted có giá tr 1776, nhưng *ted (v i m t d u sao ñ ng trư c) tr t i giá tr ñư c lưu tr trong ñ a ch 1776, ñó là 25. Hãy chú ý s khác bi t gi a vi c có hay không có d u sao tham chi u. beth = ted; // beth b ng ted ( 1776 ) // beth b ng giá tr ñư c tr beth = *ted; b i( 25 ) Toán t l y ñ a ch (&) Trang 55