kĨ thuẬt lẬp trÌnh
TRANSCRIPT
KĨ THUẬT LẬP TRÌNH
TÀI LIỆU VÀ PHẦN MỀM
Copy 2 tệp sau:
1) Giáo trình học phần
NCT - Lap trinh C++ ver3.pdf
2) Tệp chương trình cài đặt DEV-C++ Version 5.11
Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe
Sau đó ta cài đặt chương trình DEV C++
Sau khi cài đặt ta chạy chương trình từ biểu tượng Dev-C++
Chú ý: Code trong tài liệu là của Borland C++ chạy trên nền hệ điều hành 16 bit.
Code đó cần định hướng biên dịch lại chút trong môi trường hệ điều hành 32 bit.
LỊCH HỌC
Buổi 1 + 2: CÁC VẤN ĐỀ CƠ BẢN CỦA C++
Nội dung: Chương 1, Chương 2
- Vào/Ra DL
- Các cấu trúc điều khiển
- Các hàm
- Truyền tham số
- Mảng, Xâu và File
- Con trỏ
Buổi 3 + 4: LỚP ĐỐI TƢỢNG VÀ TẢI BỘI
Nội dung: Chương 3, trọng tâm Bài 1, 2, 3
Buổi 5 + 6: HÀM VÀ PHÉP TOÁN THÂN THIỆN
Nội dung: Chương 3 (tiếp theo)
Hướng dẫn thi và Kiểm tra giữa môn
TỰ HỌC
Những nội dung trong giáo trình mà chưa đề cập đến trên lớp học, ví dụ mẫu lớp,
con trỏ hàm.
CÁC BÀI TẬP ÔN THI
Bài 1.
Hãy lập trình xây dựng lớp HOCSINH với các thành phần dữ liệu và hàm sau
- SBD (kiểu số, dữ liệu riêng)
- Họ tên (kiểu xâu kí tự, dữ liệu riêng)
- Điểm trung bình các môn kì 1 và kì 2 (kiểu số thực, dữ liệu riêng)
- Hàm nhập dữ liệu học sinh (hàm tải bội thường phép toán NHẬP)
- Hàm in ra dữ liệu học sinh (hàm tải bội thân thiện phép toán XUẤT)
- Hàm đưa ra họ tên, điểm cả năm (tính theo công thức TBN = (TBK1 +
TBK2)/2) (hàm tải bội thường phép toán XUẤT)
Sử dụng các hàm trên, nhập dữ liệu cho N học sinh và đưa ra các thông tin theo
hai hàm XUẤT đã mô tả
Bài 2.
Hãy lập trình xây dựng lớp VECTOR trong không gian 3 chiều với các hàm thành
phần sau:
- Các cấu tử, hủy tử
- Nhập vector (hàm tải bội phép toán >> thân thiện)
- In ra vector (hàm tải bội phép toán << không thân thiện)
- Cộng hai vector (hàm tải bội phép toán + thân thiện)
- Nhân một số thực với một vector (hàm tải bội phép toán * không thân thiện)
- Nhân có hướng hai vector (hàm tải bội phép toán * thân thiện)
Sử dụng các hàm trên, nhập 2 vecto a và b, nhập số thực k và đưa ra màn hình
các diễn giải sau: a + b = c, k * a = c, a * b = c
Bài 3.
Hãy lập trình xây dựng lớp số phức (COMPLEX) với các phép toán tải bội thân
thiện hoặc không thân thiện sau đây.
1) Nhập số phức
2) In ra số phức
3) Cộng hai số phức
4) Nhân một số thực với một số phức
5) Nhân hai số phức
Trong hàm main, nhập hai số phức a, b và số thực k. Diễn giải các tính toán
sau: a + b = c; k * a = c; a * b = c;
Công thức nhân 2 số phức:
(a1 + b1*i) * (a2 + b2 * i) = (a1a2 – b1b2) + (a1b2 + a2b1) * i
Bài 4.
Hãy lập trình xây dựng lớp ma trận vuông (MATRIX) với các phép toán tải bội
thân thiện hoặc không thân thiện sau đây:
1) Nhập ma trận
2) In ra ma trận
3) Cộng hai ma trận
4) Nhân một số thực với một ma trận
5) Nhân hai ma trận
Bài 5.
Hãy lập trình xây dựng lớp đa thức bậc n (POLY) với các phép toán tải bội thân
thiện hoặc không thân thiện sau đây: (có thể cho n một giá trị cố định lớn hơn
hoặc bằng 2)
1) Nhập đa thức
2) In ra đa thức
3) Cộng hai đa thức
4) Nhân một số thực với một đa thức
5) Nhân hai đa thức
---------
1. CÁC VẤN ĐỀ CƠ BẢN CỦA C++
Nội dung: Chương 1, Chương 2
- Vào/Ra DL
- Các cấu trúc điều khiển
- Các hàm
- Truyền tham số
- Mảng, Xâu và File
- Con trỏ
1.1. Cấu trúc của một chƣơng trình C++
Cấu trúc chƣơng trình
//Phần 1: Khai báo các thƣ viện và các hằng
#include <tên thư viện 1>
#include <tên thư viện 2>
const tên_hằng = giá_trị
using namespace std;
//Phần 2: Khai báo và định nghĩa các hàm (nếu có)
kiểu_DL tên_hàm(danh sách tham số) {
Thân hàm;
return <giá_trị/biểu_thức>
}
//Phần 3: Hàm main
int main() {
Các lệnh giải quyết bài toán;
return 0;
}
Ví dụ 1
In lên màn hình dòng chữ Hello Dev-C++
#include <iostream.h>
using namespace std;
int main() {
cout << “Hello Dev-C++”;
return 0;
}
Ví dụ 2
Lập trình tính diện tích gỗ còn thừa của hai miếng gỗ hình vuông với cạnh tương
ứng là a và b khi người ta xẻ chúng thành hai mặt bàn hình tròn
#include <iostream>
#define pi 3.14
using namespace std;
int main(){
float a,b;
float dt2v, dt2t, dt;
cout << "Nhap cac canh cua 2 hinh vuong: ";
cin >> a >> b;
Khai báo biến và
Nhập dữ liệu
dt2v = a*a + b*b;
dt2t = pi*a*a/4 + pi*b*b/4;
dt = dt2v - dt2t;
Tính toán theo yêu cầu
bài toán
cout<< "Dien tich go con thua la:" << dt;
return 0;
}
Xuất thông tin cần tìm
1.2. Vào/ra dữ liệu
C C++
C++
Vào dữ liệu: cin >> tên_biến >> tên_biến
Xuất dữ liệu: cout << giá_trị << biến << biểu_thức
a b
1.3. Những vấn đề liên quan
- Kiểu dữ liệu: int, long, float, double, char
- Các phép toán: Mỗi kiểu dữ liệu có các phép toán riêng
o float, double: +, -, *, /
o int: +, -, *, / (chia lấy phần nguyên), %
o các phép toán trên bit, …
o
1.4. Các cấu trúc điều khiển
1.4.1. Cấu trúc rẽ nhánh
Khuyết Đủ
if (đk) {nhóm lệnh;} if (đk) {nhóm lệnh 1;}
else {nhóm lệnh 2;}
Trong ngôn ngữ C/C++ mọi giá trị là số. Nếu nhóm lệnh có 1 lệnh không
cần {}
Ví dụ 3
Lập trình đưa ra chỉ số BMI của một người và nếu người đó thừa cân (BMI > 23)
thì thông báo “THUA CAN”. Biết BMI = cân nặng/(chiều cao)2. Chiều cao và cân
nặng được nhập từ bàn phím.
#include <iostream>
using namespace std;
int main(){
float cc, cn, bmi;
cout<<"nhap chieu cao: "; cin>>cc;
cout<<"nhap chieu can nang: "; cin>>cn;
bmi = cn/(cc*cc);
cout<<"Chi so BMI la: "<<bmi<<endl;
if(bmi>23) cout<<"THUA CAN";
return 0;
}
Ví dụ 4
Lập trình đưa ra chỉ số BMI của một người và đưa ra thông tin người đó “THUA
CAN” hoặc “KHONG THUA CAN”;
#include <iostream>
#include <math.h>
using namespace std;
int main(){
float cc, cn, bmi;
cout<<"nhap chieu cao va can nang: "; cin>>cc>>cn;
bmi = cn/pow(cc,2);
cout<<"Chi so BMI la: "<<bmi<<endl;
if(bmi<18.5) cout<<"Thieu can";
else if(bmi<23.0)cout<<"Binh thuong";
else if(bmi<25.0)cout<<"Thua can";
else cout<<"Beo phi";
return 0;
}
Ví dụ 5
Lập trình đưa ra chỉ số BMI của một người và đưa ra thông tin về sức khỏe người
đó dựa vào bảng sau đây
BMI Phân loại
<18.5 Thiếu cân
[18.5, 23.0) Bình thường
[23.0, 25.0) Thừa cân
≥ 25 Béo phì
code
1.4.2. Cấu trúc chọn lựa (rẽ nhiều nhánh)
switch (biến){
case giá_trị_1: nhóm lệnh 1;
case giá_trị_2: nhóm lệnh 2;
…
default : nhóm lệnh mặc định;
}
Ví dụ 6
Lập trình nhập vào tháng và năm, đưa ra thông báo số ngày của tháng đó.
Yêu cầu: Thực hiện hai cách dùng if và dùng switch.
Chú ý: Năm nhuận tháng 2 có 29 ngày, năm không nhuận tháng 2 có 28 ngày.
- Năm đầu thế kỉ mà chia hết cho 400 thì là năm nhuận
- Năm không phải đầu thế kỉ mà chia hết cho 4 thì là năm nhuận
- Trường hợp còn lại không là năm nhuận
Cách 1:
if ((y%100 == 0 && y % 400 ==0) || ( y%100 != 0 && y % 4 ==0) ) d=29;
else d = 28;
Cách 2:
if (y%100 == 0)
if (y % 400 ==0) d = 29;
else d = 28;
else //Ngầm hiểu đó là năm không phải đầu thế kỉ
if ( y % 4 == 0) d = 29;
else d = 28;
Bài tập phụ: Tính số ngày của tháng 2 khi biết năm.
#include <iostream>
using namespace std;
int main(){
int d, y;
cout<<"nhap nam: "; cin>>y;
if ((y%100 == 0 && y % 400 ==0) || ( y%100 != 0 && y % 4 ==0) ) d=29;
else d = 28;
cout<<"Thang Hai cua nam "<<y<<" co so ngay la: "<<d;
return 0;
}
BT6
#include <iostream>
using namespace std;
int main(){
int d, m, y;
cout<<"Nhap thang va nam: "; cin>>m>>y;
switch (m){
case 1: d = 31; break;
case 2:
if ((y%100 == 0 && y % 400 ==0) ||
( y%100 != 0 && y % 4 ==0) ) d=29;
else d = 28; break;
case 3: d = 31; break;
case 4: d = 30; break;
case 5: d = 31; break;
case 6: d = 30; break;
case 7: d = 31; break;
case 8: d = 31; break;
case 9: d = 30; break;
case 10: d = 31; break;
case 11: d = 30; break;
case 12: d = 31; break;
default: d = 0;
}
if(d==0) cout<<"Nhap sai thang!";
else cout<<"Nam "<<y<<" thang "<<m<<" co so ngay la: "<<d;
return 0;
}
Cách 2
#include <iostream>
using namespace std;
int main(){
int d, m, y;
cout<<"Nhap thang va nam: "; cin>>m>>y;
if (m==2){
if ((y%100 == 0 && y % 400 ==0) ||
(y%100 != 0 && y % 4 ==0) ) d=29;
else d = 28; }
else if (m==1 || m==3 || m==5 || m==7 || m == 8 || m==10 || m==12) d=31;
else if (m==4 || m==6 || m==9 || m==1)d=30;
else d = 0;
if(d==0) cout<<"Nhap sai thang!";
else cout<<"Thang "<<m<<" ,nam "<<y<<" co "<<d<< " ngay.";
return 0;
}
1.4.3. Cấu trúc lặp for
Cú pháp:
for(bt1; bt2; bt3) {nhóm_lệnh;}
Hoạt động:
Bước 1: Tính bt1; (đúng 01 lần)
Bước 2: Tính bt2;
Bước 3: Nếu bt2 ĐÚNG thì thực hiện nhóm lệnh ngược lại thì Kết thúc
Bước 4: Tính bt3 và quay về Bước 2;
Ví dụ 7
Lập trình nhập mảng n số nguyên, đảo ngược mảng. In ra mảng trước và sau khi
đảo ngược.
Bổ sung kiến thức về mảng
Khai báo
kiểu_DL tên_biến_mảng[kích_thước];
kiểu_DL tên_biến_mảng[] = {danh sách các phần tử};
Ví dụ:
int a[100];
float b[] = {5.5, 9.0, 7.5, 6.0, 4.0};
Truy cập một phần tử của mảng
Truy cập phần tử thứ i của mảng a thông qua cách viết là a[i]
Chú ý mảng n phần tử có vị trí từ 0 đến n-1
Nhập mảng
cout<< “Nhap so phan tu cua mang:” ; cin>>n;
for(i=0; i<n; i++) {cout<< “Nhap a[”<<i<< “] = ”; cin>>a[i];}
In mảng
for(i=0; i<n; i++) cout<<a[i]<< “, ”;
Giải quyết bài toán
#include <iostream>
#define maxn 50
using namespace std;
int main(){
int a[maxn];
int n;
int i,j,tg;
//Nhap mang
cout<< "Nhap so phan tu cua mang:" ; cin>>n;
for(i=0; i<n; i++) {cout<< "Nhap a["<<i<< "] = "; cin>>a[i];}
// In ra mang truoc khi dao nguoc
cout<< "Mang truoc khi dao nguoc: ";
for(i=0; i<n; i++) cout<<a[i]<< ", "; cout<<endl;
//Dao nguoc mang
for(i=0,j=n-1; i<j; i++,j--) {tg=a[i]; a[i]=a[j];a[j]=tg;}
// In ra mang sau khi dao nguoc
cout<< "Mang sau khi dao nguoc: ";
for(i=0; i<n; i++) cout<<a[i]<< ", ";
}
Chú ý về các thành phần của vòng for
for (bt1; bt2; bt3) {nhóm_lệnh}
for (i=0, j=n-1; i<j; i++, j--) {tg=a[i]; a[i]=a[j]; a[j]=tg}
Trong lệnh for một hoặc hai hoặc cả ba biểu thức có thể khuyết.
Đoạn code đảo ngược dãy có những cách sau
Cách 1: Không khuyết biểu thức nào
for(i=0,j=n-1; i<j; i++,j--) {tg=a[i]; a[i]=a[j];a[j]=tg;}
Cách 2: Khuyết bt1
i=0;j=n-1;
for(;i<j; i++,j--) {tg=a[i]; a[i]=a[j];a[j]=tg;}
Cách 2: Khuyết bt2
for(i=0,j=n-1; ; i++, j--) if i<j {tg=a[i]; a[i]=a[j];a[j]=tg;} else break;
Cách 3: Khuyết bt3
for(i=0,j=n-1; i<j; ) {tg=a[i]; a[i]=a[j];a[j]=tg; i++; j--}
Cách 4: Khuyết bt1 và bt2
i=0;j=n-1;
for(; ; i++,j--) if i<j {tg=a[i]; a[i]=a[j];a[j]=tg;} else break;
Cách 5: Khuyết bt1 và bt3
i=0;j=n-1;
for(; i<j; ) {tg=a[i]; a[i]=a[j];a[j]=tg;i++;j--;}
Cách 6: Khuyết bt2 và bt3
for(i=0,j=n-1; ; ) if i<j {tg=a[i]; a[i]=a[j];a[j]=tg; i++; j--;} else break;
Cách 7: Khuyết bt1, bt2, bt3
i=0;j=n-1;
for(; ; ) if i<j {tg=a[i]; a[i]=a[j];a[j]=tg; i++; j--;} else break;
1.4.4. Cấu trúc lặp while
Cú pháp
Dạng kiểm tra điều kiện trước Dạng kiểm tra điều kiện sau
while (bt) {nhóm lệnh;} do {nhóm lệnh} while (bt);
- Lặp khi bt = 1 (TRUE)
- Kiểm tra bt trước
- Lặp khi bt = 1 (TRUE)
- Kiểm tra bt sau
Ví dụ minh họa: Đoạn chương trình nhập sĩ số lớp n (5≤ n ≤ 40)
Cách 1 Cách 2
cout<< “n = ”; cin>>n;
while (n<5 || n>40) {
cout<< “nhap lai n = ”; cin>>n;
}
do {
cout<< “nhap lai n = ”; cin>>n;
} while (n<5 || n>40);
Ví dụ 8
Một người gửi tiết kiệm
- Số tiền ban đầu là a (triệu đồng)
- Lãi suất là k %
- Chu kì tính lãi là c (tháng)
Yêu cầu: Lập trình nhập a, k, c và đưa ra các thông tin sau:
1) Số tiền rút được cả gốc và lãi sau t tháng (t được nhập)
2) Người đó phải gửi bao nhiêu tháng để nhận số tiền (cả gốc) là b (triệu đồng)
(b được nhập)
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
float a,b,k;
int c,t,i;
cout<<"Nhap so tien ban dau: "; cin >> a;
cout<<"Nhap lai suat: "; cin>>k;
cout<<"Nhap chu ki tinh lai: "; cin>>c;
cout<<setiosflags(ios::showpoint)<<setprecision(4);
cout<<"CAU 1 \n";
cout<<"Nhap so thang gui: "; cin>>t;
for(b=a,i=1; i<=t; i++) if (i%c==0) b += b*k/100;
cout<<"So tien rut duoc sau "<<t<<" thang la: "<<b<<endl;
cout<<"CAU 2 \n";
cout<<"Nhap so tien can rut: "; cin>>b;
float s;
t=0; s=a;
while(s<b){t++; if(t%c==0) s+=s*k/100;
}
cout<<"De nhan duoc so tien "<<b<<" trieu dong, can gui "<<t<<" thang.";
}
1.5. DỮ LIỆU KIỂU TỆP
#include <fstream>
Sử dụng text file để đọc dữ liệu
ifstream fi; Khai báo biến tệp fi để nhập dữ liệu
fi.open(“tên file”); Mở tệp
fi>>data1>>data2; Đọc hết dữ liệu từ dòng hiện tại ra các biến
fi.close() Đóng tệp
Sử dụng text file để ghi dữ liệu
ofstream fo; Khai báo biến tệp fo để ghi dữ liệu
fo.open(“tên file”); Mở tệp
fo<<data1<< “,”<<data2; Ghi hết dữ liệu từ các biến vào dòng hiện tại
fo.close() Đóng tệp
Ví dụ 9
Lập chương trình thực hiện các công việc sau đây:
1) Nhập số nguyên n, và điểm thi học kì môn Toán của lớp 11A4 có n học sinh.
2) Tìm điểm cao nhất và cho biết đó là những học sinh có STT nào?
3) Tính tỉ lệ học sinh đạt loại khá giỏi (điểm thi ≥ 8).
4) Tính tỉ lệ học sinh có điểm cao hơn điểm trung bình của lớp
Dữ liệu vào/ra
DIEMTHI.INP KETQUA.OUT
6
7.5
8.0
9.0
6.5
5.5
9.0
Diem cao nhat: 9
HS: 3, 6
Ti le HS Kha Gioi: 50 %
Ti le HS diem cao hon TB: 50 %
Chương trình
#include <iostream>
#include <fstream>
using namespace std;
int main(){
float a[100];
int n;
int i;
//Doc du lieu tu tep ra bien
ifstream fi;
fi.open("DIEMTHI.INP");
fi>>n;
for(i=1;i<=n;i++) fi>>a[i];
fi.close();
//Xu li du lieu tren bien va in ket qua vao tep
ofstream fo;
fo.open("DIEMTHI.OUT");
//Cau 2
float max=a[1];
for(i=1;i<=n;i++)if(max<a[i])max=a[i];
fo<<"Diem cao nhat: "<<max<<endl;
//Cach 1
fo<<"HS: "; int hs[100]; int m=0;
for(i=1;i<=n;i++)if(a[i]==max)fo<<i<<", "; fo<<endl;
//Cach 2
fo<<"HS: "; int tt[100]; int m=0;
for(i=1;i<=n;i++)if(a[i]==max) tt[++m]=i;
for(i=1;i<=m-1;i++)fo<<tt[i]<<", "; fo<<hs[i]; fo<<endl;
//Cau 3
int d = 0;
for(i=1;i<=n;i++) if (a[i]>=8) d++;
fo<<"Ti le HS kha gioi: "<<float(d)*100/n<<"%"<<endl;
//Cau 4
float dtb=0;
for(i=1;i<=n;i++)dtb+=a[i]; dtb/=n;
d=0;
for(i=1;i<=n;i++)if(a[i]>dtb)d++;
fo<<"Ti le HS diem cao hon TB: "<<float(d)*100/n<<"%";
fo.close();
}
2. LỚP ĐỐI TƢỢNG
2.1. Định nghĩa lớp đối tƣợng
Phần Nội dung
1
class ten_lop{
private:
//Khai báo dữ liệu riêng của lớp
//Khai báo [và định nghĩa] hàm riêng (phương thức riêng)
public:
//Khai báo dữ liệu chung của lớp
//Khai báo [và định nghĩa] hàm chung (phương thức chung)
};
2 //Định nghĩa các hàm riêng và chung nếu phía trên chưa định nghĩa
3
int main(){
tên_lớp DS_các_đối_tượng;
//các lệnh làm việc với các đối tượng của lớp
}
Bài 1.
Hãy lập trình xây dựng lớp HOCSINH với các thành phần dữ liệu và hàm sau
- SBD (kiểu số, dữ liệu riêng)
- Họ tên (kiểu xâu kí tự, dữ liệu riêng)
- Điểm trung bình các môn kì 1 và kì 2 (kiểu số thực, dữ liệu riêng)
- Hàm nhập dữ liệu học sinh (hàm tải bội thường phép toán NHẬP)
- Hàm in ra dữ liệu học sinh (hàm tải bội thân thiện phép toán XUẤT)
- Hàm đưa ra họ tên, điểm cả năm (tính theo công thức TBN = (TBK1 +
TBK2)/2) (hàm tải bội thường phép toán XUẤT)
Sử dụng các hàm trên, nhập dữ liệu cho N học sinh và đưa ra các thông tin theo
hai hàm XUẤT đã mô tả
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class HOCSINH{
private:
int sbd;
char *hoten;
float tbk1, tbk2;
public:
void nhapdl(); //chi khai bao, chua dinh nghia
void indl();//chi khai bao, chua dinh nghia
void intbn() {
cout<< hoten <<": "<< (tbk1+tbk2)/2<<endl;
}
};
void HOCSINH::nhapdl(){
cout<<"SBD: "; cin>>sbd; fflush(stdin);
char tg[30];
cout<<"Ho ten: "; gets(tg);
hoten = new char[strlen(tg)+1];
strcpy(hoten,tg);
cout<<"Diem tbk1 va tbk2: "; cin>>tbk1>>tbk2;
}
void HOCSINH::indl(){
cout<<sbd<<" - "<<hoten<<" , tbk1: "<<tbk1<<" ,tbk2: "<<tbk2<<endl;
}
int main(){
HOCSINH hs, a[100]; //khai bao doi tuong hs va mang doi tuong a
int n, i;
cout<<"Nhap so HS: "; cin>>n;
for(i=0;i<n;i++) {
cout<<"Nhap thong tin cho HS thu "<<i+1<<":"<<endl;
a[i].nhapdl();
}
cout<<"\n Thong tin cac HS da nhap la: \n";
for(i=0;i<n;i++) a[i].indl();
cout<<"\n Diem TB nam cua cac HS la: \n";
for(i=0;i<n;i++) a[i].intbn() ;
}
Bài 1B
Xây dựng các toán tử (operator) NHẬP >> và XUẤT << là các toán tử tải bội đồng
thời là các hàm thành phần trong lớp.
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class HOCSINH{
private:
int sbd;
char *hoten;
float tbk1, tbk2;
public:
istream& operator >>(istream& din);
ostream& operator <<(ostream& dout);
void intbn() {
cout<< hoten <<": "<< (tbk1+tbk2)/2<<endl;
}
};
istream& HOCSINH::operator >> (istream& din){
cout<<"SBD: "; din>>sbd; fflush(stdin);
char tg[30];
cout<<"Ho ten: "; gets(tg);
hoten = new char[strlen(tg)+1];
strcpy(hoten,tg);
cout<<"Diem tbk1 va tbk2: "; din>>tbk1>>tbk2;
return din;
}
ostream& HOCSINH::operator << (ostream& dout){
dout<<sbd<<" - "<<hoten<<" , tbk1: "<<tbk1<<" ,tbk2: "<<tbk2<<endl;
return dout;
}
int main(){
HOCSINH hs, a[100]; //khai bao doi tuong hs va mang doi tuong a
int n, i;
cout<<"Nhap so HS: "; cin>>n;
for(i=0;i<n;i++) {
cout<<"Nhap thong tin cho HS thu "<<i+1<<":"<<endl;
//a[i].nhapdl();
a[i].operator >>(cin); //Day la cach tuong minh
}
cout<<"\n Thong tin cac HS da nhap la: \n";
for(i=0;i<n;i++) a[i].operator <<(cout); //Day la cach tuong minh
cout<<"\n Diem TB nam cua cac HS la: \n";
for(i=0;i<n;i++) a[i].intbn() ;
}
HÀM THÂN THIỆN
Hàm thành phần bình thường Hàm thành phần thân thiện
void intbn(HOCSINH hs) {
cout<< hoten <<": "
<< (tbk1+tbk2)/2<<endl;
}
friend void intbn(HOCSINH hs) {
cout<< hs.hoten <<": "
<< (hs.tbk1+hs.tbk2)/2<<endl;
}
Khi dùng
HOCSINH hs;
hs.intbn();
Khi dùng
HOCSINH hs;
intbn(hs);
XÉT CÁC TOÁN TỬ NHẬP VÀ XUẤT
TOÁN TỬ NHẬP
Toán tử bình thường Toán tử thân thiện
Khai
báo
istream& operator >>(istream& din); friend istream& operator >>(istream& din,
HOCSINH& hs);
Định
nghĩa
istream& HOCSINH::operator >>
(istream& din)
{
cout<<"SBD: ";
din>>sbd; fflush(stdin);
char tg[30];
cout<<"Ho ten: "; gets(tg);
hoten = new char[strlen(tg)+1];
strcpy(hoten,tg);
cout<<"Diem tbk1 va tbk2: ";
din>>tbk1>>tbk2;
return din;
}
istream& operator >> (istream& din, HOCSINH& hs)
{
cout<<"SBD: ";
din>>hs.sbd; fflush(stdin);
char tg[30];
cout<<"Ho ten: "; gets(tg);
hs.hoten = new char[strlen(tg)+1];
strcpy(hs.hoten,tg);
cout<<"Diem tbk1 va tbk2: ";
din>>hs.tbk1>>hs.tbk2;
return din;
}
Sử
dụng
for(i=0;i<n;i++) {
cout<<"Nhap thong tin cho HS thu
"<<i+1<<":"<<endl;
a[i].operator >>(cin);
}
for(i=0;i<n;i++) {
cout<<"Nhap thong tin cho HS thu
"<<i+1<<":"<<endl;
cin>>a[i];
}
TOÁN TỬ XUẤT
Toán tử bình thường Toán tử thân thiện
Khai
báo
ostream& operator <<(ostream&
dout);
friend ostream& operator <<(ostream& dout,
HOCSINH& hs);
Định
nghĩa
ostream& HOCSINH::operator <<
(ostream& dout)
{
dout<<sbd<<" - "<<hoten
<<" , tbk1: "<<tbk1
<<" ,tbk2: "<<tbk2<<endl;
return dout;
}
ostream& operator << (ostream& dout, HOCSINH&
hs)
{
dout<<hs.sbd<<" - "<<hs.hoten
<<" , tbk1: "<<hs.tbk1
<<" ,tbk2: "<<hs.tbk2<<endl;
return dout;
}
Sử
dụng
for(i=0;i<n;i++) a[i].operator <<(cout); for(i=0;i<n;i++) cout<<a[i];
3. TẢI BỘI VÀ THÂN THIỆN
Bài 2A. TẢI BỘI, CẤU TỬ VÀ HỦY TỬ
Hãy lập trình xây dựng lớp VECTOR trong không gian 3 chiều với các hàm thành
phần sau:
- Các cấu tử, hủy tử
- Nhập vector (hàm tải bội phép toán >> )
- In ra vector (hàm tải bội phép toán << )
- Cộng hai vector (hàm tải bội phép toán + )
- Nhân một số thực với một vector (hàm tải bội phép toán * )
- Nhân có hướng hai vector (hàm tải bội phép toán * )
Sử dụng các hàm trên, nhập 2 vecto a và b, nhập số thực k và đưa ra màn hình
các diễn giải sau: a + b = c, k * a = c, a * b = c
a(a1, a2, a3) b(b1, b2, b3)
c=(c.x, c.y, c.z) = (x, y, z) (a.x, b.y, c.z)
(x, y, z) (a.x, a.y, a.z) = (y*a.z-z*a.y, z*a.x-x*a.z, x*a.y – y*a.x)
c.x = y*a.z-z*a.y;
c.y = z*a.x-x*a.z;
c.z=x*a.y – y*a.x;
function sqr(x:real) : real;
var r : real;
begin r := x*x;
sqr := r;
end;
TẢI BỘI THÔNG THƢỜNG
Cộng một vector với một vector, kết quả là một vector
VECTOR operator + (VECTOR a){
//Cộng vector của đối tượng ẩn (được xác định bởi con trỏ this) với vector a, được
kết quả giả sử là vector c. Vector c chính là kết quả của hàm.
VECTOR c;
//c=this + a;
//(c.x, c.y, c.z) = (this->x, this->y, this-z) + (a.x, a.y. a.z);
c.x = x + a.x; c.y = y + a.y; c.z = z + a.z;
return c;
}
Ví dụ khi dùng
VECTOR b; đối tượng thật b được tạo ra, không phải là this nữa
b.operator +(a); Nghĩa là cộng vector b với vector a, được kết quả là một vector
và gán cho b.
Nhân một số với một vector, kết quả là một vector
VECTOR operator * (float r){
//Nhân số thực r với vector của đối tượng ẩn (this) với số thực r, được kết quả giả
sử là vector c. Vector c chính là kết quả của hàm.
VECTOR c;
//c=this * r;
//(c.x, c.y, c.z) = (this->x*r, this->y*r, this-z*r);
c.x = x*r; c.y = y*r; c.z = z*r;
return c;
}
Nhân một vector với một vector
VECTOR VECTOR::operator * (VECTOR a){
//Nhân vector của this với vector a, kết quả là vector c, trả lại giá trị c cho tên hàm
//(c.x, c.y, c.z) = (this->x, this->y, this->z) * (a.x, a.y, a.z)
//(c.x, c.y, c.z) = (x, y, z) * (a.x, a.y, a.z)
VECTOR c;
c.x = y*a.z – z*a.y;
c.y = z*a.y – x*a.z;
c.z = x*a.y – y*a.x;
return c;
}
#include <iostream>
using namespace std;
class VECTOR{
private:
float x,y,z;
public:
~VECTOR(){;} // huy tu = destructor
VECTOR(){x=0;y=0;z=0;} // cau tu ngam dinh = contructor
VECTOR(float x1,float y1, float z1){
x=x1;y=y1;z=z1;
} //cau tu khoi tao
VECTOR(VECTOR& a){
x=a.x;y=a.y;z=a.z;
} //cau tu sao chep
istream& operator >> (istream& din);
ostream& operator << (ostream& dout);
VECTOR operator + (VECTOR a);
VECTOR operator * (float r);
VECTOR operator * (VECTOR a);
};
istream& VECTOR::operator >> (istream& din){
cout<<"(x, y, z) = "; din>>x>>y>>z;
return din;
}
ostream& VECTOR::operator << (ostream& dout){
dout<<"("<<x<<", "<<y<<", "<<z<<")";
return dout;
}
VECTOR VECTOR::operator + (VECTOR a){
VECTOR c;
c.x=x+a.x; c.y=y+a.y; c.z=z+a.z;
return c;
}
VECTOR VECTOR::operator * (float r){
VECTOR c;
c.x=r*x; c.y=r*y; c.z=r*z;
return c;
}
VECTOR VECTOR::operator * (VECTOR a){
VECTOR c;
//(x, y, z)*(a.x, a.y, a.z) = (y*a.z-z*a.y, z*a.x-x*a.z, x*a.y - y*a.x)
c.x = y*a.z-z*a.y;
c.y = z*a.x-x*a.z;
c.z = x*a.y-y*a.x;
return c;
}
int main(){
VECTOR a, b;
float k;
cout<<"Nhap so thuc k: "; cin>>k;
cout<<"Nhap vector a: \n"; a.operator >>(cin);
cout<<"Nhap vector b: \n"; b.operator >>(cin);
VECTOR c;
c=a; //thuc hien duoc nho cau tu sao chep
c=c.operator +(b); //c = a + b
//in ra dien giai a + b = c
a.operator <<(cout); cout<<"+";
b.operator <<(cout); cout<<"=";
c.operator <<(cout); cout<<endl;
//in ra dien giai k*a = c
c=a.operator *(k);
cout<<k<<"*"; a.operator <<(cout);
cout<<"="; c.operator <<(cout); cout<<endl;
//in ra dien giai a*b = c
c=a;
c=c.operator *(b);
a.operator <<(cout); cout<<"*";
b.operator <<(cout); cout<<"=";
c.operator <<(cout);
}
TẢI BỘI THÂN THIỆN
#include <iostream>
using namespace std;
class VECTOR{
private:
float x,y,z;
public:
~VECTOR(){;} // huy tu = destructor
VECTOR(){x=0;y=0;z=0;} // cau tu NGAM DINH = contructor
VECTOR(float x1,float y1, float z1){
x=x1;y=y1;z=z1;
} //cau tu khoi tao
VECTOR(VECTOR& a){
x=a.x;y=a.y;z=a.z;
} //cau tu sao chep
friend istream& operator >> (istream& din,VECTOR& a);
friend ostream& operator << (ostream& dout,VECTOR a);
friend VECTOR operator + (VECTOR a,VECTOR b);
friend VECTOR operator * (float r, VECTOR a);
friend VECTOR operator * (VECTOR a,VECTOR b);
};
istream& operator >> (istream& din,VECTOR& a){
cout<<"(x, y, z) = "; din>>a.x>>a.y>>a.z;
return din;
}
ostream& operator << (ostream& dout,VECTOR a){
dout<<"("<<a.x<<", "<<a.y<<", "<<a.z<<")";
return dout;
}
VECTOR operator + (VECTOR a,VECTOR b){
VECTOR c;
c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z;
return c;
}
VECTOR operator * (float r,VECTOR a){
VECTOR c;
c.x=r*a.x; c.y=r*a.y; c.z=r*a.z;
return c;
}
VECTOR operator * (VECTOR a,VECTOR b){
VECTOR c;
//(a.x, a.y, a.z)*(b.x, b.y, b.z)
// = (a2*b3-a3*b2; a3*b1-a1*b3; a1*b2-a2*b1)
c.x = a.y * b.z - a.z * b.y;
c.y = a.z * b.x - a.x * b.z;
c.z = a.x * b.y - a.y * b.x;
cout<<"Tinh tai cho: c = "<<c<<endl;
return c;
}
int main(){
VECTOR a, b;
float k;
cout<<"Nhap so thuc k: "; cin>>k;
cout<<"Nhap vector a: \n"; cin>>a;
cout<<"Nhap vector b: \n"; cin>>b;
VECTOR c;
//in ra dien giai a + b = c
c = a + b;
cout<<a << "+" << b << "=" << c << endl;
//in ra dien giai k*a = c
c = k * a;
cout<< k <<"*" << a << "=" << c <<endl;
//in ra dien giai a*b = c
c = a * b;
cout << a << "*" << b << "=" << c;
}
BÀI 3
Hãy lập trình xây dựng lớp số phức (COMPLEX) với các phép toán tải bội thân
thiện hoặc không thân thiện sau đây.
1) Nhập số phức
2) In ra số phức
3) Cộng hai số phức
4) Nhân một số thực với một số phức
5) Nhân hai số phức
Trong hàm main, nhập hai số phức a, b và số thực k. Diễn giải các tính toán
sau: a + b = c; k * a = c; a * b = c;
Công thức nhân 2 số phức:
(a1 + b1*i) * (a2 + b2 * i) = (a1a2 – b1b2) + (a1b2 + a2b1) * i
#include <iostream>
#include <math.h>
using namespace std;
class COMPLEX
{ private:
float x,y;
public:
~COMPLEX() {;}
COMPLEX() {x=y=0;}
COMPLEX(float a) {x=y=a;}
COMPLEX(float a,float b) {x=a;y=b;}
COMPLEX(COMPLEX &Z) {x=Z.x; y=Z.y;}
friend COMPLEX operator + (COMPLEX,COMPLEX);
friend COMPLEX operator * (float,COMPLEX);
friend COMPLEX operator * (COMPLEX,COMPLEX);
friend ostream& operator << (ostream&, COMPLEX &);
friend istream& operator >> (istream&, COMPLEX &);
};
//cong 2 so phuc
COMPLEX operator +(COMPLEX z1,COMPLEX z2)
{COMPLEX z;
z.x = z1.x + z2.x; z.y = z1.y + z2.y; return z;}
//nhan 1 so thuc voi 1 so phuc
COMPLEX operator *(float r,COMPLEX z1)
{COMPLEX z;
z.x = r*z1.x ; z.y = r*z1.y;return z;}
//nhan 2 so phuc
COMPLEX operator *(COMPLEX z1,COMPLEX z2)
{COMPLEX z;
z.x = z1.x * z2.x - z1.y*z2.y;
z.y = z1.x * z2.y + z1.y*z2.x;
return z;}
//Nhap so phuc
istream& operator >> (istream& din, COMPLEX& z)
{ float x1,y1;
cout<<"x, y = "; din >> x1; din>> y1; z.x=x1; z.y= y1;
return din;}
//In ra so phuc
ostream& operator << (ostream &dout, COMPLEX &z)
{ dout<<"("<<z.x;
if (z.y>0) dout<<" + i * "<<z.y<<")";
else if (z.y<0) dout<<" - i * "<<abs(z.y)<<")";
return dout;}
int main() {
COMPLEX a,b,c;
float k;
cout <<"nhap so phuc a: \n"; cin>>a;
cout <<"nhap so phuc b: \n"; cin>>b;
cout <<"nhap so thuc k: "; cin>>k;
//Dien giai a + b = c
c = a + b;
cout << a << " + " << b << " = " << c << endl;
//Dien giai k*a = c
c = k*a;
cout << k << " * " << a << " = " << c << endl;
//Dien giai a*b = c
c = a*b;
cout << a << " * " << b << " = " << c;
return 0;
}