用C语言链表实现学生成绩管理系统

#include"stdio.h"
#include"malloc.h"
#include<stdlib.h>
#include<windows.h>
#include <iostream>
#include <conio.h>
#define MaxNum  2    //科目总数

/*********************************管理员结构体************/
typedef struct user{
    char username[20];     //账号
    char password[20];     //密码
} User;

/**********************班级学生信息结构体******************/
typedef struct student   
{    char C_name[10];  //班级名称
     int  stuNum;      //学号
     char name[10];   //姓名
     char sex;        //性别
     float score;     //总成绩
     float subject[MaxNum]; //科目总数
     struct student *pNext;   //设置下一个指针
}Student;
Student *head= NULL;
/**********************函数声明*************************/
    void menu();           //创建菜单
    void student_list();   //打印学生信息
    void input_score();    //录入学生成绩
    void search_score();   //查询成绩
    void modify_score();   //修改成绩
    void delete_score();   //删除成绩
    void save_score();     //保存成绩
    void class_Score();    //班级得分
    void Account_system();    //账号管理系统
/***********************主函数***************************/
int main()
{       
    Account_system();    
    int choose;
    while(1)
     {
        menu();
        scanf("%d",&choose);
        getchar();
        switch(choose)
         {
            case 1:
                    input_score();      //录入学生成绩                                        
                    student_list();
                    input_score();
                    break;
            case 2:
                    search_score();  //查询成绩
                    student_list();
                    break;
            case 3:
                    modify_score(); //修改成绩
                    student_list();
                    break;
            case 4:
                    delete_score();   //删除成绩
                    student_list();
                    break;
            case 5:
                    save_score();    //保存成绩
                    student_list();
                    break;
                    
            case 6: class_Score();
                    break;
            case 0:
                    goto end;
            default:
                goto end;
             }
        }
    end:
    return 0;
}
//*****************函数定义***************
     
/*******************************************
    *函数名称:menu                        *
    *功能:     给用户提供菜单选项         *
    *输入:     无                         *
    *输出:     无                         *
********************************************/        
void menu(){          
        system("cls");
        printf("***欢迎使用学生成绩管理系统******\n");
        printf("*\t1、学生成绩录入\t\t*\n");
        printf("*\t2、学生成绩查询\t\t*\n");
        printf("*\t3、学生成绩修改\t\t*\n");
        printf("*\t4、学生成绩删除\t\t*\n");
        printf("*\t5、学生成绩保存\t\t*\n");
        printf("*\t6、班级成绩均值\t\t*\n");
        printf("*\t0、退      出\t\t*\n");
        printf("*********************************\n");
        printf("请输入你的选择(0-----6)");        
}

