You are on page 1of 19

CLASS TRONG C++

I) Khái niệm.

Class thực chất là một kiểu dữ liệu, do chính chúng ta định nghĩa (xây dựng).
Trước đây chúng ta quen với việc khai báo các biến với những kiểu dữ liệu được định sẵn như
int, float, string, char, bool nhưng không thực sự hiểu chúng là gì. Bây giờ thì chúng ta có thể
hình dung chúng chính là một class, nhưng chúng được định nghĩa mặc định và chúng ta không
thể can thiệp.
Còn giờ đây chúng ta có thể tạo ra kiểu dữ liệu mình mong muốn theo cách của chúng ta, thông
qua class.
Trước đây để lưu một số nguyên và một chuỗi (string) ta cần dùng 2 biến, một biến dạng
nguyên, một biến dạng string.
Nhưng giờ ta muốn chỉ cần một biến nhưng vẫn lưu được cả 2 loại dữ liệu trên, hoặc thậm chí
là 1 biến nhưng lưu được 3 4 5...đến n dữ liệu mà chúng ta muốn.
Điều này rất thuận tiện trong việc lưu trữ dữ liệu, ví dụ như lưu tên và điểm của một sinh viên,
lưu tên, quê quán, cân nặng chiều cao của một người vv.

II)Cấu trúc class.

Một class sẽ được khai báo như sau:


class <tên >
{
//các kiểu dữ liệu cơ bản
}; // có dấu; sau dấu ngoặc nhọn
bên phải là ví dụ về một class có tên sv (sinh viên)
chứa các kiểu dữ liệu tên (string), năm sinh (int), điểm toán (int).
Do tính đặc thù của class là che giấu dữ liệu nên ta tạm đặt tất cả các biến dưới dạng public để
các thao tác về sau không bị vướng víu, phần này các bạn ko cần để ý. Tôi sẽ nhắc lại nó về sau.
Bây giờ tôi muốn lưu dữ liệu của 1 sinh viên thì tôi sẽ làm như sau:
Tạm đặt tên biến là a, chúng ta sẽ khai báo biến y hệt khai báo với các kiểu dữ liệu thông
thường khác. <tên class> <tên biến>;
Cụ thể là
sv a;
Lúc này a sẽ mang kiểu dữ liệu sv.
bên trong kiểu dữ liệu sv lại chứa
3 loại dữ liệu với các tên biến lần lượt là
ten, namsinh, diemtoan.
để nhập tên cho sinh viên a
ta sẽ dùng toán tử chấm ‘.’.
Ví dụ muốn nhập tên “Hung” cho biến a,
ta sẽ thao tác như sau:
a.ten = “Hung”;
tương tự:
a. namsinh = 2003.
a. diemtoan = 9.

Ngoài ra ta cũng có thể nhập dữ liệu cho


các biến của a bằng lệnh cin thông thường
Và như mọi loại dữ liệu khác, ta cũng có thể tạo
ra một mảng mang kiểu dữ liệu sv
bằng cách khai báo theo cú pháp thông thường
Nếu đề bài cho ta kiểu:
Nhập số n sau đó nhập lần lượt thông tin
tên, năm sinh, điểm toán trên cùng 1 dòng cách nhau
bởi khoảng trắng trên n dòng tiếp theo.
thì ta sẽ thao tác nhập mảng như sau; ví dụ:
input:
3
Hoa 2002 10
Thang 2003 9
Manh 2001 7

Giả sử đề yêu cầu xuất ra tên sinh viên có điểm thấp nhất ta sẽ thao tác như sau.
Luyện tập:
Bài 1: Tạo một class người trong đó có chứa tên, tuổi, cân nặng.
input: Nhập vào một số n, trên n dòng tiếp theo là thông tin về tên, tuổi, cân nặng
output: Xuất ra tên người có tuổi cao nhất.
ví du:
input:
4
Trang 19 48
Minh 20 62
Linh 21 50
Hung 18 67
ouput : Linh
#include<iostream>
using namespace std;
class Person{
public:
string name;
int age,weight;
};
int main(){
int n;
cin>>n;
Person a[n];
for(int i=0;i<n;i++){
cin>>a[i].name>>a[i].age>>a[i].weight;
}
cout<<"--------------------"<<endl;
int m=a[0].age, k=0;
for(int i=1;i<n;i++){
if(a[i].age>m){
m=a[i].age;
k=i;
}
}
cout<<a[k].name;
return 0;
}
Bài 2: Tạo một class động vật, trong đó có tên thú, tên người nuôi (không khoảng trắng), cân
nặng
input: nhập không biết trước số lượng nhiều dòng
mỗi dòng là thông tin lần lượt về tên thú, tên người nuôi và cân nặng
ouput: Tên người nuôi có thú nặng ký nhất
ví dụ:
input:
cho Van 18
meo Nam 7
tho Vinh 5
heo Nhan 70
vit Tra 3
output: Nhan
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Person{
public:
string name,pet;
int weight;

};

