Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 35

TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN




BÁO CÁO BÀI TẬP LỚN


MÔN KỸ THUẬT LẬP TRÌNH CƠ SỞ
MÃ ĐỀ : 62

Giảng viên hướng dẫn : Nguyễn Thành Huy


Sinh viên thực hiện : Nguyễn Quang Hà
Lớp : 2110A03
Mã sinh viên : 21A100100107

HÀ NỘI – NĂM 2021


1

Mục Lục
Câu 1.........................................................................................................................
Câu 2.........................................................................................................................
Câu 3.........................................................................................................................
Câu 4.........................................................................................................................
Câu 5.........................................................................................................................
Câu 6.........................................................................................................................
Câu 7.......................................................................................................................10
Câu 8.......................................................................................................................12
Câu 9.......................................................................................................................19
Câu 10.....................................................................................................................22
2

Trường Đại Học Mở Hà Nội


Khoa Công Nghệ Thông Tin

BÁO CÁO BÀI TẬP LỚN MÔN KỸ THUẬT LẬP TRÌNH CƠ SỞ


Tên môn học : Kỹ thuật lập trình cơ sở. Số tín chỉ : 04
Học kỳ I : Năm học 2021-2022
Đề số 62

Câu 1
** Trình bày thuật toán (bao gồm: input - output - process – bộ dữ liệu test) để
tính tổng của một dãy n số gồm: x1, x2, …, xn (0<=n<=50)

B1 : Input
- int n, int i, int sum;
B2 : Output
- int sum;
B3 : Process
- Kiểm tra (0<=n<=50) dùng if else :
*Nếu đúng :
+ Dùng vòng lặp for
+ i tăng dần ( i++ ) từ 0 với điều kiện i <= n;
+ Thực hiện tính toán sum = sum + i trong vòng lặp;
*Nếu sai :
+ Hiện thông báo ra màn hình “ Bạn đã nhập n sai điều kiện “
3

B4 : Bộ dữ liệu test

ST n sum
T
1 5 15
2 10 55
3 15 120
Câu 2
** Viết chương trình nhập vào số có 4 chữ số. In ra màn hình chữ số hàng đơn vị
của số vừa được từ bàn phím
B1: Input
- int n, n1;
B2 : Output
- int n1;
B3 : Process
- Kiểm tra điều kiện ( n < 10000 && n >= 1000 ) bằng câu lệnh if else:
*Nếu đúng :
- n1 = n % 10 (chia lấy dư)
*Nếu sai :
- Hiện thông báo ra màn hình “Bạn đã nhập sai điều kiện”
B4 : Bộ dữ liệu test
ST n n1
T
1 2703 3
2 8888 8
3 9999 9
4

B5 : Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet chuong trinh nhap vao so co 4 chu so . In ra man hinh
chu so hang don vi cua so vua duoc tu ban phim
*/
#include <iostream>
int main()
{
int n;
std::cout << "Nhap mot so co 4 chu so" << std::endl;
std::cin >> n;
if (n < 10000 && n >= 1000)
{
n = n % 10;
std::cout << "Chu so hang don vi cua chu so vua nhap la " << n << std::endl;
}
else
{
std::cout << "Ban nhap sai dieu kien" << std::endl;
}
return 0;
}

Câu 3
** Viết chương trình nhập R từ bàn phím, Thực hiện tính diện tích và thể tích
của hình cầu với bán kính R theo công thức: S = 4*R*R; V = R*S/3.
B1: Input
- float r , S , V;
B2 : Output
- float S, V;
B3 : Process
- S = 4*R*R;
- V = R*S/3;

B4 : Bộ dữ liệu test
5

STT r S V
1 5 100 166.667
2 10 400 1333.33
3 15 900 4500

B5 : Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet chuong trinh nhap R tu ban phim, Thuc hien tinh dien tich va the
tich cua hinh cau voi ban kinh R theo cong thuc : S = 4 * R * R; V = R * S / 3
*/
#include <iostream>
int main()
{
float r;
std::cout << "Nhap vao ban kinh R : ";
std::cin >> r;
float S = 4 * r * r;
float V = (dientich * r) / 3;
std::cout << "Dien tich hinh tron la " << S << std::endl;
std::cout << "The tich hinh tron la " << V << std::endl;
return 0;
}
Câu 4
** Viết Chương trình Nhập 2 số và dấu các phép toán:cộng (+), trừ (-), nhân (x),
chia (:) . In kết quả làm toán với 2 số đó.
B1: Input
- float num1, num2;
B2 : Output
- Kết quả làm toán với 2 số num1, num2;
B3 : Process
- num1 + num2, num1 - num2, num1 * num2, num1 / num2;
6