/*******************************************
    *函数名称:student_list                *
    *功能:      打印学生信息              *
    *输入:     无                         *
    *输出:     无                         *
********************************************/  
void student_list(){  
        int actnum = 0; 
        int a = 0; 
        float totalScore = 0;   
        system("cls");     //小黑框,清屏
        Student *p =head;  //定义一个指针用来打印学生成绩
        Student *temp = head;
        printf("****你刚刚录入的学生信息为*****\n");
        printf("班级\t\t学号\t姓名\t性别\t总成绩\n");
        while(p != NULL)   //利用while循环打印
             {           
           printf("%-8s%10d%8s%8c%11.2f\n",p->C_name,p->stuNum,p->name,p->sex,p->score);
        if(p->score >= 140){   //判断成绩在140分以上的
            actnum++;
          }
           p = p->pNext;      //不断将下一个节点的地址给p用来打印
          }
        printf("总成绩在140分以上的学生人数为:%d\n", actnum); // 输出成绩在140分以上的学生人数
        
        while (temp != NULL) {
            totalScore += temp->score;    //求和
            a++; 
        temp = temp->pNext;
    }
        totalScore = (totalScore/a);  //求平均值
        printf("全校的平均分是%.2f\n",totalScore);
        
        
        
        
        
        system("pause");   //暂停小黑框用来停止程序,按任意键可以继续程序
        
}
/*******************************************
    *函数名称:Account_system              *
    *功能:     设置管理员账号密码         *
    *输入:     无                         *
    *输出:     无                         *
********************************************/
void Account_system(){
            User admin;
            User encipher;
            User user;
            char ch;
            int i = 0;      
            strcpy(admin.username, "114514");
            strcpy(admin.password, "114514"); 
            printf("请输入管理员账号:");
            scanf("%s", user.username);
            printf("请输入管理员密码:");
             while (1) 
              {
                ch = _getch();  // 从控制台获取一个字符而不显示在屏幕上
                if (ch == 13)  // 如果是回车键,结束输入
                  break;
                encipher.password[i] = ch;
                std::cout << '*';  // 显示星号
                i++;
              }
           encipher.password[i] = '\0';  // 添加字符串结束符
    

    
            
            
            
            
    if (strcmp(user.username, admin.username) != 0 && strcmp(user.password, admin.password) != 0)
     {          printf("管理员账号或密码错误!\n");
                return;
     }    
}
/*******************************************
    *函数名称:  class_Score               
    *功能:    根据用户需要,打印班级平均值        
    *输入:     无                         
    *输出:     无                         
********************************************/
void  class_Score()
{         
        int num;
        int actnum;
        float totalScore = 0.00;
        Student *temp = head;
        printf("请输入要查找的班级编号");
        scanf("%d",&num);     
        while (temp != NULL) {
          if(temp->serial == num) {
            totalScore += temp->score;    //求和
            actnum++;
        }
        temp = temp->pNext;
    }
        totalScore = (totalScore/actnum);  //求平均值
        printf("你输入编号为:%d 的班级平均分是:%.2f\n",num,totalScore);
        system("pause");
}
/*******************************************
    *函数名称:input_score                 *
    *功能:      录入学生成绩              *
    *输入:     无                         *
    *输出:     无                         *
********************************************/
void input_score(){  
    
        while(1){
        
        Student *p = head;   //声明一个指针用于从头到尾遍历
        Student *prev = NULL; //再声明一个指针用于存放前一个节点的地址,相当于数学里的数列p-1
        Student *newNode=(Student *)malloc(sizeof(Student));  //分配内存空间用于存储信息  
        printf("请输入班级的名字:");  
        scanf("%s",newNode->C_name); 
        printf("请输入班级的编号:");
        scanf("%d",&newNode->serial);
        printf("请输入学生的学号:");   
        scanf("%d",&newNode->stuNum);
        printf("请输入学生的姓名:");
        scanf("%s",newNode->name);
        getchar();
        printf("请输入学生的性别(男:M,女:F):");
        scanf("%c",&newNode->sex);
    
        printf("请输入学生的数学成绩:\n");
        for(int k = 0; k < MaxNum; k++) 
          {
             scanf("%f",&newNode->subject[k]);        
             printf("请输入学生的语文成绩\n");
          }
       
        for(int i = 0;i < MaxNum; i++){
            newNode->score += newNode->subject[i];   
            }
        newNode->pNext = NULL;   //新节点的指针为NULL,即链表结束        
    //  判断是否有需要排序的节点    
    if(!head || (newNode->stuNum ) > (head->stuNum)) 
     {
        newNode->pNext =head;   //将新节点插入到链表的头部,使其成为新的头节点。
        head = newNode;         //将新节点插入到了链表的头部,并将其设为新的头节点
        return;                                  
     }
    //遍历链表,寻找需要插入新节点的位置
    while(p && p->stuNum >= newNode->stuNum)   
     {
        prev = p;         //prev指向p指向的节点
        p = p->pNext;     //p指向当前节点的下一个节点地址 
     }                      //循环结束后p的地址就是需要插入的地方
        prev->pNext = newNode;        //将新节点插入到prev节点的后面
        newNode->pNext = p;              //将节点p作为新节点的下一个节点,完成插入
        
            student_list();
            printf("还继续吗(y/n)"); // 判断是否停止录入,跳出循环
             getchar();
             char s=getchar();
             if(s=='n'||s=='N')
             break;     
        }    
        
}


