Bài giảng bài 9 và 10 cung cấp những kiến thức về kiểu chung, lớp string, lớp vector. Những nội dung chính được trình bày trong chương này gồm có: Chương trình con chung, kiểu chung; lớp, lớp string; các toán tử với xâu kí tự; các hàm kí tự; lớp vector; khai báo vector;... mời các bạn cùng tham khảo.
Trang 1Mô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
Trang 2Buổi 9&10: Kiểu chung, lớp
Trang 3Chươ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:
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ự
void hoandoi(double & a , double & b) {
double tmp;
tmp = a; a = b; b = tmp; }
Trang 4Chương trình con chung, kiểu chung
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
T là một kiểu chung và sẽ được thay thế bởi một kiểu
Trang 5// Hóa đổi giá trị hai số thực, hai xâu kí tự
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;
Trang 6truy 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ố);
Trang 7Lớ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 <string> ở
Trang 8Lớ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ố
Trang 9Các toán tử với xâu kí tự
s[i] Truy cập đến phần tử thứ i của
s + s2 Trả về xâu mới là xâu s nối với
xâu s2
(xem trang 473-474)
Trang 10Phươ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
s.replace(pos,num,
s2)
Thay thế các kí tự trong xâu s bằng toàn bộ xâu s2, bắt đầu từ vị trí pos trong xâu s
s.resize(len)
Xác định lại chiều dài của xâu s là 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
s.substr(pos,len) Trả về xâu mới gồm các phần tử của xâu
s từ s[pos] s[pos+len]
Các thao tác với xâu kí tự (tr.473-474):
Trang 11Cá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
Trang 12//Đổi một xâu kí tự thành dạng viết hoa
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
Trang 13// Sử dụng một số thao tác với xâu kí tự
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;
}
Trang 14Lớ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)
để 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ữ
Trang 15Khai báo vector
Để sử dụng lớp vector cần khai báo
#include <vector> ở đầu chương trình
Các cách khai báo một vector
1 vector < kiểu_dữ_liệu > tên_vector;
2 vector < kiểu_dữ_liệu > tên_vector(so_pt);
3 vector < kiểu_dữ_liệu > 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ử
Trang 16Khai báo vector
vector< double > 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< string > 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!”
Trang 17Ghép thêm phần tử e vào cuối vector v Đổi cỡ của vector v thành newSize
Trả về số phần tử của vector v
Trang 18Nhập giá trị cho vector
Cách 1: Khai báo vector sau khi nhập số phần tử của vector
cout << "Nhap gia tri cho cac phan tu:\n";
for ( int i = 0; i < n; i++)
{
cout << “A[“<<i<<”]=“;
cin >> A[i];
}
Trang 19Nhập giá trị cho vector
Cách 2: Khai báo vector, nhập số phần tử của vector, sau đó điều
cout << "Nhap gia tri cho cac phan tu:\n";
for (int i = 0; i < n; i++)
{
cout << "A["<<i<<"]=";
cin >> A[i];
}
Trang 20Nhậ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<double> A;
double x;
char traloi;
cout << "Ban co muon nhap khong(y/n)?"; cin >> traloi;
while (traloi == 'y')
{
cout << "Nhap mot gia tri:"; cin >> x;
A.push_back(x); //gắn giá trị vừa nhập vào cuối vertor cout << “Tiep tuc nhap(y/n)?"; cin >> traloi;
}
Trang 21In 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] <<" ";
Trang 22
/*Nhập điểm cho một nhóm sinh viên và lưu vào vector, sau đó in ra
for (int i = 0; i < n; i++) {
cout << "Nhap diem cho sinh vien " << i+1 << ": ";
cin >> sv_diem[i];
}
for (int i = 0; i < sv_diem.size(); i++) {
cout << "Sinh vien " << i+1 << '\t' << sv_diem[i]<<endl;
}
return 0;
}
Trang 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
cout << "Nhap gia tri cho cac phan tu:\n";
for (int i = 0; i < n; 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] <<" ";
Trang 24Vector của các vector
Khai báo 1 vector các số thực:
vector<double> row(7)
Khai báo 1 vector chứa các vector số thực:
vector<vector<double>> table(3, row)
Một bảng hai chiều
kích thước 3*7 Một hàng có độ dài là 7
Trang 25//Nhập dữ liệu cho một vector của vector và in nó ra màn hình
using namespace std;
template<class T> void nhapvectorcuavector(vector< vector< T > > & w) {
cout<<"Nhap gia tri cho cac phan tu cua vector:"<<endl;
for ( unsigned int i = 0; i < w.size(); i ++)
for ( unsigned int j = 0; j < w[i].size(); j ++) {
cout << "w[" << i << "][" << j << "] =";
cin >> w[i][j];
}
}
template<class T> void invectorcuavector(vector< vector< T > > w) {
cout<<"In gia tri cac phan tu cua vector:"<<endl;
for ( unsigned int i = 0; i < w.size(); i ++) {
for ( unsigned int j = 0; j < w[i].size(); j ++) cout << w[i][j] << " ";
cout << "Nhap so hang, cot cua vector:" ; cin >> m >> n ;
vector < double > row(n); vector < vector < double > > table(m,row);
nhapvectorcuavector(table);
Trang 26đã nhập