1.07 标准IO

1.思维导图

2.先编写以下结构体

struct Student

{
char name[20];
double math;
double chinese;
double english;
double physical;
double chemical;
double biological; };

第一步:创建一个 struct Student 类型的链表L,初始化该链表中3个学生的属性

第二步:编写一个叫做save的函数,功能为 将链表L中的3个学生的所有信息,保存到文件中去,使用fprintf实现
第三步:编写一个叫做load的函数,功能为 将文件中保存的3个学生信息,读取后,写入到另一个链表L1中去
第四步:编写一个叫做 show的函数,功能为 遍历输出 L或者 L1链表中的所有学生的信息
第五步:编写一个叫做 setMath 的函数,功能为 修改 文件中 所有学生的数学成绩

1>程序代码:
cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//定义一个学生成绩的结构体类型
typedef struct Student
{
    char name[20];
    double math;
    double chinese;
    double english;
    double physical;
    double chemical;
    double biological;
    struct Student *next;
} Stu, *StuPtr;

//创建链表
StuPtr create()
{
    StuPtr L = NULL;
    return L;
}

//添加数据
StuPtr add(StuPtr L)
{
    StuPtr s = (StuPtr)malloc(sizeof(Stu));
    if (s == NULL)
    {
        printf("内存分配失败!\n");
        return L;
    }

    if (L == NULL)
    {
        L = s;
        s->next = NULL;
    }
    else
    {
        StuPtr p = L;
        while (p->next!= NULL)
        {
            p = p->next;
        }
        p->next = s;
    }
    s->next = NULL;

    printf("姓名:");
    scanf("%s", s->name);
    printf("数学:");
    scanf("%lf", &s->math);
    printf("语文:");
    scanf("%lf", &s->chinese);
    printf("英语:");
    scanf("%lf", &s->english);
    printf("物理:");
    scanf("%lf", &s->physical);
    printf("化学:");
    scanf("%lf", &s->chemical);
    printf("生物:");
    scanf("%lf", &s->biological);
    printf("\n");

    return L;
}

//将数组链表L中学生信息保存到文件中
void save(StuPtr L, const char *filename)
{
    if (L == NULL)
    {
        printf("保存失败!\n");
        return;
    }

    FILE *fp = fopen(filename, "w");
    if (fp == NULL)
    {
        printf("无法打开文件!\n");
        return;
    }

    StuPtr p = L;
    while (p!= NULL)
    {
        fprintf(fp, "%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", p->name, p->math, p->chinese, p->english, p->physical, p->chemical, p->biological);
        p = p->next;
    }

    fclose(fp);
}

//将文件中保存的学生信息,写入到另一个链表L1中
void load(StuPtr *L1, const char *filename)
{
    FILE *fp = fopen(filename, "r");
    if (fp == NULL)
    {
        printf("无法打开文件!\n");
        return;
    }

    *L1 = NULL;
    while (1)
    {
        StuPtr s = (StuPtr)malloc(sizeof(Stu));
        if (s == NULL)
        {
            printf("内存分配失败!\n");
            break;
        }

        int res = fscanf(fp, "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", s->name, &s->math, &s->chinese, &s->english, &s->physical, &s->chemical, &s->biological);
        if (res == EOF)
        {
            free(s);
            break;
        }

        s->next = *L1;
        *L1 = s;
    }

    fclose(fp);
}

//展示链表内容
void show(StuPtr L)
{
    StuPtr p = L;
    if (p == NULL)
    {
        printf("展示失败!\n");
        return;
    }

    printf("姓名\t数学\t语文\t英语\t物理\t化学\t生物\n");
    while (p!= NULL)
    {
        printf("%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", p->name, p->math, p->chinese, p->english, p->physical, p->chemical, p->biological);
        p = p->next;
    }
    printf("------------------------------------------------------\n");
}

//修改文件中所有学生的数学成绩
void setMath(const char *filename, double math)
{
    StuPtr L = create();
    load(&L, filename); // 修正这里,传递指针的指针
    StuPtr p = L;
    while (p!= NULL)
    {
        p->math = math;
        p = p->next;
    }
    save(L, filename);

    // 释放内存
    while (L!= NULL)
    {
        StuPtr temp = L;
        L = L->next;
        free(temp);
    }
}

int main(int argc, const char *argv[])
{
    StuPtr L = create();
    L = add(L);
    L = add(L);
    L = add(L);

    save(L, "student.txt");

    StuPtr L1 = create();
    load(&L1, "student.txt"); // 修正这里,传递指针的指针

    show(L);
    show(L1);

    setMath("student.txt", 100);

    // 释放内存
    while (L!= NULL)
    {
        StuPtr temp = L;
        L = L->next;
        free(temp);
    }
    while (L1!= NULL)
    {
        StuPtr temp = L1;
        L1 = L1->next;
        free(temp);
    }

    return 0;
}
2>运行结果显示:
相关推荐
仰泳的熊猫8 分钟前
题目1433:蓝桥杯2013年第四届真题-危险系数
数据结构·c++·算法·蓝桥杯·深度优先·图论
平哥努力学习ing9 分钟前
补充 part 1——防御性编程
算法
cyforkk11 分钟前
14、Java 基础硬核复习:数据结构与集合源码的核心逻辑与面试考点
java·数据结构·面试
wbs_scy20 分钟前
C++:智能指针完全指南(原理、用法与避坑实战,从 RAII 到循环引用)
开发语言·c++·算法
u01092727122 分钟前
C++中的对象池模式
开发语言·c++·算法
试试勇气24 分钟前
算法工具箱之哈希表
数据结构·算法·散列表
HaiLang_IT25 分钟前
【信息安全毕业设计】基于双层滤波与分割点改进孤立森林的网络入侵检测算法研究
网络·算法·课程设计
hansang_IR44 分钟前
【记录】AT_abc400模拟赛
c++·算法·模拟赛
iAkuya1 小时前
(leetcode)力扣100 59括号生成(回溯||按括号序列的长度递归)
算法·leetcode·职场和发展
共享家95271 小时前
双指针算法(一)
数据结构·算法·leetcode