B4 : Bộ dữ liệu test
STT num1 num2 + - * /
1 1 1 2 0 1 1
2 4 2 6 2 8 2
3 9 3 12 6 27 3

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet Chuong trinh Nhap 2 so va dau cac phep toan : cong(+), tru(-), nhan(x), chia(:)
In ket qua lam toan voi 2 so do*/
#include <iostream>
int main()
{
double num1, num2;
std::cout << "Nhap vao 2 so : \n";
std::cout << "num1 = "; std::cin >> num1;
std::cout << "num2 = "; std::cin >> num2;
std::cout << num1 << "+" << num2 << " = " << num1 + num2 << std::endl;
std::cout << num1 << "-" << num2 << " = " << num1 - num2 << std::endl;
std::cout << num1 << "x" << num2 << " = " << num1 * num2 << std::endl;
std::cout << num1 << ":" << num2 << " = " << num1 / num2 << std::endl;
return 0;
}
7

Câu 5
** Viết hàm chuyển chữ thường thành chữ hoa. Sau đó, viết chương trình nhập
một chuỗi bất kì, gọi hàm trên và cho biết kết quả. Không sử dụng thư viện có
sẵn của C/C++.

B1: Input
- char mot_chu, nhieu_chu;
B2 : Output
- Chữ cái và một chuỗi các chứ cái được chuyển từ chữ thường thành chữ
hoa;

B3 : Process
- Viết một hàm void chuyen_doi (char s[]) :
+ Dùng vòng lặp for :
+ int i tăng dần từ 0 với điều kiện (i <=strlen(s));
+ Dùng điều kiện if :
(s[i] >= 97 && s[i] <= 128)
+ s[i] -= 32;
B4 : Bộ dữ liệu test

STT mot_chu nhieu_chu mot_chu(đã nhieu_chu(đã


chuyển) chuyển)
1 a abcde A ABCDE
2 b nguyen B NGUYEN
3 c ha C HA
8

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet ham chuyen chu thuong thanh chu hoa. Sau do viet chuong trinh nhap mot chuoi bat ki, goi ham tren
va cho biet ket qua. Khong su dung thu vien co san cua C++.
*/

#include <iostream>
// Ham chuyen doi chu thuong thanh chu hoa
void chuyen_doi(char s[])
{
std::cout << "Nhap vao chuoi bat ky: ";
std::cin.getline(s, 100);
for (int i = 0; i <= strlen(s); i++)
{
if (s[i] >= 97 && s[i] <= 128)
s[i] -= 32;
}
std::cout << "Nhieu chu sau khi chuyen thanh viet hoa la " << s << std::endl;
}
int main()
{
char s[100];
chuyen_doi(s);
std::cout << "\n\n";
return 0;
}
9

Câu 6
** Viết hàm tìm kiếm xem ký tự nào xuất hiện nhiều nhất trong chuỗi. Viết
chương trình nhập vào một chuỗi bất kỳ, gọi hàm trên và in ra kết quả. Không sử
dụng thư viện có sẵn của C/C++.
B1: Input
- Độ dài ký tự n;
- Các ký tự;
B2 : Output
- Ký tự xuất hiện nhiều nhất và xuất hiện bao nhiêu lần;
B3 : Process
- Viết hàm nhập độ dài ký tự và lần lượt các ký tự vào (viết dưới dạng
mảng)
- Viết hàm kiểm tra từng xem ký tự có lặp lại không bằng cách dùng 2
vòng
lặp for và điều kiện so sánh lần lượt các kí tự sau với ký tự đầu rồi ký tự
đằng;
với ký tự 2 và cứ thế đến hết.
- Viết hàm kiểm tra từng ký tự xem có xuất hiện hơn một lần không ( so
sánh;
với int max = 1 ) sau đó vùng vòng for xuất kết quả;
B4 : Bộ dữ liệu test

STT n(độ dài ký tự) Các ký tự Ký tự xuất hiện Số lần xuất


nhiều nhất là hiện
1 5 aabca a 3
2 6 abbbcb b 4
3 7 cbcccca c 5
10

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question:
Viet ham tim xem ki tu nao nhieu nhat trong chuoi, viet chuong trinh nhap vao mot chuoi
bat ky, goi ham tren va in ra ket qua. Khong su dung thu vien co san cua C/C++.
*/
#include <iostream>
void nhap(char a[], int& n)
{
std::cout << "Nhap n ky tu can nhap : ";
std::cin >> n;
std::cout << "Nhap ky tu : ";
for (int i = 0; i < n; ++i)
{
std::cin >> a[i];
}
}
void sol(char a[], int& n, int b[])
{
for (int i = 0; i < n; ++i)
{
for (int j = i; j < n; ++j)
{
if (a[j] == a[i])
{
b[i]++;
}
}
}
}
void hien(char a[], int& n, int b[])
{
int max = 1;
for (int i = 0; i < n; ++i)
{
if (b[i] > max)
max = b[i];
}
for (int i = 0; i < n; ++i)
{
if (max == b[i])
{
std::cout << "Ky tu xuat hien nhieu nhat la : " << a[i] << std::endl;
11

std::cout << "Ky tu xuat hien " << b[i] << " lan" << std::endl;
}
}
}
int main()
{
int n;
int b[20] = { 0 };
char a[20];
nhap(a, n);
sol(a, n, b);
hien(a, n, b);
std::cout << "\n\n";
}

