鱼C论坛

 找回密码
 立即注册
查看: 4499|回复: 25

[原创] C语言学生成绩管理系统

[复制链接]
发表于 2021-1-6 08:37:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一世轻尘 于 2021-1-6 08:41 编辑

自己写的,很菜
//学生成绩管理系统 
//需要自己建一个名为Information的txt文件来存储数据
//txt文件与cpp文件路径相同 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define LEN sizeof(struct student)

//学生信息结构体 
struct student
{
        char name[10];//学生姓名 
        char id[15];//学生学号 
        int score[3];//学生三科成绩 
        struct student *next;
};

typedef struct student stu;

//声明函数 
stu* enter(stu *h);//成绩录入函数 
stu* initialize();//初始化链表头函数 
void menu();//菜单 
void print(stu *h);//成绩打印函数 
void modify(stu *h);//成绩修改函数 
void statistics(stu *h);//查找统计信息 
void del(stu *h);//删除函数 
void quit(stu *h);//退出函数 
void save(stu *h);//保存文件函数 
void open(stu *h);//打开文件读取信息建立链表函数 


//主函数 
int main()
{
        stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表 
        int function;//功能选项 
        char flag;//判断变量 
        int t=0;
        data=initialize();//初始化头结点 
        open(data);//读取文件内的数据,并建立链表 
        while(1)
        {
                menu();//打开菜单 
                printf("请选择操作:");
                scanf("%d",&function);//输入你想要实现的功能 
                switch(function)//构建多个功能分支 
                {
                        case 1:while(1)
                        {
                                enter(data);//输入一个数据并连接在链表的后面 
                                printf("是否继续输入(y/n)");
                                scanf("%s",&flag);
                                if(flag=='N'||flag=='n')break;
                        }system("cls");break;
                        case 2:print(data);_getch();system("cls");break;
                        case 3:modify(data);system("cls");break;
                        case 4:statistics(data);_getch();system("cls");break;
                        case 5:del(data);_getch();system("cls");break;
                        case 6:quit(data);break;
                        default:printf("error!!!请重新输入:");
                        break;
                }//switch结束 
        }
        return 0;
}

//系统界面显示 
void menu()
{
        printf("          ***********************************************             \n");
        printf("            **********学生成绩管理系统*****************               \n");
        printf("          ***********************************************             \n");
        printf("                       1.录入和添加成绩                               \n");
        printf("                       2.输出成绩                                     \n");
        printf("                       3.修改成绩                                     \n");
        printf("                       4.查找学生信息                                 \n");
        printf("                       5.删除学生信息                                 \n");
        printf("                       6.退出系统并保存                               \n");
        printf("          ***********************************************             \n");
}

//初始化头节点函数 
stu* initialize()
{
        stu *head;
        head=(stu*)malloc(LEN);
        if(head==NULL)
        {
                printf("error!");
                exit(1);
        }
        head->next=NULL;//使头结点指针域为空
        return head; 
}



//成绩录入 
stu* enter(stu *h)
{
        stu *p,*q=h;
        char name[10],id[15];
        int math, English,computer;
        p=(stu*)malloc(LEN);//为学生信息申请节点 
        printf("请依次输入学生信息:\n");
        printf("姓名 学号 数学 英语 计算机导论与程序设计\n");
        scanf("%s %s %d %d %d",name,id,&math,&English,&computer);
        
        for(;q->next!=NULL;q=q->next){;}//移动到尾结点 

//将输入的内容赋值给链表中的相应位置 
        strcpy(p->name,name);
        strcpy(p->id,id);
        p->score[0]=math;
        p->score[1]=English;
        p->score[2]=computer;//赋值完毕 
        //移动指针 
        p->next=NULL; 
        q->next=p;
        q=p;
        return h;
}


//成绩打印 
void print(stu *h)
{
        stu *p=h->next;//从头结点之后的结点开始输出 
        printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");//左对齐的方式输出 
        while(p!=NULL)//输出链表的全部内容 
        {
                printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
                p=p->next;
        } 
}