int main(){
Person p[100];
int n=0;
while(cin>>p[n].pet>>p[n].name>>p[n].weight){
n++;
}
int m=p[0].weight,k=0;
for(int i=1;i<n;i++){
if(p[i].weight>m){
m=p[i].weight;
k=i;
}
}
cout<<p[k].name;

return 0;
}
Bài 3:
Tạo một class xe máy trong đó có các biến : màu sơn (có khoảng trắng), số xe (int), chủ xe (có
khoảng trắng).
input:
Nhập thông tin một xe trên 3 dòng và nhập liên tục (không biết trước số lượng)
ouput: biển số xe của những xe có màu đỏ.
ví dụ:
input:
xanh la cay
3314
Nguyen Van Manh
do
2213
Dinh Van Nam
trang
1534
Le Van Gam
do
1977
Huynh Van Lam
output:
2213 1977
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Car{
public:
string colour,name;
int cn;
};
int main(){
int n=0;
Car a[100];
while(getline(cin,a[n].colour), cin>>a[n].cn, cin.ignore(),getline(cin,a[n].name)){
n++;
}
vector<int> v;
for(int i=0;i<n;i++){
if(a[i].colour=="do"){
v.push_back(a[i].cn);
}
}
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
return 0;
}

III) Hàm trong class

Hàm trong class cũng sẽ có cấu trúc như một hàm thông thường, nhưng sẽ nằm gọn bên trong
class. Và các biến trong class sẽ như biến toàn cục đối với các hàm trong class.
Và các hàm trong class chỉ có được sử dụng bởi các biến mang dạng dữ liệu của class.
Để sử dụng hàm trong class ta cũng dùng dấu chấm ‘.’
Bây giờ để nhập tên và điểm cho ba biến a, b,c dạng sv, cũng như xuất tên và điểm thì ta sẽ làm
như sau :

Tuy nhiên điều này quá dài dòng, thay vào đó ta chỉ cần xây dựng hàm nhập và hàm xuất trong
class sv để mọi biến dạng sv đều sử dụng được. Ta sẽ thao tác như sau.
Lưu ý: Khi ta gọi hàm a.nhap() thì hàm nhap() sẽ như chui vào bên trong a tiến hành nhập các
giá trị cho a.
lúc này các biến như ten
diemtoan, diemvan vv
trong hàm nhap () chính là
các biến bên trong a.
Tóm lại các biến thuộc class nào thì sẽ đều mang bên trong tất cả các biến và hàm của class đó,
như một ốc sên rinh theo cái vỏ vậy.
Hay bên trong a, b hay c đều có các biến ten, diemtoan, diemvan, diem anh và các hàm
tongdiem (), nhap(), xuat().
Ví Dụ mẫu: Nhập lần lượt nhiều dòng mỗi dòng là thông tin tên, điểm toán, điểm văn, điểm
anh của một sv bất kỳ (không biết trước bao nhiêu dòng). Xuất tên của sv có điểm tổng cao nhất

