c语言文件写入问题,输出结果有问题

问题如下:有五个学生,每个学生有3门课的成绩,从键盘输入相关数据(包括:学号,姓名和三门课程的成绩),计算出平均成绩,并将原有的数据和计算出的平均分数存放在磁盘文件"stud.txt"中
代码

#include"stdio.h"
#include
#define N 5
struct student
{
int num;
char name[5];
int c1;
int c2;
int c3;
int all;
};
void main()
{
    struct student st[N];
    int i,j,m;
    float ar[5];
    printf("请分别输入这五个学生的学号、姓名以及三门课的成绩:\n");
    float ar1=0,ar2=0,ar3=0,ar4=0,ar5=0;
    for(i=0;iscanf("%d",&st[i].num);
        scanf("%s",st[i].name);
        scanf("%d",&st[i].c1);
        scanf("%d",&st[i].c2);
        scanf("%d",&st[i].c3);
        st[i].all = st[i].c1 + st[i].c2 + st[i].c3;
       }
       for(j=0;j<5;j++)
       {
       ar[i]=st[0].all/3;
       }
        FILE *fp;
        fp=fopen("stud.txt","w");
        fprintf(fp,"学号 姓名 成绩 平均分\n ");
        for(m=0;m<5;m++)
        fprintf(fp," %d %s %5d %5d %5d %.2f\n",st[m].num,st[m].name,st[m].c1,st[m].c2,st[m].c3,ar[m]);
        fclose(fp);
}

运行结果有点问题,估计是后半部分的原因,但不知道怎么改

img

你的代码修改过后的:

#include"stdio.h"
#include<stdio.h>
#define N 5
struct student
{
int num;
char name[5];
int c1;
int c2;
int c3;
float avg;
};
void main()
{
    struct student st[N];
    int i,j,m;
    printf("请分别输入这五个学生的学号、姓名以及三门课的成绩:\n");
    float ar1=0,ar2=0,ar3=0,ar4=0,ar5=0;
    FILE *fp;
    for(i=0;i<N;i++)
    {
        scanf("%d",&st[i].num);
        scanf("%s",st[i].name);
        scanf("%d",&st[i].c1);
        scanf("%d",&st[i].c2);
        scanf("%d",&st[i].c3);
        st[i].avg = (st[i].c1 + st[i].c2 + st[i].c3)/3.0;
   }
     fp=fopen("stud.txt","w");
   fprintf(fp,"学号 姓名 成绩 平均分\n ");
   for(m=0;m<5;m++)
   {
        fprintf(fp,"%d  %s  %d  %d  %d  %f\n",st[m].num,st[m].name,st[m].c1,st[m].c2,st[m].c3,st[m].avg);
   }
    fclose(fp);
}

我按照题目写的全部代码:
运行结果示例:

img

写入文件内容示例:

img

#include<stdio.h>
#define N 5
typedef struct Student{
long long int id;
char name[20];
float chinese;
float math;
float english;
float avg;
}Student;
Student student[N];
Student student1[N];
/**控制台录入信息*/
void insert(Student student[N])
{
    int i;
    for(i=0;i<N;i++)
    {
        printf("请输入第%d位学生的信息:\n",i+1);
        scanf("%lld %s %f %f %f",&student[i].id,student[i].name,&student[i].chinese,&student[i].math,&student[i].english);
        student[i].avg=(student[i].chinese+student[i].math+student[i].english)/(3*1.0);
    }
}
/**信息存储到stud.txt文件*/
void ctrl_s(Student student[N])
{
   FILE*f;
   int i;
   f=fopen("stud.txt","w");
   for(i=0;i<N;i++)
   {
      fprintf(f,"%lld\t%s\t%f\t%f\t%f\t%f\n",
      student[i].id,student[i].name,student[i].chinese,student[i].math,student[i].english,student[i].avg);
   }
   fclose(f);
}
void print(Student student1[N])
{
   FILE*f;
   int i;
   f=fopen("stud.txt","r");
   if(f==NULL){printf("文件打开失败!\n");}
   else
   {
   for(i=0;i<N;i++)
   {
      fscanf(f,"%lld\t%s\t%f\t%f\t%f\t%f\n",
      &student1[i].id,student1[i].name,&student1[i].chinese,&student1[i].math,&student1[i].english,&student1[i].avg);
   }
   for(i=0;i<N;i++)
   {
       printf("学号:%lld 姓名:%s 语文:%.2f 数学:%.2f 英语:%.2f 平均分:%.2f\n",
      student1[i].id,student1[i].name,student1[i].chinese,student1[i].math,student1[i].english,student1[i].avg);
   }
   }
   fclose(f);
}
int main()
{
    insert(student);
    ctrl_s(student);
    printf("学生信息如下:\n");
    print(student1);
    return 0;
}


students = [] # 存储所有学生的列表

for i in range(5):
print("请输入第{}个学生的信息:".format(i+1))
student = {} # 存储单个学生信息的字典
student['id'] = input("学号:")
student['name'] = input("姓名:")
student['grades'] = [] # 存储单个学生的3门成绩的列表
for j in range(3):
student['grades'].append(float(input("第{}门成绩:".format(j+1))))
students.append(student)

计算平均成绩
for student in students:
total_grade = 0 # 存储单个学生总成绩
for grade in student['grades']:
total_grade += grade
student['average'] = total_grade / len(student['grades'])

将信息写入文件
with open("stud.txt", "w") as f:
for student in students:
f.write("{},{},{},{}\n".format(student['id'], student['name'], student['grades'], student['average']))

有几个错误需要修正:

1、使用了两个不同的头文件 "stdio.h" 和 <stdio.h>。这是冗余的,只需要使用一个即可。

2、在计算每个学生的总成绩时,代码应该是这样的:

st[i].all = st[i].c1 + st[i].c2 + st[i].c3;

3、在计算每个学生的平均分时,应该使用以下代码:

ar[i] = st[i].all / 3.0;

这样就可以获得每个学生的实际平均分,而不是固定值。

4、在将数据写入文件时,应该将平均分作为最后一列写入,而不是第五列。代码应该是这样的:

fprintf(fp, " %d %s %5d %5d %5d %.2f\n", st[m].num, st[m].name, st[m].c1, st[m].c2, st[m].c3, ar[m]);

修正这些问题后,代码应该能够正常工作。

/3.0
ar[i]是错的st[0]错了
主要是i错了

加上fflush(stdin);去除缓存


#include<stdio.h>
#define N 5
struct student
{
int num;
char name[5];
int c1;
int c2;
int c3;
int all;
};
int main()
{
    struct student st[N];
    int i,j,m;
    float ar[5];
    printf("请分别输入这五个学生的学号、姓名以及三门课的成绩:\n");
    float ar1=0,ar2=0,ar3=0,ar4=0,ar5=0;
    for(i=0;i<N;i++)
    {
        scanf("%d",&st[i].num);
        fflush(stdin);
        scanf("%s",st[i].name);
        scanf("%d",&st[i].c1);
        scanf("%d",&st[i].c2);
        scanf("%d",&st[i].c3);
        st[i].all = st[i].c1 + st[i].c2 + st[i].c3;
       }
       for(j=0;j<5;j++)
       {
       ar[i]=st[0].all/3.0;
       }
        FILE *fp;
        fp=fopen("stud.txt","w");
        fprintf(fp,"学号 姓名 成绩 平均分\n ");
        for(m=0;m<5;m++)
        fprintf(fp," %d %s %5d %5d %5d %.2f\n",st[m].num,st[m].name,st[m].c1,st[m].c2,st[m].c3,ar[m]);
        fclose(fp);
}