gwgirl 发表于 2022-1-2 11:18

成绩信息管理系统豪华完整版,带详细注释,欢迎学习,文件读写、封装、多文件等等

编程环境:windows
编程语言:vs2019
涉及工具:C语言
是否讲解思路和原理:是
以下为主题内容:

main.cpp 主文件内容#include"infoAdimSys.h"
#if 0
1.C语言基础
2.C语言结构体
3.数据结构基本的结构:链式结构
4.文件操作
---------------------------------------------------------- -
      死流程
1.登录界面:登录验证
2.菜单设计
3.按键交互
4.选择存储数据的方式、结构
      数据结构
      数组:结构数组
      链式结构
#endif // 0

int main()
{
      openFile();      
      while (true)
      {
                menu();
                system("pause");
                system("cls");
      }
      return 0;
}function.cpp
#include"infoAdimSys.h"
struct HDname_ HDfun;
struct Node* tempList = createList();
struct student tempData;//定义一个临时的Data用来存储临时的信息

char* FilePath()
{
      char* FilePath = (char*)"D:/student.txt";
      return FilePath;
}

void openFile()
{
      readInfoFormFile(FilePath(), tempList);
}

//输入一个int数据
int keyInt(uint32_t data)
{
      if (!scanf_s("%d", &data))
      {
                while (getchar() != '\n');//清空缓存区防止输入错误产生死循环
      }
      return data;
}

//输入一个str数据
char* keyStr(char* data)
{
      if (!scanf_s("%s", data, 50))
      {
                while (getchar() != '\n');//清空缓存区防止输入错误产生死循环
      }
      return data;
}

//查找学生信息
void findinfo()
{
      while (true)
      {
                system("cls");
                printf("\n");
                system("TITLE 欢迎使用XXXXXXXXXXXXXXXXXXXXXX豪华信息管理系统");//设置CMD打开标题
                printf("欢迎使用XXXXXXXXXXXXXXXXXXXXXX豪华信息管理系统\n");
                printf("\n");
                printf("\n");
                printf("┏━━━━━━━━━━━━━━━━━ %s成绩管理系统━━━━━━━━━━━━━━━━┓\n",HDfun.userItem);
                printf("┃          ★★★★★          ┃\n");
                printf("┃                         ┃\n");
                printf("┃         1.按%s查询        ┃\n",HDfun.userNumber);
                printf("┃                         ┃\n");
                printf("┃         2.按%s查询        ┃\n",HDfun.userName);
                printf("┃                         ┃\n");
                printf("┃         3.按%s查询        ┃\n",HDfun.userGrade);
                printf("┃                         ┃\n");
                printf("┃         4.按%s查询        ┃\n",HDfun.userTerm);
                printf("┃                         ┃\n");
                printf("┃         5.%s名单       ┃\n",HDfun.dataRange);
                printf("┃                         ┃\n");
                printf("┃         6.返回管理系统首页       ┃\n");
                printf("┃                         ┃\n");
                printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
                printf("请输入菜单编号(只可以输入数字1-6):\n");
                int userKey = 0;
                switch (keyInt(userKey))
                {
                case 1:
                        printf("1.请输入要查询的%s:\n",HDfun.userNumber);
                        findNodeInt(tempList, keyInt(tempData.number));//按学号查找
                        break;
                case 2:
                        printf("2.请输入要查询的%s:\n", HDfun.userName);
                        findNodeStr(tempList, keyStr(tempData.name));//按学号查找
                        break;
                case 3:
                        printf("3.请输入要查询的%s:\n", HDfun.userGrade);
                        findGradeNodeStr(tempList, keyStr(tempData.grade));//按班级查找
                        break;
                case 4:
                        printf("4.请输入要查询的%s:\n", HDfun.userTerm);
                        findTermNodeStr(tempList, keyStr(tempData.term));//按学期查找
                        break;
                case 5:
                        printf("5.请输入%s:\n",HDfun.dataRange);
                        findMathNodeInt(tempList, keyInt(tempData.number));
                        break;
                case 6:
                        printf("6.返回管理系统首页:\n");
                        return;
                        break;
                default:
                        printf("你输入的信息有误请重新输入:\n");
                        break;
                }
                system("pause");
                system("cls");
      }
}

