• 学生成绩管理系统1.0v 完成的学习总结


    本文是对于 学生成绩管理系统1.0v 完成的总结,用于阶段总结和日后交流

    =======================错误处理=====================
    1、使用malloc()和free()遇到的错误:

    【报错形式】:
    *** glibc detected *** ./a.out: free(): invalid next size (fast): 0x085b2330 ***
    *** glibc detected *** ./a.out: malloc(): memory corruption: 0x085b2340 ***
    【错误原因】:
    使用malloc申请的内存,在使用时,写入的内存超过了内存容量,造成在free时报错
    【解决办法】:
    ·在使用结构体数据赋值时,注意变量的强制转换,防止内存数据写入过量;
    ·在使用循环时,注意是否循环过度;
    ·【重点】在使用申请内存时,也要注意申请的大小,
    如 malloc(sizeof(Node)),若 Node 是结构体,则申请的内存大小是合理
    若 Node 是结构体指针(不建议),则申请内存大小是指针大小,固定4个字节
    【避免方式】:数据赋值时注意【循环次数】和【数据类型】,定义结构体时,别用结构体指针,或者定义
    结构体指针时,结构内部避免数据变量【区分指针变量】。

    2、在 a.c 里,使用 b.c 文件内定义的结构体 pLink 时,遇到的错误:

    【报错形式】:
    错误: 未知的类型名‘pLink’
    错误: 未知的类型名‘pLink’
    【错误原因】:
    在 b.h 内添加了 a.h 的头文件,导致结构体 pLink 被重复定义,最终在 a.c 内使用无效
    【解决办法】:
    ·将 b.h 内的 a.h 注释掉
    【避免方式】:在写头文件时,尽量少添加声明文件;或者另外【新建】一个【结构体定义】的声明文件。

    =======================知识点总结===================
    参考文档:
    (https://blog.csdn.net/zxx910509/article/details/56275492/)
    (https://www.cnblogs.com/kangjianwei101/p/5220021.html)
    1、对文件进行读写操作:

    【步骤一】:首先获取需要进行操作的文件指针,
    即 FILE* fp = fopen("data/file.txt","r/r+/w/w+/a/a+");
    r :只读,指针指向【文件的开头】 -> 【读文件】
    r+:可读可写,指针指向【文件的开头】
    w :只写(文件若存在,则清零;若不存在,则创建),指针指向【文件的开头】 -> 【写文件】
    w+:可读可写,指针指向【文件的开头】
    a :只写添加,指针指向【文件的结尾】 -> 【添加文件】
    a+:可读可写添加,指针指向【读:文件的开头;添加:文件的结尾】
    +b:【二进制模式】对【二进制文件】(区分纯文本文件,自行百度)进行操作。
    【步骤二】:进行相应的文件操作
    读 fgetc(fp) :一次读一个字符;区别getc(fp),getchar();
    fgets(fp) :一次读一行字符;区别gets();
    fscanf() :一次读一个格式字符;fscanf(fp,"%s%d",str,&d); -> 【适合数据载入】
    写 fputc(fp) :一次写一个字符;区别putc(fp),putchar();
    fputs(fp) :一次写一行字符;区别puts();
    fprintf() :一次写一个格式字符;fprintf(fp,"%s %d ",str,d); -> 【适合数据存储】
    文件结束标志:feof用检测流上的文件结束符,其返回值有两种情况:
    如果遇到文件结束,函数值为非零值,否则函数值为0
    while(!feof(fp)) {} -> 【适合文件操作结束】
    【步骤三】:关闭文件
    fclose(fp) :-> 【适合结束文件操作,释放缓冲区】

    2、对双向链表进行快速排序:

    【原理】:递归,确定最左侧数据的位置,依次递归
    【要点】:确定结束和递归的标志;确定链表的头尾;确定排序的头尾;
    【步骤】:
    传入左右端点和左端点排名,备份当前左右端点(用于结束判断);
    外while:确定一个节点的位置
    内while:右端左移
    交换左右端节点
    若左右节点相等,跳出外循环
    内while:左端右移
    交换左右端节点
    若左右节点相等,跳出外循环
    【思考】:此处使用的是节点交换,程序复杂,建议可以对 待确定位置的节点内容 进行备份,而后
    的节点只需单向赋值即可,最后再把备份内容赋值到确定位置。

    =======================注意点=======================
    1、一个中文字符所占有的字节数为 【3个字节】;
    2、对字符串数组变量进行赋值时,使用 string.h 里的 strcpy() 执行;scanf()无需这样;
    3、定义字符串数组变量时,若需要8个字节,那要定义9个字节,留一个存字符串结束符;
    4、做界面方法时,返回用户选择即可;各功能界面,放在各功能的方法里

    =======================未解决的问题=================
    1、当输入的格式(chars)与要求输入的格式(int)不一致,本次输入无效[变量值不变],并进入死循环
    #include <stdio.h>
    int main()
    {
    //[未解决]
    int id = -1;
    while(1)
    {
    scanf("%d",&id);
    printf("%d",id);
    }
    }
    执行:g
    -1 -1 -1 -1 -1 -1 -1 ……(死循环)

    =======================计划改进内容=====================
    1、对系统文档进行【加密】:通过一种协议,在读入时解码,在写入时编码;
    2、在输入密码时,输入的字符【不显示】在终端界面上;
    3、实现按【任意键返回】的功能。
    4、不再对退学的学生进行分数排序,不再对没有分数的同学进行排序
    5、添加生日提醒
    6、添加教师和学生的所属关系

  • 相关阅读:
    2019牛客暑期多校训练营(第六场)
    2019牛客暑期多校训练营(第五场)
    2019牛客暑期多校训练营(第四场)
    2019牛客暑期多校训练营(第三场)
    Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))
    Codeforces Round #486 (Div. 3) C "Equal Sums" (map+pair<>)
    Count New String
    【模板】后缀自动机 (SAM)
    Watchcow
    二次剩余
  • 原文地址:https://www.cnblogs.com/ZhongShengXueXi/p/9249814.html
Copyright © 2020-2023  润新知