介绍

        相信许多同学在大学期间,学习计算机相关课程的时候,都有一个令人头疼的问题——课程设计。那么本片文章就详细的分享一个用C语言实现一个简单学生成绩管理系统,供同学们学习和参考(文章最后会附上源程序)。

项目分析

1.建立一张学生成绩表,每个学生包含 学号、姓名、性别、语文、数学、英语、平均分

2.将表中所有信息按平均分降序排列。

3.按学号查找某学生所有成绩。

4.能够实现某学生的成绩插入和删除

5.实现文件操作,程序退出时将学生成绩保存在studen_grad.txt文件中;程序开始时,能够从student_grad.txt文件中加载已有的学生成绩信息。

整题框架

包含文件:

1.main函数文件(main.c),主程序整题框架

2.学生成绩管理函数文件(score managemen.c),用来实现各接口函数

3.学生成绩管理头文件(score managemen.h),用来定义和声明函数。

main.c文件

主函数框架

int main()
{
    Slist* List = ListInit();
    ListLoad(List);
    int input = 0;
    do
    {

        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch(input)
        {
        case 1:
            ListPushBack(List);
            break;
        case 2:
            ListDelet(List);
        case 3:
            ListPrint(List);
            break;
        case 4:
            ListSort(List);
            break;
        case 5:
            ListSearch(List);
            break;
        case 0:
            ListSave(List);
            printf("保存成功,退出!\n");
            break;

        }

    }
    while(input);

    return 0;
}

menu()函数

void menu()
{
    printf("*****************************************\n");
    printf("******      学生成绩管理系统     ********\n");
    printf("******  1.增加           2.删除  ********\n");
    printf("******  3.显示           4.排序  ********\n");
    printf("******  5.查找           0.退出  ********\n");
    printf("*****************************************\n");
}

score managemen.h文件

结构体链表

//双向循环链表 存储学生信息
typedef struct ScoreList
{
    char number[20];
    char name[20];
    char sex[5];
    int chinese;
    int math;
    int english;
    float average;
    struct ScoreList* next;
    struct ScoreList* prev;

}Slist;

接口函数声明

Slist* ListInit();//链表初始化
void ListPushBack(Slist* phead);//链表尾部插入学生成绩
void ListDelet(Slist* phead);//按学号删除
void ListSearch(Slist* phead);//按学号查找
void ListPrint(Slist* phead);//打印链表
void ListSort(Slist* phead);//排序(平均分降序)
void ListSave(Slist* phead);//文件保存
void ListLoad(Slist* phead);//加载

scor managem.c文件

Slist* ListInit() 链表初始化函数

Slist* ListInit()
{
    Slist* phead = (Slist*)malloc(sizeof(Slist));
    phead->next = phead;
    phead->prev = phead;
    return phead;
}

void ListPushBack(Slist* phead)  链表尾部插入学生成绩

//链表尾部插入
void ListPushBack(Slist* phead)
{
    system("cls");
    assert(phead);
    Slist* newnode = (Slist*)malloc(sizeof(Slist));

    printf("请输入学号:");
    scanf("%s",newnode->number);
    printf("请输入姓名:");
    scanf("%s",newnode->name);
    printf("请输入性别:");
    scanf("%s",newnode->sex);
    printf("请输入语文成绩:");
    scanf("%d",&(newnode->chinese));
    printf("请输入数学成绩:");
    scanf("%d",&(newnode->math));
    printf("请输入英语成绩:");
    scanf("%d",&(newnode->english));
    newnode->average =(float)(newnode->chinese + newnode->math + newnode->english)/3;

    Slist* tailnode = phead->prev;
    tailnode->next = newnode;
    newnode->prev = tailnode;
    newnode->next = phead;
    phead->prev = newnode;
    printf("添加成功\n");
}

void ListDelet(Slist* phead)  按学号链表删除

//按学号删除
void ListDelet(Slist* phead)
{
    assert(phead);
    system("cls");
    char number[20];//存储要删除学生的学号
    printf("请输入要删除的学号:>");
    scanf("%s",number);
    Slist* cur = phead->next;
    while(cur != phead)
    {
        if(strcmp(number,cur->number) == 0)//判断成绩表中是否存在该学生学号
        {
            Slist* nextnode = cur->next;
            Slist* prevnode = cur->prev;
            free(cur);

            prevnode->next = nextnode;
            nextnode->prev = prevnode;
            printf("删除成功!\n");
            return;
        }
        cur = cur->next;
    }
    printf("该学生不存在\n");

}