//目录菜单
void menu()
{
      
      //system("mode con cols=130 lines=40");//设置CMD打开窗口固定大小设置后没有滚动条
      printf("\n");
      system("TITLE 欢迎使用XXXXXXXXXXXXXXXXXXXXXX豪华信息管理系统");//设置CMD打开标题
      printf("欢迎使用XXXXXXXXXXXXXXXXXXXXXX豪华信息管理系统\n");
      printf("\n");
      printf("\n");
      printf("┏━━━━━━━━━━━━━━━━━ %s成绩管理系统━━━━━━━━━━━━━━━━┓\n", HDfun.userItem);
      printf("┃          ★★★★★          ┃\n");
      printf("┃                         ┃\n");
      printf("┃         1.查看全部信息         ┃\n");
      printf("┃                         ┃\n");
      printf("┃         2.查找%s信息         ┃\n", HDfun.userItem);
      printf("┃                         ┃\n");
      printf("┃         3.添加%s信息         ┃\n", HDfun.userItem);
      printf("┃                         ┃\n");
      printf("┃         4.修改%s信息         ┃\n", HDfun.userItem);
      printf("┃                         ┃\n");
      printf("┃         5.删除%s信息         ┃\n", HDfun.userItem);
      printf("┃                         ┃\n");
      printf("┃         6.退出%s系统         ┃\n", HDfun.userItem);
      printf("┃                         ┃\n");
      printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
      printf("请输入菜单编号(只可以输入数字1-6):\n");
      int userKey = 0;
      switch (keyInt(userKey))
      {
      case 1:
                printf("查看全部信息:\n");
                loopPrintList(tempList);//打印列表全部信息
                break;
      case 2:
                printf("查找%s信息:\n",HDfun.userItem);
                findinfo();
                break;
      case 3:
                printf("添加%s信息:\n", HDfun.userItem);
                addNode(tempList, tempData);
                break;
      case 4:
                printf("修改%s信息:\n", HDfun.userItem);
                editNodeAppointStr(tempList, keyStr(tempData.name));
                break;
      case 5:
                printf("删除%s信息:\n", HDfun.userItem);
                deleteNodeAppointInt(tempList, keyInt(tempData.number));
                break;
      case 6:
                printf("退出%s系统:\n", HDfun.userItem);
                system("pause");
                exit(0);
                break;
      default:
                printf("你输入的信息有误请重新输入:\n");
                break;
      }
}createList.cpp
#include"infoAdimSys.h"

struct HDname_ HDnameList;
#pragma once
//写数据结构
//死写法:
//1.抽象单一个体
//2.描述最初状态:初始化--->初始化变量
//3.插入,删除
//4.打印遍历
//1.1 链表就是结构体变量和结构体变量链接在了一起
//1.2 指针变为变量的方式:是通过动态内存申请
//1.3                无表头链表:第一个节点不存储数据
//                        有表头链表:第一个节点不存储数据

//定义结构体链表==方法1
//typedef struct student_
//{
//      uint32_t number;                //学号                3140602001   31亿 int类型存不下31亿
//      char name;                //姓名
//      char grade;                //班级
//      char term;                        //学期
//      float      math;                              //数学
//      float      chinese;                        //语文
//      float      english;                        //英语
//      float      computer;                //计算机
//
//      //next指针,指向下一个节点
//      struct student_* next;
//}Student, * List;                              //取别名,为了列表和节点

//<1> 这个需要定义到头文件才能在main调用 定义结构体链表 == 方法2 == 定义一个结构体.定义数据格式(定义一个User)
//struct student
//{
//      uint32_t                number;      //学号                3140602001   31亿 int类型存不下31亿
//      char      name;                //姓名
//      char      grade;                //班级
//      char      term;                        //学期
//      float      math;                              //数学
//      float      chinese;                        //语文
//      float      english;                        //英语
//      float      computer;                //计算机
//};


