躲在树丛玩泥巴 2021-01-06 21:18 采纳率: 71.4%
浏览 61
已结题

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

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

能不能改写成这种形式

  • 写回答

2条回答 默认 最新

  • 「已注销」 2021-02-02 17:34
    关注

    你可以参考我给别人写的

    #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代码,你看看排序算法什么的就好了

    评论

报告相同问题?

悬赏问题

  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站