Câu 7
** Viết các hàm thực hiện:
o Nhập vào 1 mảng các số nguyên gồm n phần tử (0<=n<=50)
o In ra màn hình 1 mảng các số nguyên
o Đếm số phần tử lẻ trong mảng các số nguyên
o Cho biết giá trị nhỏ nhất của mảng số nguyên
o Tìm kiếm một phần tử x nào đó trong mảng các số nguyên
o Sắp xếp các phần tử của mảng các số nguyên theo thứ tự giảm dần
Viết chương trình chính Áp dụng lần lượt các hàm trên
B1: Input
- Nhập vào 1 mảng có n phần tử (0<=n<=50);
- Giá trị cho các phần tử;
- Giá trị x cần tìm;
B2 : Output
- Mảng số nguyên đã nhập;
- Số phần tử lẻ trong mảng;
- Giá trị nhỏ nhất của mảng;
- Vị trí của phần tử x trong mảng các số nguyên ;
- Mảng sau khi sắp xếp theo thứ tự giảm dần;
12

B3 : Process
- Viết hàm nhập, hiện ra mảng dùng vòng lặp for;
- Viết hàm kiểm tra phần tử lẻ dùng vòng lặp for kiểm tra
nếu có số nào chia hết cho 2 thì bỏ qua còn không thì tăng
tổng số phần tử lẻ thêm 1;
- Viết hàm tìm giá trị nhỏ nhất ( cho gtnn bằng với a[0])
dùng vòng lặp for kiểm tra nếu gtnn lớn hơn a[i] thì cho
gtnn = a[i];
- Viết hàm tìm vị trí phần tử x dùng vòng lặp for kiểm tra
xem nếu giá trị của x = a[i] thì vị trí của x sẽ = i;
- Viết hàm sắp xếp (tạo 1 biến tg) dùng 2 vòng for với biến i
và j = i +1 để kiểm tra nếu a[i] < a[j] , gán giá trị biến a[i] vào tg
rồi gán giá trị a[j] vào a[i] rồi lại gán giá trị tg cho a[j];
B4 : Bộ dữ liệu test
STT n Mảng A Giá trị x Số lượng Giá trị Vị trí Sắp xếp lại
phần tử lẻ nhỏ giá trị x theo thứ tự
nhất cần tìm giảm dần
1 5 12215 2 3 1 12 52211
2 6 6 7 8 9 10 11 10 3 6 4 11 10 9 8 7 6
13

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet cac ham thuc hien :
+ Nhap vao 1 mang so nguyen gom n phan tu (0<=n<=50).
+ In ra man hinh 1 mang so nguyen.
+ Dem so phan tu le trong mang cac so nguyen.
+ Cho biet gia tri nho nhat cua mang so nguyen.
+ Tim kiem mot phan tu x nao do trong mang cac so nguyen.
+ Sap xep cac phan tu cua mang cac so nguyen theo thu tu giam dan.
Viet chuong trinh chinh Ap dung lan luot cac ham tren.
*/