//<2>定义结构体链表==方法2==定义一个结构体.定义数据格式(定义一个User)
//struct Node
//{
//      struct student Data;
//      struct Node* next;      //Node 尾指针
//};

//<3>定义结构体链表==方法2==定义一个结构体指针==通过动态内存申请是指针变为结构体变量
//这里第一个节点就创建完成了,用一个节点表示整个链表,这是一个有表头链表
struct Node* createList()
{
      //1.3                有表头链表:第一个节点不存储数据
      //                        无表头链表:第一个节点存储数据
      //1. 产生一个结构体变量==创建指针,指向一块申请的内存
      struct Node* listHeadNode = (struct Node*)malloc(sizeof(struct Node)); //链表头指向动态空间
      if (!listHeadNode)      //判断是否申请成功
                {
                        printf("分配空间失败!");
                        free(listHeadNode);
                        return NULL;
                }
      //2. 初始化一个变量
      listHeadNode->next = NULL;
      return listHeadNode;
};

//<4>创建新节点---第二个节点 --> (实际是数据的第一个节点 ,从这里开始有数据) 把定义的user
struct Node* createNode(struct student Data)
{
      //1.3                有表头链表:第一个节点不存储数据
      //                        无表头链表:第一个节点存储数据
      //1.                产生一个结构体变量==创建指针,指向一块申请的内存
      struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); //链表头指向动态空间
      if (!newNode)//判断是否申请成功
      {
                printf("分配空间失败!");
                free(newNode);
                return NULL;
      }
      //2.                初始化一个变量让我们新节点的number = number
      newNode->Data= Data;
      newNode->next = NULL;
      return newNode;
}

//<5>头插入新节点==插入节点通过头部( 插入哪个表头指向列表?,插入的数据是多少):对应的功能就是录入信息
void insertNodeByHead(struct Node* listHeadNode, student Data)
{
      //想不清楚就去画,看看流程
      //插入
      struct Node* newNode = createNode(Data);//新建一个节点指针 = 创建一个新节点

      newNode->next = listHeadNode->next;//先让新表指向 头链表指向的下一个列表
      listHeadNode->next = newNode;                        //再把头链接的的下一个指针指向这个新列表,完成插入
}

//<6>尾插入新节点==插入节点通过尾部( 插入哪个表头指向列表?,插入的数据是多少): 对应的功能就是录入信息
void insertNodeByEnd(struct Node* listHeadNode, student Data)
{
      //想不清楚就去画,看看流程
      //插入
      struct Node* newNode = createNode(Data);
      //传进来的节点指向的下一节点,指向新节点
      struct Node* newNodeCurrent = listHeadNode->next;
                if (newNodeCurrent==NULL)
                {
                        listHeadNode->next = newNode;//先让新表指向 头链表指向的下一个列表
                        newNode->next = NULL;                        //再把头链接的的下一个指针指向这个新列表,完成插入
                }
                else
                {
                        while (newNodeCurrent->next)
                        {
                              newNodeCurrent = newNodeCurrent->next;
                        }
                        newNodeCurrent->next = newNode;//先让新表指向 头链表指向的下一个列表
                        newNode->next = NULL;                        //再把头链接的的下一个指针指向这个新列表,完成插入
                }
}