/*******************************************
    *函数名称:search_score                *
    *功能:      查询学生成绩              *
    *输入:     无                         *
    *输出:     无                         *
********************************************/
void search_score(){       
        int num;
        printf("请输入要查找的学号");
        scanf("%d",&num);
        Student *temp = head;   //将头指针的地址给temp
        while(temp!=NULL)       
            {
            if(temp->stuNum == num)
                break;
            temp = temp->pNext;    //如果没有找到学号,继续向下遍历
         }
        if(temp == NULL)       //判断链表是否为空。
           { 
             printf("没有符合条件的记录");
             system("pause");     //暂停小黑框 
           }else {
                 printf("找到的信息如下:\n");
                 printf("学号\t\t姓名\t性别\t成绩\n");
              printf("%-16d%-8s%-8c%-8.2f\n",temp->stuNum,temp->name,temp->sex,temp->score);
              system("pause");
              
                 }
}

/*******************************************
    *函数名称:modify_score                *
    *功能:      修改学生成绩              *
    *输入:     无                         *
    *输出:     无                         *
********************************************/
void modify_score(){        
        int num;
        char choose;
        printf("请输入你要修改的学号:");
        scanf("%d",&num);
        Student *temp = head;
        while(temp!= NULL)
           {
            if(temp->stuNum == num)
              {
                break;
                temp = temp->pNext;
                
              }
           }
        if(temp == NULL)
            { 
                printf("没有符合条件的记录");
                system("pause");      
            }else {
            printf("找到的信息如下:\n");
            printf("学号\t\t姓名\t性别\t成绩\n");
            printf("%-16d%-8s%-8c%-8.2f\n",temp->stuNum,temp->name,temp->sex,temp->score);
            getchar();
            printf("是否为您要修改的记录?(y/n)");
            choose = getchar();
            if(choose =='y'||choose =='Y')
             {
            printf("请输入新的成绩:");
            scanf("%f",&temp->score);
                }
                   }
}

/*******************************************
    *函数名称:delete_score                *
    *功能:      删除学生成绩              *
    *输入:     无                         *
    *输出:     无                         *
********************************************/
void delete_score(){   
        int stuNumber;
        char choose;
        Student *p = head;  //遍历的准备工作
        Student *prev = NULL;
        printf("请输入你要删除的学号");
        scanf("%d",&stuNumber);
        getchar();
        if(!head)     //判断头指针,就可以判断链表是否为空
          {       
            printf("链表为空。\n");
            return;
          }
        if(head->stuNum == stuNumber) //找到学号
           {
            head = head->pNext;  //让头指针指向下一个节点地址,从而断开连接
            free(p);          //释放内存
            return;
           }
        while(p&& p->stuNum != stuNumber) //没有找到学号,一直往下遍历
          { 
            prev = p;
            p = p->pNext;
          }
        if(p)
         {  //找到了学号,将学号里的信息打印出来。
            printf("找到的学号如下:\n");
            printf("学号\t\t姓名\t性别\t成绩\n");
            printf("%-16d%-8s%-8c%-8.2f\n",p->stuNum,p->name,p->sex,p->score);
            printf("是否为你要删除的记录?(y\n)");
            choose = getchar();
            if(choose=='y'|| choose=='Y')
             {
                prev->pNext= p->pNext;   
                free(p);
             }
         }else{
                printf("学号%d的学生没有找到。\n",stuNumber);
            }
}

/*******************************************
    *函数名称:save_score                  *
    *功能:      保存学生成绩              *
    *输入:     无                         *
    *输出:     无                         *
********************************************/
void save_score(){     
           FILE *fp;   //定义文件指针
           fp = fopen("d://sutuden.txt","a+");  //先写w+,运行一遍后改成a+
           if(fp = NULL)
             {
                  printf("文件打开失败。");
                  return;
             }
               Student *temp = head;
                 while(temp != NULL)
                  {
                     fprintf(fp,"%d %s %c %.2f\n,temp->stuNum,temp->name,temp->sex,temp->score");
                     temp = temp->pNext;
                  }
            fclose(fp);
            printf("文件保存成功。");
            system("pause");
            return;
}

         

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风会带走遗憾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值