Lời giải chi tiết bài thực hành LTHĐT HKH 1: Các bài tập code C++

Đáp án chi tiết bài thực hành LTHĐT HKH 1 môn Code C++! Tham khảo code mẫu, giải thích thuật toán dễ hiểu, giúp bạn nắm vững kiến thức lập trình hướng đối tượng.

Trường đại học

Chưa rõ

Người đăng

Ẩn danh

Thể loại

Bài thực hành

Chưa rõ

43
0
0

Phí lưu trữ

30 Point

Tóm tắt

I. Tổng Quan Đáp Án Bài Thực Hành LTHĐT HKH 1 Code C

Bài viết này cung cấp đáp ánlời giải chi tiết cho các bài thực hành Lập trình hướng đối tượng (LTHĐT) học kỳ HKH 1, với ngôn ngữ lập trình C++. Trọng tâm là cung cấp code mẫu C++ và giải thích cặn kẽ từng dòng lệnh, giúp người học nắm vững kiến thức C++ cơ bảnC++ nâng cao. Các bài tập được lựa chọn bao gồm nhiều chủ đề khác nhau như lớp đối tượng, kế thừa, đa hình, friend function và friend class, constructor và destructor, cũng như các kỹ thuật lập trình hướng đối tượng khác. Mục tiêu là giúp sinh viên giải bài tập một cách hiệu quả và hiểu sâu sắc hơn về các khái niệm quan trọng trong LTHĐT bằng C++. Bài viết cũng hướng dẫn cách sử dụng các IDE C++ phổ biến như Visual Studio C++, CodeBlocks, Dev C++Online C++ Compiler để biên dịch và debug code C++. Bên cạnh đó, bài viết cũng đề cập đến các nguồn tài liệu tham khảo hữu ích như GitHub C++, Repository C++, Stack Overflow C++ và các diễn đàn lập trình C++.

1.1. Giới thiệu các khái niệm LTHĐT cơ bản trong C

LTHĐT (Lập trình hướng đối tượng) là một phương pháp lập trình mạnh mẽ, cho phép tổ chức code thành các đối tượng độc lập, có thuộc tính (dữ liệu) và hành vi (phương thức). Các khái niệm then chốt trong LTHĐT bao gồm: Lớp (Class), Đối tượng (Object), Kế thừa (Inheritance), Đa hình (Polymorphism), Đóng gói (Encapsulation) và Trừu tượng (Abstraction). Trong C++, lớp được sử dụng để định nghĩa một kiểu dữ liệu mới, trong khi đối tượng là một thể hiện cụ thể của lớp đó. Kế thừa cho phép tạo ra các lớp mới dựa trên các lớp đã có, kế thừa các thuộc tính và phương thức của lớp cha. Đa hình cho phép một đối tượng có thể có nhiều hình thức khác nhau, tùy thuộc vào ngữ cảnh sử dụng. Đóng gói là việc che giấu thông tin bên trong đối tượng, chỉ cho phép truy cập thông qua các phương thức công khai. Trừu tượng là việc tập trung vào các đặc điểm quan trọng của đối tượng, bỏ qua các chi tiết không cần thiết. Ví dụ, Class SINHVIEN có các thuộc tính MASV, HOTEN, TUOI, DIEM và các phương thức NHAP, XUAT. 'STUDENT CLASS class SINHVIEN { ... }' - Đây là ví dụ cơ bản về lớp trong C++, định nghĩa cấu trúc dữ liệu sinh viên.

1.2. Mục tiêu và phạm vi của bài thực hành Code C HKH 1

Bài thực hành LTHĐT HKH 1 có mục tiêu giúp sinh viên làm quen và nắm vững các kiến thức nền tảng của lập trình hướng đối tượng với ngôn ngữ C++. Phạm vi của bài thực hành bao gồm: khai báo và sử dụng lớp, định nghĩa các phương thức, khởi tạo đối tượng, sử dụng các khái niệm kế thừa, đa hình, friend function và friend class. Các bài tập thường bao gồm việc xây dựng các lớp mô tả các đối tượng thực tế như: Sinh viên, Hình chữ nhật, Hàng hóa, Sách, Mảng số, Ngày tháng, Nhân sự, Nhà sản xuất, Phiếu nhập hàng, Máy tính, v.v... Bài thực hành này giúp sinh viên phát triển tư duy lập trình hướng đối tượng, kỹ năng giải quyết vấn đề và khả năng viết code C++ rõ ràng, dễ bảo trì. Sinh viên cũng được làm quen với việc sử dụng các công cụ lập trình như compiler C++, IDE C++ và các thư viện hỗ trợ.

II. Thách Thức Lỗi Thường Gặp Khi Giải Bài Tập LTHĐT Code C

Trong quá trình giải bài tập LTHĐT với C++, sinh viên thường gặp phải một số lỗi phổ biến như: Lỗi cú pháp (syntax errors), Lỗi logic (logical errors), Lỗi biên dịch (compilation errors), Lỗi runtime (runtime errors), Lỗi liên quan đến quản lý bộ nhớ (memory management errors), và Lỗi liên quan đến việc sử dụng sai các khái niệm LTHĐT. Lỗi cú pháp thường do viết sai cú pháp của ngôn ngữ C++, ví dụ như thiếu dấu chấm phẩy, sai tên biến, sai tên hàm, v.v... Lỗi logic thường do sai sót trong thuật toán, dẫn đến kết quả không đúng. Lỗi biên dịch xảy ra khi trình biên dịch không thể biên dịch code C++, thường do lỗi cú pháp hoặc lỗi liên kết. Lỗi runtime xảy ra khi chương trình đang chạy, ví dụ như chia cho 0, truy cập vào vùng nhớ không hợp lệ, v.v... Lỗi quản lý bộ nhớ thường do không giải phóng bộ nhớ sau khi sử dụng, dẫn đến rò rỉ bộ nhớ. Việc debug code C++ là một kỹ năng quan trọng giúp sinh viên tìm ra và sửa các lỗi này. Các công cụ như Visual Studio C++, CodeBlocks, Dev C++ cung cấp các tính năng debug mạnh mẽ, giúp sinh viên theo dõi giá trị của biến, kiểm tra luồng thực thi của chương trình và tìm ra nguyên nhân gây ra lỗi.