#include <iostream>
// Nhap vao 1 mang so nguyen
void nhap_vao(int a[], int& n)
{
std::cout << "(0 <= n <= 50) Input : n = ";
std::cin >> n;
for (int i = 0; i < n; ++i)
{
std::cout << "a[" << i << "] = ";
std::cin >> a[i];
}
}
// Hien ra mang so nguyen
void hien_ra(int a[], int n)
{
for (int i = 0; i < n; ++i)
{
std::cout << a[i] << " ";
}
}
// Dem so phan tu le trong mang
void dem_phan_tu_le(int a[], int n)
{
int sptl = 0;
for (int i = 0; i < n; ++i)
{
int kiem_tra = 0;
if (a[i] % 2 == 0)
kiem_tra = 1;
if (kiem_tra == 0)
sptl++;
}
std::cout << "\nSo phan tu le cua mang A la : " << sptl << std::endl;
}
// Tim gia tri nho nhat cua mang
void gia_tri_nho_nhat(int a[], int n)
{
14

int gtnn = a[0];


for (int i = 1; i < n; ++i)
{
if (gtnn > a[i])
gtnn = a[i];
}
std::cout << "\nGia tri nho nhat cua mang A la : " << gtnn << std::endl;
}
// Tim kiem vi tri phan tu x trong mang
void tim_phan_tu_x(int a[], int n)
{
std::cout << "\nNhap phan tu x can tim mang A : ";
int vi_tri_x[50];
int x, dem = 0;
std::cin >> x;
std::cout << "\nVi tri x can tim trong mang A la : ";
for (int i = 0; i < n; ++i)
{
if (a[i] == x)
{
vi_tri_x[i] = i;
dem++;
std::cout << " " << vi_tri_x[i];
}
}
}
// Sap xep cac phan tu cua mang theo thu tu giam dan
void sap_xep(int a[], int n)
{
int tg;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] < a[j])
{
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
}
std::cout << "\n\nMang A sau khi sap xep giam dan la : ";
hien_ra(a, n);
}
int main()
{
int a[50], n = 0;
nhap_vao(a, n);
hien_ra(a, n);
dem_phan_tu_le(a, n);
gia_tri_nho_nhat(a, n);
tim_phan_tu_x(a, n);
sap_xep(a, n);
std::cout << "\n\n";
15

return 0;
}

Câu 8
** Viết các hàm thực hiện các công việc sau:
o Nhập một ma trận số nguyên có kích thước n*m
o Hiện ma trận số nguyên ra màn hình
o Xóa một hàng có vị trí h.
o Tính Trung bình cộng các phần tử của một cột c.
o Hiện ra màn hình cột có giá trị Trung bình cộng lớn nhất.
Viết chương trình chính Áp dụng lần lượt các hàm trên
B1: Input
- Nhập vào mảng 2 chiều có dạng a[n][m];
- Nhập vào hàng h cần xóa;
- Nhập vào cột c cần tính;
B2 : Output
- Ma trận có kích thước n*m;
- Ma trận sau khi xóa hàng h;
- Giá trị trung bình cộng cột c;
- Cột có giá trị lớn nhất và giá trị của nó;
B3 : Process
- Viết hàm nhập, hiện dùng vòng lặp for;
- Viết hàm xóa hàng h dùng vòng lặp for để thay
thế lần lượt các giá trị của hàng đó bằng các giá
trị hàng sau rồi sau đó giảm tổng số hàng đi (n--)
- Viết hàm tìm trung bình cộng cột c dùng vòng lặp
for để tính tổng lần lượt các giá trị của cột đó và cộng
vào mẫu số sau mỗi vòng lặp sau đó tính :
16

tbc_cotc = tbc_tu / tbc_mau;

-Viết hàm tìm trung bình cộng cột max (tbc_max), dùng vòng lặp
for tính trung bình cộng cột 0(kết quả = test1), gán giá trị đó cho
tbc_max sau đó reset tử và mẫu về 0, dùng 2 vòng for để tính tbc
các cột từ 1 trở đi, sau mỗi cột tính được gán vào test2 để dùng if
so sánh nếu (test2 > test1) thì tbc_max = test2 còn không thì tiếp
tục lặp và reset tử và mẫu để tính cột tiếp theo;

B4 : Bộ dữ liệu test
ST n m h c Ma Trận Ma trận sau TBC Cột có giá trị Giá trị TBC củ
T khi xóa cột h cột c max cột max
1 3 3 0 1 123 456 6.5 2 7.5
456 789
789
2 3 4 0 2 1234 5678 9 3 10
5678 9 10 11 12
9 10 11 12
17

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet cac ham thuc hien cac cong viec sau:
Nhap mot ma tran so nguyen co kich thuoc n*m
Hien ma tran so nguyen ra man hinh
Xoa mot hang co vi tri h
Tinh trung binh cong cac phan tu cua mot cot c
Hien ra man hinh cot co gia tri trung binh cong lon nhat
*/

