[C++] Ghi liên tiếp 1 dãy số nguyên vào tệp “DATA.INF”

Dưới đây đoạn mã thực hiện yêu cầu viết các hàm để nhập một dãy số nguyên vào tệp tin “DATA.INF”. Hãy cùng tìm hiểu chi tiết các hàm đã được xây dựng.

Xem thêm:

1. Bài toán nhập một dãy số nguyên vào tệp

Bài 41 (TH-CSLT-04): Viết các hàm sau:
– Ghi liên tiếp 1 dãy các số nguyên liên tiếp vào tệp “DATA.INF”
– Tính TBC các số âm có trong tệp “DATA.INF”
– Chèn thêm 1 số x vào vị trí k trong tệp “DATA.INF”
– Tìm vị trí phần tử lớn nhất trong tệp “DATA.INF”
– Đọc nội dung tệp “DATA.INF” in ra màn hình.

2. Ghi liên tiếp 1 dãy các số nguyên liên tiếp vào tệp “DATA.INF”

– Tạo một đối tượng ofstream có tên là arr. Nếu tệp tin không tồn tại, nó sẽ tự động được tạo. Nếu tệp tin đã tồn tại, nội dung cũ trong tệp tin sẽ bị ghi đè.

– Số lượng phần tử trong mảng a[] (biểu thức n) được ghi vào dòng đầu tiên của tệp tin bằng cách sử dụng toán tử “<<” của đối tượng arr. Đối với số nguyên, giá trị được chuyển đổi thành định dạng văn bản và được ghi vào tệp tin. Cuối dòng endl được sử dụng để thêm ký tự xuống dòng sau khi ghi giá trị n.

– Vòng lặp for được sử dụng để ghi từng phần tử của mảng a[] vào các dòng tiếp theo của tệp tin.

– Đóng tệp và xuất thông tin ra màn hình.

3. Tính TBC các số âm có trong tệp “DATA.INF”

– Tạo một đối tượng ifstream có tên là arr để đọc dữ liệu từ tệp “DATA.INF”.

– Nếu mở được tệp thì đọc phần từ n của tệp tin.

– Đọc lần lượt các phần tử của mảng a[] từ tệp tin.

– Tính tổng và đếm số lượng số âm trong mảng.

– Nếu tổng sum khác 0, tbc được tính bằng phép chia sum cho dem, giá trị tbc được trả về.

4. Chèn thêm 1 số x vào vị trí k trong tệp “DATA.INF”

  1. Đầu tiên, hàm mở tệp tin “DATA.INF” để đọc dữ liệu bằng cách tạo một đối tượng ifstream có tên là input. Nếu tệp tin không mở được, điều kiện if (!input.is_open()) sẽ được kiểm tra. Trong trường hợp này, hàm in ra thông báo lỗi “Loi khi mo tep!” và kết thúc hàm bằng lệnh return.
  2. Nếu tệp tin được mở thành công, hàm tiếp tục đọc số phần tử n từ tệp tin:
  3. Tiếp theo, hàm đọc lần lượt các phần tử của mảng a[] từ tệp tin. Lệnh input >> a[i] được sử dụng để đọc giá trị từ tệp tin và gán cho phần tử a[i] của mảng.
  4. Sau đó, tệp tin được đóng bằng lệnh input.close() để giải phóng tệp tin.
  5. Tiếp theo, người dùng được yêu cầu nhập giá trị phần tử mới x và vị trí k:
  6. Hàm chèn phần tử x vào mảng a[] tại vị trí k bằng cách dịch chuyển các phần tử phía sau của mảng sang phải một vị trí:
  7. Vòng lặp trên dịch chuyển các phần tử từ a[n-1] đến a[k] sang phải một vị trí.
  8. Gán giá trị của phần tử x vào vị trí k trong mảng:
  9. Tăng giá trị của n lên 1 để đánh dấu rằng mảng đã được chèn một phần tử mới:
  10. Gọi hàm luuFile(a, n) để lưu lại mảng đã được chèn vào tệp tin “DATA.INF”. Hàm luuFile được giả sử đã được định nghĩa đúng và có thể lưu mảng a[] vào tệp tin.

5. Tìm vị trí phần tử lớn nhất trong tệp “DATA.INF”

– Mở tệp và đọc dữ liệu từ tệp.

– Khởi tạo biến a_max với giá trị của phần tử đầu tiên trong mảng a[]. Duyệt qua các phần tử còn lại của mảng, bắt đầu từ phần tử thứ hai, và so sánh với a_max. Nếu tìm thấy phần tử lớn hơn a_max, cập nhật giá trị a_max và ghi nhận vị trí của phần tử đó

– Biến pos được sử dụng để lưu trữ vị trí của phần tử lớn nhất trong mảng. Đóng tệp tin bằng lệnh arr.close(); để giải phóng tệp tin. Trả về giá trị pos – vị trí của phần tử lớn nhất trong mảng.

6. Đọc nội dung tệp “DATA.INF” in ra màn hình

  1. Đầu tiên, hàm mở tệp tin “DATA.INF” để đọc dữ liệu bằng cách tạo một đối tượng ifstream có tên là arr. Nếu tệp tin không mở được, điều kiện if (!arr.is_open()) sẽ được kiểm tra. Trong trường hợp này, hàm in ra thông báo lỗi “Loi khi mo tep!” và kết thúc hàm bằng lệnh return.
  2. Nếu tệp tin được mở thành công, hàm tiếp tục đọc số lượng phần tử n từ tệp tin:
  3. Tiếp theo, hàm đọc lần lượt các phần tử của mảng a[] từ tệp tin:
  4. Lệnh arr >> a[i] được sử dụng để đọc giá trị từ tệp tin và gán cho phần tử a[i] của mảng. Sau khi đọc xong mảng, hàm hiển thị danh sách các phần tử trong mảng.
  5. Đóng tệp tin bằng lệnh arr.close(); để giải phóng tệp tin.