2.1. Cách nhận biết và khắc phục lỗi cú pháp Code C nhanh chóng

Lỗi cú pháp trong C++ là loại lỗi phổ biến nhất, đặc biệt đối với người mới bắt đầu. Để nhận biết lỗi cú pháp, cần chú ý đến thông báo lỗi của trình biên dịch. Thông báo lỗi thường chỉ ra dòng code gây ra lỗi và mô tả loại lỗi. Ví dụ, "expected ';' before 'return'" nghĩa là thiếu dấu chấm phẩy trước lệnh return. Các lỗi cú pháp thường gặp bao gồm: thiếu dấu chấm phẩy (;), sai dấu ngoặc (()), {}, [], thiếu từ khóa (ví dụ, 'int', 'float', 'class'), sai tên biến hoặc hàm, sử dụng toán tử không đúng cách, v.v... Để khắc phục lỗi cú pháp, cần đọc kỹ thông báo lỗi, kiểm tra lại dòng code bị lỗi và các dòng code lân cận. Sử dụng các IDE C++ như Visual Studio C++, CodeBlocks, Dev C++ có tính năng tự động kiểm tra cú pháp, giúp phát hiện và sửa lỗi nhanh chóng. Ngoài ra, việc tuân thủ các quy tắc viết code rõ ràng, dễ đọc cũng giúp giảm thiểu lỗi cú pháp.

2.2. Phương pháp Debug Code C hiệu quả để tìm ra lỗi logic

Lỗi logic là loại lỗi khó phát hiện hơn so với lỗi cú pháp, vì chương trình vẫn chạy được nhưng kết quả không đúng. Để tìm ra lỗi logic, cần sử dụng các phương pháp debug code C++ hiệu quả. Một phương pháp phổ biến là sử dụng các điểm dừng (breakpoints) trong IDE C++. Tại điểm dừng, chương trình sẽ tạm dừng và cho phép kiểm tra giá trị của các biến, xem xét luồng thực thi của chương trình. Một phương pháp khác là sử dụng các lệnh in (printf, cout) để in ra giá trị của các biến tại các thời điểm khác nhau, giúp theo dõi sự thay đổi của dữ liệu. Ngoài ra, cần xem xét lại thuật toán, kiểm tra các điều kiện rẽ nhánh, các vòng lặp, và đảm bảo rằng code thực hiện đúng theo yêu cầu của bài toán. Sử dụng các công cụ debug của Visual Studio C++, CodeBlocks, Dev C++ giúp người học theo dõi và tìm ra lỗi một cách trực quan nhất.

III. Giải Pháp Hướng Dẫn Chi Tiết Bài Thực Hành Sinh Viên Code C

Phần này cung cấp hướng dẫn chi tiếtđáp án cho bài tập về lớp Sinh Viên (STUDENT CLASS) trong C++. Bài tập này yêu cầu xây dựng một lớp SINHVIEN với các thuộc tính như mã sinh viên (MASV), họ tên (HOTEN), tuổi (TUOI), điểm (DIEM) và các phương thức nhập thông tin (NHAP) và xuất thông tin (XUAT). Code mẫu C++ được cung cấp sẽ bao gồm khai báo lớp, định nghĩa các thuộc tính và phương thức, cũng như cách sử dụng lớp để tạo và thao tác với các đối tượng sinh viên. Hướng dẫn cũng giải thích cặn kẽ từng dòng lệnh, giúp sinh viên hiểu rõ cách thức hoạt động của chương trình. Ngoài ra, bài viết cũng đề cập đến các vấn đề thường gặp khi làm bài tập này và cách khắc phục. 'class SINHVIEN { ... }' - Đây là khai báo lớp sinh viên trong C++.

3.1. Phân tích Code C mẫu cho lớp Sinh Viên và các thuộc tính

Lớp SINHVIEN trong C++ được xây dựng để mô tả thông tin của một sinh viên. Các thuộc tính của lớp bao gồm: MASV (mã sinh viên) là một mảng ký tự (char) để lưu mã sinh viên, HOTEN (họ tên) là một mảng ký tự để lưu họ tên sinh viên, TUOI (tuổi) là một số nguyên (int) để lưu tuổi sinh viên, và DIEM (điểm) là một số thực (float) để lưu điểm của sinh viên. Các thuộc tính này được khai báo ở chế độ private (mặc định) hoặc public tùy thuộc vào yêu cầu của bài toán. Thông thường, các thuộc tính nên được khai báo ở chế độ private để đảm bảo tính đóng gói, và chỉ cho phép truy cập thông qua các phương thức public. Ví dụ, 'char MASV[30];' khai báo một mảng ký tự để lưu trữ mã sinh viên. 'int TUOI;' khai báo một biến kiểu số nguyên để lưu trữ tuổi của sinh viên.

3.2. Hướng dẫn viết hàm nhập NHAP và xuất XUAT thông tin Sinh Viên