#include <iostream>
// Nhap vao ma tran
void nhap_vao(int a[][10], int& n, int& m)
{
std::cout << "Nhap so hang : n = ";
std::cin >> n;
std::cout << "Nhap so cot : m = ";
std::cin >> m;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
std::cout << "a[" << i << "][" << j << "] = ";
std::cin >> a[i][j];
18

}
}
}
// Hien ra ma tran
void hien_ra(int a[][10], int& n, int m)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
std::cout << a[i][j] << " ";
}
std::cout << std::endl;
}
}
// Xoa hang co vi tri h
void xoa_hang(int a[][10], int& n, int m)
{
int h;
std::cout << "\nNhap hang h can xoa : ";
std::cin >> h;
for (int i = h; i < n; ++i)
{
for (int j = 0; j < m; ++j)
a[i][j] = a[i + 1][j];
}
n--;
std::cout << "Mang A sau khi xoa : \n";
}
// Tinh trung binh cong cac phan tu cot c
void tim_tbc_cotC(int a[][10], int n, int m)
{
float tbc_mau = 0, tbc_tu = 0, tbc_cotc = 0;
std::cout << "\nNhap cot muon tinh trung binh cong : ";
int c;
std::cin >> c;
for (int i = 0; i < n; ++i)
{
tbc_tu += a[i][c];
tbc_mau++;
}
tbc_cotc = tbc_tu / tbc_mau;
std::cout << "\nGia tri trung binh cong cot c vua tinh la : " << tbc_cotc;
}
// Tinh toan de tim xem trung binh cong cot nao max
void tim_tbc_max(int a[][10], int n, int m)
{
int cot_max;
float tbc_max;
float test1, test2;
float tbc_tu = 0, tbc_mau = 0;
// Tinh tbc cot dau tien
int c = 0;
for (int i = 0; i < n; ++i)
{
19

tbc_tu += a[i][c];
tbc_mau++;
}
test1 = tbc_tu / tbc_mau;
tbc_max = test1;
tbc_mau = 0;
tbc_tu = 0;
// Tinh tbc cac cot con lai
for (int j = 1; j < m; ++j)
{
for (int i = 0; i < n; ++i)
{
tbc_tu += a[i][j];
tbc_mau++;
}
test2 = tbc_tu / tbc_mau;
// So sanh tbc cac cot voi nhau de tim ra tbc max
if (test2 > test1)
{
tbc_max = test2;
cot_max = j;
}
// Reset tu va mau
tbc_mau = 0;
tbc_tu = 0;
}
std::cout << "\nCot co gia tri lon nhat la cot : " << cot_max;
std::cout << "\nGia tri tbc cua cot lon nhat la : " << tbc_max;
}

int main()
{
int a[10][10], n = 0, m = 0;
nhap_vao(a, n, m);
hien_ra(a, n, m);
xoa_hang(a, n, m);
hien_ra(a, n, m);
tim_tbc_cotC(a, n, m);
tim_tbc_max(a, n, m);
std::cout << "\n\n";
return 0;
}
Câu 9
** viết các chương trình con thực hiện các công việc sau:
o nhập danh sách các loại xe của hãng xe máy honda gồm các thông tin: mã xe,
tên xe, màu sắc, đơn giá và lưu vào tệp honda.dat (dạng nhị phân); việc nhập sẽ
dừng lại khi mã xe được nhập là 0.
o hiện danh sách xe từ tệp honda.txt ra màn hình;
20

