c语言文件运用和结构体数组

#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数的值 
   }
}

这段代码是用来排序数组的(这叫不叫冒泡排序。。)

能不能改写成这种形式

你可以参考我给别人写的

#pragma warning(disable:4996)
#include <stdio.h>
int main()
{
	float MAX, MIN;
	float array_grade[10];
	for (int i = 0; i <= 9; i++) {
		printf("输入第%d个学生的分数:", i+1);
		scanf("%f", &array_grade[i]);
	}
	MAX = array_grade[0]; MIN = array_grade[0];
	for (int i = 0; i <= 9; i++) {
		if (MAX<array_grade[i]) {
			MAX = array_grade[i];
		}
	}
	for (int i = 0; i <= 9; i++) {
		if (MIN > array_grade[i]) {
			MIN = array_grade[i];
		}
	}
	printf("MAX IS %.2f\n", MAX);
	printf("MIN IS %.2f\n", MIN);
}

C代码,你看看排序算法什么的就好了

//数据的格式化输入输出有问题,代码中有详细注释

#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_s("%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_s("请输入第%d个学生学号:\n", k);


		scanf("%f", &x.sm); //输入格式改为%f


		printf_s("请输入第%d个学生姓名:\n", k);


		scanf("%s", &x.name);


		printf_s("请输入第%d个学生成绩:\n", k);


		scanf("%f", &x.am); //输入格式改为%f


		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;


	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, "学号:%f    姓名:%s     成绩:%f\n", x[max].sm, x[max].name, x[max].am);    //存储格式改成%f,或者把x[max].sm和x[max].am改成int类型


		j++;


		x[max].am = 0;


	}


	fclose(fp2);


	free(x);


}