void ListSearch(Slist* phead)   按学号查找

void ListSearch(Slist* phead)
{
    assert(phead);
    system("cls");
    char number[20];
    printf("请输入学号:>");
    scanf("%s",number);
    Slist* cur = phead->next;
    while(cur != phead)
    {
        if(strcmp(number,cur->number) == 0) //判断学生是否存在
        {
            printf("姓名:%s  性别:%s  语文:%d  数学:%d  英语:%d  平均分:%f\n",
                   cur->name,cur->sex,cur->chinese,cur->math,cur->english,cur->average);
            return;
        }
        cur = cur->next;
    }
    printf("没有找到该学生\n");
}

void ListPrint(Slist* phead);//打印链表

//链表打印
void ListPrint(Slist* phead)
{
    assert(phead);
    system("cls");
    printf("%-10s\t%-8s\t%-5s\t%-5s\t%-5s\t%-5s\t%-10s\n","学号","姓名","性别","语文","数学","英语","平均分");

    Slist* cur = phead->next;
    while(cur != phead)
    {
        printf("%-10s\t%-8s\t%-5s\t%-5d\t%-5d\t%-5d\t%-10.3f\n",
               cur->number,cur->name,cur->sex,
               cur->chinese,cur->math,cur->english,cur->average);
        cur = cur->next;
    }
}

void ListSort(Slist* phead);//排序(平均分降序)

//按平均分降序
void ListSort(Slist* phead)
{
    assert(phead);
    system("cls");
    int count = 0;//记录链表长度
    Slist* cur = phead->next;
    while(cur != phead)
    {
        count++;
        cur = cur->next;
    }

    int i = 0;
    int j = 0;
    for(i = 0;i < count;i++)//冒泡排序
    {
        Slist* prevnode = phead;
        Slist* curnode = prevnode->next;
        Slist* nextnode = curnode->next;
        Slist* tailnode = nextnode->next;
        for(j = 0;j < count-i;j++)
        {
            if(curnode->average < nextnode->average)
            {
                prevnode->next = nextnode;
                nextnode->prev = prevnode;

                curnode->next = tailnode;
                tailnode->prev = curnode;

                nextnode->next = curnode;
                curnode->prev = nextnode;

            }
                tailnode = tailnode->next;
                nextnode = nextnode->next;
                curnode = curnode->next;
                prevnode = prevnode->next;
        }
    }
    printf("排序成功!\n");
}

void ListSave(Slist* phead);//文件保存

void ListSave(Slist* phead)
{
    FILE* fpWrite = fopen("student_grad.txt","w");
    if(fpWrite == NULL)
    {
        printf("%s\n",strerror(errno));
        return;
    }
    Slist* cur = phead->next;
    while(cur != phead)
    {
        fprintf(fpWrite,"%-10s\t%-8s\t%-5s\t%-5d\t%-5d\t%-5d\t%-10.3f\n",
               cur->number,cur->name,cur->sex,
               cur->chinese,cur->math,cur->english,cur->average);
        cur = cur->next;
    }
    fclose(fpWrite);
    fpWrite = NULL;
}

void ListLoad(Slist* phead);//加载

void ListLoad(Slist* phead)
{
    FILE* fpRead = fopen("student_grad.txt","r");

    while(1)
    {
        Slist* newnode = (Slist*)malloc(sizeof(Slist));
        if(fscanf(fpRead,"%s\t%s\t%s\t%d\t%d\t%d\t%f\n",
            newnode->number,newnode->name,newnode->sex,
            &(newnode->chinese),&(newnode->math),&(newnode->english),&(newnode->average)) != EOF)//判断是否读取完
        {
            Slist* tailnode = phead->prev;
            tailnode->next = newnode;
            newnode->prev = tailnode;
            newnode->next = phead;
            phead->prev = newnode;
        }
        else
        {
            break;
        }
    }

}

源程序

链接:https://pan.baidu.com/s/1u9fQKzVYo-LcodWqw4LSaw?pwd=1234 
提取码:1234

希望帮助到的同学给个三连呀~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