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”
- Đầ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ệnif (!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ệnhreturn
. - 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: - 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ệnhinput >> 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 đó, tệp tin được đóng bằng lệnh
input.close()
để giải phóng tệp tin. - 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
: - Hàm chèn phần tử
x
vào mảnga[]
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í: - Vòng lặp trên dịch chuyển các phần tử từ
a[n-1]
đếna[k]
sang phải một vị trí. - Gán giá trị của phần tử
x
vào vị trík
trong mảng: - 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: - Gọi hàm
luuFile(a, n)
để lưu lại mảng đã được chèn vào tệp tin “DATA.INF”. HàmluuFile
được giả sử đã được định nghĩa đúng và có thể lưu mảnga[]
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
- Đầ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ệnif (!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ệnhreturn
. - 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: - 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
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. - Đó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ả
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: