C语言文件设计题,写入文件stud.txt三个学生的成绩

一道C语言文件设计题目

题目:

假设有3个学生,每个学生有三门课的成绩,设计程序从键盘输入每个学生的相关数据(具体包括学号、姓名、语文成绩、数学成绩、英语成绩,每个学生的具体数据内容由设计者自定),并要求计算出每个学生的平均成绩并进行保存。存储学生数据的结构模型可以选择线性表或者单向链表,数据结构中结构变量的组成元素和类型由设计者根据题目要求自己定义。

将已输入的学生数据信息和计算出的平均分数写入文件stud.txt,并通过读取该文件显示到屏幕上来检查stud.txt文件中的学生平均分计算是否正确。

要求:

1、提供实现以上题目要求的源代码程序(包括对代码中的主要函数及程序段进行注释说明)

2、实验报告中要提供程序运行过程及各步骤执行结果的截图

简单啊,可以写给你
运行截图:

img

文件内容:

img

#include<stdio.h>
#define N 3
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)/(N*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;
}

参考如下博文:
C语言编程实践-学生成绩管理程序
https://blog.csdn.net/liranke/article/details/4867997

这个应该是大学的实践题目吧,之前做过,思路和代码可以参考,https://blog.csdn.net/weixin_43344151/article/details/123901624

我们可以使用线性表或单向链表来存储学生数据,每个学生的数据包括学号、姓名、语文成绩、数学成绩和英语成绩。我们需要设计一个程序,从键盘输入每个学生的数据,并计算出每个学生的平均成绩。最后,将这些学生数据写入文件 stud.txt,并读取该文件显示到屏幕上来检查计算的正确性。
代码如下:

#include <stdio.h>

#define MAX_STUDENT_COUNT 3

//定义学生数据的结构体
struct Student {
    int id;
    char name[20];
    float chinese;
    float math;
    float english;
    float average;
};

struct Student students[MAX_STUDENT_COUNT];
int student_count = 0;

//输入学生数据
void input_student() {
    if (student_count == MAX_STUDENT_COUNT) {
        printf("学生数已达到最大值,无法输入新的学生数据\n");
        return;
    }

    printf("请输入学生学号:");
    scanf("%d", &students[student_count].id);
    printf("请输入学生姓名:");
    scanf("%s", students[student_count].name);
    printf("请输入学生语文成绩:");
    scanf("%f", &students[student_count].chinese);
    printf("请输入学生数学成绩:");
    scanf("%f", &students[student_count].math);
    printf("请输入学生英语成绩:");
    scanf("%f", &students[student_count].english);

    student_count++;
}

//将学生数据写入文件
void write_to_file() {
    FILE *fp = fopen("stud.txt", "w");
    if (fp == NULL) {
        printf("打开文件失败\n");
        return;
    }

    for (int i = 0; i < student_count; i++) {
        fprintf(fp, "%d %s %.2f %.2f %.2f\n", students[i].id, students[i].name,
                students[i].chinese, students[i].math, students[i].english);
    }

    fclose(fp);
}

//从文件读取学生数据
void read_from_file() {
    FILE *fp = fopen("stud.txt", "r");
    if (fp == NULL) {
        printf("打开文件失败\n");
        return;
    }

    student_count = 0;
    while (fscanf(fp, "%d %s %f %f %f", &students[student_count].id, students[student_count].name,
                  &students[student_count].chinese, &students[student_count].math, &students[student_count].english) == 5) {
        student_count++;
    }

    fclose(fp);
}

int main() {
    // 从键盘输入学生数据
    input_student();
    input_student();
    input_student();

    // 计算学生平均成绩并保存
    for (int i = 0; i < student_count; i++) {
        students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3;
    }

    // 将学生数据写入文件
    write_to_file();

    // 从文件读取学生数据
    read_from_file();

    // 打印学生数据
    for (int i = 0; i < student_count; i++) {
        printf("学号:%d 姓名:%s 语文成绩:%.2f 数学成绩:%.2f 英语成绩:%.2f 平均分:%.2f\n",
               students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].average);
    }

    return 0;
}

首先需要定义学生信息的结构体

struct Student {
char id[20];
char name[20];
int chinese;
int math;
int english;
float average;
};

使用一个数组来保存所有学生的信息。

struct Student students[3];

使用一个循环来输入每个学生的信息。

for (int i = 0; i < 3; i++) {
printf("Enter student %d's id: ", i + 1);
scanf("%s", students[i].id);
printf("Enter student %d's name: ", i + 1);
scanf("%s", students[i].name);
printf("Enter student %d's Chinese score: ", i + 1);
scanf("%d", &students[i].chinese);
printf("Enter student %d's math score: ", i + 1);
scanf("%d", &students[i].math);
printf("Enter student %d's English score: ", i + 1);
scanf("%d", &students[i].english);
}

可以使用一个循环来计算每个学生的平均分。

for (int i = 0; i < 3; i++) {
students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3.0;
}

使用一个循环来写入文件,并使用另一个循环来从文件中读取学生信息并显示在屏幕上。

