程序设计实验:成绩管理系统

问题描述:设计一个方便、快捷、高效的学生成绩管理系统。
1.基本要求
(1)利用单链表存储内容:学号、姓名、英语、数学、C语言、总分、平均分及名次等信息;
(2)具备创建、添加、删除、查询(按学号、姓名等查询)、修改、排序、显示等功能;
(3)实现最高分、最低分、平均分、不及格人数等的统计;
(4)界面美观、操作简便。
2.重点、难点
重点:单链表的建立、遍历、查询、插入、修改、删除等操作。
难点:文件的读写操作。

我之前课设也是这个,私

对于你这个问题可以参考如下链接:
https://wenku.baidu.com/view/e43f3f0fbe64783e0912a21614791711cc797992.html
https://blog.csdn.net/weixin_45386459/article/details/121575888

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _student{
    char name[20];
    int age;
    int stuNum;
    int score;
}student;

typedef struct _Node{
    student stu1;
    struct _Node* pNext;
}Node;

Node *g_head=NULL;
void menu(){
    printf("------------------\n");
    printf("- 1录入信息-\n");
    printf("- 2查看信息-\n");
    printf("- 3保存信息-\n");
    printf("- 4读取信息-\n");    
    printf("- 5统计人数-\n");
    printf("- 6查找信息-\n");
    printf("- 7修改信息-\n");
    printf("- 8删除信息-\n");
    printf("- 0退出-\n");
    printf("退出不要直接点叉,请按0退出!\n查看文件之前请先读取文件!\n");
}
void input(){
    printf("请输入学生信息\t\n");
    Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    pNewNode->pNext=NULL;
    
    if(g_head==NULL){
        g_head=pNewNode;
    }
    else{
        pNewNode->pNext=g_head;
        g_head=pNewNode;
    }
    printf("请输入姓名: ");
    scanf("%s",pNewNode->stu1.name);
    printf("请输入年龄: ");
    scanf("%d",&pNewNode->stu1.age);
    printf("请输入学号 : ");
    scanf("%d",&pNewNode->stu1.stuNum);
    printf("请输入成绩 : ");
    scanf("%d",&pNewNode->stu1.score);
printf("该学生信息输入完毕!\n\n");
}

void printdate(){
    Node* p=g_head;
    printf("\t姓名\t年龄\t学号\t成绩\n");
    while(p!=NULL)
    {
        printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        p=p->pNext;
    }
}


void save(){
    
    FILE *fp=fopen("E:\\stu.data","w");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        fwrite(&p->stu1,1,sizeof(student),fp);
        p=p->pNext;

    }
    fclose(fp);
    printf("文件保存成功!\n");
}


void rs(){
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
    }
    printf("文件读取成功!\n 查看文件请按2\n");
    student stu;
    
    while(fread(&stu,1,sizeof(student),fp)){
        Node* pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;

        memcpy(pNewNode,&stu,sizeof(student));

        if(g_head==NULL){
            g_head=pNewNode;

        }
        else{
            pNewNode->pNext=g_head;
            g_head=pNewNode;

        }
    }
    }



void count(){
    int a=0;
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        p=p->pNext;
        a++;
    }
    printf("总人数%d",a);
}




void find(){
    int num;
    printf("请输入要查找的学生学号: \n");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){
        if(p->stu1.stuNum==num){
            printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        }
        p=p->pNext;
    }
printf("have not");
}



void change(){
    int num;
    printf("请输入要修改的学生的学号: ");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){

        if(p->stu1.stuNum==num){
            printf("请输入姓名: \n");
            scanf("%s",p->stu1.name);
            printf("请输入年龄: \n");
            scanf("%d",&p->stu1.age);
            printf("请输入学号: \n");
            scanf("%d",&p->stu1.stuNum);
            printf("请输入成绩: \n");
            scanf("%d",&p->stu1.score);
            printf("信息更改完毕!");
        }

        p=p->pNext;
    }
    if(p==NULL){
        printf("该学生不存在!\n");
    }

}



void del(){
    int num;

    printf("请输入要删除的学号");
    scanf("%d",&num);
    Node* p=g_head;
    Node*p1,*p2;
    if(p->stu1.stuNum==num){
        p1=p->pNext;

        free(p1);

    }
    if(p->pNext!=NULL){
        p2=p->pNext;
        p->pNext=p->pNext->pNext;
        free(p2);
    }
printf("学号为%d的信息删除成功!\n",num);

}



int main()
{
    menu();
    while(1)
    {
        char ch=getch();
        switch(ch){
        case '1':input();break;
        case '2':printdate();break;
        case '3':save();break;
        case '4':rs();break;


        case '5':count();break;
        case '6':find();break;
        case '7':change();break;
        case '8':del();break;



        case '0':exit(0);
        
        }
    }

return 0;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

链表的基本操作。可以参考类似的例子自己写一下,都是很类似的东西。
参考:
https://blog.csdn.net/qfl_sdu/article/details/118326835?spm=1001.2014.3001.5502