Em có một bài tập, đề bài như sau ạ:
Lập trình thực hiện các nhiệm vụ sau
- Định nghĩa một kiểu cấu trúc Sinhvien gồm
- dtb (điểm trung bình theo thang 4.0 - kiểu float)
- masv, hoten là kiểu xâu kí tự
typedef struct
{
char masv[7];
char hoten[32];
float dtb;
} Sinhvien;
- Định nghĩa một kiểu cấu trúc Lop gồm có:
- dssv là một mảng con trỏ cấu trúc Sinhvien*
- siso là số sinh viên trong danh sách
const int MAX = 80;
typedef struct
{
Sinhvien dssv[MAX];
char tenlop[8];
int n;
} Lop;
- Đầu vào của chương trình là tệp SV.inp có định dạng như sau
Dòng 1: tên lớp
Dòng 2: sĩ số
- Các dòng tiếp theo: Mã số SV, họ tên, điểm trung bình
56PM
65
484756
Nguyen Van Hung
3.3
…
Lập chương trình bao gồm các hàm sau
a. Hàm nhập thông tin từ tệp tin vào một biến cấu trúc Lop gồm: tên lớp, sĩ số n, và thông tin của n sinh viên vào trong danh sách sinh viên . Với mỗi sinh viên cần nhập đầy đủ thông tin như: mã số, họ tên, điểm trung bình
void nhap_dssv (Lop* lop);
// tham số lop là đại diện cho địa chỉ của 1 biến cấu trúc sẽ lưu thông tin
b. Hàm sắp xếp danh sách sinh viên theo thứ tự điểm trung bình giảm dần
void sapxep_dssv(Sinhvien ds[], int n);
c. Hàm in danh sách sinh viên theo quy cách sau:
Ma so SV | Ho ten | Diem trung binh
374754 Nguyen Van Tuan 3.5
…
void in_dssv(Sinhvien ds[], int n);
d. Hàm tìm kiếm trong lớp và cho kết quả là một danh sách sinh viên có điểm trung bình lớn hơn d (0 <= d <= 4.0)
void tim_diemtb(Lop* lop, float d, Sinhvien ketqua[])
e. Viết hàm main thực thi việc
i. Nhập thông tin và danh sách sinh viên của lớp
ii. Sắp xếp danh sách sinh viên trong lớp và in ra màn hình
iii. Tìm kiếm sinh viên có điểm trung bình > 2.0 và in ra tệp SV.out theo định dạng trong câu c.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 80
struct SinhVien
{
char maSV[8];
char hoTen[50];
float dtb;
};
struct LopHoc
{
int siso;
SinhVien sv[MAX];
char tenLop[8];
};
void in_dssv(SinhVien ds[], int n)
{
printf("%-8s%-25s%-4s"," MSSV"," Ho ten"," Diem trung binh\n");
for(int i=0; i<n; i++)
printf("%-8s%-25s%-3.2f\n",ds[i].maSV,ds[i].hoTen,ds[i].dtb);
}
void nhap_dssv(LopHoc* lop)
{
FILE *f=fopen("SV.inp","r");
if(f==NULL)
{
perror("Loi mo tep SV.inp");
exit(1);
}
fflush(f);
fgets(lop->tenLop,10,f);
fscanf(f,"%d",&lop->siso);
for(int i=0; i<lop->siso; i++)
{
fgets(lop->sv[i].maSV,10,f);
fgets(lop->sv[i].hoTen,50,f);
fscanf(f,"%f",&lop->sv[i].dtb);
}
fclose(f);
}
void sapxep_dssv(SinhVien ds[], int n)
{
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(ds[i].dtb<ds[j].dtb)
{
struct SinhVien tg=ds[i];
ds[i]=ds[j];
ds[j]=tg;
}
printf("\nDanh sach sau khi sap xep:\n");
in_dssv(ds,n);
}
void tim_diemtb (LopHoc* lop, float d, SinhVien ketqua[])
{
int m=0;
for(int i=0; i<lop->siso; i++)
if(lop->sv[i].dtb>d)
{
ketqua[m]=lop->sv[i];
m++;
}
FILE *f=fopen("SV.out","w");
if(f==NULL)
{
perror("Loi mo tep SV.out");
exit(1);
}
if(m>0)
{
fprintf(f,"%-8s%-25s%-4s"," MSSV"," Ho ten"," Diem trung binh\n");
for(int i=0; i<m; i++)
fprintf(f,"%-8s%-25s%-3.2f\n",ketqua[i].maSV,ketqua[i].hoTen,ketqua[i].dtb);
fclose(f);
}
else fprintf(f,"Khong co sinh vien nao co dtb>%3.1f\n",d);
}
int main()
{
LopHoc* lop=(LopHoc*) malloc(sizeof(LopHoc));
SinhVien kq[MAX];
nhap_dssv(lop);
sapxep_dssv(lop->sv,lop->siso);
tim_diemtb(lop,2.0,kq);
free(lop);
getch();
return 0;
}
Trên đây là chương trình e viết, chạy không lỗi nhưng kết quả cứ sai tùm lum hết. T.T
anh chị nào có kinh nghiệm làm việc với file thì giúp e chỉnh sửa với đc ko ạ.
Em cảm ơn ạ.