// Write to file
FILE *fp = fopen("stud.txt", "w");
for (int i = 0; i < 3; i++) {
fprintf(fp, "%s,%s,%d,%d,%d,%.2f\n", students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].average);
}
fclose(fp);


// Read from file and display on screen
char id[20];
char name[20];
int chinese;
int math;
int english;
float average;
while (fscanf(fp, "%s,%s,%d,%d,%d,%f\n", id, name, &chinese, &math, &english, &average) == 6) {
printf("%s %s %d %d %d %.2f\n", id, name, chinese, math, english, average);
}

// Close file
fclose(fp);

return 0;
}

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define STU_NUM 3
#define STU_FILE_PATH "./stud.txt"
typedef struct STU
{
    float Chin, Math, Eng, av;
    char name[20];
    char number[15];
    struct STU *next_student;
} STU;

/*
func : 打开文件
param: 需要打开的文件路径,不存在则自动创建
return: 返回可用的文件描述符
*/
int open_stu_file(char *path)
{
    int fd;
    fd = open(path, O_CREAT | O_RDWR);
    if (fd < 0)
    {
        perror("open file failed\n");
        exit(-1);
    }
    return fd;
}

int main()
{
    STU student[STU_NUM];
    memset(&student, 0, sizeof(student));
    int i, fd;
    char data_buf[100] = {0};
    char *table_head = "STU_NAME            STU_NUM            CHIN            MATH            ENG            AV\n";
    printf("********************************\n\n");
    for (i = 0; i < STU_NUM; i++)
    {
        printf("please enter student%d's name\n", i + 1);
        scanf("%s", student[i].name);
        printf("please enter student%d's number\n", i + 1);
        scanf("%s", student[i].number);
        printf("please enter student%d's grade(Chinese,Math,English)\n", i + 1);
        scanf("%f%f%f", &student[i].Chin, &student[i].Math, &student[i].Eng);
        student[i].av = (student[i].Chin + student[i].Math + student[i].Eng) / 3.0;
    }

    /*打开文件*/
    fd = open_stu_file(STU_FILE_PATH);

     /*输出表头到指定文件*/
    write(fd, table_head, strlen(table_head));   
    for (i = 0; i < STU_NUM; i++)
    {
        sprintf(data_buf, "%12s %12s %18.2f %14.2f %14.2f %14.2f\n", student[i].name, student[i].number, student[i].Chin, student[i].Math, student[i].Eng, student[i].av);
        write(fd, data_buf, strlen(data_buf));     /*将学生信息按照格式输出到指定文件*/
        memset(data_buf, 0, sizeof(data_buf));
    }
    /*关闭文件*/
    close(fd);
}

img

#include <stdio.h>
#define MAX_STUDENT_COUNT 3
//定义学生数据的结构体
struct Student {
    int id;
    char name[20];
    float chinese;
    float math;
    float english;
    float average;
};
struct Student students[MAX_STUDENT_COUNT];
int student_count = 0;
//输入学生数据
void input_student() {
    if (student_count == MAX_STUDENT_COUNT) {
        printf("学生数已达到最大值,无法输入新的学生数据\n");
        return;
    }
    printf("请输入学生学号:");
    scanf("%d", &students[student_count].id);
    printf("请输入学生姓名:");
    scanf("%s", students[student_count].name);
    printf("请输入学生语文成绩:");
    scanf("%f", &students[student_count].chinese);
    printf("请输入学生数学成绩:");
    scanf("%f", &students[student_count].math);
    printf("请输入学生英语成绩:");
    scanf("%f", &students[student_count].english);
    student_count++;
}
//将学生数据写入文件
void write_to_file() {
    FILE *fp = fopen("stud.txt", "w");
    if (fp == NULL) {
        printf("打开文件失败\n");
        return;
    }
    for (int i = 0; i < student_count; i++) {
        fprintf(fp, "%d %s %.2f %.2f %.2f\n", students[i].id, students[i].name,
                students[i].chinese, students[i].math, students[i].english);
    }
    fclose(fp);
}
//从文件读取学生数据
void read_from_file() {
    FILE *fp = fopen("stud.txt", "r");
    if (fp == NULL) {
        printf("打开文件失败\n");
        return;
    }
    student_count = 0;
    while (fscanf(fp, "%d %s %f %f %f", &students[student_count].id, students[student_count].name,
                  &students[student_count].chinese, &students[student_count].math, &students[student_count].english) == 5) {
        student_count++;
    }
    fclose(fp);
}
int main() {
    // 从键盘输入学生数据
    input_student();
    input_student();
    input_student();
    // 计算学生平均成绩并保存
    for (int i = 0; i < student_count; i++) {
        students[i].average = (students[i].chinese + students[i].math + students[i].english) / 3;
    }
    // 将学生数据写入文件
    write_to_file();
    // 从文件读取学生数据
    read_from_file();
    // 打印学生数据
    for (int i = 0; i < student_count; i++) {
        printf("学号:%d 姓名:%s 语文成绩:%.2f 数学成绩:%.2f 英语成绩:%.2f 平均分:%.2f\n",
               students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].average);
    }
    return 0;
}