o nhập tên xe từ bàn phím, tìm và in ra các màu sắc và đơn giá tương ứng của
loại xe đó.
o sắp xếp danh sách xe theo đơn giá giảm dần và hiển thị ra màn hình với đầy đủ
các thông tin
Viết chương trình chính để gọi các chương trình con theo trật tự trên. Nếu có thể
tổ chức chương trình thông qua menu thì sẽ là một điểm cộng.
B1: Input
- Nhập thông tin của xe;
B2 : Output
- Danh sách xe máy từ tệp honda.txt;
- Thông tin xe cần tìm;
- Danh sách xe sau khi được sắp xếp theo đơn giá giảm dần;
B3 : Process
- Viết các hàm nhập hiện dùng vòng lặp for;
- Dùng thư viện fstream và cú pháp của fstream như std::ofstream,std::ifstream
(khai báo) , tên.open(“honda.dat/hondat.txt”)( để mở file ), tên.write (để ghi các
thông tin cần thiết vào file ), tên_close()(để đóng file sau khi sử dụng ) để viết
hàm ghi thông tin xe máy vào file honda.dat và honda.txt để sử dụng in ra với
yêu cầu số 2;
- Tạo một string s rồi nhập tên xe cần cần tìm, chạy vòng lặp for kiểm tra nếu
string s trùng với tên xe trong danh sách thì hiện thông tin chi tiết ra;
- Dùng 2 vòng lặp for và điều kiện if kiểm tra nếu giá xe đằng trước nhỏ hơn giá
xe đằng sau thì hoán đổi vị trí của tất cả thông tin, như vậy sau khi sắp xếp ta sẽ
có được danh sách được sắp xếp giá xe giảm dần;
B4 : Bộ dữ liệu test
21
22
23

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Viet cac chuong trinh con thuc hien cac cong viec sau :
Nhap danh sach cac loai xe cua hang xe may honda gom cac thong tin : ma xe,
ten xe, mau sac, don gia va luu vao tep honda.dat (dang nhi phan)
viec nhap se dung lai khi ma xe duoc nhap la 0
Hien danh sach tu tep honda.txt ra man hinh
Nhap ten xe tu ban phim, tim va in ra cac mau sac va don gia tuong ung cua loai xe do
Sap xep danh sach xe theo don gia giam dan va hien thi ra man hinh voi day du cac thong tin
*/
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
struct xe_may
{
char ma_xe[100];
char ten_xe[100];
char mau_xe[100];
float don_gia;
};
void nhap(xe_may& a)
{
std::cin.ignore();
std::cout << "\nNhap ten xe : "; std::cin.getline(a.ten_xe, 100);
std::cout << "Nhap ma xe : "; std::cin.getline(a.ma_xe, 100);
std::cout << "Nhap mau xe : "; std::cin.getline(a.mau_xe, 100);
std::cout << "Nhap don gia cua xe : "; std::cin >> a.don_gia;
}
void hien(xe_may a)
{
std::cout << std::endl << std::setw(1) << std::setiosflags(std::ios::left) << "*) ";
std::cout << std::setw(10) << a.ten_xe;
std::cout << std::setw(10) << a.don_gia;
std::cout << std::setw(10) << a.ma_xe;
std::cout << std::setw(10) << a.mau_xe;
}
void tieu_de()
{
std::cout << std::endl << std::setw(5) << std::setiosflags(std::ios::left) << "STT";
std::cout << std::setw(10) << "TEN XE";
std::cout << std::setw(10) << "DON GIA";
std::cout << std::setw(10) << "MA XE";
std::cout << std::setw(10) << "MAU XE";
}
void nhapds(xe_may ds[], int& n)
{
std::cin.ignore();
24

std::cout << "\nNhap so luong xe may : "; std::cin >> n;


for (int i = 0; i < n; ++i)
{
nhap(ds[i]);
}
}
void hiends(xe_may ds[], int n)
{
tieu_de();
for (int i = 0; i < n; ++i)
{
hien(ds[i]);
}
}
void ghifile(xe_may a[], int n)
{

std::ofstream fo;
fo.open("honda.dat", std::ios::binary);
for (int i = 0; i < n; ++i)
{
fo.write((char*)(&a[i]), sizeof(xe_may));
}
fo.close();
}
void ghifiletxt(xe_may a[], int n)
{
std::ofstream fo;
fo.open("honda.txt", std::ios::binary);
for (int i = 0; i < n; ++i)
{
fo.write((char*)(&a[i]), sizeof(xe_may));
}
fo.close();
}
void docfile()
{
std::ifstream fi("honda.txt");
tieu_de();
xe_may b;
while (1)
{
fi.read((char*)(&b), sizeof(xe_may));
if (fi.eof())
break;
hien(b);
}
fi.close();
}
void tim_xe(xe_may a[], int n)
{
std::string tim;
std::cin.ignore();
std::cout << "\nNhap xe can tim : "; std::getline(std::cin, tim);
for (int i = 0; i < n; ++i)
25

{
if (a[i].ten_xe == tim)
{
tieu_de();
hien(a[i]);
break;
}
}
}
void hoan_vi_tri(xe_may& x, xe_may& y)
{
xe_may tg;
tg = x;
x = y;
y = tg;
}
void sap_xep(xe_may a[], int n)
{
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
if (a[i].don_gia < a[j].don_gia)
{
hoan_vi_tri(a[i], a[j]);
}
}
}
}
void Menu()
{
std::cout << "============= HE_THONG_XE_MAY =============\n";
std::cout << "|| 1. Nhap thong tin xe may va luu file ||\n";
std::cout << "|| 2. Hien danh sach xe may tu file ||\n";
std::cout << "|| 3. Tim thong tin xe may ||\n";
std::cout << "|| 4. Sap xep giam dan (don gia) ||\n";
std::cout << "|| 5. Thoat menu ||\n";
std::cout << "===========================================\n";
}
int lua_chon_menu()
{
int m = 0;
std::cout << "\nNhap thong tin can thuc hien : ";
std::cin >> m;
if (m > 0 || m << 10)
{
return m;
}
else
{
return lua_chon_menu();
}
}
void xu_li_du_lieu(xe_may a[], int& n)
{
26

int number = lua_chon_menu();


switch (number)
{
case 1:
{
std::cout << "=====THONG_TIN_XE_MAY=====";
nhapds(a, n);
ghifile(a, n);
ghifiletxt(a, n);
break;
}
case 2:
{
std::cout << "=====DANH_SACH_XE_MAY=====";
docfile();
break;
}
case 3:
{
tim_xe(a, n);
break;
}
case 4:
{
sap_xep(a, n);
std::cout << "*HE THONG DA DUOC SAP XEP LAI*\n";
std::cout << "=====DANH_SACH_XE_MAY=====";
hiends(a, n);
break;
}
case 5:
{
exit(0);
}
}
}
int main()
{
xe_may a[20];
int n = 0;
while (true)
{
Menu();
xu_li_du_lieu(a, n);
std::cout << "\n\n";
system("pause");
system("cls");
}
}