Hàm NHAP trong lớp SINHVIEN có nhiệm vụ nhập thông tin của sinh viên từ bàn phím. Hàm này thường sử dụng các lệnh như cin (để nhập số) và gets (để nhập chuỗi) để lấy dữ liệu từ người dùng. Cần chú ý sử dụng fflush(stdin) để xóa bộ đệm bàn phím trước khi nhập chuỗi, tránh bị trôi lệnh. Hàm XUAT có nhiệm vụ xuất thông tin của sinh viên ra màn hình. Hàm này thường sử dụng các lệnh như cout (để xuất số và chuỗi) và setw (để định dạng độ rộng của cột) để hiển thị thông tin một cách rõ ràng, dễ đọc. Ví dụ, 'cout<<"Ma SV: "; gets(MASV);' là đoạn code nhập mã sinh viên từ bàn phím. 'cout<<"Ma SV: "<<MASV<<endl;' là đoạn code xuất mã sinh viên ra màn hình.

IV. Phương Pháp Giải Bài Tập Hình Chữ Nhật Sử Dụng Class Code C

Bài tập này hướng dẫn cách xây dựng lớp Hình chữ nhật (RECTANGLE CLASS) trong C++. Lớp HCN sẽ có các thuộc tính như chiều dài (D), chiều rộng (R) và các phương thức như nhập thông tin (NHAP), vẽ hình chữ nhật (VE), tính diện tích (DIENTICH) và tính chu vi (CHUVI). Code mẫu C++ được cung cấp sẽ minh họa cách khai báo lớp, định nghĩa các thuộc tính và phương thức, cũng như cách sử dụng lớp để tạo và thao tác với các đối tượng hình chữ nhật. Hướng dẫn cũng giải thích cách sử dụng vòng lặp để vẽ hình chữ nhật bằng các ký tự, cũng như cách tính diện tích và chu vi dựa trên chiều dài và chiều rộng. 'class HCN { ... }' - Đây là khai báo lớp hình chữ nhật trong C++.

4.1. Xây dựng lớp HCN với thuộc tính chiều dài và chiều rộng

Lớp HCN (Hình Chữ Nhật) được xây dựng với hai thuộc tính chính: D (chiều dài) và R (chiều rộng). Cả hai thuộc tính này đều có kiểu dữ liệu là float, cho phép lưu trữ các giá trị không nguyên. Các thuộc tính này thường được khai báo ở chế độ private để đảm bảo tính đóng gói, và chỉ cho phép truy cập thông qua các phương thức public. Ví dụ, 'float D;' khai báo một biến kiểu số thực để lưu trữ chiều dài của hình chữ nhật. 'float R;' khai báo một biến kiểu số thực để lưu trữ chiều rộng của hình chữ nhật.

4.2. Triển khai phương thức VE DIENTICH và CHUVI trong Class HCN

Phương thức VE trong lớp HCN có nhiệm vụ vẽ hình chữ nhật ra màn hình bằng các ký tự, thường là dấu ''. Phương thức này sử dụng hai vòng lặp for lồng nhau để duyệt qua từng hàng và từng cột của hình chữ nhật. Phương thức DIENTICH có nhiệm vụ tính diện tích của hình chữ nhật, dựa trên công thức diện tích = chiều dài * chiều rộng (**DR**). Phương thức CHUVI có nhiệm vụ tính chu vi của hình chữ nhật, dựa trên công thức chu vi = 2 * (chiều dài + chiều rộng) (2(D+R)*). Ví dụ, 'for(int i=0; i<D; i++) { ... }' là vòng lặp duyệt qua từng hàng của hình chữ nhật. 'return D*R;' là lệnh trả về diện tích của hình chữ nhật.

V. Ứng Dụng Quản Lý Danh Sách Hàng Hóa Bằng Mảng Đối Tượng C

Bài tập này hướng dẫn cách sử dụng mảng đối tượng (OBJECT ARRAY) để quản lý danh sách hàng hóa trong C++. Lớp HANG sẽ có các thuộc tính như mã hàng (MAHANG), tên hàng (TENHANG), đơn giá (DONGIA), số lượng (SOLUONG) và các phương thức nhập thông tin (NHAP) và xuất thông tin (XUAT). Code mẫu C++ được cung cấp sẽ minh họa cách khai báo và sử dụng mảng đối tượng, cách cấp phát bộ nhớ động cho mảng, cũng như cách truy cập và thao tác với các phần tử trong mảng. Hướng dẫn cũng giải thích cách tính tổng giá trị của từng mặt hàng và tổng giá trị của toàn bộ danh sách hàng hóa. 'class HANG { ... }' - Đây là khai báo lớp hàng hóa trong C++.

5.1. Xây dựng Class HANG với các thuộc tính mã tên giá số lượng

Lớp HANG (Hàng hóa) được xây dựng với các thuộc tính: MAHANG (mã hàng) là một mảng ký tự để lưu mã hàng, TENHANG (tên hàng) là một mảng ký tự để lưu tên hàng, DONGIA (đơn giá) là một số thực để lưu đơn giá của hàng hóa, và SOLUONG (số lượng) là một số nguyên để lưu số lượng hàng hóa. Các thuộc tính này thường được khai báo ở chế độ private để đảm bảo tính đóng gói, và chỉ cho phép truy cập thông qua các phương thức public. Ví dụ, 'char MAHANG[10];' khai báo một mảng ký tự để lưu trữ mã hàng. 'float DONGIA;' khai báo một biến kiểu số thực để lưu trữ đơn giá của hàng hóa.

5.2. Sử dụng mảng đối tượng để lưu trữ danh sách hàng hóa

