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