//<8>删除指定字符串列表 删除节点指定 (删除哪个表头指向列表?, 指定一个正确位置-数据 )先找到再删除
void deleteNodeAppointStr(struct Node* listHeadNode, char* positionData)//通过字符串查找删除,我们就按名字查找吧
{
      if (positionData == NULL)//我们删除之前,要先判断一下这个链表有没有这项数据
      {
                printf("无相关内容,无法删除!\n");//如果没有就提示下用户;
                return; //然后直接返回
      }
      else {
                //删除前我们先做准备工作,定义两个链表节点指针;
                //定义一个节点指针“posintionFrontData”指向我们要操作节点的上一个节点,我们先要查找的节点是 "listHeadNode->next"
                struct Node* posintionFrontNode = listHeadNode;
                //由于我们的表头是没有数据的,需要
                struct Node* posintionNode = listHeadNode->next;//定义一个节点的指针指向找到的数据节点的下一个节点,用这个指针遍历链表
                //现在我们开始遍历链表找到我们要删除的节表
                while (strcmp("posintionData->Data.name " , "positionData"))//如果posintionData->number的值不等于要查找的<positionData>值
                {
                        if (positionData == NULL)//我们不能让他一直找下去,当找到这个链表的最后一节还没有找到数据
                        {
                              printf("无相关内容,无法删除!\n");//提示下用户没找到;
                              return; //然后直接返回
                        }
                        else
                        {
                              //那就找下一个节点,让当前节点的上一节点指针指向这个节点
                              posintionFrontNode = posintionNode;//让我们定义<posintionFrontData>指针 指向现在操作的节点
                              //让当前节点的指针posintionData ,指向它的下一个节点继续查找数据
                              posintionNode = posintionFrontNode->next; //然后我们再把<posintionData>指向我们下次要操作的节点,继续while开始比对数据
                        }
                }
                posintionFrontNode->next = posintionNode->next; //让这个节点的上一个节点指向下一个节点的位置指向这个节点的下一节点
                free(posintionNode);//释放掉这节点,达到删除目的
      }
}

//<9>查找单行打印列表   要打印谁就把谁传进来 把要打印的链表表头传进来
void printList(structNode* listHeadNode)
{
      system("cls");
                struct Node* pMove = listHeadNode->next;//我们的第一个链表头没有数据,所以要从第二个节表打印
                if (listHeadNode)
                {
                        printf("请按照要求输入%s、%s、%s、%s、%s、%s、%s、%s:\n", HDnameList.userNumber, HDnameList.userName, HDnameList.userGrade, HDnameList.userTerm,HDnameList.userMath, HDnameList.userChinese, HDnameList.userEnglish, HDnameList.userComputer);
                        printf_s("%d\t %s\t %s\t 第%s学期\t %0.2f\t %0.2f\t %0.2f\t %0.2f\t\n", pMove->Data.number, pMove->Data.name,
                              pMove->Data.grade, pMove->Data.term, pMove->Data.math, pMove->Data.chinese, pMove->Data.english, pMove->Data.computer);//打印里面的数据
                        printf("\n-------------------------------华丽的换行符----------------------------------\n");
                }
                else
                {
                        printf("无法找到数据\n");
                }      
}

//<9.1>循环打印列表   要打印谁就把谁传进来 把要打印的链表表头传进来
void loopPrintList(structNode* listHeadNode)
{
      system("cls");
      struct Node* pMove = listHeadNode->next;//我们的第一个链表头没有数据,所以要从第二个节表打印
      printf("请按照要求输入%s、%s、%s、%s、%s、%s、%s、%s:\n", HDnameList.userNumber, HDnameList.userName, HDnameList.userGrade, HDnameList.userTerm,HDnameList.userMath, HDnameList.userChinese, HDnameList.userEnglish, HDnameList.userComputer);
      while (pMove)//当前列表指针指向的链表是空的就不需要打印了
      {
                printf_s("%d\t %s\t %s\t 第%s学期\t %0.2f\t %0.2f\t %0.2f\t %0.2f\t\n", pMove->Data.number, pMove->Data.name,
                        pMove->Data.grade, pMove->Data.term, pMove->Data.math, pMove->Data.chinese, pMove->Data.english, pMove->Data.computer);//打印里面的数据
                pMove = pMove->next;//打印完了我们去下一个节点
      }
      printf("\n-------------------------------华丽的换行符----------------------------------\n");
}

