BÀI GIẢI THỰC HÀNH KỸ THUẬT LẬP TRÌNH BÀI THỰC TẬP SỐ 1 2 Cơ bản về C++ 2 BÀI THỰC TẬP SỐ 2 4 Cấu trúc lựa chọn 4 BÀI THỰC TẬP SỐ 3 8 Cấu trúc lặp 8 BÀI THỰC TẬP SỐ 4 11 Mảng và Cấu trúc 11 BÀI THỰC TẬP SỐ 5 16 BÀI THỰC TẬP SỐ 6 21 Giới thiệu về Lớp Đối tượng 21 BÀI THỰC TẬP SỐ 7 27 Xử lý Đối tượng 27 BÀI THỰC TẬP SỐ 8 32 Xử lý Đối tượng (tiếp theo) 32 BÀI THỰC TẬP SỐ 9 38 Sự Thừa kế và Bao gộp trong C++ 38 BÀI THỰC TẬP SỐ 10 45 Đa hình và Khuôn hình 45
Trang 1ĐẠI HỌC BÁCH KHOA TP HCM
KHOA CÔNG NGHỆ THÔNG TIN
BÀI GIẢI THỰC HÀNH KỸ THUẬT LẬP TRÌNH
BÀI THỰC TẬP SỐ 1 2
Cơ bản về C++ 2
BÀI THỰC TẬP SỐ 2 4
Cấu trúc lựa chọn 4
BÀI THỰC TẬP SỐ 3 8
Cấu trúc lặp 8
BÀI THỰC TẬP SỐ 4 11
Mảng và Cấu trúc 11
BÀI THỰC TẬP SỐ 5 16
BÀI THỰC TẬP SỐ 6 21
Giới thiệu về Lớp Đối tượng 21
BÀI THỰC TẬP SỐ 7 27
Xử lý Đối tượng 27
BÀI THỰC TẬP SỐ 8 32
Xử lý Đối tượng (tiếp theo) 32
BÀI THỰC TẬP SỐ 9 38
Sự Thừa kế và Bao gộp trong C++ 38
BÀI THỰC TẬP SỐ 10 45
Đa hình và Khuôn hình 45
Trang 2area = radius * radius * PI; // Circle area calculation
cout << "The area is " << area << " with a radius of 5.\n";
radius = 20; // Compute area with new radius
area = radius * radius * PI;
cout << "The area is " << area << " with a radius of 20.\n";
int start_hour, start_minute, start_second;
int end_hour, end_minute, end_second;
cout << "Nhap thoi diem thu nhat: " << endl;
Trang 3int start_elapsed, end_elapsed;
start_elapsed = start_hour * 3600 + start_minute * 60 + start_second;end_elapsed = end_hour * 3600 + end_minute * 60 + end_second;
int duration = end_elapsed - start_elapsed;
int hour = duration / 3600;
int minute = (duration % 3600) / 60;
int second = duration - hour * 3600 - minute * 60;
cout << "Hai thoi diem cach nhau: " << hour << " gio " << minute
<< " phut " << second << " giay";
}
Trang 4BÀI THỰC TẬP SỐ 2 Cấu trúc lựa chọn
Câu 4: Dùng cấu trúc switch để viết lại đoạn chương trình sau:
if (num == 1)
{cout << “Alpha”; }else if (num == 2)
{ cout << “Beta”; }else if (num == 3)
{ cout << “Gamma”; }else
Trang 5chuc = (so % 100) / 10;
don_vi = so - tram * 100 - chuc * 10;
int lon_nhat, giua, be_nhat;
lon_nhat = tram > chuc ? tram : chuc;
lon_nhat = lon_nhat > don_vi ? lon_nhat : don_vi;
be_nhat = tram < chuc ? tram : chuc;
be_nhat = be_nhat < don_vi ? be_nhat : don_vi;
giua = (tram + chuc + don_vi) - lon_nhat - be_nhat;
cout << "Cac chu so sau khi sap xep thu tu: "
<< be_nhat << giua << lon_nhat;
if (((mod4 == 0) && (mod100 != 0)) || (mod400 == 0))
cout << "Day la nam nhuan!\n";
c Nếu lớn hơn 30km thì mỗi km thêm sẽ là 3000
Hãy nhập số km sau đó in ra số tiền phải trả.
Trang 6Câu 8: Nhập vào ngày, tháng, năm Kiểm tra xem ngày, tháng, năm đó có hợp lệ hay không, nếu
hợp lệ cho biết ngày trước đó là bao nhiêu.
Ví dụ: Nhập 01/01/2003 Ngày trước đó 31/12/2002
#include <iostream.h>
void main()
{
int ngay, thang, nam;
cout << "Nhap vao ngay : ";
int mod4, mod100, mod400;
Trang 7thang = 12;
nam = nam - 1;
}
switch (thang){
}
cout << "Ngay hom truoc ngay da nhap: "
<< ngay << "/" << thang << "/" << nam;
}
Trang 8BÀI THỰC TẬP SỐ 3 Cấu trúc lặp
Câu 5: Viết một chương trình C++ tính tổng và giá trị trung bình của n số thực chính xác đơn được
nhập vào từ người sử dụng Trị của n cũng là một giá trị do người sử dụng nhập vào.
#include <iostream.h>
void main()
{
int i, n;
float num, s, avg;
cout << "Ban muon nhap bao nhieu so? ";
Câu 6: Viết một chương trình C++ sinh ra một bảng đổi nhiệt độ từ Celcius sang Fahrenheit Cho
nhiệt độ Celcius tăng từ 5 độ đến 50 độ với mỗi bước tăng 5 độ Bảng kết quả in ra có dạng:
Trang 9Dựa vào công thức này, viết một chương trình C++ để tính xấp xỉ giá trị của e Hãy dùng
vòng lặp while mà dừng lại khi độ sai biệt giữa hai lần xấp xỉ nhỏ hơn 1.0E-6.
} while (error > epxilon);
cout << "Gia tri xap xi cua e tinh duoc la : " << e << endl;
}
Câu 8: Viết một chương trình C++ tính tóan và trình bày số tiền tích lũy được nếu gửi tiết kiệm
1000$ vào ngân hàng sau từng năm trong vòng 10 năm Chương trình cũng cần trình bày số tiền tích lũy được với lãi suất thay đổi từ 6% đến 12% với bước tăng 1% Như vậy, ta nên dùng hai vòng lặp lồng nhau: vòng lặp ngòai thay đổi theo lãi suất và vòng lặp trong thay đổi theo số năm Công thức để tính số tiền tích lũy L = P(1+ i)n với P là số tiền gửi ban đầu,
i là lãi suất, n là số chu kì tính lãi.
cout << " Nam thu " << n << " thu duoc so tien: "
<< deposit * pow(1 + i, n) << endl;
}cout << endl;
}
}
Trang 10Câu 9: Viết chương trình nhập số nguyên dương n Liệt kê n số nguyên tố đầu tiên.
nguyen_to = false;
break;}
}}
while (!nguyen_to);
cout << "So nguyen to thu " << i << " la: " << so << endl;}
}
Trang 11BÀI THỰC TẬP SỐ 4 Mảng và Cấu trúc
Câu 5: Hãy viết một chương trình C++ đọc vào một mảng gồm n số thực chính xác đơn và tìm số
nhỏ nhất trong array đó n là một trị số nguyên do người sử dụng nhập vào.
min = mangso[i];
j = i + 1;
}}
cout << "So thuc nho nhat trong mang la so thu " << j << ", co gia tri "
<< min;
}
Câu 6: Hãy viết một chương trình C++ đọc vào một mảng gồm n số thực chính xác đơn và sắp xếp
array đó theo thứ tự giảm dần.
if (array[j] < array[j+1]){
float tg;
Trang 12tg = array[j];
array[j] = array[j+1];
array[j+1] = tg;
}}
vitri = i;
break;}
Trang 13cout << "Khong co phan tu nao cua mang bang " << x;
cout << "Sau khi chen phan tu " << x << " vao vi tri dau tien: \n ";
cout << " mang tro thanh ( viet theo hang doc ) : " << endl;
Câu 9: Hãy viết một chương trình C++ đọc vào một ma trận n n và chuyển vị ma trận này và in
ma trận chuyển vị ra Chuyển vị một ma trận vuông nghĩa là:
Trang 14sau khi chuyển vi, nó trở thành
cout << "Nhap vao phan tu a(" << (i + 1) << ", " << (j + 1) <<
"): ";
cin >> mang[i][j];
}}
cout << "Ma tran ban nhap vao la :" << endl;
Trang 15a Hãy khai báo một kiểu dữ liệu mang tên Car là kiểu cấu trúc mà mỗi chiếc xe (car) có thể gồm những thông tin như trong mỗi hàng của bảng sau:
25 36 44 52 68
1450 3240 1792 2360 2114
62 136 76 105 67
b Dùng kiểu dữ liệu được định nghĩa ở a., viết một chương trình C++ mà đọc vào dữ liệu
được cho ở bảng trên vào thành một array gồm 5 cấu trúc Một khi dữ liệu đã được đọc
vào, chương trình sẽ tính tóan và trình bày ra báo cáo gồm các cột: mã số xe, số km đã đi trên mỗi lít xăng
km_lit = array[i].kms_driven / array[i].litre_used;
cout << "So km da di tren moi lit xang : " << km_lit << endl;
}
}
Trang 16BÀI THỰC TẬP SỐ 5 Câu 4: Cho một hàm như sau:
int square(int a){
a = a*a;
return a;
}
a Viết chương trình C++ nhập vào số nguyên x và gọi hàm square
để tính bình phương của x và trình bày kết quả này ra.
b Viết lại hàm square để hàm này trở thành một hàm gọi bằng địa
chỉ, đặt tên hàm mới là square2 Viết chương trình C++ nhập vào số nguyên x và gọi hàm square2 để tính bình phương của x và trình bày giá trị của x sau khi gọi hàm Có
nhận xét gì về giá trị của x sau khi gọi hàm?
cout << "Ham goi bang gia tri" << endl;
cout << "x^2= " << square(x) << endl;
cout << "Gia tri x sau khi goi ham: x= " << x << endl << endl;
cout << "Ham goi bang dia chi" << endl;
cout << "x^2= " << square2(x) << endl;
cout <<"Gia tri cua x sau khi goi ham: x= " << x << endl << endl;
}
Câu 5: Đọc hàm sau đây dùng để tính số nguyên lớn nhất mà bình phương của nó nhỏ hơn hay
bằng một trị số nguyên cho trước.
int Intqrt(int num){
int i;
i = 1;
do
Trang 17++ i while i*i <= num;
cout << "So nguyen lon nhat ma binh phuong cua no <=" << n
<< " la so: " << Intqrt(n) << endl;
}
Câu 5: Hãy khai báo mảng động cho ma trận hai chiều có kích thước m x n Sau đó, kiểm tra có
phải ma trận đối xứng không.
cout << "phan tu [" << i << "][" << j << "] = ";
cin >> a[i][j];
}}
}
void in(int m, int n, int **a)
{
cout << "IN MANG 2 CHIEU " << m << "x" << n << endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cout << setw(5) << a[i][j];
cout << endl;
Trang 18kt = 0;
break;}
if (kt == 0) break;}
cout << "Xoa mang 2 chieu";
for (int i = 0; i < m; i++)
Câu 6: Viết chương trình nhập số nguyên dương n gồm k chữ số (0 < k ≤ 5) , sắp xếp các chữ số
của n theo thứ tự tăng dần.
Trang 19Ví dụ: Nhập n = 1536 Kết quả sau khi sắp xếp: 1356.
for (unsigned int i = 0; i < strlen(n) - 1; i++)
for (unsigned int j= i + 1; j < strlen(n); j++)
if (n[i] > n[j]){
t = n[i];
n[i] = n[j];
n[j] = t;
}}
b Viết chương trình C++ nhập vào hai số nguyên n và m và gọi hàm C định nghĩa ở câu a để tính C(n,m) và trình bày kết quả ra.
#include<iostream.h>
int tohop(int n, int m)
{
if (m == 0 || m == n)
Trang 21BÀI THỰC TẬP SỐ 6 Giới thiệu về Lớp Đối tượng
Câu 1b Hãy tổ chức chương trình có sử dụng lớp đối tượng student thành file giao tiếp (interface file) và file thi công (implementation file) và chạy chúng trên môi trường Visual C++
cout<< " Roll no = "<< rollno << endl;
cout<< " Age =" << age << endl;
cout<< " Sex =" << sex << endl;
cout<< " Height =" << height << endl;
cout<< " Weight =" << weight << endl;
Trang 22Câu 2 Cho lớp đối tượng student được định nghĩa như trong 1.a Hãy viết chương trình C++ hoàn chỉnh mà hàm main() khai báo một mảng (array) có kích thước là 10 để chứa các đối tượng
student, yêu cầu người dùng đọc dữ liệu của các đối tượng student trong mảng và trình bày các đối
Câu 3 Cho lớp đối tượng student được định nghĩa như trong 1.a Hãy viết chương trình C++ hoàn
chỉnh mà hàm main() theo các yêu cầu sau:
- Khai báo một mảng (array) có kích thước động để chứa các đối tượng student
- Yêu cầu người dùng nhập vào số nguyên n và tạo vùng nhớ heap để mảng trên có thể chứa
được n đối tượng student.
- Đọc dữ liệu của các đối tượng student vào mảng và trình bày các đối tượng student đó ra màn
Trang 23for (i = 0; i < size; i++)
Câu 5 Xây dựng một lớp đối tượng Rectangle mà gồm hai thành viên dữ liệu kiểu số thực chính
xác đơn: length và width Lớp đối tượng có các hàm thành viên sau đây:
- hàm khởi tạo (constructor) không có thông số Hàm này gán trị 0 cho hai thành viên dữ liệu của đối tượng
- hàm khởi tạo có hai thông số kiểu số thực chính xác đơn Hàm này gán trị của hai thông số cho hai thành viên dữ liệu của đối tượng
- hàm perimeter() tính chu vi của một hình chữ nhật
- hàm area() tính diện tích của một hình chữ nhật.
- thủ tục getdata( ) để yêu cầu người dùng nhập giá trị cho length và width của hình chữ nhật
- thủ tục showdata( ) để trình bày ra màn hình length, width, chu vi và diện tính của hình chữ
nhật.
Hiện thực lớp đối tượng Rectangle vào một chương trình C++ hoàn chỉnh Chương trình này khai báo hai đối tượng thuộc lớp Rectangle sử dụng hai hàm khỏi tạo ở trên, đọc vào và trình bày dữ liệu
của hai đối tượng này nhằm kiểm tra sự hoạt động của các hàm thành viên.
Cải tiến chương trình: thay hai hàm khởi tạo đã định nghĩa ở trên của lớp Rectangle bằng một hàm
khởi tạo có thông số mặc định (default argument).
this->length = length;
this->width = width;
}
void getData()
Trang 24cout << "Information of rectangle: " << endl;
cout << "Length: " << length << endl;
cout << "Width: " << width << endl;
cout << "Perimeter of rectangle: " << r2.perimeter() << endl;
cout << "Area of rectangle: " << r2.area() << endl;
}
Câu 6 Xây dựng một lớp đối tượng CStudent gồm các thành phần dữ liệu (data members) sau:
- mã số sinh viên (là số nguyên).
- một mảng (array) được khai báo tĩnh gồm 5 số thực chính xác đơn dùng để chứa tối đa 5 điểm số.
- một số nguyên chỉ số điểm số được nhập vào
Các hàm thành viên (member functions) của lớp đối tượng như sau:
- hàm khởi tạo (constructor) của lớp đối tượng này để gán giá trị đầu = 0 cho tất cả các thành
viên dữ liệu của mỗi đối tượng CStudent.
- thủ tục nhập mã số sinh viên.
- thủ tục nhập một điểm số kỳ thi và cập nhập tổng số điểm đã nhập vào.
- hàm tính điểm trung bình để trả ra điểm trung bình cộng của các điểm số đã nhập.
- thủ tục xuất ra màn hình mã số sinh viên và điểm trung bình của sinh viên.
Trang 25Hiện thực lớp đối tượng CStudent vào một chương trình C++ hoàn chỉnh Chương trình này khai báo một đối tượng thuộc lớp CStudent, đọc vào và trình bày dữ liệu của đối tượng này nhằm kiểm
tra sự hoạt động của các hàm thành viên.
void set_student_id(int student_id);
void add_mark(float mark);
Trang 26for (int i = 0; i < num_of_mark; i++)
cout << "Student id: " << student_id << endl;
cout << "GPA of student: " << get_gpa() << endl;
Trang 27BÀI THỰC TẬP SỐ 7
Xử lý Đối tượng Câu 1b Chỉnh sửa chương trình để không còn lỗi trên Chạy thử các sửa đổi trên trong môi trường
Auto::Auto(char* szMake, double dEngine){
szCarMake = new char[25];
strcpy(szCarMake, szMake);
dCarEngineSize = dCarEngine;
}
Auto::displayAuto(){
cout<< “The car make: “<< szCarMake<< endl;
cout<< “The car engine size: “<< dCarEngine<< endl;
}
void main(){
Trang 28a Thêm vào lớp đối tượng trên một hàm khởi tạo sao chép (copy constructor) thích hợp.
b Thêm vào lớp đối tượng trên một hàm hủy bỏ (destructor) thích hợp.
Chạy thử các sửa đổi trên trong môi trường Visual C++.
Auto(char*, double);
Auto(const Auto &);
cout<< "The car make: "<< szCarMake<< endl;
cout<< "The car engine size: "<< dCarEngine<< endl;
Trang 29Câu 5 Xây dựng một lớp đối tượng Dyn_Student gồm các thành phần dữ liệu (data members) như
sau:
- mã số sinh viên (là số nguyên).
- một mảng động (dynamic array) dùng để chứa điểm số của sinh viên, mảng động được hiện thực là một con trỏ kiểu số thực chính xác đơn.
- một số nguyên dùng để chỉ số điểm số của sinh viên
Các hàm thành viên (member functions) của lớp đối tượng như sau:
- hàm khởi tạo (constructor) không có thông số, hàm này gán giá trị đầu = 0 hoặc = NULL cho
tất cả các thành viên dữ liệu của mỗi đối tượng Dyn_Student.
- hàm khởi tạo có một thông số kiểu số nguyên, hàm này gán giá trị của thông số cho thành phần
dữ liệu số điểm số của sinh viên và sau đó tạo vùng nhớ heap cho mảng động
- hàm khởi tạo sao chép (copy constructor) để tạo đối tượng thuộc lớp Dyn_Student từ đối tượng
tượng có sẵn.
- thủ tục nhập mã số sinh viên.
- thủ tục nhập các điểm số của sinh viên.
- hàm tính điểm trung bình để trả ra điểm trung bình cộng của các điểm số.
- thủ tục xuất ra màn hình mã số sinh viên và điểm trung bình của sinh viên.
- hàm hủy (destructor) để hủy vùng nhớ heap đã cấp phát cho mảng động.
Hiện thực lớp đối tượng Dyn_Student vào một chương trình C++ hoàn chỉnh Chương trình này khai báo một đối tượng thuộc lớp Dyn_Student, đọc vào và trình bày dữ liệu của đối tượng này
nhằm kiểm tra sự hoạt động của các hàm thành viên.
DynStudent(int num_of_mark);
DynStudent(const DynStudent &);