Giáo trình môn học Tin đại cương - Bài 9+10: Kiểu chung, lớp string, Lớp vector - Lý Anh Tuấn

pdf 26 trang huongle 3360
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn học Tin đại cương - Bài 9+10: Kiểu chung, lớp string, Lớp vector - Lý Anh Tuấn", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_mon_hoc_tin_dai_cuong_bai_910_kieu_chung_lop_stri.pdf

Nội dung text: Giáo trình môn học Tin đại cương - Bài 9+10: Kiểu chung, lớp string, Lớp vector - Lý Anh Tuấn

  1. Môn học Tin đại cương Lý Anh Tuấn Bộ môn Khoa học máy tính, Khoa Công nghệ thông tin, Trường đại học Thủy Lợi 1
  2. Buổi 9&10: Kiểu chung, lớp string, lớp vector  Chương trình con chung, kiểu chung  Lớp string  Lớp vector  Vector của các vector 2
  3. Chương trình con chung, kiểu chung  Để hoán đổi giá trị của 2 biến thực chúng ta viết thủ tục sau: void hoandoi(double & a , double & b) { double tmp; tmp = a; a = b; b = tmp; }  Thủ tục này hoạt động tốt nếu ta hoán đổi giá trị 2 biến thực, tuy nhiên không thể sử dụng nó để hoán đổi giá trị 2 biến nguyên hoặc 2 biến xâu kí tự. 3
  4. Chương trình con chung, kiểu chung  C++ cung cấp các chương trình con chung, một chương trình con chung sẽ tham số hóa các kiểu dữ liệu dự định sẽ sử dụng  Thủ tục hoandoi được viết dưới dạng thủ tục chung template void hoandoi(T & a, T & b) { T tmp; tmp = a; a = b; b = tmp; }  T là một kiểu chung và sẽ được thay thế bởi một kiểu dữ liệu cụ thể khi thủ tục được gọi 4
  5. // Hóa đổi giá trị hai số thực, hai xâu kí tự #include using namespace std; template void hoandoi(T & a, T & b) { T tmp; tmp = a; a = b; b = tmp; } int main() { double x=5, y=10; cout<<"Truoc: "<< x <<" "<< y <<endl; hoandoi(x, y); cout<<"Sau: "<< x <<" "<< y <<endl; string str1(“neu co quyet tam"); string str2("chung ta se tien bo"); cout<<"Truoc: "<< str1 <<" "<< str2 <<endl; hoandoi(str1, str2); cout<<"Sau: "<< str1 <<" "<< str2 <<endl; return 0; } 5
  6. Lớp  Lớp là sự mở rộng của cấu trúc dữ liệu: thay vì chỉ lưu trữ dữ liệu, lớp lưu trữ cả dữ liệu và hàm (phương thức)  Đối tượng là sự thể hiện cụ thể của một lớp. Có thể coi một lớp là một kiểu, và một đối tượng là một biến.  Khai báo một đối tượng x thuộc lớp T: T x(danh_sách_tham_số);  Các phương thức của lớp thường được sử dụng để truy cập tới dữ liệu của đối tượng thuộc lớp, cú pháp: x.tên_phương_thức(danh_sách_tham_số); 6
  7. Lớp string  C++ hỗ trợ xâu kí tự thông qua lớp string, để sử dụng lớp string cần khai báo #include ở đầu chương trình  Các đối tượng kiểu string có thể được khai báo và sử dụng như các kiểu dữ liệu khác  Ngoài ra, lớp string cung cấp cách thức truy cập tới các kí tự của xâu kí tự và một tập các phép toán xử lý xâu. VD: ghép xâu, trích một đoạn trong xâu, tìm kiếm xâu, 7
  8. Lớp string  Có thể coi xâu kí tự kiểu string là một mảng các kí tự kiểu char và có thể truy cập tới các kí tự riêng biệt của xâu thông qua chỉ số  Ví dụ: string s = “Dai hoc Thuy Loi"; //khai báo, gán g/trị cho xâu s char c; c=s[0]; //gán ‘D’ cho c c=s[5]; //gán ‘o’ cho c s[0]=‘n’; //gán ‘n’ vào vị trí đầu tiên của xâu 8
  9. Các toán tử với xâu kí tự s[i] Truy cập đến phần tử thứ i của xâu ký tự (i nguyên) s=s2 Gán nội dung của xâu s2 cho xâu s s s2, Các phép toán so sánh hai xâu, s==s2, s =s2, s!=s2 trả về false s + s2 Trả về xâu mới là xâu s nối với xâu s2 (xem trang 473-474) 9
  10. Các thao tác với xâu kí tự (tr.473-474): Phương thức Ý nghĩa s.push_back(c) Gắn ký tự c vào xâu s s.append(s2) Gắn xâu s2 vào xâu s s.erase(pos,len) Xóa bỏ len kí tự khỏi s, bắt đầu từ pos s.find(s2) Trả về ví trí của s2 trong s, hoặc s.npos nếu không tìm thấy s2 s.insert(pos,s2) Chèn xâu s2 vào s bắt đầu từ pos Thay thế các kí tự trong xâu s bằng s.replace(pos,num, toàn bộ xâu s2, bắt đầu từ vị trí pos s2) trong xâu s Xác định lại chiều dài của xâu s là s.resize(len) len, bỏ bớt đi hoặc thêm vào xâu s các kí tự null khi cần s.size() Trả về số phần tử trong xâu s Trả về xâu mới gồm các phần tử của xâu s.substr(pos,len) s từ s[pos] s[pos+len] 10
  11. Các hàm kí tự (nhắc lại)  Một số hàm kí tự trong thư viện cctype(tr.463-464):  int isalnum(char c): trả về true nếu c là một ký tự hay số  int isalpha(char c): trả về true nếu c là một ký tự  int isdigit(char c): trả về true nếu c là một số hệ 10  int isspace(char c): trả về true nếu c là một khoảng trống  int isupper(char c): trả về true nếu c là một chữ hoa  int tolower(char c): đổi kí tự c sang chữ thường  int toupper(char c): đổi kí tự c sang chữ hoa 11
  12. //Đổi một xâu kí tự thành dạng viết hoa #include #include using namespace std; string upperCase(string s); int main() { cout << "Nhap vao mot xau ki tu:"; string line; getline(cin, line); // nhận một xâu từ bàn phím cout << upperCase(line) << endl; // in xâu dưới dạng viết hoa return 0; } string upperCase(string s) { for(int i = 0; i < s.size(); i = i + 1) { s[i] = toupper(s[i]); } return s; } 12
  13. // Sử dụng một số thao tác với xâu kí tự #include #include using namespace std; int main () { string str="Dao duc cao nhat cua con nguoi la gi?“ "Do chinh la long yeu nuoc."; string str2, str3; int pos; str2 = str.substr (0,33); // "Dao duc cao nhat cua con nguoi la" pos = str.find("long"); // vị trí của "long" trong str str3 = str.substr (pos); // lấy từ "long" đến hết xâu cout << str2 << ' ' << str3 << endl; return 0; } 13
  14. Lớp vector  Lớp vector là một kiểu cấu trúc dữ liệu mảng động, làm việc giống như mảng thông thường tuy nhiên có thêm khả năng tự động thay đổi kích cỡ khi chèn và loại bỏ đối tượng  vector có thể chứa được hầu hết các kiểu dữ liệu, thậm chí là các vector khác (vector của các vector)  Lớp vector cung cấp một tập các phương thức chuẩn để truy cập tới các phần tử, thêm các phần tử vào đầu hoặc cuối, xóa các phần tử và kiểm tra số phần tử được lưu trữ 14
  15. Khai báo vector  Để sử dụng lớp vector cần khai báo #include ở đầu chương trình  Các cách khai báo một vector 1. vector tên_vector; 2. vector tên_vector(so_pt); 3. vector tên_vector(so_pt, e); trong đó: - so_pt là biểu thức trả về số phần tử của vector - e là giá trị khởi tạo của các phần tử 15
  16. Khai báo vector  Ví dụ:  vector A; //Khai báo vector nguyên A, chưa có phần tử nào  vector data(20); //Khai báo vector data có 20 phần tử kiểu double:  vector B(10, 1.0); //Khai báo vector B gồm 10 phần tử kiểu double có giá trị khởi tạo là 1.0  vector C(10, ”Hi!”); //Khai báo vector C gồm 10 phần tử kiểu string có giá trị khởi tạo là “Hi!” 16
  17. Các thao tác cơ bản Phương thức Ngữ nghĩa v.assign(n, e) Thay thế nội dung của v bằng n bản sao của e v[i] hoặc v.at(i) Tham chiếu đến phần tử thứ i của vector v v.back() Tham chiếu đến phần tử cuối cùng của vector v v.clear() Làm rỗng vector v v.empty() Trả về true nếu vector v rỗng v.front() Tham chiếu đến phần tử đầu tiên của vector v v.pop_back() Xóa phần tử cuối cùng của vector v v.push_back(e) Ghép thêm phần tử e vào cuối vector v v.resize(newsSize) Đổi cỡ của vector v thành newSize v.size() Trả về số phần tử của vector v 17
  18. Nhập giá trị cho vector  Cách 1: Khai báo vector sau khi nhập số phần tử của vector int n; cout > n; vector A(n); cout > A[i]; } 18
  19. Nhập giá trị cho vector  Cách 2: Khai báo vector, nhập số phần tử của vector, sau đó điều chỉnh kích cỡ vector cho phù hợp int n; vector A; cout > n; A.resize (n); cout > A[i]; } 19
  20. Nhập giá trị cho vector  Cách 3: Nhập giá trị cho các phần tử của vector cho đến khi người dùng muốn dừng lại vector A; double x; char traloi; cout > traloi; while (traloi == 'y') { cout > x; A.push_back(x); //gắn giá trị vừa nhập vào cuối vertor cout > traloi; } 20
  21. In vector ra màn hình  In vector ra màn hình: có thể thay A.size() bằng n nếu n là kích cỡ vector cout<<"Cac phan tu cua day la:"<<endl; for (int i = 0; i < A.size(); i++) cout << A[i] <<" "; 21
  22. /*Nhập điểm cho một nhóm sinh viên và lưu vào vector, sau đó in ra màn hình*/ #include #include using namespace std; int main() { int n; cout > n; vector sv_diem(n); for (int i = 0; i > sv_diem[i]; } for (int i = 0; i < sv_diem.size(); i++) { cout << "Sinh vien " << i+1 << '\t' << sv_diem[i]<<endl; } return 0; } 22
  23. // Thiết lập một dãy mới gồm các phần tử dương của dãy đã nhập #include #include using namespace std; void main(){ int n; cout > n; vector A(n); cout > A[i]; } vector B; for (int i = 0; i 0) B.push_back(A[i]); cout<<"Cac phan tu cua day da nhap la:"<<endl; for (int i = 0; i < A.size(); i++) cout << A[i] <<" "; cout<<endl; cout<<"Cac phan tu duong cua day la:"<<endl; for (int i = 0; i < B.size(); i++) cout << B[i] <<" "; } 23
  24. Vector của các vector  Khai báo 1 vector các số thực: vector row(7) Một hàng có độ dài là 7  Khai báo 1 vector chứa các vector số thực: vector > table(3, row) Một bảng hai chiều kích thước 3*7 24
  25. //Nhập dữ liệu cho một vector của vector và in nó ra màn hình #include #include using namespace std; template void nhapvectorcuavector(vector > & w) { cout > w[i][j]; } } template void invectorcuavector(vector > w) { cout > m >> n ; vector row(n); vector > table(m,row); nhapvectorcuavector(table); invectorcuavector(table); } 25
  26. Bài tập 1) Viết chương trình đếm số kí tự ‘e’ trong một xâu kí tự được đọc vào từ bàn phím 2) Nhập một dãy số nguyên từ bàn phím, đảo ngược dãy số và in dãy ra màn hình 3) Nhập một dãy số thực từ bàn phím, và một số nguyên k, nếu k lớn hơn kích thước của dãy thì thiết lập một dãy mới gồm các phần tử chẵn của dãy đã nhập, ngược lại nếu k bé hơn kích thước của dãy thì thiết lập một dãy mới gồm các phần tử lẻ của dãy đã nhập 26