Để quản lý danh sách hàng hóa, có thể sử dụng mảng đối tượng, tức là một mảng mà mỗi phần tử là một đối tượng của lớp HANG. Để khai báo mảng đối tượng, cần chỉ định kiểu dữ liệu là tên lớp và số lượng phần tử của mảng. Để cấp phát bộ nhớ động cho mảng, có thể sử dụng toán tử new. Sau khi sử dụng xong mảng, cần giải phóng bộ nhớ để tránh rò rỉ bộ nhớ. Ví dụ, 'HANG * x = new HANG[n];' khai báo một con trỏ đến mảng đối tượng HANG và cấp phát bộ nhớ cho n đối tượng. 'delete [] x;' giải phóng bộ nhớ đã cấp phát cho mảng x.

5.3. Viết hàm nhập và xuất thông tin cho từng mặt hàng Code C

Tương tự như bài tập về lớp Sinh Viên, hàm NHAP sẽ nhập thông tin cho từng mặt hàng. Hàm XUAT sẽ xuất thông tin của từng mặt hàng ra màn hình. Quan trọng là sử dụng vòng lặp để duyệt qua mảng và thực hiện nhập/xuất cho từng phần tử. Hàm XUAT có thể được cải tiến để tính tổng giá trị của từng mặt hàng (DONGIA * SOLUONG) và tổng giá trị của toàn bộ danh sách hàng hóa. Việc sử dụng setw từ thư viện <iomanip> giúp định dạng đầu ra rõ ràng và dễ đọc. Ví dụ, 'cout << setw(10) << MAHANG << setw(20) << TENHANG...' định dạng các cột thông tin về hàng hóa.

VI. Kết Luận Nâng Cao Kỹ Năng Lập Trình Hướng Đối Tượng C

Bài viết đã trình bày đáp ánhướng dẫn chi tiết cho một số bài thực hành LTHĐT HKH 1 với ngôn ngữ C++. Hy vọng rằng thông qua việc nghiên cứu các code mẫu C++ và các giải thích cặn kẽ, sinh viên sẽ nắm vững kiến thức nền tảng của lập trình hướng đối tượng và có thể áp dụng vào các bài toán thực tế. Để nâng cao kỹ năng lập trình C++, sinh viên nên tiếp tục luyện tập giải nhiều bài tập khác nhau, tham khảo các nguồn tài liệu trực tuyến như GitHub C++, Repository C++, Stack Overflow C++ và tham gia các diễn đàn lập trình C++ để học hỏi kinh nghiệm từ những người khác. Quan trọng nhất là phải luôn kiên trì và không ngừng học hỏi. 'return 0;' là câu lệnh kết thúc chương trình một cách thành công.

6.1. Các nguồn tài liệu học lập trình C hữu ích nhất hiện nay

Có rất nhiều nguồn tài liệu hữu ích để học lập trình C++. Đối với người mới bắt đầu, có thể tham khảo các sách giáo trình C++ cơ bản, các khóa học trực tuyến trên các nền tảng như Coursera, Udemy, edX. Đối với người đã có kiến thức nền tảng, có thể tham khảo các sách C++ nâng cao, các blog chuyên về C++, các tài liệu hướng dẫn về STL (Standard Template Library), Boost Library, v.v... Ngoài ra, việc tham gia các cộng đồng lập trình C++ trên các diễn đàn, nhóm Facebook, Slack, Discord cũng giúp học hỏi kinh nghiệm và giải đáp thắc mắc. GitHub C++ chứa rất nhiều dự án C++ mã nguồn mở, là nguồn tài liệu tham khảo vô giá để học hỏi cách viết code C++ chuyên nghiệp.

6.2. Lời khuyên để cải thiện kỹ năng Code C và LTHĐT

Để cải thiện kỹ năng code C++LTHĐT, cần thực hành thường xuyên, giải nhiều bài tập khác nhau, từ dễ đến khó. Cần chú trọng đến việc viết code rõ ràng, dễ đọc, tuân thủ các quy tắc lập trình tốt. Nên sử dụng các công cụ debug để tìm ra và sửa lỗi một cách hiệu quả. Nên đọc code của người khác, tham gia vào các dự án mã nguồn mở để học hỏi kinh nghiệm. Quan trọng nhất là phải có đam mê và sự kiên trì, không ngại thử thách và không ngừng học hỏi. Ví dụ, tham gia vào dự án C++ trên GitHub sẽ giúp làm quen với quy trình làm việc nhóm, cách sử dụng hệ thống quản lý phiên bản Git, và cách viết code chuyên nghiệp.

20/09/2025

Trích đoạn nội dung tài liệu