//<9.2>打印当前   要打印谁就把谁传进来 把要打印的链表表头传进来
void printNode(structNode* curNode)
{
      system("cls");
      struct Node* pMove = curNode;
      if (curNode)
      {
                printf("请按照要求输入%s、%s、%s、%s、%s、%s、%s、%s:\n", HDnameList.userNumber, HDnameList.userName, HDnameList.userGrade, HDnameList.userTerm,HDnameList.userMath, HDnameList.userChinese, HDnameList.userEnglish, HDnameList.userComputer);
                printf_s("%d\t %s\t %s\t 第%s学期\t %0.2f\t %0.2f\t %0.2f\t %0.2f\t\n", pMove->Data.number, pMove->Data.name,
                        pMove->Data.grade, pMove->Data.term, pMove->Data.math, pMove->Data.chinese, pMove->Data.english, pMove->Data.computer);//打印里面的数据
                printf("\n-------------------------------华丽的换行符----------------------------------\n");
      }
      else
      {
                printf("无法找到数据\n");
      }
}

//<11.0>按编号查找    (要查找的链表   要查找的数据)
struct Node* searchNodeByAppoinNum(struct Node* ListHeadNode, uint32_t num)
{
      struct Node* pMove = ListHeadNode->next;
      if (pMove == NULL)
      {
                return pMove;
      }
      else
      {
                while (pMove->Data.number != num)
                {
                        pMove = pMove->next;
                        if (pMove == NULL)
                        {
                              break;
                        }
                }
                return pMove;
      }
}

//<11.1>按姓名查找    (要查找的链表   要查找的数据)
struct Node* searchNodeByAppoinNane(struct Node* ListHeadNode, char* name)
{
      struct Node* pMove = ListHeadNode->next;
      if (pMove == NULL)
      {
                return pMove;
      }
      else
      {
                while (strcmp(pMove->Data.name , name))
                {
                        pMove = pMove->next;
                        if (pMove == NULL)
                        {
                              break;
                        }
                }
                return pMove;
      }
}

//<11.1>按班级查找    (要查找的链表   要查找的数据)
struct Node* searchNodeByAppoinGrade(struct Node* ListHeadNode, char* name)
{
      struct Node* pMove = ListHeadNode->next;
      if (pMove == NULL)
      {
                return pMove;
      }
      else
      {
                while (strcmp(pMove->Data.grade, name))
                {
                        pMove = pMove->next;
                        if (pMove == NULL)
                        {
                              break;
                        }
                }
                return pMove;
      }
}

//<11.3>按期数查找    (要查找的链表   要查找的数据)
struct Node* searchNodeByAppoinTerm(struct Node* ListHeadNode, char* name)
{
      struct Node* pMove = ListHeadNode->next;
      if (pMove == NULL)
      {
                return pMove;
      }
      else
      {
                while (strcmp(pMove->Data.term, name))
                {
                        pMove = pMove->next;
                        if (pMove == NULL)
                        {
                              break;
                        }
                }
                return pMove;
      }
}operationData.cpp
#include"infoAdimSys.h"

struct HDname_ HDname;

//<10>添加成员信息
void addNode(struct Node* listHeadNode, struct student tempData)
{
      printf("请按照要求输入%s、%s、%s、%s、%s、%s、%s、%s:\n", HDname.userNumber, HDname.userName, HDname.userGrade, HDname.userTerm,
                                                                                                                                                                                                                HDname.userMath, HDname.userChinese, HDname.userEnglish, HDname.userComputer);
      printf("请按格式输入%s:20210900001\n",HDname.userNumber);
      scanf_s("%u", &tempData.number);
      printf("请按格式输入%s:中文不超过5个汉字!\n",HDname.userName);
      scanf_s("%s", tempData.name, 10);
      printf("请按格式输入%s:例:TCT201309 \n",HDname.userGrade);
      scanf_s("%s", tempData.grade, 50);
      printf("请按格式输入第几%s:例:一 \n",HDname.userTerm);
      scanf_s("%s", tempData.term, 50);
      printf("请按格式输入%s:100或90.5\n",HDname.userMath);
      scanf_s("%f", &tempData.math);
      printf("请按格式输入%s:100或90.5\n",HDname.userChinese);
      scanf_s("%f", &tempData.chinese);
      printf("请按格式输入%s:100或90.5\n",HDname.userEnglish);
      scanf_s("%f", &tempData.english);
      printf("请按格式输入%s:100或90.5\n",HDname.userComputer);
      scanf_s("%f", &tempData.computer);
      insertNodeByEnd(listHeadNode, tempData);
      printf("\n------------------------------添加完成----------------------------------\n");
      loopPrintList(listHeadNode);
      saveInfoFormFile(FilePath(), listHeadNode);
}

