KĨ THUẬT LẬP TRÌNH

31
KĨ THUẬT LP TRÌNH TÀI LIU VÀ PHN MM Copy 2 tp sau: 1) Giáo trình hc phn 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 tbiểu tượng Dev-C++ Chú ý: Code trong tài li u là ca Borland C++ chy trên nn hđiều hành 16 bit. Code đó cần định hướng biên dch lại chút trong môi trường hđiều hành 32 bit. LCH HC Bui 1 + 2: CÁC VẤN ĐỀ CƠ BẢN CA C++ Ni dung: Chương 1, Chương 2 - Vào/Ra DL - Các cấu trúc điều khin - Các hàm - Truy n tham s- Mng, Xâu và File - Con trBui 3 + 4: LỚP ĐỐI TƢỢNG VÀ TI BI Ni dung: Chương 3, trng tâm Bài 1, 2, 3 Bui 5 + 6: HÀM VÀ PHÉP TOÁN THÂN THIN Ni dung: Chương 3 (tiếp theo) Hướng dn thi và Ki m tra gia môn

Transcript of KĨ THUẬT LẬP TRÌNH

Page 1: KĨ THUẬT LẬP TRÌNH

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

Page 2: KĨ THUẬT LẬP TRÌNH

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

Page 3: KĨ THUẬT LẬP TRÌNH

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

---------

Page 4: KĨ THUẬT LẬP TRÌNH

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;

Page 5: KĨ THUẬT LẬP TRÌNH

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

Page 6: KĨ THUẬT LẬP TRÌNH

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;

}

Page 7: KĨ THUẬT LẬP TRÌNH

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

Page 8: KĨ THUẬT LẬP TRÌNH

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(){

Page 9: KĨ THUẬT LẬP TRÌNH

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;

Page 10: KĨ THUẬT LẬP TRÌNH

}

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.

Page 11: KĨ THUẬT LẬP TRÌNH

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;}

Page 12: KĨ THUẬT LẬP TRÌNH

// 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;

Page 13: KĨ THUẬT LẬP TRÌNH

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;

Page 14: KĨ THUẬT LẬP TRÌNH

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

Page 15: KĨ THUẬT LẬP TRÌNH

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;

Page 16: KĨ THUẬT LẬP TRÌNH

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)

Page 17: KĨ THUẬT LẬP TRÌNH

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;

Page 18: KĨ THUẬT LẬP TRÌNH

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() ;

}

Page 19: KĨ THUẬT LẬP TRÌNH

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

Page 20: KĨ THUẬT LẬP TRÌNH

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);

Page 21: KĨ THUẬT LẬP TRÌNH

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;

}

Page 22: KĨ THUẬT LẬP TRÌNH

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;

Page 23: KĨ THUẬT LẬP TRÌNH

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)

Page 24: KĨ THUẬT LẬP TRÌNH

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<<")";

Page 25: KĨ THUẬT LẬP TRÌNH

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

Page 26: KĨ THUẬT LẬP TRÌNH

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;

Page 27: KĨ THUẬT LẬP TRÌNH

}

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;

Page 28: KĨ THUẬT LẬP TRÌNH

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;}

Page 29: KĨ THUẬT LẬP TRÌNH

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;}

Page 30: KĨ THUẬT LẬP TRÌNH

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;

}

Page 31: KĨ THUẬT LẬP TRÌNH