STUDENT CLASS class SINHVIEN { #include “iostream” char MASV[30]; #include “stdio.h” char HOTEN[50]; #include “conio.h” int TUOI; #include “iomanip” float DIEM; public: void NHAP(); void XUAT(); }; void SINHVIEN::NHAP() { cout<<"Ma SV: "; fflush(stdin); gets(MASV); cout<<"Ho Ten: "; fflush(stdin); gets(HOTEN); cout<<"Tuoi: "; cin>>TUOI; cout<<"Diem: "; cin>>DIEM; } void SINHVIEN::XUAT() { cout<<"Ma SV: "<<MASV<<endl; cout<<"Ho ten: "<<HOTEN<<endl; cout<<"Tuoi: "<<TUOI<<endl; cout<<"Diem: "<<DIEM<<endl<<endl; } int main() { SINHVIEN a, b; cout<<"Nhap thong tin cua sinh vien a:"<<endl; a.NHAP(); cout<<"Nhap thong tin cua sinh vien b:"<<endl; b.NHAP(); cout<<endl<<"Sinh vien a"<<endl; a.XUAT(); cout<<"Sinh vien b"<<endl; b.XUAT(); return 0; } BÀI 1. RECTANGLE CLASS class HCN { float D, R; public: void NHAP(); void VE(); float DIENTICH(); float CHUVI(); }; void HCN::NHAP() { cout<<"Chieu dai : "; cin>>D; cout<<"Chieu rong: "; cin>>R; } void HCN::VE() { for(int i=0; i<D; i++) { for(int j=0; j<R; j++) cout<<"*"; cout<<endl; } } float HCN::DIENTICH() { return D*R; } float HCN::CHUVI() { return 2*(D+R); } int main() { HCN x; x.VE(); cout<<"Dien tich HCN: "<<x.DIENTICH()<<endl; cout<<"Chu vi HCN : "<<x.CHUVI(); return 0; } BÀI 1. OBJECT ARRAY class HANG { char MAHANG[10]; char TENHANG[20]; float DONGIA; int SOLUONG; public: void NHAP(); void XUAT(); }; void HANG::NHAP() { cout<<"Ma hang : "; fflush(stdin); gets(MAHANG); cout<<"Ten hang : "; fflush(stdin); gets(TENHANG); cout<<"Don gia : "; cin>>DONGIA; cout<<"So luong : "; cin>>SOLUONG; } void HANG::XUAT() { cout<<setw(10)<<MAHANG<<setw(20)<<TENHANG<<setw(10)<<DONGIA<<set w(10)<<SOLUONG<<setw(20)<<DONGIA*SOLUONG<<endl; } int main() { int n; cout<<"Nhap so mat hang: "; cin>>n; Hang * x = new HANG[n]; for(int i=0; i<n; i++) { cout<<"Nhap hang "<<i+1<<endl; x[i].XUAT(); return 0; } BÀI 1. OBJECT ARRAY CONTINUE class SACH { char MASACH[10]; char TENSACH[20]; int SOTRANG; float GIATIEN; public: void NHAP(); void XUAT(); }; void SACH::NHAP() { cout<<"Ma sach : "; fflush(stdin); gets(MASACH); cout<<"Ten sach : "; fflush(stdin); gets(TENSACH); cout<<"So trang : "; cin>>SOTRANG; cout<<"Gia tien : "; cin>>GIATIEN; } void SACH::XUAT() { cout<<setw(10)<<MASACH<<setw(20)<<TENSACH<<setw(10)<<SOTRANG<<setw (10)<<GIATIEN<<endl; } int main() { int n; cout<<"Nhap so sach: "; cin>>n; SACH *x=new SACH[n]; for(int i=0; i<n; i++) { cout<<"Nhap sach thu "<<i+1<<endl; x[i].XUAT(); return 0; } BÀI 1.

ARRAY OF NUMBERS class MANG { int *a; int n; public: void NHAP(); void XUAT(); void SAP(); }; void MANG::NHAP() { cout<<"n= "; cin>>n; a=new int[n]; for(int i=0; i<n; i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } } void MANG::XUAT() { cout<<endl; for(int i=0; i<n; i++) cout<<a[i]<<" "; } void MANG::SAP() { for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) if(a[i]>a[j]) { int tg=a[i]; a[i]=a[j]; a[j]=tg; } } int main() { MANG x; x.XUAT(); return 0; } BÀI 1. COMPLETE class MANG { float *a; int n; public: void NHAP(); void XUAT(); float MAX(); float MIN(); }; void MANG::NHAP() { cout<<"n= "; cin>>n; a=new float[n]; for(int i=0; i<n; i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } } void MANG::XUAT() { cout<<endl; for(int i=0; i<n; i++) cout<<a[i]<<" "; } float MANG::MAX() { float M=a[0]; for(int i=0; i<n; i++) if(a[i]>M) M=a[i] ; return M; } float MANG::MIN() { float M=a[0]; for(int i=0; i<n; i++) if(a[i]<M) M=a[i]; return M; } int main() { MANG x; x.NHAP(); cout<<"Mang vua nhap:"<<endl; x.XUAT(); cout<<"MAX="<<x.MIN(); return 0; } BÀI 2. DATE TYPE class DATE { int D, M, Y; public: void NHAP(); void XUAT(); }; class NHANSU { char MANS[20]; char HOTEN[30]; DATE NS; public: void NHAP(); void XUAT(); }; void DATE::NHAP() { cout<<"Day: "; cin>>D; cout<<"Month: "; cin>>M; cout<<"Year: "; cin>>Y; } void DATE::XUAT() { cout<<setw(10)<<D<<"/"<<M<<"/"<<Y<<endl; } void NHANSU::NHAP() { cout<<"Ma nhan su: "; fflush(stdin); gets(MANS); cout<<"Ten nhan su: "; fflush(stdin); gets(HOTEN); cout<<"Ngay thang nam sinh:"<<endl; NS.NHAP(); } void NHANSU::XUAT() { cout<<setw(10)<<MANS<<setw(15)<<HOTEN; NS.NHAP(); cout<<endl<<"Nhan su vua nhap:"<<endl; x.XUAT(); return 0; } BÀI 2. ONE-ONE RELATIONSHIP class NSX { char MANSX[20]; char TENNSX[20]; char DCNSX[20]; public: void NHAP(); void XUAT(); }; class HANG { char MANHANG[20]; char TENHANG[30]; NSX x; public: void NHAP(); void XUAT(); }; void NSX::NHAP() { cout<<"Ma NSX : "; fflush(stdin); gets(MANSX); cout<<"Ten NSX: "; fflush(stdin); gets(TENNSX); cout<<"DC NSX: "; fflush(stdin); gets(DCNSX); } void NSX::XUAT() { cout<<"Ma NSX : "<<MANSX<<endl; cout<<"Ten NSX: "<<TENNSX<<endl; cout<<"DC NSX: "<<DCNSX<<endl; } void HANG::NHAP() { cout<<"Ma hang: "; fflush(stdin); gets(MANHANG); cout<<"Ten hang: "; fflush(stdin); gets(TENHANG); cout<<"Nha san xuat:"<<endl; x.NHAP(); } void HANG::XUAT() { cout<<"Ma hang: "<<MANHANG<<endl; cout<<"Ten hang: "<<TENHANG<<endl; cout<<"Nha san xuat: "; x.NHAP(); cout<<endl<<"Mat hang vua nhap:"<<endl; x.XUAT(); return 0; } BÀI 2.

