#include<stdio.h>
#include<stdlib.h>
typedef struct data{
float sm;//学号
char name[20];//名字
float am;//成绩
}Data;
void FileWrite(FILE *fp,int n);
void FileRead_W(FILE *fp,int n);
int main(void){
int n;
char address[30];
printf("请输入储存文件名:\n");
scanf("%s",address);
FILE *fp;
if((fp=fopen(address,"wb+"))==NULL){
printf("文件打开失败!\n");
return 0;
}
printf("请输入学生数量:\n");
scanf("%d",&n);
FileWrite(fp,n);
FileRead_W(fp,n);
fclose(fp);
return 0;
}
void FileWrite(FILE *fp,int n){
Data x;
int k=1;
while(k<=n){
printf("请输入第%d个学生学号:\n",k);
scanf("%d",&x.sm);
printf("请输入第%d个学生姓名:\n",k);
scanf("%s",&x.name);
printf("请输入第%d个学生成绩:\n",k);
scanf("%d",&x.am);
fwrite(&x,sizeof(Data),1,fp);
k++;
}
rewind(fp);
}
void FileRead_W(FILE *fp,int n){
int sum=0;
Data *x=NULL;
if((x=(Data *)malloc(sizeof(Data)*n))==NULL){
printf("内存分配失败!\n");
exit(1);
}
int i;
int j=0;
for(i=0;i<n;i++){
fread(&x[i],sizeof(Data),1,fp);
sum+=x[i].am;
}
printf("平均成绩为%.1f分。\n",sum*1.0/n);
FILE *fp2=NULL;
fp2=fopen("C:\\Users\\lenovo\\Desktop\\成绩.txt","a");
int max;
while(j<n){
for(i=0;i<n;i++){
max=0;
if(x[max].am<x[i].am)
max=i;
}
fprintf(fp2,"学号:%d 姓名:%s 成绩:%d\n",x[max].sm,x[max].name,x[max].am);
j++;
x[max].am=0;
}
fclose(fp2);
free(x);
}
1,“结构体未定长度数组” 是这么用的吗
2,从输出平均成绩以下的代码结果全部错了,,,应该怎么改
3,
int max;
while(j<n){
for(i=0;i<n;i++){
max=0;
if(x[max].am<x[i].am)
max=i;
}
fprintf(fp2,"学号:%d 姓名:%s 成绩:%d\n",x[max].sm,x[max].name,x[max].am);
j++;
x[max].am=0;
}
这是自己想出来的一种按照结构体中某一值排序的方法,有没有更加简单的,,,,
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
//交换2数的值
}
}
这段代码是用来排序数组的(这叫不叫冒泡排序。。)
能不能改写成这种形式