#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);
}