7. Code nhập một dãy số nguyên vào tệp

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

void nhapmang(int a[], int &n){

    cout << "Nhap so phan tu n: ";
    cin >> n;

    for(int i=0;i<n;i++){
        cout << "Nhap phan tu thu " << i + 1 << ": ";
        cin >> a[i];
    }
}

void luuFile(int a[], int n) {

    ofstream arr("DATA.INF");
    arr << n << endl;
    for (int i = 0; i < n; i++) {
        arr << a[i] << endl;
    }
    arr.close();
    cout<<" Luu file thanh cong!"<<endl;
}

void docFile(int a[], int n){

    ifstream arr("DATA.INF");

    if(!arr.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return ;
    }else{
        arr>>n; //doc so luong phan tu

        //doc tung phan tu
        for(int i=0;i<n;i++){
            arr>>a[i];
        }
        cout<<"Danh sach mang la: "<<endl;
        for(int i=0;i<n;i++){
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
    arr.close();
}

float TBC_soam(int a[], int n){

    ifstream arr("DATA.INF");
    int sum=0, dem=0;
    if(!arr.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return 0;
    }else{

        arr>>n; //doc so phan tu n
        // doc lan luot cac phan tu cua mang
        for(int i=0;i<n;i++){
            arr>>a[i];
        }
        // Tính tổng và đếm số lượng số âm
        for(int i=0;i<n;i++){
            if(a[i]<0){
                sum+=a[i];
                dem++;
            }
        }
        float tbc=0;
        // Tính trung bình cộng
        if(sum!=0){
            tbc=sum/dem;
            arr.close();
            return  tbc;
        }else{
            arr.close();
            return 0;
        }

    }
}

void chen_phan_tu_x(int a[], int &n){

    ifstream input("DATA.INF");

    if(!input.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return;

    }else{

        input>>n;

        for(int i=0;i<n;i++){
            input>>a[i];
        }
        input.close();
        int x;
        cout<<" Nhap phan tu x: "; cin>>x;

        int k;
        cout<<"Nhap vi tri thu k: "; cin>>k;

        for(int i=n;i>k;i--){
            a[i]=a[i-1];
        }

        a[k]=x;
        n++;
        luuFile(a,n);
    }

}

int vi_tri_phan_tu_lon_nhat(int a[], int n){

    ifstream arr("DATA.INF");
    int pos=0;
    if(!arr.is_open()){
        cout<<"Loi khi mo tep!"<<endl;
        return -1;
    }else{

        arr>>n;

        for(int i=0;i<n;i++){
            arr>>a[i];
        }

        int a_max =a[0];

        for(int i=1;i<n;i++){
            if(a[i]>a_max){
                a_max=a[i];
                pos=i;
            }
        }
    }
    arr.close();
    return pos;

}

int main() {
    int a[200];
    int n, chon;

    do{
        cout<<" |1. Nhap mang va luu vao file DATA.INF"<<endl;
        cout<<" |2. Tinh TBC cac so am"<<endl;
        cout<<" |3. Chen them so x vao vi tri k trong tep"<<endl;
        cout<<" |4. Tim vi tri phan tu lon nhat"<<endl;
        cout<<" |5. Doc file DATA.INF"<<endl;
        cout<<"Lua chon: "; cin>>chon;
        switch(chon){
            case 1 : {
                nhapmang(a,n);
                luuFile(a, n);
                break;
            }
            case 2: {
                float tbc;
                tbc=TBC_soam(a,n);
                if(tbc!=0){
                    cout<<"Trung binh cong cac so am la: "<<fixed<<setprecision(3)<<tbc<<endl;
                }else{
                    cout<<"Khong co so am nao trong mang!"<<endl;
                }
                break;
            }
            case 3: {
                chen_phan_tu_x(a,n);
                docFile(a,n);
                break;
            }
            case 4: {
                int vt=vi_tri_phan_tu_lon_nhat(a,n);
                cout<<"Vi tri cua phan tu lon nhat la: "<<vt+1<<endl;
                break;
            }
            case 5: {
                docFile(a,n);
                break;
            }

        }
    }while(chon!=0);

    return 0;
}

4. Kết quả

Ghi liên tiếp 1 dãy các số nguyên liên tiếp vào tệp “DATA.INF” Ghi liên tiếp 1 dãy các số nguyên liên tiếp vào tệp “DATA.INF” Đọc nội dung tệp “DATA.INF” in ra màn hình Chèn thêm 1 số x vào vị trí k trong tệp “DATA.INF”

Trong bài tập này, chúng ta đã viết thành công các hàm để làm việc với tệp tin “DATA.INF”. Chúng ta đã có hàm để ghi liên tiếp một dãy số nguyên vào tệp, tính trung bình cộng của các số âm trong tệp, chèn một số vào vị trí cần thiết, tìm vị trí của phần tử lớn nhất và đọc nội dung của tệp để in ra màn hình. Cảm ơn các bạn đã tham khảo trên ttnguyen.net.

Tải full bài tập thực hành lập trình C/C++ có lời giải:

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em