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
26 trang |
Chia sẻ: phuongt97 | Lượt xem: 344 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Tin đại cương - Buổi 9&10: Kiểu chung, lớp string, lớp vector - Lý Anh Tuấn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trê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
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
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:
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;
}
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
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
template
void hoandoi(T & a, T & b)
{
T tmp;
tmp = a; a = b; b = tmp;
}
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;
}
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ố);
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,
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
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
ss2,
s==s2, s<=s2,
s>=s2, s!=s2
Các phép toán so sánh hai xâu,
nếu đúng trả về true, nếu sai
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)
10
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
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):
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
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;
}
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;
}
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ữ
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ử
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!”
17
Các thao tác cơ bản
Phương thức Ngữ nghĩa
v.assign(n, e)
v[i] hoặc v.at(i)
v.back()
v.clear()
v.empty()
v.front()
v.pop_back()
v.push_back(e)
v.resize(newsSize)
v.size()
Thay thế nội dung của v bằng n bản sao của e
Tham chiếu đến phần tử thứ i của vector v
Tham chiếu đến phần tử cuối cùng của vector v
Làm rỗng vector v
Trả về true nếu vector v rỗng
Tham chiếu đến phần tử đầu tiên của vector v
Xóa phần tử cuối cùng của vector v
Ghé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
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 << "Nhap so phan tu cua day:";
cin >> n;
vector A(n);
cout << "Nhap gia tri cho cac phan tu:\n";
for (int i = 0; i < n; i++)
{
cout << “A[“<<i<<”]=“;
cin >> A[i];
}
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 << "Nhap so phan tu cua day:";
cin >> n;
A.resize (n);
cout << "Nhap gia tri cho cac phan tu:\n";
for (int i = 0; i < n; i++)
{
cout << "A["<<i<<"]=";
cin >> A[i];
}
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;
}
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] <<" ";
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 < 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;
}
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 << "Nhap gia tri cho cac phan tu:\n";
for (int i = 0; i < n; i++){
cout << "A["<<i<<"]=";
cin >> A[i];
}
vector B;
for (int i = 0; i < A.size(); i++)
if (A[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] <<" ";
}
24
Vector của các vector
Khai báo 1 vector các số thực:
vector row(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
Một hàng có độ dài là 7
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<<"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 void invectorcuavector(vector > 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 << endl;
}
}
void main() {
int m,n;
cout > m >> n ;
vector row(n); vector > table(m,row);
nhapvectorcuavector(table);
invectorcuavector(table);
}
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
Các file đính kèm theo tài liệu này:
- bai_giang_tin_dai_cuong_buoi_910_kieu_chung_lop_string_lop_v.pdf