Câu 10
** viết các chương trình con thực hiện các công việc sau:
27

o nhập liên tiếp 1 dãy số nguyên vào tệp “mang.in” (dưới dạng nhị phân) cho
đến khi gặp số 0 thì dừng
o đọc nội dung tệp tin “mang.in”, lưu vào một mảng số nguyên và hiện ra màn
hình
o sắp xếp lại mảng theo yêu cầu, các số chia hết cho 3 lên đầu dãy, các số chẵn
đứng sau và đoạn cuối cùng gồm các số còn lại
o ghi vào tệp “vitri.out” (dưới dạng tệp nhị phân) vị trí 2 phần tử lớn nhất và nhỏ
nhất đầu tiên tìm được trong mảng.
Viết chương trình chính để gọi các chương trình con trên theo trật tự được viết
như trên. Nếu có thể tổ chức chương trình thông qua menu thì sẽ là một điểm
cộng.
B1: Input
- Dãy số n phần tử;
B2 : Output
- Mảng số nguyên vừa nhập ( hiện ra từ file mang.in );
B3 : Process
- Dùng vòng lặp for để nhập các số nguyên vào mảng;
- Dùng thư viện fstream và cú pháp của fstream như std::ofstream,std::ifstream
(khai báo) , tên.open(“mang.in”)( để mở file ), tên.write (để ghi các thông tin cần
thiết vào file ), tên_close()(để đóng file sau khi sử dụng ) để viết các số trong
mảng vừa nhập vào file mang.in và in file đó ra màn hình;
- Sắp xếp lại mảng dùng các vòng lặp for, 2 vòng đầu tiên kiểm tra các số vị trí i
với các số vị trí i + 1, xem nếu i + 1 chia hết cho 3 thì đổi chỗ i + 1 với i , cứ thế
ta đc các số chia hết cho 3 lên đầu dãy, 2 vòng lặp sau ta kiểm tra tương tự
NHƯNG điều kiền là số đó phải chia hết cho 2 ( số chẵn ) và khác các số chia
hết cho 3( để không ảnh hưởng đến vị trí đã xếp ban đầu);
- Tìm vị trí 2 phần tử lớn nhất bằng cách cho phần tử max và min là phần tử đầu
tiên của mảng, vị trí cũng cho bằng 0 rồi dùng vòng lặp for kiểm tra nếu các số
từ vị trí 1 trở đi lớn hơn phần tử max thì gán phần tử đó làm phần tử max và vị
trí của phần tử đó là vị trí vòng lặp chạy đến (tương tự với min), với phần tử max
và min thứ 2 thì ta cho lần lượt bằng INT_MIN( giá trị nhỏ nhất trong biến int)
và INT_MAX (giá trị lớn nhất trong biến int) rồi làm tương tự cách trên nhưng
28

thêm điều kiện phải khác với phần tử max và min tìm đc ban đầu để không bị
trùng sau đó ta dùng các cú pháp của fstream để ghi vào tệp ghi.out;
B4 : Bộ dữ liệu test
29

Với trường hợp các số trong mảng giống nhau thì ta hiện ra màn hình không tồn
tại GTLN, GTNN
30