//<10>修改指定字符串列表 修改节点指定 (修改哪个表头指向列表?, 指定一个正确位置-数据 )先找到再修改
void editNodeAppointStr(struct Node* listHeadNode, char* EditData)//通过字符串查找删除,我们就按名字查找吧
{
      struct Node* curNode = searchNodeByAppoinNane(listHeadNode, EditData);
      printf("请按照要求输入%s、%s、%s、%s、%s、%s、%s、%s:\n", HDname.userNumber, HDname.userName, HDname.userGrade, HDname.userTerm,
                HDname.userMath, HDname.userChinese, HDname.userEnglish, HDname.userComputer);
      printf("请按格式输入%s:20210900001\n", HDname.userNumber);
      scanf_s("%u", &curNode->Data.number);
      printf("请按格式输入%s:中文不超过5个汉字!\n", HDname.userName);
      scanf_s("%s", curNode->Data.name, 10);
      printf("请按格式输入%s:例:TCT201309 \n", HDname.userGrade);
      scanf_s("%s", curNode->Data.grade, 50);
      printf("请按格式输入第几%s:例:一 \n", HDname.userTerm);
      scanf_s("%s", curNode->Data.term, 50);
      printf("请按格式输入%s:100或90.5\n", HDname.userMath);
      scanf_s("%f", &curNode->Data.math);
      printf("请按格式输入%s:100或90.5\n", HDname.userChinese);
      scanf_s("%f", &curNode->Data.chinese);
      printf("请按格式输入%s:100或90.5\n", HDname.userEnglish);
      scanf_s("%f", &curNode->Data.english);
      printf("请按格式输入%s:100或90.5\n", HDname.userComputer);
      scanf_s("%f", &curNode->Data.computer);
      printf("\n------------------------------添加完成----------------------------------\n");
      loopPrintList(listHeadNode);
      saveInfoFormFile(FilePath(), listHeadNode);
}

//<7>删除指定Int列表 删除节点指定 (删除哪个表头指向列表?, 指定一个正确位置-数据 )先找到再删除
void deleteNodeAppointInt(struct Node* listHeadNode, int positionData)//通过整数查找删除
{
      if (positionData == NULL)//我们删除之前,要先判断一下这个链表有没有这项数据
      {
                printf("无相关内容,无法删除!\n");//如果没有就提示下用户;
                return; //然后直接返回
      }
      else {
                //删除前我们先做准备工作,定义两个链表节点指针;
                //定义一个节点指针“posintionFrontData”指向我们要操作节点的上一个节点,我们先要查找的节点是 "listHeadNode->next"
                struct Node* posintionFrontData = listHeadNode;
                //由于我们的表头是没有数据的,需要
                struct Node* posintionData = listHeadNode->next;//定义一个节点的指针指向找到的数据节点的下一个节点,用这个指针遍历链表
                //现在我们开始遍历链表找到我们要删除的节表
                while (posintionData->Data.number != positionData)//如果posintionData->number的值不等于要查找的<positionData>值
                {
                        if (positionData == NULL)//我们不能让他一直找下去,当找到这个链表的最后一节还没有找到数据
                        {
                              printf("无相关内容,无法删除!\n");//提示下用户没找到;
                              return; //然后直接返回
                        }
                        else
                        {
                              //那就找下一个节点,让当前节点的上一节点指针指向这个节点
                              posintionFrontData = posintionData;//让我们定义<posintionFrontData>指针 指向现在操作的节点
                              //让当前节点的指针posintionData ,指向它的下一个节点继续查找数据
                              posintionData = posintionFrontData->next; //然后我们再把<posintionData>指向我们下次要操作的节点,继续while开始比对数据
                        }
                }
                posintionFrontData->next = posintionData->next; //让这个节点的上一个节点指向下一个节点的位置指向这个节点的下一节点
                free(posintionData);//释放掉这节点,达到删除目的
      }
      saveInfoFormFile(FilePath(), listHeadNode);
}


