class này có các phương thức sau: hàm contructor, nhập,xuất, cộng (lấy phân số thứ nhất cộng phân số thứ hai, và phần nguyên thứ nhất cộng phần nguyên thứ hai. Nếu hỗn số nào có phần [r]
(1)Mục lục
CHỦ ĐỀ 1: CLASS
Lopps
LOPHS
LOPMANG
OOP_Set
LOPDATHUC 11
1718_2_LTHDT_Midterm_01 13
OOP_NDTN_ExA1 16
OOP_NDTN_ExA2 18
OOP_NDTN_ExB1 19
OOP_NDTN_ExB2 20
Chủ đề 2: fiend Quá tải toán tử : 22
Bài 1: LOPSV2 23
Bài 2: LOPMANGSV 24
Bài : TAPSOMOI 26
Bài 4: OOP_NDTN_ExB3 28
Bài 5: OOP_NDTN_ExA3 29
Bài 6: 1718_2_LTHDT_Midterm_02 30
Chủ đề 3: KHUÔN HÌNH 33
Template2 33
KhuonHinhTong 35
TEMPTAPSOMOI 37
Chủ đề 4: kế thừa 39
Bài 1: HCNHV 39
Bài 3: LTHDT_HonSo1 43
Bài 4: LTHDT_HonSo2 44
Chủ đề 5: Đa hình 46
Bài 1: QLINTERNET 46
(2)CHỦ ĐỀ 1: CLASS Lopps
Xây dựng lớp phân số cho phép thực thao tác: Nhập, xuất
2 Lấy tử số, mẫu số
3 Gán giá trị cho tử số, mẫu số Nghịch đảo, rút gọn
5 Cộng, trừ, nhân, chia, so sánh với phân số khác
Viết chương trình sử dụng lớp phân số để giải yêu cầu sau Input: Gồm dòng
- Dòng phân số X có số tử mẫu số - Dòng 2: chứa số nguyên k
Output:
- Dòng 1: Xuất tử phân số X - Dòng 2: Xuất mẫu phân số X
- Dòng 3: Phân số nghịch đảo phân số X - Dòng 4: Phân số rút gọn phân số X
- Dòng 5: xuất phân số Y (Phân số Y phân số có tử mẫu tính sau: tử Y = tử X + k
mẫu Y = mẫu X + k)
- Dòng 6: Xuất phân số tích (sau rút gọn) phân số X phân số Y
2 1
2 4/2 1/2 3/5 3/10
#include <iostream> using namespace std; int UCLN(int a, int b) { int temp;
while (b != 0) {
temp = a % b; a = b;
b = temp; }
return a; }
class PS{ int tu, mau; public: //get-set
(3)int getMau(){return mau;}
PS(int t=0, int m=1){ tu = t; mau= m; } PS(const PS &p) { tu = p.tu; mau= p.mau; } ~PS(){}
//nhap xuat
friend istream& operator >> (istream& is, PS &p){ is>> p.tu>>p.mau;
return is; }
friend ostream& operator << (ostream& os, PS &p){ os<< p.tu <<"/"<< p.mau;
return os; }
PS RutGonPS(){
int ucln= UCLN(tu, mau); return PS(tu/ucln, mau/ucln); //doi void -> PS
//tu /= ucln; //mau /=ucln; }
PS NghichDaoPS(){ return PS(mau, tu);} //phep toan: + - / * , logic so sanh PS operator + (PS p){
int a= tu*p.mau + p.tu*mau; int b = mau* p.mau;
return PS(a,b); }
PS operator - (PS p){
int a= tu*p.mau - p.tu*mau; int b = mau* p.mau;
return PS(a,b); }
PS operator * (PS p){ int a= tu*p.tu; int b = mau* p.mau; return PS(a,b); }
PS operator / (PS p){ int a= tu*p.mau; int b = mau* p.tu; return PS(a,b); }
bool operator > (PS p){
return (tu*p.mau > p.tu*mau); }
//lm tiep
//ham khac : ham cong so nguyen
PS CongSoNguyen(int k){ return PS(tu+k, mau +k); }
(4)int main(){ PS x; cin>> x;
//cout<<x<<endl; int k;
cin>>k;
cout<< x.getTu()<<endl; cout<< x.getMau()<<endl; PS p2 = x.NghichDaoPS(); cout<<p2 <<endl;
PS p3 = x.RutGonPS(); cout<<p3 <<endl;
PS p4 = x.CongSoNguyen(k); cout<<p4<<endl;
PS p5 = x * p4;
PS p6 = p5.RutGonPS(); cout<<p6<<endl; return 0;
}
LOPHS
Thông tin học sinh bao gồm: Họ tên
Điểm văn, toán
Xây dựng lớp học sinh cho phép thực thao tác: Nhập, xuất
Lấy họ tên, điểm văn, toán
Gán giá trị cho họ tên, điểm văn, điểm tốn Tính điểm trung bình
Xếp loại theo tiêu chí: Gioi (>= 8.0), Kha (>= 7.0) Trung binh (>= 5.0), Yeu (< 5) Viết chương trình giải sau: Input:
- Dòng 1: số nguyên N (với N<=100)
- Nx3 dòng thông tin N học sinh, với dịng thơng tin học sinh gồm: họ tên, điểm toán văn
Output:
- Xuất họ tên học sinh có điểm trung bình cao loại học sinh
3
(5)1 2
Tran Van B 3
4
Trinh Thi C 10
9
1 Khai báo chuỗi, ví dụ:
string s; //lưu ý: thư viện: #include <string>
2 Nhập vào chuỗi khơng có khoảng trắng
cin>>s;
3 Nhập chuỗi có khoảng trắng
getline(cin,s);
4 Nhập chuỗi, mà trước nhập số:
int n; cin>>n;
cin.ignore();
getline(cin,s);
5 Nhập chuỗi, mà trước nhập vào dãy có kết thúc ctrl + z
int a[100] , n = 0; int x;
while (cin>>x){ a[n++] = x; }
cin.clear();
getline(cin,s);
#include <iostream> #include <string> using namespace std; class HS{
double dvan, dtoan; string hoten; public:
//get-set
string getHoTen(){return hoten;} //ktao - huy
HS(string s=" -", double t=0, double v=0){ hoten=s; dvan = v; dtoan=t;
}
HS(const HS &hs){
hoten=hs.hoten; dvan = hs.dvan; dtoan=hs.dtoan; }
~HS(){} //nhap xuat
(6)is>>hs.dtoan>> hs.dvan; return is;
}
friend ostream& operator << (ostream& os , HS hs){ os<<hs.hoten << "|"<< hs.dtoan<< "|"<<hs.dvan<<endl; return os;
}
//dtb - xeploai
double getDTB(){ return (dvan + dtoan)/2; } string xeploaiHS(){
double dtb = getDTB(); if(dtb >= 8) return "Gioi"; if(dtb >= 7) return "Kha"; if(dtb >= 5) return "Trung binh"; return "Yeu";
} };
int main(){ int n; cin>>n; HS dsHS[100]; for(int i= 0; i< n; i++){ cin.ignore(); cin>>dsHS[i]; //cout<<dsHS[i]; }
int index= 0;
for(int i=1; i< n; i++){
if( dsHS[i].getDTB() > dsHS[index].getDTB() ) index = i;
}
//cout<<dsHS[index];
cout<<dsHS[index].getHoTen()<<endl; cout<<dsHS[index].xeploaiHS()<<endl; return 0;
}
LOPMANG
Xây dựng lớp mảng cho phép thực thao tác sau: Nhập, xuất mảng
Lấy kích thước mảng Lấy phần tử vị trí
Gán giá trị cho phần tử vị trí Tìm phần tử mảng Sắp xếp tăng, giảm
Yêu cầu áp dụng lớp mảng để viết chương trình giải sau: Input:
- Dòng 1: nhập vào số nguyên X (x<=100)
(7)Output:
- Dòng 1: số lượng phần tử mảng
- Dịng 2: Xuất TRUE có giá trị X mảng, xuất FALSE khơng có giá trị X trong mảng
- Dòng 3: xuất mảng theo thứ tự tăng dần
- Dòng 4: Sau phần tử đầu mảng tăng lên đơn vị (mảng ban đầu) xuất mảng theo thứ tự giảm dần
3
2 4 4 TRUE
1 4 3 1
#include <iostream> using namespace std; /**
* NGUYEN KHAC VAN **
* int a[]= {1,2,3,4} //size=
* int a[]= new int[10]{1,2,3,4} //size= 10 (0 cho tu phan chua co) * int a[10]; //size= 10 {0,0,0,0 }
**/
class MANG{ int n; //sl ptu int a[100]; public: //get - set
int getN(){return n;} //indexer []
/**
* MANG m; m.a[i] ~ m[i] */
int& operator [] (int k) { return a[k];
}
//ktao - huy
MANG (int _n=1, int _a[]= new int[1]){ n = _n;
for(int i =0; i< _n; i++) a[i] = _a[i];
}
MANG (const MANG &m){ n = m.n;
for(int i =0; i< n; i++) a[i] = m.a[i]; }
~MANG(){ n=0; } //nhap - xuat
(8)//do somethings m.n=0;
while(is>>m.a[m.n]){ m.n++; } return is;
}
friend ostream& operator << (ostream& os, MANG m){ //do somethings
for(int i = 0; i< m.n; i++) cout<< m.a[i] << " "; return os;
}
//tim kiem
int searchMANG(int k){
//do somethings for(int i= 0; i< n; i++) if(a[i]== k)
return i;
return -1; }
//sap xep
void sortMANG(bool flag = true){
//flag = true (sx tang dan), false (sx giam dan) for(int i= 0; i< n-1; i++)
for(int j= i+1; j< n; j++) if(flag){
if(a[i] > a[j] ){
int tmp = a[i]; a[i]= a[j]; a[j]=tmp; }
} else{
if(a[i] < a[j] ){
int tmp = a[i]; a[i]= a[j]; a[j]=tmp; }
} } };
int main(){ int x; cin>>x;
MANG m; cin>>m;
cout<< m.getN()<<endl; if(m.searchMANG(x) >= ) cout<<"TRUE"<<endl; else
(9)MANG m1= m; m1.sortMANG(); cout<<m1<<endl;
m[0] = m[0] + 1; m.sortMANG(false); cout<<m<<endl; }
OOP_Set
Xây dựng chương trình quản lý đối tượng Tập Hợp (Set), biết rằng: • Đối tượng Tập Hợp chứa N số nguyên
• Các đối tượng Tập Hợp tương tác với qua phép toán: o Phép Giao (Intersect): kết phép giao tập hợp A B
là tập hợp chứa giá trị vừa thuộc A, vừa thuộc B
o Phép Hợp (Union): kết phép hợp tập hợp A B tập hợp chứa tất giá trị thuộc A thuộc B
Yêu cầu:
1 Xây dựng lớp đối tượng Tập Hợp (Set) có đầy đủ thành phần liệu phương thức cần thiết Việc xây dựng chương trình phải thực phương pháp lập trình hướng đối tượng, thể nguyên lý đóng gói chế che dấu liệu
2 Sử dụng kĩ thuật cấp phát động để tạo mảng lưu giá trị Tập Hợp
3 Input:
o Dòng thứ nhất, chứa số nguyên N cho biết số lượng phần tử tập hợp thứ
o Dòng thứ hai, chứa N số nguyên cho biết giá trị phần tử tập hợp thứ Mỗi số nguyên cách khoảng trắng
o Dòng thứ ba, chứa số nguyên M cho biết số lượng phần tử tập hợp thứ hai
o Dòng thứ tư, chứa M số nguyên cho biết giá trị phần tử tập hợp thứ hai Mỗi số nguyên cách khoảng trắng
4 Output:
• Dịng thứ nhất: chứa N số ngun giá trị phần tử tập hợp thứ Mỗi số nguyên cách khoảng trắng
• Dòng thứ hai: chứa M số nguyên giá trị phần tử tập hợp thứ hai Mỗi số ngun cách khoảng trắng
• Dịng thứ ba: chứa kết phép giao tập hợp thứ thứ hai Các giá trị tập hợp kết xếp theo thứ tự tăng dần Nếu tập hợp rỗng xuất số
• Dòng thứ tư: chứa kết phép hợp tập hợp thứ thứ hai Các giá trị tập hợp kết xếp theo thứ tự tăng dần Nếu tập hợp rỗng xuất số
(10)class Set { private: int *a; int n; public:
void nhap(); void xuat(); int getn();
int getphantu (int i); };
void Set::nhap() { cin >> n; a = new int[n];
for (int i = ; i < n ; ++i) cin >> a[i]; }
void Set::xuat() {
for (int i = ; i < n ; ++i) cout << a[i] << " "; }
int Set::getn() { return n; }
int Set::getphantu (int i) { return a[i];
}
void giao (Set a , Set b) { int c[100];
int n = 0; int dem = 0;
for (int i = ; i < a.getn() ; ++i) { for (int j = ; j < b.getn() ; ++j) {
if(a.getphantu(i) == b.getphantu(j)) { c[n++] = a.getphantu(i);
++dem; break; }
} }
if (n == 0) cout << 0; else {
sort (c , c + n);
for (int i = ; i < n ; ++i) cout << c[i] << " "; }
}
void hop (Set a , Set b) { int c[100];
int n = 0;
for (int i = ; i < a.getn() ; ++i) c[n++] = a.getphantu(i); for (int i = ; i < b.getn() ; ++i) {
int dem = 0;
for (int j = ; j < a.getn() ; ++j) {
(11)}
if (dem == 0) c[n++] = b.getphantu(i); }
if (n == 0) cout << 0; else {
sort (c , c + n);
for (int i = ; i < n ; ++i) cout << c[i] << " "; }
}
int main() { Set a , b; a.nhap(); b.nhap(); a.xuat(); cout << endl; b.xuat(); cout << endl; giao (a , b); cout << endl; hop (a , b); return 0; }
LOPDATHUC
Xây dựng lớp đối tượng Đa thức (Polynomial) để biểu diễn đa thức có dạng anxn + an-1xn-1 + an-2xn-2 + … + a2x2 + a1x + a0
Yêu cầu:
1 Xây dựng lớp đối tượng với đầy đủ thành phần liệu cần thiết, bao gồm: - số nguyên không âm biểu diễn bậc đa thức
- mảng hệ số kiểu số thực Xây dựng phương thức khởi tạo:
- Khởi tạo không tham số với bậc (đa thức bậc 0) - Khởi tạo chép
3 Xây dựng phương thức tính giá trị đa thức biết giá trị biến x Xây dựng phương thức tính đạo hàm bậc đa thức
5 Xây dựng phương thức nạp chồng toán tử nhập xuất cho đa thức Lưu ý:
Khi xuất đa thức, SV cần kiểm tra định dạng đơn thức trường hợp sau: - Hệ số số âm xuất dấu – (dấu trừ) đứng trước hệ số
- Hệ số số dương xuất dấu + (dấu cộng) đứng trước hệ số (ngoại trừ hệ số đầu tiên) - Hệ số khơng cần xuất hệ số
- Hệ số khơng cần xuất đơn thức
- Số mũ khơng cần xuất số mũ biến x - Số mũ xuất hệ số
Input:
- Dòng số nguyên không âm N cho biết bậc đa thức - Dòng thứ hai N + số thực cho biết hệ số từ N đến đa thức - Dòng thứ ba số thực K cho biết giá trị biến x để tính giá trị đa thức Output:
(12)- Dòng thứ hai đạo hàm bậc đa thức ban đầu, xuất theo định dạng - Dòng thứ ba giá trị đạo hàm bậc đa thức x = K
4
5 -4 -2
5x^4 – 4x^3 + 3x^2 – 2x + 20x^3 – 12x^2 + 6x – 122
#include <iostream> #include <cmath> using namespace std; class DaThuc { private: int n;
double a[100]; public:
void Nhap() { cin >> n;
for (int i = ; i <= n ; ++i) cin >> a[i]; }
void XuatMotSoHang (int a , int n , int &dem) { if (a != 0) {
if (dem == 0) {
if (n == 0) cout << a; if (n == 1) cout << a << "x"; if (n > 1) cout << a << "x^" << n; ++dem;
} else {
if (dem == 1) { if (n == 0) {
if (a > 0) cout << "+" << a; if (a < 0) cout << a; }
if (n == 1) {
if (a == 1) cout << "+x"; if (a == -1) cout << "-x";
if (a < -1 || (a > -1 && a < 0)) cout << a << "x"; if (a > || (a < && a > 0)) cout << "+" << a << "x"; }
if (n > 1) {
if (a == 1) cout << "+x^" << n; if (a == -1) cout << "-x^" << n;
if (a < -1 || (a > -1 && a < 0)) cout << a << "x^" << n; if (a > || (a < && a > 0)) cout << "+" << a << "x^" << n; }
} } } }
(13)int dem = 0;
for (int i = ; i <= n ; ++i) {
XuatMotSoHang (a[i] , n - i , dem); }
}
void DaoHam() {
for (int i = ; i <= n ; ++i) { a[i] = a[i] * (n - i); }
n; Xuat(); }
double GiaTri (double x) { double giatri = 0;
for (int i = ; i <= n ; ++i) { giatri += a[i] * pow (x , n - i); }
return giatri; }
};
int main() { DaThuc a; double x; a.Nhap(); cin >> x; a.Xuat(); cout << endl; a.DaoHam();
cout << endl << a.GiaTri (x); return 0;
}
1718_2_LTHDT_Midterm_01
Xây dựng lớp Employee (Nhân viên) theo mô tả sau:
Employee - id: int
- firstName: String - lastName: String - salary: double
+ Employee(id:int, firstName:String, lastName:String, salary:double) + getID():int
+ getFirstName():String + getLastName():String + getName():String + getSalary():double
+ setSalary(salary:double):void + getAnnualSalary():double
+ raiseSalary(percent:double):double + toString():String
(14)Cho biết:
- Phương thức getName trả chuỗi “firstName lastName”;
- Phương thức getAnnualSalary trả giá trị lương năm = 12 * salary
- Phương thức raiseSalary thực việc tăng lương nhân viên theo % trả mức lương sau tăng;
- Phương thức toString trả chuỗi thông tin nhân viên theo định dạng: “Employee[id=?,name=firstName lastName,salary=?]”;
Yêu cầu: phải thực theo phương pháp lập trình hướng đối tượng yêu cầu đề Bài làm không phương pháp sai u cầu khơng tính điểm
Lưu ý: lương nhân viên xuất theo dạng tiền tệ, bắt đầu kí tự $ có tối đa số lẻ phần thập phân
Input:
- Dòng - 4: thông tin nhân viên;
- Dòng 5: giá trị số thực cho biết số % tăng lương cho nhân viên Output:
- Dòng 1: thông tin nhân viên xuất theo định dạng mơ tả - Dịng 2: mức lương nhân viên sau tăng
- Dòng 3: lương năm nhân viên (áp dụng mức lương sau tăng) 12
Up Coder 5000 15
***nhớ chỉnh sang c++11 trở lên***
Employee[id=12,name=Up Coder,salary=$5000.00] $5750.00
$69000.00
#include <iostream> #include <iomanip> #include <string> using namespace std; class Employee{ int id;
string firstName, lastName; double salary;
public:
int getID(){ return id; }
string getFirstName(){ return firstName; } string getLastName(){ return lastName; }
string getName(){ return firstName +" " + lastName; } double getSalary(){ return salary; }
void setSalary(double _salary){ salary = _salary;} double getAnnualSalary(){ return 12*salary; } double raiseSalary(double percent){
salary = salary*(1 + percent); return salary;
}
string toString(){
(15)return s; }
Employee(int _id=0, string _firstName="firstName", string _lastName="lastName", double _salary= 0){ id = _id; firstName = _firstName; lastName = _lastName; salary = _salary;
}
friend istream& operator >> (istream& is, Employee &e){ is>> e.id >> e.firstName >> e.lastName >> e.salary; return is;
}
friend ostream& operator << (ostream& os, Employee e){ os<< "Employee[id= " << e.id << ",name=" << e.getName() <<",salary= $";
os<< fixed << setprecision(2) << e.salary; os<< "]"<<endl;
return os; }
Employee operator ++() { // a++ salary = salary*(1 + 0.1); return *this;
}
Employee operator ++(int){ // ++a Employee res = *this;
salary =salary*(1 + 0.1); return res;
//salary = salary*(1 + 0.1); //return *this;
}
Employee operator (){ //a salary = salary*(1 - 0.1); return *this;
}
Employee operator (int){ // a Employee res = *this;
salary = salary*(1 - 0.1); return res;
//resalary = salary*(1 - 0.1); //return *this;
}
Employee operator + ( double k){ salary = salary+k;
return *this; }
Employee operator - (double k){ salary = salary - k;
return *this; }
bool operator <(Employee em){
return (getAnnualSalary() < em.getAnnualSalary()); }
bool operator >(Employee em){
(16)}
bool operator ==(Employee em){
return (getAnnualSalary() == em.getAnnualSalary()); }
bool operator !=(Employee em){
return (getAnnualSalary() != em.getAnnualSalary()); }
};
int main(){
Employee emp1 , emp2; cin>>emp1 >> emp2; double plus1, plus2; cin>>plus1>> plus2;
cout<<emp1; cout<<emp2;
if(emp1== emp2)
cout<<"BANG NHAU"<<endl; if(emp1 < emp2)
cout<<"NHO HON"<<endl; if(emp1> emp2)
cout<<"LON HON"<<endl;
cout<<"$"<<(emp1++ - plus1 ).getSalary()<<endl; cout<<"$"<<( emp2 + plus2 ).getSalary()<<endl; return 0;
} /** 12 Up Coder 5000 13 Fit Hcmup 6500.3 1500 1000.75
Employee[id= 12,name=Up Coder,salary= $5000.00] Employee[id= 13,name=Fit Hcmup,salary= $6500.30] NHO HON
$3500.00 $6851.02 **/
OOP_NDTN_ExA1
Ta có định nghĩa kiểu liệu ARRINT1: P= a0 a1⋯an-1
(17)Ví dụ: len=6 mảng a[]={6;5;4;3;2;1} → P= 123456 Xây dựng lớp ARRINT1 dùng để mô tả đối tượng trên:
- Có hàm khởi tạo mặc định để tạo đa thức len=1 a0 =
- Có hàm khởi tạo tham số kiểu int truyền vào thuộc tính len lớp ARRINT1 để tạo đa thức mà hệ số
- Có hàm khởi tạo tham số độ dài len mảng số nguyên chứa an, an-1, …, a0 (kiểu int[])
- Có property getLen, setLen giá trị len ARRINT1
- Phương thức Input: với tham số truyền vào gồm số nguyên cho biết len mảng số nguyên biểu diễn giá trị hệ số từ a[n-1] đến a[0].-
- Phương thức Output: xuất thông tin theo dạng: len :a0 a1⋯an-1
Input:
o Dịng 1: số ngun N cho biết thuộc tính len
oDòng 2: N số nguyên cho biết giá trị hệ số từ a[N-1] đến a[0] (Trường hợp có “#” thực tạo ARRINT1 tham số len)
Output:
o Dòng 1: hiển thị ARRINT1 theo định dạng phương thức xuất 6
6
6:123456 3
#
3:111
#include<iostream> using namespace std;
void nhap_mang(int a[],int n) { for(int i=0;i<n;++i) cin>>a[i]; }
void ARRINT1(int a[],int n) { cout<<n<<": ";
if(a[0]==a[1] && a[0]==0) { for(int i=0;i<n;++i) cout<<1; }
else {
for(int i=n-1;i>=0; i) cout<<a[i]; }
}
void xuat_mang(int a[],int n) { for(int i=0;i<n;++i) cout<<a[i]<<" "; }
int main() { int a[100]; int n; cin>>n;
(18)}
OOP_NDTN_ExA2
Từ định nghĩa kiểu liệu ARRINT1: P= a0 a1⋯an-1
Trong đó, ARRINT1 có thuộc tính len =n (độ dài) mảng a[n] để lưu (ký tự số), giá trị phạm vi từ → giá trị an-1 #
Ví dụ: len=6 mảng a[]={6;5;4;3;2;1} → P= 123456
Xây dựng tiếp phương thức sau:
- Phương thức getMod trả số nguyên với tham số truyền vào b (kiểu int) để tính tổng mod phần tử với tham số b
- Phương thức getOddNumber trả kiểu ARRINT1 với len số lượng chữ số lẻ mảng mảng a[] chứa số lẻ theo thứ tự nguyên thêm vào mảng
Ví dụ: Gọi getOddNumber cho P(6, a[]={1,2,3,4,5,6}) → Q(3, a[]={1,3,5}) Input:
o Dòng 1: số nguyên N cho biết thuộc tính len giá trị b
o Dòng 2: N số nguyên cho biết giá trị hệ số từ a[N-1] đến a[0] Output:
o Dòng 1: cho biết giá trị dùng getMod với số nguyên b o Dòng 2: hiển thị ARRINT1 sau thực gọi getOddNumber 6
3
2 2:13 4
1 1
4 4:11 #include<iostream>
using namespace std; void nhap(int *&a,int n) { a=new int[n];
for(int i=0;i<n;++i) cin>>a[i]; }
int getMod(int *a,int n,int b) { int tong=0;
for(int i=0;i<n;++i) { tong=tong+a[i]%b; }
return tong; }
void cap_phat(int *&a,int moi,int cu) { int *b=new int[cu];
for(int i=0;i<cu;++i) b[i]=a[i]; delete[] a;
a=new int[moi];
for(int i=0;i<cu;++i) a[i]=b[i]; delete[] b;
(19)void nhap_mang(int *&a,int &n,int x) { if(n==0) a=new int;
else cap_phat(a,n+1,n); a[n]=x;
++n; }
void xuat(int *a,int n) { cout<<n<<": ";
for(int i=0;i<n;++i) cout<<a[i]; }
void getOddNumber(int *a,int n) { int *b;
int m=0;
for(int i=n-1;i>=0; i) {
if(a[i]%2!=0) nhap_mang(b,m,a[i]); }
xuat(b,m); delete[] b; }
int main() { int *a; int n,b; cin>>n>>b; nhap(a,n);
cout<<getMod(a,n,b)<<endl; getOddNumber(a,n);
delete[] a; return 0; }
OOP_NDTN_ExB1
Ta có định nghĩa kiểu liệu ARRINT2: P= a0 a1⋯an-1
Trong đó, ARRINT2 có thuộc tính len =n (độ dài) mảng a[n] để lưu (ký tự số), giá trị phạm vi từ → giá trị an-1 #
Ví dụ: len=6 mảng a[]={6;5;4;3;2;1} → P= 123456 Xây dựng lớp ARRINT2 dùng để mô tả đối tượng trên:
- Có hàm khởi tạo mặc định để tạo đa thức len=1 a0 =
- Có hàm khởi tạo tham số kiểu int truyền vào thuộc tính len lớp ARRINT2 để tạo đa thức mà hệ số tăng dần theo bậc từ tới n-1
- Có hàm khởi tạo tham số độ dài len mảng số nguyên chứa an, an-1, …, a0 (kiểu int[])
- Có property getLen, setLen giá trị len ARRINT2
- Phương thức Input: với tham số truyền vào gồm số nguyên cho biết len mảng số nguyên biểu diễn giá trị hệ số từ a[n-1] đến a[0].-
- Phương thức Output: xuất thông tin theo dạng: len :a0 a1⋯an-1
Input:
(20)oDòng 2: N số nguyên cho biết giá trị hệ số từ a[N-1] đến a[0] (Trường hợp có “#” thực tạo ARRIN2 tham số len)
Output:
o Dòng 1: hiển thị ARRINT2 theo định dạng phương thức xuất
1
6:123456
#
3:123
#include<iostream> using namespace std; void nhap(char a[],int len) { for(int i=0;i<len;++i) { cin>>a[i];
} }
void xuat(char a[],int len) { for(int i=0;i<len;++i) { cout<<a[i]<<" "; }
}
void arr(char a[],int len) { cout<<len<<": "; if(a[0]=='#') {
for(int i=1;i<=len;++i) cout<<i; }
else {
for(int i=len-1;i>=0; i) cout<<a[i]; }
}
int main() { char a[100]; int len; cin>>len; nhap(a,len); arr(a,len); return 0; }
OOP_NDTN_ExB2
Từ định nghĩa kiểu liệu ARRINT2: P= a0 a1⋯an-1
Trong đó, ARRINT2 có thuộc tính len =n (độ dài) mảng a[n] để lưu (ký tự số), giá trị phạm vi từ → giá trị an-1 #
Ví dụ: len=6 mảng a[]={6;5;4;3;2;1} → P= 123456
Xây dựng tiếp phương thức sau:
- Phương thức getDiv trả số nguyên với tham số truyền vào
(21)- Phương thức getEvenNumber trả kiểu ARRINT2 với len số lượng chữ số chẵn mảng mảng a[] chứa số chẵn theo thứ tự thêm vào mảng
Ví dụ: getEvenNumber cho P(6, a[]={1,2,3,4,5,6}) → Q(3, a[]={2,4,6}) Input:
o Dòng 1: số nguyên N cho biết thuộc tính len giá trị b
o Dòng 2: N số nguyên cho biết giá trị hệ số từ a[N-1] đến a[0] Output:
o Dòng 1: cho biết giá trị dùng getDiv với số nguyên b
o Dòng 2: hiển thị ARRINT2 sau thực gọi getEvenNumber
2
5 4:2042
1
2 2:24 #include<iostream>
#include<string> using namespace std; void nhap(int *&a,int n) { a=new int[n];
for(int i=0;i<n;++i) cin>>a[i]; }
int getDiv(int *a,int n,int b) { int tong=0;
for(int i=0;i<n;++i) { tong=tong+a[i]/b; }
return tong; }
int dem_so_chan_trong_mang(int *a,int n) { int dem=0;
for(int i=0;i<n;++i) { if(a[i]%2==0) ++dem; }
return dem; }
void cap_phat(int *&a,int moi,int cu) { int *b=new int[cu];
for(int i=0;i<cu;++i) b[i]=a[i]; delete[] a;
a=new int[moi];
for(int i=0;i<cu;++i) a[i]=b[i]; delete[] b;
}
(22)else cap_phat(a,n+1,n); a[n]=x;
++n; }
void xoa(int *a,int &n,int vt) { for(int i=vt+1;i<n;++i) a[i-1]=a[i]; n;
cap_phat(a,n,n); }
void getEvenNumber(int *a,int n) { int *b;
int m=0;
for(int i=0;i<n;++i) {
if(a[i]%2==0) nhap_mang(b,m,a[i]); }
while(b[0]==0) xoa(b,m,0); cout<<m<<": ";
for(int i=m-1;i>=0; i) cout<<b[i]; }
int main() { int *a; int n,b; cin>>n>>b; nhap(a,n);
cout<<getDiv(a,n,b)<<endl; getEvenNumber(a,n); delete[] a;
return 0; }
Chủ đề 2: fiend Quá tải toán tử : Khai báo chuỗi, ví dụ:
string s; //lưu ý: thư viện: #include <string> Nhập vào chuỗi khơng có khoảng trắng
cin>>s;
3 Nhập chuỗi có khoảng trắng
getline(cin,s);
4 Nhập chuỗi, mà trước nhập số: int n;
cin>>n;
cin.ignore();
(23)5 Nhập chuỗi, mà trước nhập vào dãy có kết thúc ctrl + z int a[100] , n = 0;
int x;
while (cin>>x){ a[n++] = x; }
cin.clear();
getline(cin,s);
Bài 1: LOPSV2
Yêu cầu 1 xây dựng lớp sau kèm theo thao tác nó: - Lớp Điểm, gồm có thuộc tính:
+ mảng số thực: lưu danh sách điểm môn học (các điểm số thực >=0 <=10) + số lượng phần tử danh sách điểm
Thao tác: xây dựng toán tử >>, <<, [], =, lấy điểm trung bình cộng, phương thức khởi tạo (3 phương thức), phương thức hủy, phương thức get set
- Lớp SinhViên, gồm có thuộc tính + Họ tên (chuỗi có khoảng trắng)
+ Mã Sinh Viên (chuỗi khơng có khoảng trắng) + Điểm (thuộc lớp điểm khai báo trên)
Thao tác: xây dựng toán tử >>, <<, =, < (dựa vào điểm trung bình), lấy điểm trung bình cộng, phương thức khởi tạo (3 phương thức), phương thức hủy, phương thức get set
Yêu cầu 2: Viết chương trình sử dụng lớp sinh viên lớp điểm để giải sau: -Input:
+ Dòng 1: Nhập họ tên sinh viên + Dòng 2: nhập mã sinh viên
+ Dòng 3: Gồm nhiều số thực (mỗi số cách khoảng trắng) điểm sinh viên - Output: Xuất theo cấu trúc
+ Dòng 1: Ho Ten: họ tên sinh viên + Dòng 2: Ma Sinh Vien: mã sinh viên
+ Dịng 3: DTB: Điểm trung bình sinh viên ví dụ:
input
Nguyen Van A K42.11.22.33 10 10 5 output
Ho Ten: Nguyen Van A Ma Sinh Vien: K42.11.22.33 DTB: 7.5
Lưu ý: điểm trung bình số thực lấy xác chữ số thập phân #include <iostream>
#include <iomanip> #include <string> using namespace std; class Diem{
(24)int n;
double a[10]; public:
Diem(int _n= 1, double _a[] = new double[1]){ n = _n;
for(int i =0; i< n; i++) a[i]= _a[i];
}
Diem(const Diem &d){ n = d.n;
for(int i =0; i< n; i++) a[i]= d.a[i]; }
~Diem(){ n=0; }
double & operator[](int index){ return a[index];
}
friend istream& operator >> (istream& is, Diem &d){
d.n=0;
while(is>>d[d.n]){ d.n++; } return is;
}
friend ostream& operator << (ostream& os, Diem d){
for(int i=0; i< d.n; i++) os<<d[i]<< " "; return os; }
double getDTB(){ double Diemtb=0; for(int i=0; i < n; i++) Diemtb+= a[i]; return Diemtb/n; }
};
//ktao - huy SinhVien(){}
SinhVien(string _hoten, string _mssv, Diem _d ){ hoten= _hoten;
mssv= _mssv; diem = _d; }
SinhVien(const SinhVien &sv){ hoten= sv.hoten;
mssv= sv.mssv; diem = sv.diem; }
~SinhVien(){}
friend istream& operator >>(istream& is,SinhVien& SV){ getline(is,SV.hoten); is>>SV.mssv; is>>SV.diem; return is; }
friend ostream& operator <<(ostream& os,SinhVien SV){
os<<"Ho Ten: "<<SV.hoten <<endl; os<<"Ma Sinh Vien: "<<SV.mssv<<endl; os<< fixed<< setprecision(1) ;
os<< "DTB: "<<SV.diem.getDTB()<<endl; return os; } }; int main(){ SinhVien sv; cin>> sv; cout<<sv; return 0; }
Bài 2: LOPMANGSV
Yêu cầu1: xây dựng lớp MangSinhVien (mảng sinh viên) với thuộc tính sau: + Mảng chiều kiểu sinh viên (lớp sinh viên lớp miêu tả Lớp SinhVien) + số nguyên - lưu số lượng phần tử mảng
Xây dựng thao tác sau: - tải >>, <<,[], =
- phương thức khởi tạo, hủy, set get
- phương thức tính điểm trung bình mảng (tính trung bình tất điểm trung bình sinh viên) - phương thức trả vị trí sinh viên có điểm trung bình lớp (vị trí vị trí nằm mảng)
yêu cầu 2: Sử dụng lớp MangSinhVien để giải sau: - Input:
+ Dòng 1: nhập vào số nguyên N
(25)-Output:
- Xuất sinh viên có điểm trung bình cao ví dụ:
input
Nguyen Van A K42.11.22.33 10 10 5 Tran Thi C K43.10.20.13 10 10 5 output
Ho Ten: Tran Thi C
Ma Sinh Vien: K43.10.20.13 DTB: 7.7
Lưu ý: điểm trung bình số thực lấy xác chữ số thập phân #include <iostream>
#include <iomanip> #include <string> using namespace std; class Diem {
double a[10]; int n;
public:
double& operator [] (int i) {return a[i];} // khoi tao , huy
Diem (int N = , double A[] = new double [1]) { n = N;
for (int i = ; i < n ; ++i) a[i] = A[i]; }
Diem (Diem& d) { n = d.n;
for (int i = ; i < n ; ++i) a[i] = d[i]; }
~Diem () {n = 0;} // nhap xuat
friend istream& operator >> (istream& is , Diem& d) {
d.n = 0;
while (is >> d.a[d.n]) d.n ++; return is;
}
friend ostream& operator << (ostream& os , Diem d) {
for (int i = ; i < d.n ; ++i) os << d[i] << " "; return os;
}
int getN () {return n;}
double getA (int i) {return a[i];} double getDTB () {
double tong = 0;
friend istream& operator >> (istream& is , SinhVien& sv) {
getline (is , sv.hoten); is >> sv.mssv;
is >> sv.d; cin.clear(); }
friend ostream& operator << (ostream& os , SinhVien sv) {
os << "Ho Ten: " << sv.hoten << endl; os << "Ma Sinh Vien: " << sv.mssv << endl; os << "DTB: " << fixed << setprecision (1) << sv.getDTBSV();
}
double getDTBSV () { return d.getDTB(); }
bool operator < (SinhVien sv) {
return (getDTBSV() < sv.getDTBSV()) ? true : false;
} };
class MangSinhVien { int n;
SinhVien sv[100]; public:
friend istream& operator >> (istream& is , MangSinhVien& msv) {
is >> msv.n; cin.ignore();
for (int i = ; i < msv.n ; ++i) { is >> msv.sv[i];
}
(26)for (int i = ; i < n ; ++i) tong += a[i]; return tong / n;
}
bool operator < (Diem d) { return getDTB() < d.getDTB(); }
bool operator >= (Diem d) { return getDTB() >= d.getDTB(); }
};
class SinhVien { string hoten , mssv; Diem d;
public:
friend ostream& operator << (ostream& os , MangSinhVien msv) {
for (int i = ; i < msv.n ; ++i) os << msv.sv[i] << endl;
return os; }
void getDTBSVMax () { SinhVien svmax = sv[0]; for (int i = ; i < n ; ++i) {
if (svmax < sv[i]) svmax = sv[i]; }
cout << svmax; }
};
int main() {
MangSinhVien msv; cin >> msv;
// cout << msv; msv.getDTBSVMax(); return 0;
} Bài : TAPSOMOI
Yêu cầu 1:
Khai báo lớp có tên TapSoMoi (Tập Số Mới), với biến thành viên loại private có tên x,y,z,t có kiểu số nguyên (0<=x,y,z,t<=1000)
Viết hàm khởi tạo:
- Hàm khởi tạo mặc định có nội dung gán x, y, z, t
- Hàm khởi tạo thứ có tham số a,b,c,d, gán a, b, c, d cho biến thành viên x, y, z, t Cài đặt toán tử sau:
- Toán tử nhập >> xuất << đối tượng TapSoMoi (xem ví dụ để hiểu rõ thao tác xuất TapSoMoi) - Toán tử + cộng đối tượng TapSoMoi Thực phép cộng tương ứng biến thành viên đối tượng TapSoMoi (x cộng với x, y cộng với y, z cộng với z, t cộng với t), trả đối tượng kiểu TapSoMoi
- Toán tử < so sánh đối tượng TapSoMoi, tổng biến thành viên x,y,z,t TapSoMoi nhỏ xác định TapSoMoi nhỏ
- Tốn tử = gán đối tượng TapSoMoi Thực phép gán tương ứng biến thành viên đối tương TapSoMoi
- Toán tử ++ tăng đối tượng TapSoMoi Thực cộng vào giá trị biến thành viên x, t Yêu cầu 2:
Sử dụng cấu trúc trên, giải tập với yêu cầu sau: Input:
Gồm dòng, dòng chứa nguyên đại diện cho TapSoMoi Output:
- Dịng 1: Xuất thơng tin TapSoMoi - Dịng 2: Xuất thơng tin TapSoMoi
- Dòng 3: xuất chữ “true” (khơng có dấu “ ) TapSoMoi < TapSoMoi 2, ngược lại xuất “false” (khơng có dấu “ )
- Dòng 4: Xuất tổng TapSoMoi TapSoMoi
- Dòng 5: Xuất TapSoMoi sau thực thao tác ++ Ví dụ:
(27)2 3
[TapSoMoi] 2;1;3;1 [TapSoMoi] 3;4;1;3 true
[TapSoMoi] 5;5;4;4 [TapSoMoi] 3;1;3;2
#include <iostream> #include <fstream> using namespace std; class TapSoMoi { private:
int x , y , z , t; public:
int a , b , c , d; void TapSoMoi1(); void TapSoMoi2(); ~TapSoMoi(); };
void TapSoMoi::TapSoMoi1() { x = 0;
y = 0; z = 0; t = 0; }
void TapSoMoi::TapSoMoi2() { x = a;
y = b; z = c; t = d; }
TapSoMoi::~TapSoMoi() { }
istream& operator >> (istream& is , TapSoMoi& A) { is >> A.a >> A.b >> A.c >> A.d;
return is; }
ostream& operator << (ostream& os , TapSoMoi A) { os << "[TapSoMoi] " << A.a << ";" << A.b << ";" << A.c << ";" << A.d;
return os; }
TapSoMoi operator + (TapSoMoi A , TapSoMoi B) { TapSoMoi C;
C.a = A.a + B.a; C.b = A.b + B.b; C.c = A.c + B.c; C.d = A.d + B.d; return C; }
bool operator < (TapSoMoi A , TapSoMoi B) {
return (A.a + A.b + A.c + A.d < B.a + B.b + B.c + B.d) ? true : false;
}
void operator ++ (TapSoMoi &A) { ++A.a;
++A.d; }
int main() { TapSoMoi a , b; cin >> a >> b;
cout << a << endl << b << endl; if (a < b) cout << "true" << endl; else cout << "false" << endl; TapSoMoi tong = a + b; cout << tong << endl; ++a;
(28)Bài 4: OOP_NDTN_ExB3
Từ định nghĩa kiểu liệu ARRINT2: P= a0 a1⋯an-1
Trong đó, ARRINT2 có thuộc tính len =n (độ dài) mảng a[n] để lưu (ký tự số), giá trị phạm vi từ → giá trị an-1 #
Ví dụ: len=6 mảng a[]={6;5;4;3;2;1} → P= 123456 Xây dựng tiếp phương thức sau:
Quá tải toán tử -: Lấy hiệu hệ số cấp lại với Trong kết phép tích có giá trị x < x= |x|
Input:
- Dòng 1: số nguyên N cho biết len ARRINT2 P số nguyên M cho biết len ARRINT2 Q - Dòng 2: N số nguyên cho biết giá trị hệ số P từ [N-1] đến [0]
- Dòng 3: M số nguyên cho biết giá trị hệ số Q từ [N-1] đến [0] Output:
- Dòng 1: hiển thị ARRINT2 hiệu P – Q
#include<iostream> #include<cmath> using namespace std; void nhap(int *&a,int n) { a=new int[n];
for(int i=0;i<n;++i) cin>>a[i]; }
void dao_mang(int *&a,int n) { int *b=new int[n];
for(int i=0;i<n;++i) b[i]=a[n-1-i]; for(int i=0;i<n;++i) a[i]=b[i]; delete[] b;
}
void cap_phat(int *&a,int moi,int cu) { int *b=new int[cu];
for(int i=0;i<cu;++i) b[i]=a[i]; delete[] a;
a=new int[moi];
for(int i=0;i<cu;++i) a[i]=b[i]; delete[] b;
}
void xoa(int *a,int n,int vt) { for(int i=vt+1;i<n;++i) a[i-1]=a[i]; n;
cap_phat(a,n,n); }
void hieu(int *a,int n,int *b,int m) { while(a[0]==0) xoa(a,n,0); while(b[0]==0) xoa(b,m,0); if(n>=m) {
cout<<n<<": ";
for(int i=0;i<m;++i) cout<<abs(a[i]-b[i]); for(int i=m;i<n;++i) cout<<a[i];
} else {
cout<<m<<": ";
for(int i=0;i<n;++i) cout<<abs(a[i]-b[i]); for(int i=n;i<m;++i) cout<<b[i];
} }
int dem_so_chu_so(int a) { int dem=0;
while(a!=0) { ++dem; a=a/10; }
return dem; }
void xuat(int *a,int n) {
for(int i=0;i<n;++i) cout<<a[i]<<" "; }
(29)dao_mang(b,m); hieu(a,n,b,m); delete[] a; delete[] b; return 0; }
Bài 5: OOP_NDTN_ExA3
Từ định nghĩa kiểu liệu ARRINT1: P= a0 a1⋯an-1
Trong đó, ARRINT1 có thuộc tính len =n (độ dài) mảng a[n] để lưu (ký tự số), giá trị phạm vi từ → giá trị an-1 #
Ví dụ: len=6 mảng a[]={6;5;4;3;2;1} → P= 123456 Xây dựng tiếp phương thức sau:
Quá tải toán tử +: Cộng hệ số cấp lại với Trong kết phép cộng có giá trị x ≥ 10 x=x - 10
Input:
- Dòng 1: số nguyên N cho biết len ARRINT1 P số nguyên M cho biết len ARRINT1 Q - Dòng 2: N số nguyên cho biết giá trị hệ số P từ [N-1] đến [0]
- Dòng 3: M số nguyên cho biết giá trị hệ số Q từ [N-1] đến [0] Output:
- Dòng 1: hiển thị ARRINT1 tổng P+Q
#include<iostream> using namespace std; void nhap(int *&a,int n) { a=new int[n];
for(int i=0;i<n;++i) cin>>a[i]; }
void xuat(int *a,int n) { cout<<n<<": ";
for(int i=0;i<n;++i) cout<<a[i]; }
void dao_mang(int *&a,int n) { int *b=new int[n];
for(int i=0;i<n;++i) b[i]=a[n-1-i]; for(int i=0;i<n;++i) a[i]=b[i]; delete[] b;
}
void cap_phat(int *&a,int moi,int cu) { int *b=new int[cu];
for(int i=0;i<cu;++i) b[i]=a[i]; delete[] a;
a=new int[moi];
void arr(int *a,int n,int *b,int m) { int *c;
int p=0;
dao_mang(a,n); dao_mang(b,m); if(n>=m) {
for(int i=0;i<m;++i) { int tong=a[i]+b[i];
if(tong>=10) tong=tong-10; nhap_mang(c,p,tong); }
for(int i=m;i<n;++i) nhap_mang(c,p,a[i]); xuat(c,p);
} else {
for(int i=0;i<n;++i) { int tong=a[i]+b[i];
if(tong>=10) tong=tong-10; nhap_mang(c,p,tong); }
for(int i=n;i<m;++i) nhap_mang(c,p,b[i]); xuat(c,p);
} }
(30)for(int i=0;i<cu;++i) a[i]=b[i]; delete[] b;
}
void nhap_mang(int *&a,int &n,int x) { if(n==0) a=new int;
else cap_phat(a,n+1,n); a[n]=x;
++n; }
int *a,*b; int m,n; cin>>n>>m; nhap(a,n); nhap(b,m); arr(a,n,b,m); delete[] a; delete[] b; return 0; }
Bài 6: 1718_2_LTHDT_Midterm_02 Xây dựng lớp Employee (Nhân viên) theo mô tả sau:
Employee - id: int
- firstName: String - lastName: String - salary: double
+ Employee(id:int, firstName:String, lastName:String, salary:double) + getID():int
+ getFirstName():String + getLastName():String + getName():String + getSalary():double
+ setSalary(salary:double):void + getAnnualSalary():double
+ raiseSalary(percent:double):double + toString():String
Cho biết:
- Phương thức getName trả chuỗi “firstName lastName”;
- Phương thức getAnnualSalary trả giá trị lương năm = 12 * salary
- Phương thức raiseSalary thực việc tăng lương nhân viên theo % trả mức lương sau tăng; - Phương thức toString trả chuỗi thông tin nhân viên theo định dạng: “Employee[id=?,name=firstName
lastName,salary=?]”;
Yêu cầu: phải thực theo phương pháp lập trình hướng đối tượng yêu cầu đề Bài làm không phương pháp sai u cầu khơng tính điểm
Lưu ý: lương nhân viên xuất theo dạng tiền tệ, bắt đầu kí tự $ có tối đa số lẻ phần thập phân
Bổ sung vào lớp Employee xây dựng phương thức sau:
- Phương thức nạp chồng tốn tử >> (nhập) << (xuất) thơng tin nhân viên;
- Phương thức nạp chồng toán tử ++(tăng trước tăng sau) ––(giảm trước giảm sau) cho nhân viên Biết toán tử thực việc tăng (hoặc giảm) 10% cho lương nhân viên;
- Phương thức nạp chồng toán tử + (cộng) – (trừ) thực phép toán cộng (hoặc trừ) nhân viên với số thực để tăng (hoặc giảm) lương nhân viên tương ứng với giá trị số thực
- Phương thức nạp chồng toán tử > (so sánh lớn), < (so sánh bé), == (so sánh bằng), != (so sánh khác) Các toán tử thực việc so sánh lương năm nhân viên
Yêu cầu:
(31)Input:
- Dịng - 4: thơng tin nhân viên thứ (Emp1); - Dòng - 8: thông tin nhân viên thứ hai (Emp2);
- Dòng 9: số thực A B cho biết lượng tăng (giảm) lương nhân viên Output:
- Dịng 1: thơng tin nhân viên Emp1 theo định dạng - Dịng 2: thơng tin nhân viên Emp2 theo định dạng
- Dòng 3: xuất “BANG NHAU” lương Emp1 == lương Emp2 xuất “LON HON” lương Emp1 > lương Emp2
xuất “NHO HON” lương Emp1 < lương Emp2
- Dòng 4: lương nhân viên Emp1 sau thực phép toán (Emp1++)–A // Chạy c++11 #include <iostream>
#include <iomanip> #include <string> using namespace std; class Employee{ int id;
string firstName, lastName; double salary;
public:
int getID(){ return id; }
string getFirstName(){ return firstName; } string getLastName(){ return lastName; }
string getName(){ return firstName +" " + lastName; } double getSalary(){ return salary; }
void setSalary(double _salary){ salary = _salary;} double getAnnualSalary(){ return 12*salary; } double raiseSalary(double percent){
salary = salary*(1 + percent); return salary;
}
string toString(){
string s ="Employee[id= " + to_string(id) + ",name=" + getName() +",salary= $" +to_string(salary) +"]\n";
return s; }
Employee(int _id=0, string _firstName="firstName", string _lastName="lastName", double _salary= 0){ id = _id; firstName = _firstName; lastName = _lastName; salary = _salary;
}
friend istream& operator >> (istream& is, Employee &e){ is>> e.id >> e.firstName >> e.lastName >> e.salary; return is;
}
friend ostream& operator << (ostream& os, Employee e){ os<< "Employee[id= " << e.id << ",name=" << e.getName() <<",salary= $";
(32)return os; }
Employee operator ++() { // a++ salary = salary*(1 + 0.1); return *this;
}
Employee operator ++(int){ // ++a Employee res = *this;
salary =salary*(1 + 0.1); return res;
//salary = salary*(1 + 0.1); //return *this;
}
Employee operator (){ //a salary = salary*(1 - 0.1); return *this;
}
Employee operator (int){ // a Employee res = *this;
salary = salary*(1 - 0.1); return res;
//resalary = salary*(1 - 0.1); //return *this;
}
Employee operator + ( double k){ salary = salary+k;
return *this; }
Employee operator - (double k){ salary = salary - k;
return *this; }
bool operator <(Employee em){
return (getAnnualSalary() < em.getAnnualSalary()); }
bool operator >(Employee em){
return (getAnnualSalary() > em.getAnnualSalary()); }
bool operator ==(Employee em){
return (getAnnualSalary() == em.getAnnualSalary()); }
bool operator !=(Employee em){
return (getAnnualSalary() != em.getAnnualSalary()); }
};
int main(){
(33)
cout<<emp1; cout<<emp2;
if(emp1== emp2)
cout<<"BANG NHAU"<<endl; if(emp1 < emp2)
cout<<"NHO HON"<<endl; if(emp1> emp2)
cout<<"LON HON"<<endl;
cout<<"$"<<(emp1++ - plus1 ).getSalary()<<endl; cout<<"$"<<( emp2 + plus2 ).getSalary()<<endl; return 0;
} /** 12 Up Coder 5000 13 Fit Hcmup 6500.3 1500 1000.75
Employee[id= 12,name=Up Coder,salary= $5000.00] Employee[id= 13,name=Fit Hcmup,salary= $6500.30] NHO HON
$3500.00 $6851.02 **/
Chủ đề 3: KHUÔN HÌNH Template2
Xây dựng cấu trúc mảng (hoặc lớp) có sử dụng khn hình, áp dụng cho sau:
Viết chương trình nhập vào dãy số, yêu cầu xuất tổng dãy số hình Với qui ước:
- Kiểu a: số nguyên - Kiểu b: phân số Dữ liệu đầu vào:
- Dòng đầu tiên: nhập vào loại kiểu dãy số (kiểu a b) - Các dòng lại, dòng chứa số thuộc kiểu dòng Dữ liệu đầu ra:
- Gồm số (thuộc kiểu cho) Lưu ý:
- Nếu kết phân số phân số rút gọn
(34)Input: a
Output: 10
Input: b 2 3 4 Output:
163/60 #include <iostream>
#include <fstream> using namespace std; struct PHAN_SO { int tu , mau; };
int UCLN (int a , int b) { while (b != 0) { int c = a % b; a = b; b = c; }
return a; }
void rut_gon (PHAN_SO &a) { int ucln = UCLN (a.tu , a.mau); a.tu /= ucln;
a.mau /= ucln; }
istream& operator >> (istream& is , PHAN_SO& a) { is >> a.tu >> a.mau;
return is; }
ostream& operator << (ostream& os , PHAN_SO a) { rut_gon (a);
os << a.tu << "/" << a.mau; return os;
}
PHAN_SO operator + (PHAN_SO a , PHAN_SO b) { PHAN_SO tong;
tong.tu = a.tu * b.mau + a.mau * b.tu; tong.mau = a.mau * b.mau;
return tong; }
template <class T> void nhap_mang (T a[] , int &n , T x) { a[n] = x;
++n; }
(35)T tong = a[0];
for (int i = ; i < n ; ++i) tong = tong + a[i]; return tong;
}
int main() { char s; cin >> s; switch (s) { case 'a': {
int a[100] , n = , x;
while (cin >> x) nhap_mang <int> (a , n , x); cout << tinh_tong <int> (a , n);
} break; case 'b': { int n = 0;
PHAN_SO a[100] , x;
while (cin >> x) nhap_mang <PHAN_SO> (a , n , x); cout << tinh_tong <PHAN_SO> (a , n);
} break; }
return 0; }
KhuonHinhTong
Xây dựng chương trình có sử dụng khn hình, áp dụng cho sau:
Viết chương trình nhập vào dãy số gồm nhiều loại số, yêu cầu xuất tổng loại số hình
Với qui ước: o Kiểu a: số nguyên o Kiểu b: số phân số Dữ liệu đầu vào:
o Gồm nhiều dòng lại, dòng chứa kiểu số thuộc kiểu Dữ liệu đầu ra: Ghi dòng:
o Dòng 1: tổng loại số nguyên
o Dòng 2: tổng loại phân số (kết rút gọn)
Nếu khơng tìm thấy tổng loại xuất kết “khong co” (chữ thường, khơng dấu) vị trí loại
Ví dụ 1: Input: a b b Output: 7/6
(36)#include <iostream> #include <fstream> using namespace std; struct PHAN_SO { int tu , mau; };
int UCLN (int a ,int b) { while (b != 0) { int c = a % b; a = b; b = c; }
return a; }
void rut_gon (PHAN_SO &a) { int ucln = UCLN (a.tu , a.mau); a.tu /= ucln;
a.mau /= ucln; }
istream& operator >> (istream& is , PHAN_SO& a) { is >> a.tu >> a.mau;
return is; }
ostream& operator << (ostream& os , PHAN_SO a) { rut_gon (a);
os << a.tu << "/" << a.mau; return os;
}
PHAN_SO operator + (PHAN_SO a , PHAN_SO b) { PHAN_SO tong;
tong.tu = a.tu * b.mau + b.tu * a.mau; tong.mau = a.mau * b.mau;
return tong; }
template <class T> T tinh_tong (T a[], int n) { T t = a[0];
for (int i = ; i < n ; ++i) t = t + a[i]; return t;
}
int main() { char s;
(37)a[n++] = x1; }
break; case 'b': { cin >> x2; b[m++] = x2; }
break; }
}
if (n == 0) cout << "khong co" << endl; else cout << tinh_tong <int> (a , n) << endl; // cout << b[0];
if (m == 0) cout << " khong co" << endl; else cout << tinh_tong <PHAN_SO> (b , m); return 0;
}
TEMPTAPSOMOI
Xây dựng lớp mảng có sử dụng khn hình, áp dụng cho sau:
Viết chương trình nhập vào dãy số, yêu cầu xuất số lớn tổng dãy số hình
Với qui ước:
- Kiểu A: số nguyên ( <=1000)
- Kiểu B: TapSoMoi (được mô tả đây) Dữ liệu đầu vào:
- Dòng đầu tiên: nhập vào loại kiểu dãy số (kiểu A B) - Các dòng lại, dòng chứa số thuộc kiểu dòng Dữ liệu đầu ra:
- Dòng 1: số lớn (thuộc kiểu cho) - Dòng 2: tổng dãy số
Lưu ý: Số lượng phần tử dãy <= 1000
Lưu ý: yêu cầu tổ chức theo thư viện cho lop TapSoMoi và thư viện Mang
Ví dụ 1:
Input: A 1 4 3 4
Output:
4 12
Ví dụ 2:
Input: B 1 2 Output:
[TapSoMoi] 2;3;5;6 [TapSoMoi] 3;5;8;10
(38)};
istream& operator >> (istream& is , TapSoMoi& a) { is >> a.x >> a.y >> a.z >> a.t;
return is; }
ostream& operator << (ostream& os , TapSoMoi a) {
os << "[TapSoMoi] " << a.x << ";" << a.y << ";" << a.z << ";" << a.t; return os;
}
bool operator < (TapSoMoi a , TapSoMoi b) {
return (a.x + a.y + a.z + a.t < b.x + b.y + b.z + b.t) ? true : false; }
TapSoMoi operator + (TapSoMoi a , TapSoMoi b) { TapSoMoi c;
c.x = a.x + b.x; c.y = a.y + b.y; c.z = a.z + b.z; c.t = a.t + b.t; return c; }
template <class T> T Max (T a[] , int n) { T max = a[0];
for (int i = ; i < n ; ++i) { if (max < a[i]) max = a[i]; }
return max; }
template <class T> T Sum (T a[] , int n) { T sum = a[0];
for (int i = ; i < n ; ++i) { sum = sum + a[i]; }
return sum; }
int main() { char x; cin >> x; switch (x) { case 'A': { int a[100]; int n = , x;
while (cin >> x) a[n++] = x; cout << Max <int> (a , n) << endl; cout << Sum <int> (a , n);
} break; case 'B': {
TapSoMoi a[100] , x; int n = 0;
while (cin >> x) a[n++] = x;
(39)} } }
Chủ đề 4: kế thừa Bài 1: HCNHV
Xây dựng lớp HìnhChữNhật có thuộc tính: chiều dài, chiều rộng phương thức tínhChuVi, tínhDiệnTích Xây dựng lớp HìnhVng kế thừa từ lớp HìnhChữNhật
input:
- Dịng loại hình (Nếu HCN hình chữ nhật, HV: hình vng)
- Gồm nhiều dịng, dịng gồm số (nếu dòng HCN), số (nếu dòng HV) chiều dài chiều rộng HCN (hoặc cành hình vng)
Output:
- Xuất chu vi lớn tìm thấy ví dụ:
HCN output: 14
#include <iostream> #include <string> using namespace std; class HCN{
int dai, rong; public:
int getDai(){ return dai;} int getRong(){ return rong;} void setDai(int value){ dai= value;} void setRong(int value){ rong= value;}
HCN(int d=1, int r=1){dai= d; rong = r;}
HCN(const HCN &h ){ dai = h.dai; rong = h.rong; } ~HCN(){ dai=rong = 0; }
friend istream& operator >> (istream& is, HCN &h){ is>> h.dai>> h.rong;
return is; }
friend ostream& operator << (ostream& os, HCN h){ os<< h.getCV();
return os; }
void Set(int d=1, int r=1){dai= d; rong = r;}
int getCV(){ return 2*(dai+rong); } int getDT(){ return dai*rong; } };
int main(){ string s; cin>>s;
int n=0, maxCV=0;
if(s=="HCN"){ HCN arr[10]; while(cin>>arr[n]){
if(arr[n].getCV() > maxCV ) maxCV= arr[n].getCV(); n++;
} } else{ HV arr[10];
while(cin>>arr[n]){
//cout<<arr[n].getCV()<<endl; if(arr[n].getCV() > maxCV ) maxCV= arr[n].getCV(); n++;
} }
cout<<maxCV<<endl; /*
(40)class HV: public HCN{ int c;
public:
HV(int canh= 1){ c= canh; Set(c,c); }
HV(const HV &hv ){ c = hv.c;
Set(c,c); }
~HV(){}
friend istream& operator >> (istream& is, HV &hv){ /*is >> hv.c;
hv = HV(hv.c);*/ int canh; is >> canh; hv= HV(canh); return is; }
friend ostream& operator << (ostream& os, HV hv){ os<< hv.getCV()<<endl;
return os; }
};
return 0; }
Bài 2: LOPSV
- Xây dựng lớp người, gồm thành phần sau: + Họ tên
+ Năm sinh + Quê quán
+ Phương thức: nhập, xuất, get, set, khởi tạo, hủy
Xây dựng lớp sinh viên kế thừa từ lớp người có thêm thông tin + Khoa
+ Điểm nhiều môn học
+ Phương thức: nhập, xuất, tính điểm trung bình (lấy chữ số thập phân), get, set, khởi tạo, hủy Viết chương trình nhập vào thơng tin sinh viên, u cầu xuất thơng tin hình
Ví dụ:
#include <iostream> #include <iomanip> #include <string> using namespace std; class Diem{
int n;
double a[10]; public:
Diem(int _n= 1, double _a[] = new double[1]){ n = _n;
for(int i =0; i< n; i++) a[i]= _a[i];
}
(41)n = d.n;
for(int i =0; i< n; i++) a[i]= d.a[i]; }
~Diem(){ n=0; }
double & operator[](int index){ return a[index];
}
friend istream& operator >> (istream& is, Diem &d){ d.n=0;
while(is>>d[d.n]){ d.n++; } return is;
}
friend ostream& operator << (ostream& os, Diem d){ for(int i=0; i< d.n; i++)
os<<d[i]<< " "; return os; }
double getDTB(){ double Diemtb=0; for(int i=0; i < n; i++) Diemtb+= a[i]; return Diemtb/n; }
};
class SinhVien{ string hoten, mssv; Diem diem; public: //get-set
//ktao - huy SinhVien(){}
SinhVien(string _hoten, string _mssv, Diem _d ){ hoten= _hoten;
mssv= _mssv; diem = _d; }
SinhVien(const SinhVien &sv){ hoten= sv.hoten;
mssv= sv.mssv; diem = sv.diem; }
~SinhVien(){}
friend istream& operator >>(istream& is,SinhVien& SV){ getline(is,SV.hoten);
(42)friend ostream& operator <<(ostream& os,SinhVien SV){ os<<"Ho Ten: "<<SV.hoten <<endl;
os<<"Ma Sinh Vien: "<<SV.mssv<<endl; os<< fixed<< setprecision(1) ;
os<< "DTB: "<<SV.diem.getDTB()<<endl; return os;
} };
int main(){ /*
double a[3]= {10,3,3}; Diem d= Diem( , a); cout<<d<<endl; cin>>d;
cout<<d<<endl; Diem d2 = d; cout<<d2<<endl; */
(43)Bài 3: LTHDT_HonSo1
Viêt chương trình cộng HỖN SỐ với yêu cầu sau:
I xây dựng lớp đối tượng PhanSo có thành phần liệu tử số, mẫu số(kiểu số nguyên) có phương thức sau:
Khởi tạo khơng tham số, Khởi tạo có tham số khởi tạo chép Nhập phân số
Xuất phân số
Lấy giá trị tử số, mẫu số Cộng hai phân số
II Xây dựng lớp đối tượng HonSo kế thừa từ lớp đối tượng PhanSo và,thành phần liệu "phần nguyên"(kiểu số nguyên) có phương tương tự đối tượng PhanSo phải kế thừa từ đối tượng PhanSo
====================================================== Input:
Gồm hai dòng, dòng gồm phần tử , phần tử cách khoảng trắng Output:
Gồm dòng xuất theo định dạng: "phần nguyên" "tử số"/"mẫu số" ( xem vd để hiểu rỏ) Ví dụ:
Input Output
1
5 27/18
LƯU Ý: PHẢI SỬ DỤNG KỸ THUẬT KẾ THỪA;
#include <iostream> using namespace std; class PhanSo { int tu, mau; public: //ktao- huy
PhanSo(int _tu = 0, int _mau = 1) { tu = _tu;
mau = _mau; }
PhanSo(const PhanSo &p) { tu = p.tu;
mau = p.mau; }
~PhanSo(){} //get-set
void set(int _tu = 0, int _mau = 1) { tu = _tu;
mau = _mau; }
void setTu(int _tu) { tu = _tu;
}
class HonSo : public PhanSo { int num;
public: //get-set
void setNum(int k){num = k;} int getNum(){return num; }
HonSo(int _num = 0, int _tu = 0, int _mau = 1) { num = _num;
set(_tu,_mau); }
HonSo(const HonSo &h) : PhanSo(h) { num = h.num;
}
friend istream &operator>>(istream &is ,HonSo &h) {
int n,t,m;
cin >> n >> t >> m; h = HonSo(n,t,m); return is;
}
(44)void setMau(int _mau) { mau = _mau;
}
int getTu() { return tu; }
int getMau() { return mau; }
//nhap - xuat
friend istream &operator>>(istream &is ,PhanSo &p) {
is >> p.tu >> p.mau; return is;
}
friend ostream &operator<<(ostream &os ,PhanSo &p) {
os << p.tu << "/" << p.mau; return os;
}
//phep toan
PhanSo operator+(PhanSo p) {
return PhanSo(tu * p.mau + mau* p.tu, mau * p.mau);
} };
os << h.num << " " << h.getTu() << "/" << h.getMau();
return os; }
HonSo operator+(HonSo h) {
return HonSo(num + h.num, getTu() * h.getMau()
+ getMau()* h.getTu(), getMau() * h.getMau() );
} };
int main() {
HonSo h1, h2, temp; cin >> h1 >> h2; temp = h1 + h2; cout << temp; return 0; }
Bài 4: LTHDT_HonSo2
Xây dụng class Phân Số có thành phần liệu gồm tử số mẫu số Và Có phương thức sau: Hàm contructor, nhập, xuất, cộng, rút gọn (hàm xuất theo định dạng: "tử"/"mẫu")
Xây dựng class Hỗn Số có thành phần liệu phần nguyên tử số, mẫu số kế thừa lớp Phân Số class có phương thức sau: hàm contructor, nhập,xuất, cộng (lấy phân số thứ cộng phân số thứ hai, phần nguyên thứ cộng phần nguyên thứ hai Nếu hỗn số có phần nguyên số âm phần phân số mang giá trị âm.), rút gọn(rút gọn phần phân số)
Yêu cầu: Viết chương chương trình cộng hai Hỗn Số và rút gọn hỗn số
Input: liệu vào gồm hai dòng, dòng hỗn số, phần tử hỗn số cách khoảng trắng theo thứ tự: phần nguyên, tử, mẫu
Output: xuất tổng hai hỗn số sau rút gọn theo định dạng: "phần nguyên" "tử"/"mẫu" Ví dụ 1:
Input Output
2 3
5 3/4 Ví dụ 2:
Input Output
-4 3
(45)#include <iostream> #include <cmath> using namespace std; class phanso {
private: int tu , mau; public:
void nhap(); void xuat(); int gettu(); int getmau(); void settu (int tuso); void setmau (int mauso); phanso();
~phanso(); };
void phanso::nhap() { cin >> tu >> mau; }
void phanso::xuat() { cout << tu << "/" << mau; }
int phanso::gettu() { return tu;
}
int phanso::getmau() { return mau;
}
void phanso::settu (int tuso) { tu = tuso;
}
void phanso::setmau (int mauso) { mau = mauso;
} phanso::phanso() { } phanso::~phanso() { }
class honso : public phanso { private: int nguyen; public: void nhap(); void xuat(); int getnguyen();
void setnguyen (int songuyen); honso();
void honso::nhap() { cin >> nguyen; phanso::nhap(); }
void honso::xuat() { cout << nguyen << " "; phanso::xuat(); }
int honso::getnguyen() { return nguyen; }
void honso::setnguyen (int songuyen) { nguyen = songuyen;
}
honso::honso() { }
honso::~honso() { }
int UCLN (int a , int b) { a = abs (a);
b = abs (b); while (b != 0) { int c = a % b; a = b; b = c; }
return a; }
void rutgon (int &tu , int &mau) { int ucln = UCLN (tu , mau); tu /= ucln;
mau /= ucln; }
void cong_hai_hon_so (honso a , honso b) { honso c;
if (a.getnguyen() < 0) a.settu (-a.gettu()); if (b.getnguyen() < 0) b.settu (-b.gettu()); int songuyen = a.getnguyen() + b.getnguyen(); int tuso = a.gettu() * b.getmau() + a.getmau() * b.gettu();
int mauso = a.getmau() * b.getmau(); if (songuyen < 0) {
if (tuso > 0) tuso = -tuso; }
rutgon (tuso , mauso); c.setnguyen (songuyen); c.settu (tuso);
c.setmau (mauso); c.xuat();
}
(46)~honso(); };
honso a , b; a.nhap(); b.nhap();
cong_hai_hon_so (a , b); return 0;
} Chủ đề 5: Đa hình
Bài 1: QLINTERNET
Một tiệm truy cập Internet cần tin học hoá việc quản lý tính tiền thơng tin khách hàng Đối với khàch hàng ta cần quản lý thông tin sau:
- Tên khách hàng - Thời gian sử dụng máy - Số máy sử dụng - Đơn giá
Trong Đơn giá giá tiền sử dụng giờ, thuộc tính dành cho tất khách hàng Đơn giá chúng giống
Trong loại khách sử dụng Internet, họ phân thành loại khách: khách VIP, khách thường xuyên, khách không thường xuyên Đối với loại khách họ có cách tính giá tiền khác sau:
Ø Đối với khách VIP
o Nếu thời gian sử dụng >=
§ Tiền sử dụng = đơn giá dành cho VIP * o Nếu thời gian sử dụng <4
§ Tiền sử dụng = đơn giá * thời gian sử dụng
Trong đơn giá dành cho VIP thuộc tính dành cho tất khách hàng VIP, giá trị giống Ø Đối với khách thường xuyên:
Tiền sử dụng = thời gian sử dụng * Đơn giá – thời gian sử dụng * hệ số khuyến
Trong hệ số khuyến thông tin khách hàng thường xuyên nhà quản lý cung cấp đăng ký Ø Đối với khách hàng không thường xuyên
Tiền sử dụng = thời gian sử dụng * đơn giá + dung lượng download * đơn giá download Trong đó:
o dung lượng download dung lượng khách download liệu từ mạng máy theo đơn vị MB Mỗi khách hàng có thơng tin cho biết dung lượng download
o Đơn giá download: giá tiền tính dung lượng MB, thuộc tính dành cho tất khách hàng không thường xuyên, giá trị giống
Ngoài ra, chương trình quản lý phải xuất thơng tin khách hàng tính giá tiền khách phải
trả
a) Hãy khai báo thuộc tính, phương thức lớp mối quan hệ chúng ngôn ngữ C++ b) Viết loại constructor cho lớp khách hàng
c) Khai báo cài đặt phương thức để hiển thị thông tin cho loại khách hàng d) Khai báo cài đặt phương thức tính tiền sử dụng cho loại khách hàng
e) Viết hàm main có nội dung sau: nhập vào danh sách N phần tử khách hàng sử dụng Internet tiệm trên, yêu cầu sử dụng tính đa hình để xuất thông tin khách hàng xuất giá tiền khách hàng phải trả
Input:
- Dòng số nguyên N (số khách hàng sử dụng Internet), Đơn Giá, Đơn Giá VIP, Đơn giá download - Nx6 dịng thơng tin từ loại khác hàng với cấu trúc sau
+ TX - ký hiệu khách thường xuyên, KTX khách không thường xuyên, VIP khách VIP + dòng tiếp gồm:
- Tên khách hàng
(47)- Số máy sử dụng
+ Dòng cuối khách hàng thông tin riêng loại khách hàng
- Hệ số khuyến khách thường xuyên Dung lượng download khác khàng không thường xuyên
Output:
Thông tin khách hàng giá tiền khách phải trả (xem ví dụ để hiểu rõ cách xuất danh sách)
Ví dụ:
input output
2 3000 2000 VIP
Nguyen Van A
21 TX
Trinh Thi C 10
23 1000
1 Loai khach: VIP Ho Ten: Nguyen Van A Thoi gian su dung: So may: 21
So tien phai tra: 8000 Loai khach: TX Ho Ten: Trinh Thi C Thoi gian su dung: 10 So may: 23
So tien phai tra: 20000
#include <iostream> #include <string> using namespace std; class KH{
string tenkh, somay; int tgsd, dongia; public:
//set-get
string getTenKH(){ return tenkh;} string getSoMay(){ return somay;} int getTgsd(){ return tgsd;} int getDongia(){ return dongia;} //ktao-huy
KH(const KH& k){
tenkh= k.tenkh; somay = k.somay; tgsd=k.tgsd; dongia=k.dongia; }
KH(string h="hoten", int t=0, string s="somay", int d=1000){ tenkh= h; somay = s; tgsd=t; dongia=d;
} ~KH();
void SetKH(string h="hoten", int t=0, string s="somay", int d=1000){ tenkh= h; somay = s; tgsd=t; dongia=d;
} //nhap
friend istream& operator >> (istream& is, KH &k){ getline(is, k.tenkh);
(48)}
//da hinh
virtual double getTinhTien(){}; virtual string getLoai(){}; };
// -// class KHVIP:public KH{ int dongiaVIP; public:
//get - set //ktao- huy ~KHVIP();
KHVIP(const KHVIP &khvip): KH(khvip){ dongiaVIP= khvip.dongiaVIP;
}
KHVIP(string h="hoten", int t=1, string s="somay", int d= 1000, int _dongiaVIP= 500) :KH(h, t,s,d){ dongiaVIP= _dongiaVIP
}
double getTinhTien(){ //tinh theo cthuc if( getTgsd() > 4)
return dongiaVIP*getTgsd(); return getDongia()*getTgsd(); }
string getLoai(){ return "VIP"; }
};
// -// class KHTX:public KH{ int hskm;
public: //get-set //ktao- huy ~KHTX();
KHTX(const KHTX &kh ): KH(kh){ hskm = kh.hskm;
}
KHTX(string h="hoten", int t=1, string s="somay", int d= 1000, int _hskm= 10) :KH(h, t,s,d){ hskm= _hskm;
}
double getTinhTien(){
return getTgsd()*getDongia() – (getTgsd()*hskm*1.0)/100; }
string getLoai(){ return "TX"; }
(49)// -// class KHKTX:public KH{
int dungluongdownload, dongiadownload; public:
//get-set //ktao - huy int getTinhTien(){
return getTgsd()*getDongia()+
dungluongdownload*dongiadownload; }
string getLoai(){ return "KTX"; }
};
int main(){
//lam tiep gui ve khietltn@ voi tieu de [101701] //han chot 10h AM 21/11/2019
return 0; }
Bài 2: DAHINH1
Input:
Nhập vào mảng N phần tử gồm loại hình: hình vng, hình chữ nhật (Hình vng gồm cạnh, hình chữ nhật gồm cạnh)
Output:
Xuất chu vi hình Qui ước:
a - hình vng b - hình chữ nhật Ví dụ:
#include <iostream> using namespace std; class Hinh{
public:
virtual int getCV(){}; //=0 };
class HCN: public Hinh{ int dai, rong;
public: //get-set
int getDai(){ return dai;} int getRong(){return rong;} void setDai(int k){ dai = k;} void setRong(int k){ rong = k;} //ktao - huy
(50)HCN(const HCN &h){ dai = h.dai; rong = h.rong; } ~HCN(){}
void Set(int d=1, int r=1){dai = d; rong= r; } //nhap - xuat
friend istream& operator >> (istream& is, HCN &h){ is>>h.dai>> h.rong;
return is; }
friend ostream& operator << (ostream& os, HCN &h){ os<<h.getCV()<<endl;
return os; }
//tinh chuvi int getCV(){
return 2*(dai+rong); }
};
class HV: public HCN{ int canh;
public: //ktao - huy
HV(int c= 1): HCN(c,c){ canh= c;
//Set(c,c) }
HV(const HV& hv ): HCN( hv ){
} ~HV(){} //nhap - xuat
friend istream& operator >> (istream& is, HV &hv){ int c;
is >>c; hv = HV(c); return is; }
friend ostream& operator << (ostream& os, HV &hv){ os<<hv.getCV()<<endl;
return os; }
};
(51)}
if(x=='b'){ HCN hcn; cin>>hcn; h[n]=&hcn; }
cout<<h[n]->getCV()<<endl; n++;
} /*
HCN h[10];
while(cin>>x){ if(x=='a'){ HV hv; cin>>hv; h[n]=hv; }
if(x=='b'){ HCN hcn; cin>>hcn; h[n]=hcn; }
ài Lớp SinhVien) đây)