//成绩修改 
void modify(stu *h)
{
        stu *p=h->next;
        char name[10],id[15];
        int math,English,computer;
        printf("请输入学生姓名:");
        scanf("%s",name);
        printf("请输入学生学号:");
        scanf("%s",id);
        
        while(p)
        {
                if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)
                {
                        printf("当前学生信息:\n");
                        printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
                        printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
                        printf("请输入更正后的数学成绩:");
                        scanf("%d",&math);
                        printf("请输入更正后的英语成绩:");
                        scanf("%d",&English);
                        printf("请输入更正后的计算机导论与程序设计成绩:");
                        scanf("%d",&computer);
                        p->score[0]=math;
                        p->score[1]=English;
                        p->score[2]=computer;
                        printf("更改完成!\n");
                        system("pause");
                        break; 
                }
                else
                {
                        p=p->next;
                }
        }//while循环结束 
}


//查询统计 
void statistics(stu *h)
{
        while(1)
        { 
        int z;//选项变量 
        system("cls");//清屏 
        printf("请输入查找方式:\n7.按姓名学号查找\n8.按成绩查找\n9.退出\n") ;
        scanf("%d",&z);
        system("cls"); 
        switch(z)
        {
                case 7:{
                        stu *p=h->next;
                char name[10],id[15];
                printf("请输入学生姓名:");
                scanf("%s",name);
                printf("请输入学生学号:");
                scanf("%s",id);
                 while (p)
            {
                     if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)//比较姓名学号 
                    {
                        printf("当前学生信息:\n");
                        printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
                        printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
                        break; 
                    }
                    else
                    {
                        p=p->next;
                    }
                }//while循环结束 
                }system("pause");system("cls");break;
                case 8:{
                    while(1){
                        int x;//选项变量 
                        int num=0;//初始化满足条件的人数 
                        printf("请输入按哪一科成绩进行查找:\n按数学成绩查找输入10\n按英语成绩查找输入11\n按计算机导论与程序设计成绩查找输入12\n退出输入13\n");
                        scanf("%d",&x);
                        switch(x)
                        {
                                case 10:{
                            stu *p1=h->next;
                                int M1,M2;
                                printf("请依次输入所要查找的数学成绩的下界与上界:\n");
                                scanf("%d %d",&M1,&M2);
                                printf("学生信息:\n");
                                printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
                                
                                while(p1){        
                                        if((p1->score[0]-M1)>=0&&(p1->score[0]-M2<=0))
                                        {
                                    printf("%-15s%-10s%-10d%-10d%-10d\n",p1->id,p1->name,p1->score[0],p1->score[1],p1->score[2]);
                                    num++;
                                    p1=p1->next;
                                        }
                                        else
                                        {
                                                p1=p1->next;
                                        }
                                    }//while循环结束 
                                    printf("人数为%d\n",num);//输出人数 
                                    system("pause");
                                    system("cls");
                                }break;
                                case 11:{
                stu *p2=h->next;
                                int E1,E2;
                                printf("请依次输入所要查找的英语成绩的下界与上界:\n");
                                scanf("%d %d",&E1,&E2);
                                printf("学生信息:\n");
                                printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
                                while(p2){
                                        if((p2->score[1]-E1)>=0&&(p2->score[2]-E2<=0))
                                        {
                                    printf("%-15s%-10s%-10d%-10d%-10d\n",p2->id,p2->name,p2->score[0],p2->score[1],p2->score[2]);
                                    num++;
                                    p2=p2->next;
                                        }
                                        else
                                        {
                                                p2=p2->next;
                                        }
                                }//while循环结束 
                                printf("人数为%d\n",num);
                                system("pause");
                                system("cls");
                            }
                                break;
                                case 12:{
                                stu *p3=h->next;
                                int C1,C2;
                                printf("请依次输入所要查找的计算机导论与程序设计成绩的下界与上界:\n");
                                scanf("%d %d",&C1,&C2);
                                printf("学生信息:\n");
                                printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
                                while(p3){
                                        if((p3->score[2]-C1)>=0&&(p3->score[2]-C2<=0))
                                        {
                                    printf("%-15s%-10s%-10d%-10d%-10d\n",p3->id,p3->name,p3->score[0],p3->score[1],p3->score[2]);
                                    num++;
                                    p3=p3->next;
                                        }
                                        else
                                        {
                                                p3=p3->next;
                                        }
                                }//while循环结束 
                                printf("人数为%d\n",num);
                                system("pause");
                                system("cls");
                            }
                                break;
                                case 13:goto label2;//跳出双重循环 
                                default:break;
                        }
                }
                label2:printf("已退出"); 
                }system("pause");system("cls");break;
                case 9:goto label1;//跳出双重循环 
                default:break;
        } 
    }
    label1:printf("已退出\n");
}