//<11.1>按编号查找成员信息
void findNodeInt(struct Node* listHeadNode, uint32_t findData)
{
      printNode(searchNodeByAppoinNum(listHeadNode, findData));
}

//<11.2>按名称查找成员信息
void findNodeStr(struct Node* listHeadNode, char* findData)
{
      printNode(searchNodeByAppoinNane(listHeadNode, findData));
}

//<11.3>按分级查找成员信息
void findGradeNodeStr(struct Node* listHeadNode, char* findData)
{
      struct Node* findNode = searchNodeByAppoinGrade(listHeadNode, findData);
      if (findNode)
      {
                int cnt = 0; double gradesum = 0, gradeMean = 0;
                while (findNode)
                {
                        if (strcmp(findNode->Data.grade, findData) == 0)
                        {
                              double sum = 0, mean = 0;
                              printNode( findNode);

                              cnt++;//统计打印过多少次,作为找的多少个匹配的人数

                              sum = findNode->Data.math + findNode->Data.chinese + findNode->Data.english + findNode->Data.computer;//数学总成绩
                              mean = sum / 4.0; //语文总成绩
                              gradesum += sum;
                              gradeMean = gradesum / cnt,
                                        printf(" \n该%s的总成绩是%0.2f, 平均成绩为%0.2f!\n\n", HDname.userItem,sum, mean);
                              findNode = findNode->next;
                        }
                        else
                        {
                              findNode = findNode->next;
                        }
                }
                printf("第%s%s的平均总分成绩为%0.2f!\n", findData, HDname.userGrade, gradeMean);
                printf("本次共为您找到了%d位第%s%s的%s!\n", cnt, HDname.userGrade, findData, HDname.userItem);
      }
      else
      {
                printf("未找到第%s%s的%s\n\n\n", findData, HDname.userGrade, HDname.userItem);
      }
}


//<11.3>按期数查找成员信息
void findTermNodeStr(struct Node* listHeadNode, char* findData)
{
      struct Node* findNode = searchNodeByAppoinTerm(listHeadNode, findData);
      if (findNode)
      {
                int cnt = 0; double gradesum = 0, gradeMean = 0;
                while (findNode)
                {
                        if (strcmp(findNode->Data.term, findData) == 0)
                        {
                              double sum = 0, mean = 0;
                              printNode(findNode);

                              cnt++;//统计打印过多少次,作为找的多少个匹配的人数

                              sum = findNode->Data.math + findNode->Data.chinese + findNode->Data.english + findNode->Data.computer;//数学总成绩
                              mean = sum / 4.0; //语文总成绩
                              gradesum += sum;
                              gradeMean = gradesum / cnt,
                                        printf("\n该%s的总成绩是%0.2f, 平均成绩为%0.2f!\n\n", HDname.userItem,sum, mean);
                              findNode = findNode->next;
                        }
                        else
                        {
                              findNode = findNode->next;
                        }
                }
                printf("第%s第%s期的平均总分成绩为%0.2f!\n", findData, HDname.userTerm, gradeMean);
                printf("本次共为您找到了%d位第%s%s的%s!\n", cnt, HDname.userTerm, findData, HDname.userItem);
      }
      else
      {
                printf("未找到第%s%s的%s\n\n\n", findData, HDname.userTerm, HDname.userItem);
      }
}

