lthdtbai31.cpp
Cho tệp văn bản "daysonguyen-bai31.txt" chứa một dãy số nguyên, 7 trên tệp không có thông tin về số lượng số. Đọc từng số của dãy số từ tệp, nếu là số nguyên tố thì đưa vào hàng đợi. Đưa ra m àn hình dãy số đọc từ tệp và dãy số nguyên tố trong hàng đợi. Yêu cầu cài đặt và sử dụng hàng đợi lưu trữ phân tán
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
// Lớp Queue để biểu diễn hàng đợi lưu trữ phân tán
class Queue {
private:
struct node { // Cấu trúc nút
int infor; // Dữ liệu của nút
node* link; // Con trỏ trỏ đến nút tiếp theo
} *F, *R; // Con trỏ trỏ đến nút đầu và cuối của hàng đợi
public:
Queue() ; // Constructor khởi tạo hàng đợi rỗng
~Queue(); // Destructor để hủy hàng đợi
void insert(int x); // Hàm chèn phần tử x vào hàng đợi
int remove(); // Hàm xóa và trả về phần tử đầu hàng đợi
bool isEmpty(); // Kiểm tra hàng đợi rỗng
};
// Hàm kiểm tra số nguyên tố
bool laNguyenTo(int x) {
if (x <= 1) {
return false; // Số 0 và 1 không phải số nguyên tố
}
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
return false; // Nếu x chia hết cho bất kỳ số nào từ 2 đến căn bậc 2 của x thì x không phải số nguyên tố
}
}
return true; // x là số nguyên tố
}
// === Chương trình chính ===
int main() {
// Tạo 1 đối tượng hàng đợi
Queue q;
// Mở tệp để đọc dữ liệu
ifstream fin("daysonguyen-bai31.txt");
// Khai báo biến để lưu trữ số đọc từ tệp
int x;
cout << "Day so doc duoc tu tep la:\n";
while (fin >> x) { // Đọc số từ tệp
cout << x << " "; // In ra số vừa đọc
if (laNguyenTo(x)) { // Kiểm tra xem số có phải số nguyên tố hay không
q.insert(x); // Nếu là số nguyên tố, thêm vào hàng đợi
}
}
cout << "\n\nCac so nguyen to trong day so tren la:\n";
while (!q.isEmpty()) { // In ra các số nguyên tố trong hàng đợi
cout << q.remove() << " ";
}
cout << endl;
return 0;
}
// Định nghĩa hàm của lớp Queue
Queue::Queue(): F(NULL), R(NULL) //hàm tạo
{
}
Queue::~Queue() { // Hàm hủy
while (F != NULL) { // Lặp cho đến khi hàng đợi rỗng
node* P = F; // Lưu lại nút đầu
F = F->link; // Di chuyển F đến nút tiếp theo
delete P; // Giải phóng bộ nhớ của nút đầu
}
}
void Queue::insert(int x) { // Hàm chèn
node* N = new node; // Tạo nút mới
N->infor = x; // Gán giá trị x cho nút mới
N->link = NULL; // Nút mới trở thành nút cuối
if (R == NULL) { // Nếu hàng đợi rỗng
F = R = N; // Nút mới vừa là nút đầu vừa là nút cuối
} else { // Nếu hàng đợi không rỗng
R->link = N; // Nối nút cuối hiện tại với nút mới
R = N; // Cập nhật nút cuối
}
}
int Queue::remove() { // Hàm xóa
if (F == NULL) { // Kiểm tra hàng đợi rỗng
cout << "Hang doi da rong.";
return 1; // Giá trị trả về để báo hiệu lỗi
}
int tg = F->infor; // Lấy giá trị của nút đầu
node* P = F; // Lưu lại nút đầu để xóa
if (F == R) { // Nếu chỉ có một nút trong hàng đợi
F = R = NULL; // Hàng đợi trở nên rỗng
} else { // Nếu có nhiều hơn một nút
F = F->link; // Di chuyển nút đầu đến nút tiếp theo
}
delete P; // Giải phóng bộ nhớ của nút đầu
return tg; // Trả về giá trị của nút đầu đã xóa
}
bool Queue::isEmpty() { // Kiểm tra rỗng
return F == NULL;
}
Last updated