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>运行结果显示:
相关推荐
福居路冥想的草莓29 分钟前
逆波兰表达式求值(中等)
数据结构
oioihoii37 分钟前
C++23 新特性:为 std::pair 的转发构造函数添加默认实参
算法·c++23
智者知已应修善业1 小时前
【验证哥德巴赫猜想(奇数)】2021-11-19 15:54
c语言·c++·经验分享·笔记·算法
cdut_suye2 小时前
【Linux系统】从零开始构建简易 Shell:从输入处理到命令执行的深度剖析
java·linux·服务器·数据结构·c++·人工智能·python
-qOVOp-2 小时前
zst-2001 历年真题 设计模式
java·算法·设计模式
yaoshengvalve2 小时前
V型球阀材质性能深度解析:专攻颗粒、料浆与高腐蚀介质的工业利器-耀圣
开发语言·网络·数据结构·c++·安全·材质
evolution_language2 小时前
LintCode第68题-二叉树的前序遍历,第67题-二叉树的后序遍历
数据结构·算法·新手必刷编程50题
passionSnail2 小时前
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典
算法·matlab·矩阵·游戏程序·交互
yxc_inspire2 小时前
C++STL在算法竞赛中的应用详解
c++·算法·stl
James. 常德 student2 小时前
leetcode-hot-100(哈希)
算法·leetcode·哈希算法