//<11.4>按不及格数据查找成员信息
void findMathNodeInt(struct Node* listHeadNode, int findData)
{
      if (listHeadNode->next == NULL)//我们删除之前,要先判断一下这个链表有没有这项数据
      {
                printf("无数据,无法查找!\n");//如果没有就提示下用户;
                return; //然后直接返回
      }
      else {
                struct Node* findForntNode = listHeadNode;//这里如果我们需要返回列表到循环打印,需要返回要打印的前一节链表
                struct Node* findNode = listHeadNode->next;
                if (findData == NULL)
                {
                        printf("请正确输入数据,请重新输入要查找%s!", HDname.userMath);
                }
                else
                {
                        int cnt = 0;
                        while (findNode)
                        {
                              if (findNode->Data.math <= findData || findNode->Data.chinese <= findData || findNode->Data.english <= findData || findNode->Data.computer <= findData)//其中一项不合格就符合打印条件
                              {
                                        if (findNode->Data.math <= findData && findNode->Data.chinese <= findData && findNode->Data.english <= findData && findNode->Data.computer <= findData)//数学 语文 英语 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t语文:%0.2f\t英语:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.chinese, findNode->Data.english, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.math <= findData && findNode->Data.chinese <= findData && findNode->Data.english <= findData)//数学 语文 英语
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t语文:%0.2f\t英语:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.chinese, findNode->Data.english);
                                        }
                                        else if (findNode->Data.math <= findData && findNode->Data.chinese <= findData && findNode->Data.computer <= findData)//数学 语文 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t语文:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.chinese, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.math <= findData && findNode->Data.english <= findData && findNode->Data.computer <= findData)//数学 英语 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t英语:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.english, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.chinese <= findData && findNode->Data.english <= findData && findNode->Data.computer <= findData)//语文 英语 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\t英语:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.chinese, findNode->Data.english, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.math <= findData && findNode->Data.chinese <= findData)//数学 语文
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t语文:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.chinese);
                                        }
                                        else if (findNode->Data.math <= findData && findNode->Data.english <= findData)//数学 英语
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t英语:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.english);
                                        }
                                        else if (findNode->Data.math <= findData && findNode->Data.computer <= findData)//数学 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t数学:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.chinese <= findData && findNode->Data.english <= findData)//语文 英语
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\t英语:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.chinese, findNode->Data.english);
                                        }
                                        else if (findNode->Data.chinese <= findData && findNode->Data.computer <= findData)//语文 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.chinese, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.english <= findData && findNode->Data.computer <= findData)//英语 计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t英语:%0.2f\t计算机:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.english, findNode->Data.computer);
                                        }
                                        else if (findNode->Data.math <= findData)//数学
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.math);
                                        }
                                        else if (findNode->Data.chinese <= findData)//语文
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.chinese);
                                        }
                                        else if (findNode->Data.english <= findData)//英语
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.english);
                                        }
                                        else if (findNode->Data.computer <= findData)//计算机
                                        {
                                                printf("姓名:%s\t班级:%s\t语文:%0.2f\n\n", findNode->Data.name, findNode->Data.grade, findNode->Data.computer);
                                        }
                                        cnt++; //记录打印次数
                              }
                              if (findNode->next == NULL)
                              {
                                        printf("查询结束,请重新输入要查找%s!\n", HDname.userMath);
                                        break;
                              }
                              findNode = findNode->next;
                        }
                        printf("共有%d位科目不及格的%s!\n", cnt, HDname.userItem);
                }
      }
}**** Hidden Message *****


Shark恒 发表于 2022-1-2 11:35

注释确实很细致,大家可以参考学习~

阿桂哥 发表于 2022-1-2 11:38

豪华版,人见人爱

woaini 发表于 2022-1-2 11:55

谢谢分享 !

保安 发表于 2022-1-2 13:35

支持一波 等学会C++再来拿代码{:5_193:}

Elizer 发表于 2022-1-2 15:48

学习学习,好东西

snak2020 发表于 2022-1-2 16:55

感谢分享,收藏

liouyuwei 发表于 2022-1-2 21:56

学习一下

神秘 发表于 2022-1-3 01:36

多谢分享

wbxs2077 发表于 2022-1-3 20:03

这也太细致详细了 ,LZNB
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 成绩信息管理系统豪华完整版,带详细注释,欢迎学习,文件读写、封装、多文件等等