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

2023-12-28 11:33:47

#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;
}

?? ? ? ??

文章来源:https://blog.csdn.net/2301_82048215/article/details/135256350
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。