//删除函数 
void del(stu *h)
{
        stu *p=h,*q;
        q=p->next;
        char name[10],id[15];
        printf("请输入学生姓名:");
        scanf("%s",name);
        printf("请输入学生学号:");
        scanf("%s",id);
        while(q)
        {
                if(strcmp(q->name,name)==0&&strcmp(q->id,id)==0)
                {
                        p->next=q->next;
                        free(q);//删除p结点 
                        printf("删除成功\n");
                        break;
                }
                else
                {
                        p=p->next;
                        q=q->next;
                }
         }//while循环结束 
}



//退出系统 
void quit(stu *h)
{
        save(h);//退出时保存信息 
        exit(0);
}



//打开文件 
void open(stu *h)
{
        stu *p=h;
        stu *q;//临时变量,用于保存从文件中提取的信息 
        FILE*file=fopen("./Information.txt","rb");
        if(!file)
        {
                printf("文件打开失败!");
                return ;
        }
        
        
        q=(stu*)malloc(LEN);//开辟内存 
        fread(q,LEN,1,file);//进入循环前先读取一个结点 
        while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
        //否则,就绕过或结束循环 
        {
                //代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效 
                p->next=q;//更新链表数据,把新的节点纳入链表 
                p=q;//更新链表数据,把新的节点纳入链表 
                q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点 
                fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口 
        }//while循环结束
         
        p->next=NULL;//使尾结点指向空,结束链表 
        fclose(file);
}


//保存信息到文件中 
void save(stu *h)
{
        stu *p=h->next;
        int flag;
        FILE *file=fopen("./information.txt","wb");
        if(!file)
        {
                printf("文件打开失败!");
                return ;
        }
        while (p!=NULL)
        {
                flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中 
                if(flag!=1)
                {
                        break;
                }
                p=p->next;
        }
        fclose(file);
}

评分

参与人数 2荣誉 +2 鱼币 +7 收起 理由
ncx0331 + 5 感谢楼主无私奉献!
小伤口 + 2 + 2 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 10:57:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-10 12:22:41 | 显示全部楼层
wow~厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 18:49:18 | 显示全部楼层
这么厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 09:35:48 | 显示全部楼层
好厉害啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 13:00:38 | 显示全部楼层
厉害了,学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 14:36:48 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-4 14:40:40 | 显示全部楼层
自己写的话已经很厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-4 19:35:32 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 11:07:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 12:17:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-6 12:18:25 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 12:18:58 | 显示全部楼层
想要鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-6 16:12:58 | 显示全部楼层
这就是大佬吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 01:38:40 | 显示全部楼层
鱼币!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-7 09:42:41 | 显示全部楼层
真不错,可以送给老师!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 17:14:31 | 显示全部楼层
中间概率这么小,我不可能那么走运......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-7 17:15:44 | 显示全部楼层
这代码我都看不懂......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-9 19:35:31 | 显示全部楼层

回帖奖励 +40 鱼币

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-9 19:36:02 | 显示全部楼层
40!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 02:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表