ONE-INFINITY RELATIONSHIP class HANG { char MAHANG[20]; char TENHANG[20]; float DONGIA; public: void NHAP(); void XUAT(); }; class PHIEU { char MAPHIEU[20]; HANG *x; int n; public: void NHAP(); void XUAT(); }; void HANG::NHAP() { cout<<"Ma Hang : "; fflush(stdin); gets(MAHANG); cout<<"Ten Hang: "; fflush(stdin); gets(TENHANG); cout<<"Don Gia: "; cin>>DONGIA; } void HANG::XUAT() { cout<<setw(10)<<MAHANG<<setw(20)<<TENHANG<<setw(10)<<DONGIA<<endl; } void PHIEU::NHAP() { cout<<"Ma Phieu: "; fflush(stdin); gets(MAPHIEU); cout<<"Nhap so mat hang: "; cin>>n; x=new HANG[n]; for(int i=0; i<n; i++) x[i].NHAP(); cout<<endl<<setw(30)<<"PHIEU NHAP HANG"<<endl; a.XUAT(); return 0; } BÀI 2. MIXED RELATIONSHIP class MAY { char MAMAY[10]; char KIEUMAY[20]; char TINHTRANG[20]; public: void NHAP(); void XUAT(); }; class QUANLY { char MAQL[10]; char TENQL[20]; public: void NHAP(); void XUAT(); }; class PHONGMAY { char MAPHONG[10]; char TENPHONG[20]; QUANLY x; MAY *y; int n; public: void NHAP(); void XUAT(); }; void MAY::NHAP() { cout<<"Ma May : "; fflush(stdin); gets(MAMAY); cout<<"Kieu May: "; fflush(stdin); gets(KIEUMAY); cout<<"Tinh Trang: "; fflush(stdin); gets(TINHTRANG); } void MAY::XUAT() { cout<<setw(10)<<MAMAY<<setw(20)<<KIEUMAY<<setw(20)<<TINHTRANG<<endl; } void QUANLY::NHAP() { cout<<"Ma nguoi quan ly: "; fflush(stdin); gets(MAQL); cout<<"Ten nguoi quan ly: "; fflush(stdin); gets(TENQL); } void QUANLY::XUAT() { cout<<"Ma nguoi quan ly: "<<MAQL<<endl; cout<<"Ten nguoi quan ly: "<<TENQL<<endl; } void PHONGMAY::NHAP() { cout<<"Ma phong: "; fflush(stdin); gets(MAPHONG); cout<<"Ten phong:"; fflush(stdin); gets(TENPHONG); x.NHAP(); } void PHONGMAY::XUAT() { cout<<endl<<"Ma phong: "<<MAPHONG; cout<<". Ten phong: "<<TENPHONG<<endl; x.XUAT(); return 0; } BÀI 3. FRIEND FUNCTION class SINHVIEN { char MASINHVIEN[10]; char HOTEN[20]; float TOAN, LY, HOA; public: void NHAP(); void XUAT(); friend void SAP(SINHVIEN *a, int n); }; void SINHVIEN::NHAP() { cout<<"Ma sinh vien: "; fflush(stdin); gets(MASINHVIEN); cout<<"Ho ten: "; fflush(stdin); gets(HOTEN); cout<<"Diem toan: "; cin>>TOAN; cout<<"Diem ly: "; cin>>LY; cout<<"Diem hoa: "; cin>>HOA; } void SINHVIEN::XUAT() { cout<<setw(10)<<MASINHVIEN<<setw(20)<<HOTEN<<setw(10)<<TOAN<<setw(10) <<LY<<setw(10)<<HOA<<setw(10)<<TOAN+LY+HOA<<endl; } void SAP(SINHVIEN *a, int n) { for(int i=0; i<n; i++) for(int j=i+1; j<n; j++) if(a[i].HOA) { SINHVIEN tg=a[i]; a[i]=a[j]; a[j]=tg; } } int main() { SINHVIEN *a; int n; cout<<"Nhap so sinh vien: "; cin>>n; a=new SINHVIEN[n]; for(int i=0; i<n; i++) a[i].XUAT(); return 0; } BÀI 3.

