C语言实现新生入学登记系统

发布时间:2023-10-30 16:00

本文实例为大家分享了C语言实现新生入学登记系统的具体代码,供大家参考,具体内容如下

项目所用数据结构:链表
算法:对链表数据的增删改查操作,冒泡排序
系统架构图:

\"C语言实现新生入学登记系统_第1张图片\"

项目文件结构:

\"C语言实现新生入学登记系统_第2张图片\"

(1)system.h

#ifndef SYSTEM_H_INCLUDED
#define SYSTEM_H_INCLUDED
//宏定义学生信息的一种表示形式
#define STUDENT_DATA  pMove->studentData.studentId,pMove->studentData.name,pMove->studentData.sex,pMove->studentData.age,pMove->studentData.className,pMove->studentData.major,pMove->studentData.tel,pMove->studentData.score

#define STUDENT_RANKING stuRanking[j].studentId, stuRanking[j].name, stuRanking[j].className, stuRanking[j].score,stuRanking[j].ranking
struct student
{
      char studentId[15];  //学号
      char name[10];
      char sex[4];
      int  age;
      char className[20];  //班级
      char major[20];  //专业
      char tel[15];
      int  score;    //入学成绩
};

struct Node
{
      struct student studentData;
      struct Node* next;
};

struct studentRanking
{
     char studentId[15];
     char name[10];
     char className[20];
     int  score;
     int  ranking;

};
extern struct Node* studentList;  //链表的头指针
#endif // SYSTEM_H_INCLUDED

(2)main.h

#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED
#include \"AddStudent.h\"
#include \"BeginingAndEnding.h\"
#include \"DeleteStudent.h\"
#include \"ModifyStudent.h\"
#include \"SearchStudent.h\"
#include \"ShowStudent.h\"
#include \"ShowStudentRanking.h\"
#include \"MyList.h\"
#include \"system.h\"
void showMenu();

#endif // MAIN_H_INCLUDED

(3)main.c
 