Luyện tập :
Bài 1: Tạo một class gồm các biến tên (string), phương tiện (string), phí gửi xe (int), phí bảo
dưỡng (int)
Xây dựng hàm nhập xuất cho class trên
Xây dựng hàm tính tổng chi phí cho phương tiện (phí gửi xe + phí bảo dưỡng)
input :
nhập không biết trước số lượng nhiều dòng, trên mỗi dòng là thông tin tên, phương tiện, phí gửi
xe, phí bảo dưỡng.
ouput:
dòng 1 :tên chủ phương tiện cho phí bảo dưỡng cao nhất
dòng 2 :tên chủ phương tiện có phí gửi xe thấp nhất
dòng 3: tên chủ phương tiện có tổng chi phí cao nhất
dòng 4 ->4+n-1
tên, phương tiện và tổng chi phí trên từng dòng theo tiêu chí tổng chi phí cao nhất xếp trước
(hàm xuất nên xây dựng theo tiêu chí này)
ví dụ:
input :
Phuong Mercedes 500 1700
Minh Toyota 200 1900
Hang Honda 300 2100
Hai Ford 700 1800
ouput:
Hang
Minh
Hai
Hai Ford 2500
Hang Honda 2400
Phuong Mercedes 2200
Minh Toyota 2100
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class cst{
public:
string name,nc;
int pf,mf;
friend istream &operator>>(istream &in, cst &p){
in>>p.name>>p.nc>>p.pf>>p.mf;
return in;
}
friend ostream &operator<<(ostream &out,cst p){
out<<p.name<<" "<<p.nc<<" "<<p.total();
return out;
}
int total(){
return pf+mf;
}
};
int main(){
cst p[100];
int n=0;
while(cin>>p[n]){
n++;
}
int m1=p[0].mf;
int k1=0;
for(int i=1;i<n;i++){
if(p[i].mf>m1){
m1=p[i].mf;
k1=i;
}
}
cout<<p[k1].name<<endl;
int m2=p[0].pf;
int k2=0;
for(int i=1;i<n;i++){
if(p[i].pf<m2){
m2=p[i].pf;
k2=i;
}
}
cout<<p[k2].name<<endl;
int m3=p[0].total();
int k3=0;
for(int i=0;i<n;i++){
if(p[i].total()>m3){
m3=p[i].total();
k3=i;
}
}
cout<<p[k3].name<<endl;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(p[i].total()<p[j].total()){
cst k=p[i];
p[i]=p[j];
p[j]=k;
}
}
}
for(int i=0;i<n;i++){
cout<<p[i]<<endl;
}

return 0;
}

Bài 2: Tạo một class có các biến gồm tên (string), tuổi(int), diemtoan(float), diemvan(float)
Xây dựng hàm tính điểm trung bình (float)
Xây dựng hàm nhập và xuất
input : nhập n và n dòng sau đó chứa thông tin của một học sinh lần lượt là tên, tuổi, điểm toán,
điểm văn cách nhau bởi khoảng trắng.
ouput:
dòng 1 tên của học sinh có tuổi cao nhất.
dòng 2 tên của học sinh có điểm trung bình cao nhất.
dòng 3 tên của học sinh có điểm trung bình thấp nhất
dòng 4 ->4+n-1
xuất lần lượt tên tuổi điểm toán văn và điểm trung bình (làm tròn đến 2 chữ số thập phân) theo
thứ tự người có tuổi nhỏ nhất xuất trước, (input đảm bảo không có 2 ng trùng tuổi)
input :
4
Minh 12 8.5 7
Thanh 11 9.5 9
Hang 14 8 10
Thai 10 8 9.5
ouput :
Hang
Thanh
Minh
Thai 10 8 9.5 8.75
Thanh 11 9.5 9 9.25
Minh 12 8.5 7 7.75
Hang 14 8 10 9.00
#include<iostream>
#include<iomanip>
using namespace std;
class Student{
public:
string name;
int age;
float math,liter;
friend istream &operator>>(istream &in, Student &p){
in>>p.name>>p.age>>p.math>>p.liter;
return in;
}
friend ostream &operator<<(ostream &out, Student p){
out<<p.name<<" "<<p.age<<" "<<p.math<<" "<<p.liter<<"
"<<fixed<<setprecision(2)<<p.gettotal();
return out;
}
float gettotal(){
return (math+liter)/2;
}
};
int main(){
int n;
cin>>n;
Student s[100];
for(int i=0;i<n;i++){
cin>>s[i];
}
int m1=s[0].age; int k1=0;
for(int i=0;i<n;i++){
if(s[i].age>m1){
m1=s[i].age;
k1=i;
}
}
cout<<s[k1].name<<endl;
int m2=s[0].gettotal(); int k2=0;
for(int i=0;i<n;i++){
if(s[i].gettotal()>m2){
m2=s[i].gettotal();
k2=i;
}
}
cout<<s[k2].name<<endl;
int m3=s[0].gettotal(); int k3=0;
for(int i=0;i<n;i++){
if(s[i].gettotal()<m3){
m3=s[i].gettotal();
k3=i;
}
}
cout<<s[k3].name<<endl;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(s[i].age>s[j].age){
Student tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
}
for(int i=0;i<n;i++){
cout<<s[i]<<endl;
}
return 0;
}

You might also like