FRIEND CLASS class NSX { char MANSX[20]; char TENNSX[20]; char DCNSX[20]; friend class HANG; //lớp bạn }; class HANG { char MANHANG[20]; char TENHANG[30]; float DONGIA, TRONGLUONG; NSX x; public: void NHAP(); void XUAT(); }; void HANG::NHAP() { cout<<"Ma hang: "; fflush(stdin); gets(MANHANG); cout<<"Ten hang: "; fflush(stdin); gets(TENHANG); cout<<"Don gia: "; cin>>DONGIA; cout<<"Trong luong: "; cin>>TRONGLUONG; cout<<"Ma NSX: "; fflush(stdin); gets(x.MANSX); cout<<"Ten NSX:"; fflush(stdin); gets(x.TENNSX); cout<<"Dia chi:"; fflush(stdin); gets(x.DCNSX); } void HANG::XUAT() { cout<<"Ma hang: "<<MANHANG<<endl; cout<<"Ten hang: "<<TENHANG<<endl; cout<<"Don gia: "<<DONGIA<<endl; cout<<"Trong luong: "<<TRONGLUONG<<endl; cout<<"Ma NSX: "<<x.MANSX<<endl; cout<<"Ten NSX: "<<x.TENNSX<<endl; cout<<"Dia chi: "<<x.DCNSX<<endl; } int main() { HANG x; x.NHAP(); cout<<endl<<"Mat hang vua nhap:"<<endl; x.XUAT(); return 0; } BÀI 3. FRIENDS class HANG; class DATE { int D, M, Y; friend void IN(HANG a[], int n, int NAM); friend class HANG; }; class HANG { char MANHANG[20]; char TENHANG[30]; DATE x; public: void NHAP(); void XUAT(); friend void IN(HANG a[], int n); }; void HANG::NHAP() { cout<<"Ma hang: "; fflush(stdin); gets(MANHANG); cout<<"Ten hang: "; fflush(stdin); gets(TENHANG); cout<<"Nhap Ngay san xuat: "<<endl; cout<<"Ngay: "; cin>>x.D; cout<<"Thang: "; cin>>x.M; cout<<"Nam: "; cin>>x.Y; } void HANG::XUAT() { cout<<"Ma hang: "<<MANHANG<<endl; cout<<"Ten hang: "<<TENHANG<<endl; cout<<"Nhap Ngay san xuat: "<<x.Y<<endl; } void IN(HANG a[], int n) { for(int i=0; i<n; i++) if(a[i].NHAP(); cout<<endl<<"Mat hang nhap: 2017"<<endl; IN(a, n); return 0; } BÀI 3. CONSTRUCTOR METHODS class PTB2 { float a, b, c; public: void NHAP(); void XUAT(); void GIAI(); PTB2(); PTB2(float x, float y, float z); }; void PTB2::NHAP() { cout<<"Nhap cac he so: "<<endl; cout<<"a="; cin>>a; cout<<"b="; cin>>b; cout<<"c="; cin>>c; } void PTB2::XUAT() { cout<<"Phuong trinh: "<<a<<"X"<<(char)253<<” + "<<b<<"X + "<<c<<" = 0"<<endl; } void PTB2::GIAI() { if(a==0) cout<<"Day khong phai ptb2"<<endl; else { float delta = b*b-4*a*c; if(delta<0) cout<<"Phuong trinh vo nghiem"<<endl; else { cout<<"X1="<<(-b+sqrt(delta))/(2*a)<<endl; cout<<"X2="<<(-b-sqrt(delta))/(2*a)<<endl; } } } PTB2::PTB2() { a=b=c=0; } PTB2::PTB2(float x, float y, float z) { a=x; b=y; c=z; } int main() { PTB2 P(1, 2, 1); P.GIAI(); return 0; } BÀI 3. CONSTRUCTOR/ DESTRUCTOR METHODS class ARRAY { int *VALUE; int n; public: ARRAY(); ARRAY(int x); ~ARRAY(); void NHAP(); void XUAT(); }; ARRAY::ARRAY() { n=0; VALUE=NULL; } ARRAY::ARRAY(int x) { n=x; VALUE = new int[n]; for(int i=0; i<n; i++) VALUE[i]=0; } ARRAY::~ARRAY() { n=0; VALUE=NULL; //OR: delete [] VALUE; } void ARRAY::NHAP() { if(n==0) {cout<<"n="; cin>>n;} if(VALUE==NULL) VALUE = new int[n]; for(int i=0; i<n; i++) { cout<<"VALUE["<<i<<"]="; cin>>VALUE[i]; } } void ARRAY::XUAT() { for(int i=0; i<n; i++) cout<<VALUE[i]<<" "; } int main() { ARRAY x(8); cout<<endl<<"Mang vua khoi tao : "; x.XUAT(); cout<<endl<<"Nhap mang: "<<endl; x.NHAP(); cout<<endl<<"Mang vua nhap: "; x.XUAT(); return 0; } BÀI O1.

COUPON class NCC { char MANCC[10]; char TENNCC[20]; char DCNCC[20]; public: void NHAP(); void XUAT(); }; class HANG { char TENHANG[20]; float DONGIA; int SOLUONG; public: void NHAP(); void XUAT(); friend class PHIEU; }; class PHIEU { char MAPHIEU[20]; char NGAYLAP[20]; NCC y; HANG *x; int n; public: void NHAP(); void XUAT(); }; void NCC::NHAP() { cout<<"Ma NCC: "; fflush(stdin); gets(MANCC); cout<<"Ten NCC: "; fflush(stdin); gets(TENNCC); cout<<"DC NCC: "; fflush(stdin); gets(DCNCC); } void NCC::XUAT() { cout<<"Ma NCC: "<<setw(15)<<MANCC; cout<<setw(15)<<"Ten NCC: "<<setw(15)<<TENNCC<<endl; cout<<"DC NCC: "<<DCNCC<<endl; } void HANG::NHAP() { cout<<"Ten hang: "; fflush(stdin); gets(TENHANG); cout<<"Don gia: "; cin>>DONGIA; cout<<"So luong: "; cin>>SOLUONG; } void HANG::XUAT() { cout<<setw(20)<<TENHANG<<setw(10)<<DONGIA<<setw(10)<<SOLUONG <<setw(10)<<DONGIA*SOLUONG<<endl; } void PHIEU::NHAP() { cout<<"Ma phieu: "; fflush(stdin); gets(MAPHIEU); cout<<"Ngay lap: "; fflush(stdin); gets(NGAYLAP); y.NHAP(); } void PHIEU::XUAT() { cout<<setw(40)<<"PHIEU NHAP HANG"<<endl; cout<<"Ma phieu: "<<setw(15)<<MAPHIEU; cout<<setw(15)<<"Ngay lap: "<<setw(15)<<NGAYLAP<<endl; y.SOLUONG; cout<<setw(50)<<"Cong thanh tien: "<<TONGTIEN<<endl; } int main() { PHIEU a; a.XUAT(); return 0; } BÀI O1. TRANSCRIPT class SINHVIEN { char MASV[20]; char TENSV[20]; char LOP[10]; char KHOA[10]; public: void NHAP(); void XUAT(); }; class MON { char TENMON[20]; int SOTRINH; float DIEM; public: void NHAP(); void XUAT(); friend class PHIEU; }; class PHIEU { SINHVIEN x; MON *y; int n; public: void NHAP(); void XUAT(); }; void SINHVIEN::NHAP() { cout<<"Ma sv: "; fflush(stdin); gets(MASV); cout<<"Ten sv: "; fflush(stdin); gets(TENSV); cout<<"Lop: "; fflush(stdin); gets(LOP); cout<<"Khoa: "; fflush(stdin); gets(KHOA); } void SINHVIEN::XUAT() { cout<<"Ma sv: "<<MASV<<"\t"; cout<<"Ten sv: "<<TENSV<<endl; cout<<"Lop: "<<LOP<<"\t"; cout<<"Khoa: "<<KHOA<<endl; } void MON::NHAP() { cout<<"Ten mon: "; fflush(stdin); gets(TENMON); cout<<"So trinh:"; cin>>SOTRINH; cout<<"Diem: "; cin>>DIEM; } void MON::XUAT() { cout<<setw(20)<<TENMON<<setw(20)<<SOTRINH<<setw(20)<<DIEM<<endl; } void PHIEU::NHAP() { x.NHAP(); } void PHIEU::XUAT() { cout<<setw(40)<<"PHIEU BAO DIEM"<<endl<<endl; x.n+1)*sizeof(MON)); for(int i = p.n++; } int main() { PHIEU a; a.XUAT(); return 0; } BÀI O1. INVENTORY class PHIEU; class NHANVIEN { char HOTENNV[20]; char CHUCVUNV[20]; public: void NHAP(); void XUAT(); }; class PHONG { char MAPH[20]; char TENPH[20]; char TRUONGPH[20]; public: void NHAP(); void XUAT(); }; class TAISAN { char TENTS[20]; int SOLUONGTS; char TINHTRANGTS[20]; public: void NHAP(); void XUAT(); friend class PHIEU; friend void SUA(PHIEU a); friend void SAP(PHIEU a); }; class PHIEU { char MAPH[20]; char NGAYKK[20]; NHANVIEN x; PHONG y; TAISAN *z; int n; public: void NHAP(); void XUAT(); friend void SUA(PHIEU a); friend void SAP(PHIEU a); }; void NHANVIEN::NHAP() { cout<<"Ho ten: "; fflush(stdin); gets(HOTENNV); cout<<"Chuc vu: "; fflush(stdin); gets(CHUCVUNV); } void NHANVIEN::XUAT() { cout<<"Nhan vien kiem ke: "<<HOTENNV<<"\t"<<"Chuc vu: " <<CHUCVUNV<<endl; } void PHONG::NHAP() { cout<<"Ma phong: "; fflush(stdin); gets(MAPH); cout<<"Ten phong:"; fflush(stdin); gets(TENPH); cout<<"Truong phong: "; fflush(stdin); gets(TRUONGPH); } void PHONG::XUAT() { cout<<"Kiem ke tai phong: "<<TENPH<<"\t"<<"Ma phong: " <<MAPH<<endl; cout<<"Truong phong: "<<TRUONGPH<<endl; } void TAISAN::NHAP() { cout<<"Ten tai san: "; fflush(stdin); gets(TENTS); cout<<"So luong: "; cin>>SOLUONGTS; cout<<"Tinh trang: "; fflush(stdin); gets(TINHTRANGTS); } void TAISAN::XUAT() { cout<<setw(20)<<TENTS<<setw(20)<<SOLUONGTS<<setw(20)<<TINHTRANGTS <<endl; } void PHIEU::NHAP() { cout<<"Ma phieu: "; fflush(stdin); gets(MAPH); cout<<"Ngay kiem ke: "; fflush(stdin); gets(NGAYKK); x.NHAP(); } void PHIEU::XUAT() { cout<<setw(40)<<"PHIEU KIEM KE TAI SAN"<<endl; cout<<"Ma phieu: "<<MAPH<<"\t"<<"Ngay kiem ke: "<<NGAYKK<<endl; x.SOLUONGTS; cout<<"So tai san kiem ke: "<<n<<"\t"<<". Tong so luong: " <<TONGSL<<endl; } Bonus 1: void SUA(PHIEU a) { for(int i=0; i<a.TENTS, “May vi tinh”)==0) a.SOLUONGTS = 20; } Bonus 2: void SAP(PHIEU a) { for(int i=0; i<a.SOLUONGTS) { TAISAN tg = a.XUAT(); return 0; } BÀI 4.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