#include 
#include 
#include    //getc函数使用的头文件
#include \"main.h\"
//主函数
int main()
{
int selection;
Int ret;
    Begining();
    showMenu();      //展示界面
    ret = scanf(\"%d\", &selection); //读入用户输入数字
getchar();
While(ret != 1)
{
     printf(“输入错误,请选择(0-6):”);
     ret = scanf(\"%d\", &selection); //读入用户输入数字
}
    while (selection)
    {
        switch (selection)
        {
        case 1:
            AddStudent();  //录入学生信息
            break;
        case 2:
            ShowStudent();  //浏览学生信息
            break;
        case 3:
            SearchStudent(); //查找学生信息
            break;
        case 4:
            DeleteStudent(); //删除学生信息
            break;
        case 5:
            ModifyStudent();//修改学生信息
            break;
        case 6:
            ShowRanking(); //显示学生排名
            break;
        default:
            printf(\"\\t\\t请输入正确的数字!\\n\");
        }
        Ending(); //将链表数据写入文件
        printf(\"|按任意键返回系统菜单|\");
        getch(); //接收用户输入的任意字符
        system(\"cls\");
        showMenu();
        ret = scanf(\"%d\", &selection); //提示用户输入数字
        getchar();
    While(ret != 1)
{
        printf(“输入错误,请选择(0-6):”);
        ret = scanf(\"%d\", &selection); //读入用户输入数字
}

    }
    return 0;
}


void showMenu()
{

    printf(\"\\n\\n\\n\\n\\n\");
    printf(\"\\t|--------------- 欢迎进入 ----------------|\\n\");
    printf(\"\\t|             新生入学登记系统            |\\n\");
    printf(\"\\t|                 主菜单                  |\\n\");
    printf(\"\\t|            1. 录入学生信息              |\\n\");
    printf(\"\\t|            2. 浏览学生信息              |\\n\");
    printf(\"\\t|            3. 查找学生信息              |\\n\");
    printf(\"\\t|            4. 删除学生信息              |\\n\");
    printf(\"\\t|            5. 修改学生信息              |\\n\");
    printf(\"\\t|            6. 新生入学排名              |\\n\");
    printf(\"\\t|            0. 退出系统                  |\\n\");
    printf(\"\\t|-----------------------------------------|\\n\");
    printf(\"\\n\");
    printf(\"\\t\\t请选择(0-6):\");
}

(4)BeginingAndEnding.h

#ifndef BEGININGANDENDING_H_INCLUDED
#define BEGININGANDENDING_H_INCLUDED
//关于启动函数和结束函数
void Begining();
void Ending();
#endif // BEGININGANDENDING_H_INCLUDED

(5)BeginingAndEnding.c

#include 
#include    //getc函数使用的头文件
#include \"system.h\"
#include \"AboutFiles.h\"
#include \"BeginingAndEnding.h\"
#include \"MyList.h\"
void Begining()
{
      readInfoFromFile(\"studentList.txt\");
}
void Ending()
{
      writeInfoToFile(\"studentList.txt\");
}

(6)MyList.h

#ifndef MYLIST_H_INCLUDED
#define MYLIST_H_INCLUDED
//关于链表的函数声明
//创建节点
struct Node* createNode(struct student data);
//插入节点
void insertNodeByHead(struct student data);
//指定位置删除节点
void deleteAppointNode(char* studentId);
//查找功能
struct Node* searchInfoByData(char* studentId);
//打印链表
void printList();
#endif // MYLIST_H_INCLUDED

(7)MyList.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"system.h\"
#include \"MyList.h\"

struct Node* studentList = NULL;  //链表的头指针
//创建节点
struct Node* createNode(struct student studentData)
{
      struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
      if(newNode != NULL)
      {
            newNode->studentData = studentData;
            newNode->next = NULL;
      }
      return newNode;
}
//插入节点
void insertNodeByHead(struct student data)
{
      struct Node* newNode = createNode(data);
      //表头法插入,每次插入都将数据插入到头节点的下一个,先判断头节点是否为空,为空则新节点就是头节点,不为空,则插入在头节点的下一个位置
      if(studentList == NULL)
      {
            studentList = newNode;
      }
      else//不改变头节点
      {
            newNode->next = studentList->next;
            studentList->next = newNode;
      }

}

//指定位置删除节点(知道这个节点的前驱和后续,然后进行删除)
void deleteAppointNode( char* studentId)
{
    //将链表头部设为指定位置,先判断头节点是否为空,为空则链表没有数据,无法删除
    //如果头节点不为空,则设头结点为指定位置,如果头结点是所找的节点,则删除,如果不是,设头结点的下一个为指定节点,头结点为指定节点的前驱节点,一直向下查询
    //指定位置
    struct Node* posNode = studentList;
    //指定位置的前面
    struct Node* posFrontNode = NULL;
    //查找指定节点
    if(posNode == NULL)
    {
       printf(\"数据为空无法删除!\\n\");
        return;
    }
    else
    {
          //姓名是字符串,不能直接比较, strcmp(), 相等返回值为0,相同返回值为负数或者正数
        if(strcmp(posNode->studentData.studentId, studentId) ==0)
        {
            studentList = studentList->next;
            free(posNode);
            return;
        }
        else
        {
            posFrontNode = posNode;
            posNode = posNode->next;
            //posFrontNode = posNode; //!!
            while(strcmp(posNode->studentData.studentId, studentId))
            {
                //继续向下一个节点移动
                posFrontNode = posNode;
                posNode = posFrontNode->next;
                if(posNode == NULL) //找到了链表尾部,没有找到数据
                {
                    printf(\"未找到指定位置,无法删除!\");
                    return;
                }
            }
            //查到到对应数据后,进行删除,将该节点架空,然后释放该节点的存储单元
            posFrontNode->next = posNode->next;
            free(posNode);
            return;
        }
    }
}
//查找功能
struct Node* searchInfoByData(char* studentId)
{
      struct Node* pMove;
      pMove = studentList;
      if(pMove == NULL) //头节点为空,链表为空
      {
            //printf(\"学生链表为空!\\n\");
            return pMove;
      }
      else
      {
            // 查找到或者查找到链表最后,则结束循环,返回查询结果,结果为空,有两种可能,一种是链表中没有数据,另一种是没有查询到
            while(pMove != NULL)
            {
                  if(strcmp(pMove->studentData.studentId, studentId)==0)//找见
                  {
                        //printf(\"已查找到!\\n\");
                        return pMove;
                  }
                  else
                  {
                        pMove = pMove->next;
                  }

            }
            //printf(\"未找到!\\n\");
            return pMove;
      }
}

//打印链表
void printList()
{
      struct Node* pMove = studentList;
      //涉及到展示数据
      //表头
      if(pMove == NULL)
      {
            printf(\"No student record! Please add.\\n\");
            return;
      }
      else
      {
             printf(\"\\t-------------------------------------------------------------------------------------\\n\");
printf(\"\\t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|\\n\",\"学号\",\"姓名\",\"性别\",\"年龄\",\"班级\",\"专业\",\"电话\",\"入学成绩\");
             printf(\"\\t-------------------------------------------------------------------------------------\\n\");
while(pMove)
   {
      printf(\"\\t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|\\n\", STUDENT_DATA);
                  printf(\"\\t-------------------------------------------------------------------------------------\\n\");
    pMove = pMove->next;
            }
      }
      printf(\"\\n\");
}

(8)AddStudent.h

#ifndef ADDSTUDENT_H_INCLUDED
#define ADDSTUDENT_H_INCLUDED
void AddStudent();  //录入学生信息
#endif // ADDSTUDENT_H_INCLUDED

(9)AddStudent.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"AddStudent.h\"
#include \"system.h\"
#include  \"MyList.h\"

//录入学生信息
void AddStudent()
{
    struct student studentData;
    struct Node* isNull = NULL;  //接收查询的返回值
    int iFlagExist;  //保证不重复输入
    char cFlag;
    int ret;  //用来接收scanf的返回值,判断输入数据是否正确

    system(\"cls\");
    printf(\"===================================【录入学生信息】===============================\\n\");

    printf(\"\\n请选择是否输入学生信息(y/n):\");
    cFlag = getchar();
    getchar();
    while(cFlag != \'n\' && cFlag!=\'y\')
    {
          printf(\"输入有误,请输入‘y\'或者‘n\'!\");
          printf(\"\\n请选择是否输入学生信息(y/n):\");
          cFlag = getchar();
          getchar();
    }
    if (cFlag == \'n\')
        return;

    //循环输入学生信息可输入一条也可多条输入
    while (cFlag == \'y\')
    {
        printf(\"请输入学生学号:\");
        do
        {
            iFlagExist = 0;
            gets(studentData.studentId);
            //对学生编号在链表中进行查询,对查询结果进行判断,如果存在则重新输入,不存在则继续
            isNull = searchInfoByData(studentData.studentId);
            if(isNull!= NULL) //可以查询到
            {
                  printf(\"该学生已经存在请重新输入!\\n\");
                  printf(\"请输入学生学号:\");
                  iFlagExist = 1;
            }
        } while (iFlagExist == 1);

        //添加学生信息
        printf(\"请输入学生姓名:\");
        ret = scanf(\"%s\",studentData.name);
        while(ret!=1)
        {
              printf(\"输入学生姓名有误,请重新输入!\\n\");
              printf(\"请输入学生姓名:\");
              ret = scanf(\"%s\",studentData.name);
        }
        getchar();
        printf(\"请输入学生性别(男-M,女-F):\"); //这里采用防御式编程,如果不是M,F或者没有输入该项则重新输入
        while (gets(studentData.sex) != NULL)
        {
            if (strcmp(studentData.sex, \"F\")==0 || strcmp(studentData.sex, \"M\")==0)
                break;
            printf(\"错误,只能输入\'F\'或者\'M\',请重新输入\\n\");
            printf(\"请输入学生性别(男-M,女-F):\");
        }

        printf(\"请输入学生年龄(15-25):\");
        ret = scanf(\"%d\", &studentData.age);
        while((ret != 1) || studentData.age<15 || studentData.age>25)
        {
              printf(\"输入年龄错误,请重新输入学生年龄(15-25):\");
              ret = scanf(\"%d\", &studentData.age);
        }

        getchar();
        printf(\"请输入学生班级(eg: B电子191):\");
        gets(studentData.className);
        printf(\"请输入学生专业:\");
        gets(studentData.major);
        printf(\"请输入学生电话:\");
        gets(studentData.tel);

        printf(\"请输入学生入学成绩(200-750):\");
        ret = scanf(\"%d\", &studentData.score);
        while((ret != 1) || studentData.score<200 || studentData.score>750)
        {
              printf(\"输入成绩信息错误,请重新输入学生入学成绩(200-750):\");
              ret = scanf(\"%d\", &studentData.score);
        }
        getchar();

        insertNodeByHead(studentData);
        fflush(stdin);
        printf(\"继续输入信息吗(y/n):\");
        cFlag = getchar();
        getchar();
        while(cFlag != \'n\' && cFlag!=\'y\')
        {
            printf(\"输入有误,请输入‘y\'或者‘n\'!\");
            printf(\"\\n请选择是否输入学生信息(y/n):\");
            cFlag = getchar();
            getchar();
        }
    }
    printf(\"添加学生信息执行完毕!\\n\");
}

(10)ShowStudent.h

#ifndef SHOWSTUDENT_H_INCLUDED
#define SHOWSTUDENT_H_INCLUDED
void ShowStudent(); //查找学生信息
#endif // SHOWSTUDENT_H_INCLUDED

(11)ShowStudent.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"ShowStudent.h\"
#include \"system.h\"
#include  \"MyList.h\"
//浏览学生信息
void ShowStudent()
{
      system(\"cls\");
      printf(\"\\n\");
      printf(\"\\t====================================【浏览学生信息】================================\\n\");
      printf(\"\\n\\n\");
      printList();

}

(12)SearchStudent.h

#ifndef SEARCHSTUDENT_H_INCLUDED
#define SEARCHSTUDENT_H_INCLUDED
void SearchStudent(); //查找学生信息
#endif // SEARCHSTUDENT_H_INCLUDED

(13)SearchStudent.c

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"SearchStudent.h\"
#include \"system.h\"
#include  \"MyList.h\"

//查找学生信息
void SearchStudent()
{
      //查询成功,则返回该学生信息,查询失败则输出提示信息,可重新输入,也可退出
      struct student studentData;
      struct Node* pMove = NULL; //用来接收查询返回的结果
      char cFlag;  //接收用户的选择

      system(\"cls\");
      printf(\"\\n\");
      printf(\"\\t==================================【查找学生信息】==============================\\n\");

      printf(\"\\t是否进行学生查询(y/n):\");
      cFlag = getchar();
      getchar(); //接收回车键
      while(cFlag != \'n\' && cFlag!=\'y\')
      {
            printf(\"输入有误,请输入‘y\'或者‘n\'!\");
            printf(\"\\n请选择是否查询学生信息(y/n):\");
            cFlag = getchar();
            getchar();
      }
      if (cFlag == \'n\')
        return;

      while(cFlag == \'y\')
      {
        printf(\"\\t请输入需要查找的学生的学号:\");
        //这里通过学号进行查询,学号是唯一的,姓名有重名现象
        gets(studentData.studentId);
        pMove = searchInfoByData(studentData.studentId);
        if(pMove)  //pMove 为真时,表示查询到
        {
            printf(\"\\t查询成功,以下为该学生信息:\\n\");
            printf(\"\\t-------------------------------------------------------------------------------------\\n\");
            printf(\"\\t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|\\n\",\"学号\",\"姓名\",\"性别\",\"年龄\",\"班级\",\"专业\",\"电话\",\"入学成绩\");
            printf(\"\\t-------------------------------------------------------------------------------------\\n\");
            printf(\"\\t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|\\n\", STUDENT_DATA);
            printf(\"\\t-------------------------------------------------------------------------------------\\n\");

        }
        else //pMove 为空时,未查询到,这里为空有两种情况,一种为学生名单为空,一种是没有查询到
        {
            printf(\"\\t查询失败,该学生不存在或学生列表为空!\\n\");
            printf(\"\\t是否重新查询(y/n):\");
            cFlag = getchar();
            getchar();
            while(cFlag != \'n\' && cFlag!=\'y\')
            {
                printf(\"输入有误,请输入‘y\'或者‘n\'!\");
                printf(\"\\n是否重新查询学生信息(y/n):\");
                cFlag = getchar();
                getchar();
            }
        }
      }
      printf(\"\\t学生信息查询结束!\\n\");
}

(14)DeleteStudent.h

#ifndef DELETESTUDENT_H_INCLUDED
#define DELETESTUDENT_H_INCLUDED
void DeleteStudent(); //删除学生信息
#endif // DELETESTUDENT_H_INCLUDED

(15)DeleteStudent.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"DeleteStudent.h\"
#include \"system.h\"
#include  \"MyList.h\"
//删除学生信息
void DeleteStudent()
{
      //先根据学号对该学生进行查找,查找到则删除,没有查找到则输出提示信息
      struct student studentData;
      struct Node* pMove = NULL; //用来接收查询返回的结果
      char cFlag;

      system(\"cls\");
      printf(\"\\n\");
      printf(\"\\t==================================【删除学生信息】==============================\\n\");
      printf(\"\\t请输入需要删除的学生的学号:\");
      gets(studentData.studentId);
      pMove = searchInfoByData(studentData.studentId);
      if(pMove)  //该学生存在,进行删除
      {
        //先对学生信息进行展示
        printf(\"\\t-------------------------------------------------------------------------------------\\n\");
        printf(\"\\t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|\\n\",\"学号\",\"姓名\",\"性别\",\"年龄\",\"班级\",\"专业\",\"电话\",\"入学成绩\");
        printf(\"\\t-------------------------------------------------------------------------------------\\n\");
        printf(\"\\t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|\\n\", STUDENT_DATA);
        printf(\"\\t-------------------------------------------------------------------------------------\\n\");
        printf(\"\\t已查找到该学生信息,是否删除?(y/n)\");
        cFlag = getchar();
        getchar(); //吃掉缓冲区的空格

        while(cFlag != \'n\' && cFlag!=\'y\')
        {
            printf(\"输入有误,请输入‘y\'或者‘n\'!\");
            printf(\"\\n请选择是否输入学生信息(y/n):\");
            cFlag = getchar();
            getchar();
        }

        if(cFlag == \'n\')
            return;
        else if(cFlag == \'y\')
        {
              deleteAppointNode(studentData.studentId);
              printf(\"\\t已删除该学生信息!\\n\");
              printf(\"\\t删除操作执行结束!\\n\");
        }
      }
      else //找到了链表的末尾,或者链表为空
      {
        printf(\"\\t该学生不存在!无法执行删除操作\\n\");
      }
}

(16)ModifyStudent.h

#ifndef MODIFYSTUDENT_H_INCLUDED
#define MODIFYSTUDENT_H_INCLUDED
#include \"system.h\"
void ModifyStudent();//修改学生信息
void ShowModifyMenu();//展示修改选项菜单
void dealSelection(struct student studentData, int selection, struct Node *pMove); //处理用户选择的修改项
#endif // MODIFYSTUDENT_H_INCLUDED

(17)ModifyStudent.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"ModifyStudent.h\"
#include \"system.h\"
#include \"MyList.h\"

//修改学生信息
void ModifyStudent()
{
      struct student studentData;
      struct Node* pMove = NULL; //对学生信息查询结果进行保存
      int selection;  //保存选择信息
      char isContinue = \'n\';  //是否继续进行修改

      system(\"cls\");
      printf(\"\\n\");
      printf(\"\\t==================================【修改学生信息】==============================\\n\");

      printf(\"\\t请输入需要修改信息的学生的学号:\");
      gets(studentData.studentId);
      pMove = searchInfoByData(studentData.studentId);
      if(pMove == NULL)
      {
            printf(\"\\t该学生信息不存在,无法进行信息修改\\n\");
            return;
      }
      else  //可修改多条学生信息,也可以只修改一条学生信息
      {
            printf(\"\\t-------------------------------------------------------------------------------------\\n\");
            printf(\"\\t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|\\n\",\"学号\",\"姓名\",\"性别\",\"年龄\",\"班级\",\"专业\",\"电话\",\"入学成绩\");
            printf(\"\\t-------------------------------------------------------------------------------------\\n\");
            printf(\"\\t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|\\n\", STUDENT_DATA);
            printf(\"\\t-------------------------------------------------------------------------------------\\n\");

            printf(\"\\t是否进行学生信息的修改?(y/n)\");
            scanf(\"%c\", &isContinue);
            getchar();
            while(isContinue != \'n\' && isContinue !=\'y\')
            {
                  printf(\"\\t输入有误,请输入‘y\'或者‘n\'!\");
                  printf(\"\\t请选择是否修改学生信息(y/n):\");
                  isContinue = getchar();
                  getchar();
            }
            if(isContinue == \'n\')
                  return;
            else
            {
                  while(isContinue == \'y\')
                  {
                        //system(\'cls\');
                        ShowModifyMenu();
                        //printf(\"\\t请选择修改项: \");

                        scanf(\"%d\", &selection);
                        getchar();
                        //对用户的操作选择进行处理
                        dealSelection(studentData,selection,pMove);
                        fflush(stdin);
                        printf(\"\\t是否继续修改学生信息(y/n)?\");
                        isContinue = getchar();
                        getchar();
                        while(isContinue != \'n\' && isContinue!=\'y\')
                        {
                              printf(\"\\n输入有误,请输入‘y\'或者‘n\'!\");
                              printf(\"\\n请选择是否继续修改学生信息(y/n):\");
                              isContinue = getchar();
                              getchar();
                        }

                  }
                  printf(\"\\t学生信息修改完毕!\\n\");
           }
      }

}

//学生信息修改菜单
void ShowModifyMenu()
{
    printf(\"\\n\");
    //printf(\"\\t|              1.学号              |\\n\");
    printf(\"\\t|              1.姓名              |\\n\");
    printf(\"\\t|              2.性别              |\\n\");
    printf(\"\\t|              3.年龄              |\\n\");
    printf(\"\\t|              4.班级              |\\n\");
    printf(\"\\t|              5.专业              |\\n\");
    printf(\"\\t|              6.电话              |\\n\");
    printf(\"\\t|              7.入学成绩          |\\n\");
    printf(\"\\n\");
    printf(\"请输入所要修改的信息(键入相应的数字:1-7):\");
}

//处理用户选择的修改项
void dealSelection(struct student studentData, int selection, struct Node* pMove)
{
    int ret; //用来接收scanf的返回值
    switch (selection)
    {
    case 1:
        printf(\"\\t请输入输入学生姓名:\");
        gets(studentData.name);
        strcpy(pMove->studentData.name, studentData.name);
        break;

    case 2:
        printf(\"\\t请输入学生性别(男-M,女-F):\");
        while (gets(studentData.sex) != NULL)
        {
            if (strcmp(studentData.sex, \"F\") == 0 || strcmp(studentData.sex, \"M\") == 0)
                break;
            printf(\"\\t错误,只能输入\'F\'或者\'M\',请重新输入\\n\");
            printf(\"\\t请输入学生性别(男-M,女-F):\");
        }
        strcpy(pMove->studentData.sex,studentData.sex);
        break;

    case 3:
        printf(\"\\t请输入学生年龄(15-25):\");
        ret = scanf(\"%d\", &studentData.age);
        while((ret != 1) || studentData.age<15 || studentData.age>25)
        {
              printf(\"\\t输入年龄错误,请重新输入学生年龄(15-25):\");
              ret = scanf(\"%d\", &studentData.age);
        }
        pMove->studentData.age = studentData.age;
        break;

    case 4:
        printf(\"\\t请输入学生班级(eg:B电子191):\");
        gets(studentData.className);
        strcpy(pMove->studentData.className, studentData.className);
        break;

    case 5:
        printf(\"\\t请输入学生专业:\");
        gets(studentData.major);
        strcpy(pMove->studentData.major, studentData.major);
        break;

    case 6:
        printf(\"\\t请输入学生电话:\");
        gets(studentData.tel);
        strcpy(pMove->studentData.tel, studentData.tel);
        break;

    case 7:
        printf(\"\\t请输入学生入学成绩(100-750):\");
        ret = scanf(\"%d\", &studentData.score);
        while((ret != 1) || studentData.score<200 || studentData.score>750)
        {
              printf(\"\\t输入成绩信息错误,请重新输入学生入学成绩(200-750):\");
              ret = scanf(\"%d\", &studentData.score);
        }
        pMove->studentData.score = studentData.score;
        break;

    default:
        printf(\"\\t\\t请输入正确的数字!\");
        break;

    }
}

(18)ShowStudentRanking.h

#ifndef SHOWSTUDENTRANKING_H_INCLUDED
#define SHOWSTUDENTRANKING_H_INCLUDED
#include \"system.h\"
void ShowRanking(); //显示学生排名
void sortByScore(struct studentRanking * stuRanking, int length);
void Ranking(struct studentRanking * stuRanking, int length);
#endif // SHOWSTUDENTRANKING_H_INCLUDED

(19)ShowStudentRanking.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"ShowStudentRanking.h\"
#include \"system.h\"

void ShowRanking()
{
      //*对链表中学生的成绩进行排名,并显示排名结果,排名结果括学号姓名班级专业入学成绩排名
      //*排名是struct studentRanking 的一个结构体成员,在得出排名后,再进行展示
      //*1.对链表中所有学生的成员进行排序,排序结果保存在student.ranking中
      //重新定义一个结构体,保存排名信息并输出
      //定义一个结构体数组
      struct Node *pMove = NULL;
      struct studentRanking *stuRanking;
      int i, j;
      int length = 0; //用来保存链表的长度

      system(\"cls\");
      printf(\"\\n\");
      printf(\"\\t==================================【学生排名信息】==============================\\n\");

      if(studentList == NULL)
      {
          printf(\"学生登记为空,无法进行成绩排名\\n\");
          return;
      }
      else //学生链表头指针不为空,代表学生链表中存有学生信息
      {
          pMove = studentList;  //pMove指向链表的头
          //通过遍历得到链表有多少个存储单元
          for(i=0; pMove != NULL; i++)
          {
             pMove = pMove->next;
          }
          length = i;
          printf(\"现有学生总人数为%d\\n\", length);

          //动态数组
          stuRanking = (struct studentRanking *)malloc(length * sizeof(struct studentRanking));
          if(stuRanking == NULL)
            return;
          //将需要输出的学生信息复制到结构体数组当中
          pMove = studentList;
          for(j=0; jstudentData.studentId);
                    strcpy(stuRanking[j].name , pMove->studentData.name);
                    strcpy(stuRanking[j].className , pMove->studentData.className);
                    stuRanking[j].score = pMove->studentData.score;
                    pMove = pMove->next;
          }
          //复制完成后,根据成绩对学生进行排序
          sortByScore(stuRanking, length);
          //根据排序结果,为每名同学添加排名信息
          Ranking(stuRanking, length);
          //展示排名
          printf(\"排名结果如下:\\n\");
          printf(\"\\t-------------------------------------------------------\\n\");
          printf(\"\\t|%-10s |%-7s |%-12s |%-5s |%-5s|\\n\",\"学号\",\"姓名\",\"班级\",\"入学成绩\",\"全级排名\");
          printf(\"\\t-------------------------------------------------------\\n\");

           for(j=0; j 
 

(20)AboutFiles.h

#ifndef ABOUTFILES_H_INCLUDED
#define ABOUTFILES_H_INCLUDED
//链表的读取--文件读操作
void readInfoFromFile(char* fileName);
//链表的存储--文件写操作
void writeInfoToFile(char* fileName);
#endif // ABOUTFILES_H_INCLUDED

(21)ShowStudentRanking.c
 

#include 
#include    //getc函数使用的头文件
#include  //Sleep函数使用的头文件
#include //strcmp函数使用的头文
#include \"system.h\"
#include \"AboutFiles.h\"
#include  \"MyList.h\"

//链表的读取--文件读操作
void readInfoFromFile(char* fileName)
{
      //步骤:先将信息读到data里面,再将信息读到文件里面
      //1.打开文件
      FILE *fp;
      struct student data;
      fp = fopen(fileName, \"r\");

      if(fp == NULL)
      {
              fclose(fp);
              return NULL;

      }
      //2.读文件
      //格式化读取文件,没有读到文件结束标志,则一直读下去,读到的数据插入到链表里面
      else
      {
            while(fscanf(fp, \"%s\\t%s\\t%s\\t%d\\t%s\\t%s\\t%s\\t%d\\n\", data.studentId,data.name,data.sex,&data.age,data.className,data.major,data.tel,&data.score) != EOF)
            {
            //将文件中原来的数据插入到链表当中
                  insertNodeByHead(data);
            }
           //3.关闭文件,
           fclose(fp);
      }

}


//链表的存储--文件写操作
void writeInfoToFile(char* fileName)
{
      //1.打开文件D:\\CodeBlocks\\codeblocks C project\\StudentSystemDemo02\\studentList
      FILE *fp;
      struct Node* pMove = studentList;
      fp = fopen(fileName, \"w\");
      if(fp == NULL)
      {
            //w+具有创建的功能,建立一个新文件可读可写
            fp = fopen(fileName, \"w+\");
            //可以给文件写入一个表头信息
      }
      //2.写文件, 按格式写入操作
      while(pMove != NULL)
      {
            fprintf(fp,\"%s\\t%s\\t%s\\t%d\\t%s\\t%s\\t%s\\t%d\\n\", STUDENT_DATA);
            pMove = pMove->next;
      }

      //3.关闭文件
      fclose(fp);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号