B5 Code
/*
============================================
Name : Nguyen Quang Ha - MSV : 21A100100107
Class : 2110A03
============================================
Question :
Nhap vao day so nguyen co n phan tu vao tep mang.in (nhi phan)
Doc noi dung tep tin "mang.in", luu vao mot mang so nguyen va hien ra man hinh
Sap xep lai mang theo yeu cau, cac so chia het cho 3 len dau day, cac so chan dung sau va cac so con lai
Ghi vao tep "vitri.out" (nhi phan) vi tri 2 phan tu lon nhat va nho nhat dau tien tim duoc trong mang
*/
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
struct vitrimm
{
int vi_tri_max1;
int vi_tri_max2;
int vi_tri_min1;
int vi_tri_min2;
};
void nhap(int a[], int &n)
{
std::cout << "\nNhap so phan tu cho mang : "; std::cin >> n;
std::cout << std::endl;
for (int i = 0; i < n; ++i)
{
std::cout << "a[" << i << "] = ";
std::cin >> a[i];
}
}
void hien(int a)
{
std::cout << " " << a;
}
void hienmang(int a[], int n)
{
for (int i = 0; i < n; ++i)
{
hien(a[i]);
31

}
}
void ghifile(int a[], int n)
{
std::ofstream fo;
fo.open("mang.in", std::ios::binary);
for (int i = 0; i < n; ++i)
{
fo.write((char*)(&a[i]), sizeof(a));
}
fo.close();
}
void docfile(int a[], int n)
{
int b;
std::ifstream fi("mang.in");
while (1)
{
fi.read((char*)(&b), sizeof(a));
if (fi.eof()) break;
hien(b);
}
fi.close();
}
void sap_xep(int a[], int n)
{
int tg = 0;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
if (a[j] % 3 == 0)
{
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
}
tg = 0;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
if (a[j] % 3 != 0 && a[j] % 2 == 0 && a[i] % 3 != 0)
{
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
}
}
void ghifileout(int a[], int n)
{
32

std::ofstream fo;
fo.open("vitri.out", std::ios::binary);
for (int i = 0; i < n; ++i)
{
fo.write((char*)(&a[i]), sizeof(a));
}
fo.close();
}
void vitri(int a[], int n, vitrimm c[])
{
int first_max = a[0], position_max = 0;
int second_max = INT_MIN, position_max2 = 0;
int first_min = a[0], position_min = 0;
int second_min = INT_MAX, position_min2 = 0;
int count = 0;
for (int i = 0; i < n; ++i)
{
if (first_max == a[i])
{
count++;
}
}
if (count == n)
{
std::cout << "KHONG TON TON GLTN VA GTLNN\n";
}
else
{
for (int i = 1; i < n; ++i)
{
if (a[i] > first_max)
{
first_max = a[i];
position_max = i;
}
}
for (int i = 0; i < n; ++i)
{
if (a[i] != first_max && a[i] > second_max) // 2 ! 6, 2 > 0?
{
second_max = a[i];
position_max2 = i;
}
}
for (int i = 1; i < n; ++i)
{
if (first_min > a[i])
{
first_min = a[i];
position_min = i;
}
}
for (int i = 0; i < n; ++i) // i = 1
{
if (a[i] != first_min && a[i] < second_min) // a[1] = 2 != 1 && 2 < 0?
33

{
second_min = a[i];
position_min2 = i;
}
}
std::cout << "MAX 1 = " << first_max << std::endl;
std::cout << "Vi tri MAX 1 la : a[" << position_max << "] " << std::endl;
std::cout << "MAX 2 = " << second_max << std::endl;
std::cout << "Vi tri MAX 2 la : a[" << position_max2 << "] " << std::endl;
std::cout << "\n";
std::cout << "MIN 1 = " << first_min << std::endl;
std::cout << "Vi tri MIN 1 la : a[" << position_min << "] " << std::endl;
std::cout << "MIN 2 = " << second_min << std::endl;
std::cout << "Vi tri MIN 2 la : a[" << position_min2 << "] " << std::endl;
// Ghi vao tep vitri.out
c[0].vi_tri_max1 = position_max;
c[0].vi_tri_max2 = position_max2;
c[0].vi_tri_min1 = position_min;
c[0].vi_tri_min2 = position_min2;
std::ofstream fo;
fo.open("vitri.out", std::ios::binary);
for (int i = 0; i < n; ++i)
{
fo.write((char*)(&c[i]), sizeof(vitrimm));
}
fo.close();
}
}
void Menu()
{
std::cout << "=========== HE_THONG_SO_NGUYEN ============\n";
std::cout << "|| 1. Nhap vao day so nguyen ||\n";
std::cout << "|| 2. Hien mang so nguyen tu file ||\n";
std::cout << "|| 3. Sap xep lai so theo yeu cau ||\n";
std::cout << "|| 4. Luu tep 2 phan tu lon va nho nhat ||\n";
std::cout << "|| 5. Thoat menu ||\n";
std::cout << "===========================================\n";
}
int lua_chon_menu()
{
int m = 0;
std::cout << "\nNhap thong tin can thuc hien : ";
std::cin >> m;
if (m > 0 || m << 10)
{
return m;
}
else
{
return lua_chon_menu();
}
}
void xu_li_du_lieu(int a[], int &n, vitrimm c[])
{
int number = lua_chon_menu();
34

switch (number)
{
case 1:
{
std::cout << "=====THONG_TIN_MANG=====";
nhap(a, n);
ghifile(a, n);
break;
}
case 2:
{
std::cout << "MANG DA NHAP : ";
hienmang(a, n);
std::cout << "\nFILE mang.in : ";
docfile(a, n);
break;
}
case 3:
{
sap_xep(a, n);
hienmang(a, n);
break;
}
case 4:
{
vitri(a, n, c);
break;
}
case 5:
{
exit(0);
}
}
}
int main()
{
int a[20];
vitrimm c[20];
int n = 0;
while (true)
{
Menu();
xu_li_du_lieu(a, n, c);
std::cout << "\n\n";
system("pause");
system("cls");
}
}

You might also like