数据结构课程设计--学生信息管理系统

来源:互联网 发布:阜宁新闻网络发言人 编辑:程序博客网 时间:2024/04/25 19:22

stu.h

/***********************************************************************版权所有:2017,zhangcuiping**文件名称:a*文件标识:无*内容摘要:该部分代码用于对一些功能的声明*其他说明:无*当前版本:v1.0*作者:张翠平*完成日期:2017.12.22**修改记录:*修改日期:*版本号:v1.0*修改人:*修改内容:***********************************************************************/#ifndef STU_H_INCLUDED#define STU_H_INCLUDED#include "stdio.h"#include "stdlib.h"#include "string.h"#include <fstream>   // 写文件#include "conio.h"# define N sizeof(struct student)   //看结构体变量的大小using namespace std;typedef struct student{    char number[20];//学号    char name[20];  //姓名    char age[20];//年龄    char sex[20];  //性别    char add[20];  //地址    char Tel[20];  //电话    char special[20];  //专业    int score;//成绩    struct student *next;//指向后继结点} stu;  //为结构体命名//((((((((((((((对功能的声明)))))))))))))))))stu *creatlink( stu * x);   //创建链表信息void outfile(stu *x);       //保存至文件void print(stu *p);         //显示全部信息void findNum(stu *y);       //按学号查询信息void findName(stu *y);      //按姓名查询信息void insert(stu *x);        //插入学生信息stu *sort(stu *x);          //按成绩冒泡排序stu *delet(stu *x);        //删除信息stu *modify(stu *y);        //修改信息int MainMenu();        //主菜单int ManageMenu();      //指导员菜单int FindMenu();        //查询菜单int StudentMenu();     //学生菜单#endif // STU_H_INCLUDED


stu.cpp

/***********************************************************************版权所有:2017,zhangcuiping**文件名称:a*文件标识:无*内容摘要:该部分代码用于自定义函数的程序执行过程书写*其他说明:无*当前版本:v1.0*作者:张翠平*完成日期:2017.12.22**修改记录:*修改日期:*版本号:v1.0*修改人:*修改内容:***********************************************************************/#include <malloc.h>#include "stu.h"int length=0;   //初始化链表长度/******************************************************************************************************** 功能描述: 尾插法创建链表* 输入描述: 学生信息* 输出描述: 学生信息添加成功,保存到链表中* 返回值  : x* 其他说明:  无限增加新的学生,但不能重复。********************************************************************************************************/stu *creatlink( stu *x){    stu *p1, *p2,*p3;    int a;    int i = 1;    char choice1;    x=p2=(stu *)malloc(N);           //创建头结点 p2始终指向尾结点,开始时指向头结点    strcpy(p2->number,"-99999");  //拷贝字符串    x->next = NULL;    choice1 = 'y';    for (i = 1; choice1 == 'y'; i++)    {        p1 = (stu *)malloc(N);        printf("===============================================================================\n");        printf("请输入第%d个学生的信息:\n", i);        printf("学号:");        scanf("%s", p1->number);        printf("\n姓名:");        scanf("%s", p1->name);        printf("\n年龄:");        scanf("%s", p1->age);        printf("\n性别:");        scanf("%s", p1->sex);        printf("\n地址:");        scanf("%s", p1->add);        printf("\n电话:");        scanf("%s", p1->Tel);        printf("\n专业:");        scanf("%s", p1->special);        printf("\n成绩:");        scanf("%d", &p1->score);        if (x== NULL)        {            x=p1;            x->next=NULL;   //尾结点的next域值为NULL        }        else        {            p3=x;            while (p3)            {                if(strcmp(p1->number,p3->number)==0) //判断p1和p3是否重复                {                    printf("重复!\n");                    scanf("%d",&a);                    while(a!=1)  //输入1时才可以重新返回系统主界面                    {                        printf("你输入的数字有误\n");                        scanf("%d",&a);                    }                    return x;  //返回头指针                }                p3=p3->next; //指向下一个结点            }            p2=x;            while (p2)            {                if(p2->next==NULL)                {                    p2->next=p1;                    p1->next=NULL;                }                p2=p2->next;            }        }        length++;  //链表长度加1        printf("添加成功!\n");        printf("\n是否继续?(y/n):");        choice1 = getch();  //不回显函数 当用户按下某个字符时 函数自动读取 无需按回车        printf("\n");    }    return x;  //返回头指针}/******************************************************************************************************** 功能描述: 修改信息* 输入描述: 学生学号* 输出描述: 修改成功,把修改后的放到链表中,替换原来的* 返回值  : y* 其他说明:  可以单项修改学生信息,修改没有的学生会显示 “没有该生” 返回主页面********************************************************************************************************///(((((((((((((修改信息  (可以单项修改学生信息)  )))))))))))))stu *modify(stu *y){    int choi;    char choice;    int cp;    char num[20],ch[20];    stu *p;    if (y== NULL)    {        printf("\n请输入要修改学生的学号:");        scanf("%s", num);        printf("\n该生不存在!按任意键继续..");        getch();        return y;  //返回头指针  (Y为形式参数)    }    printf("\n请输入要修改学生的学号:");    scanf("%s", num);    p=y;    while(p)    {        if(strcmp(p->number, num)!=0)            p = p->next;        else            break;    }    if(!p)    {        printf("\n该生不存在!按任意键继续..");        getch();        return y;    }    printf("学生信息如下:\n");    printf("\n学号:%s 姓名:%s 年龄:%s 性别:%s 地址:%s 电话:%s 专业:%s 成绩:%d\n\n", p->number, p->name, p->age, p->sex, p->add, p->Tel, p->special, p->score);    while(1)    {        printf("\n请选择要修改的项:\n");        printf("1学号   2 姓名   3 年龄   4 性别   5 地址  6 电话  7 专业 8 成绩\n");        scanf("%d",&choi);        printf("请输入修改后的内容:\n");        switch (choi)        {        case 1:            scanf("%s", ch);            strcpy(p->number,ch);            break;        case 2:            scanf("%s", ch);            strcpy(p->name,ch);            break;        case 3:            scanf("%s", ch);            strcpy(p->age,ch);            break;        case 4:            scanf("%s", ch);            strcpy(p->sex,ch);            break;        case 5:            scanf("%s", ch);            strcpy(p->add,ch);            break;        case 6:            scanf("%s", ch);            strcpy(p->Tel,ch);            break;        case 7:            scanf("%s", ch);            strcpy(p->special,ch);            break;        case 8:            scanf("%d",&cp);            p->score=cp;            break;        default:            break;        }        printf("修改后学生信息如下:\n");        printf("\n学号:%s 姓名:%s 年龄:%s 性别:%s 地址:%s 电话:%s 专业:%s 成绩:%d\n\n", p->number, p->name, p->age, p->sex, p->add, p->Tel, p->special, p->score);        printf("修改成功!\n");        printf("\n是否要继续修改? \n是y否n:     ");        choice=getch();        if (choice == 'n')            break;    }    return y;}/******************************************************************************************************** 功能描述: 删除信息* 输入描述: 学生学号* 输出描述: 删除成功并且可以释放空间* 返回值  : y* 其他说明:  删除没有的学生会显示“没有该生”********************************************************************************************************/stu *delet(stu  *x){    char num[20];    stu *p,*pre;    char choice2;    if (x== NULL)    {        printf("\n错误执行!");        getch();        return x;    }    printf("\n请输入要删除学生的学号:");    scanf("%s", num);    pre=x;    int judge=0;    p=pre->next;    while(p)    {        if(strcmp(p->number, num)==0)        {            judge=1;            printf("你要删除的信息如下,请确认是否删除:\n");            printf("\n学号:%s 姓名:%s 年龄:%s 性别:%s 地址:%s 电话:%s 专业:%s 成绩:%d\n\n", p->number, p->name, p->age, p->sex, p->add, p->Tel,p->special,p->score);            printf("\n是y,否n:");   //显示要删除的学生的信息//            choice2 = getch();            if (choice2 == 'y')            {                pre->next= p->next;                free(p);    //释放空间                return x;                printf("删除学生成功!\n");                break;            }            else            {                printf("没有删除该生!\n");            }        }        pre=p;        p=p->next;    }    if(judge==0)    {        printf("该生不存在!按任意键继续..\n");        getch();        return x;    }    return x;}/******************************************************************************************************** 功能描述: 查询信息(按学号)* 输入描述: 学生学号* 输出描述: 学生信息* 返回值  : 无* 其他说明:查询没有的学生会显示“没有该生”********************************************************************************************************/void findNum(stu *y){    char num[20];    stu *p;    if (y== NULL)    {        printf("\n请输入要查找学生的学号:");        scanf("%s", num);        printf("\n该生不存在!按任意键继续..");        getch();        return;    }    printf("\n请输入要查找学生的学号:");    scanf("%s", num);    p=y;    while(p)    {        if(strcmp(p->number, num)!=0)            p = p->next;        else            break;    }    if(!p)    {        printf("\n该生不存在!按任意键继续..");        getch();        return ;    }    printf("您查找的学生信息如下:\n");    printf("\n学号:%s 姓名:%s 年龄:%s 性别:%s 地址:%s 电话:%s 专业:%s 成绩:%d\n\n", p->number, p->name, p->age, p->sex, p->add, p->Tel, p->special, p->score);    printf("按任意键继续..");    getch();}/******************************************************************************************************** 功能描述: 查询信息(按姓名)* 输入描述: 学生姓名* 输出描述: 学生信息* 返回值  : 无* 其他说明:查询没有的学生会显示“没有该生”********************************************************************************************************/void findName(stu *y){    char name[20];    stu *p;    if (y== NULL)    {        printf("\n请输入要查找学生的姓名:");        scanf("%s", name);        printf("\n该生不存在!按任意键继续..");        getch();        return;    }    printf("\n请输入要查找学生的姓名:");    scanf("%s", name);    p=y;    while(p)    {        if(strcmp(p->name, name)!=0)            p = p->next;        else            break;    }    if(!p)    {        printf("\n该生不存在!按任意键继续..");        getch();        return;    }    printf("你查找的学生信息如下:\n");    printf("\n学号:%s 姓名:%s 年龄:%s 性别:%s 地址:%s 电话:%s 专业:%s 成绩:%d\n\n", p->number, p->name, p->age, p->sex, p->add, p->Tel, p->special, p->score);    printf("按任意键继续..");    getch();}/******************************************************************************************************** 功能描述: 显示学生信息* 输入描述: 程序指令序号* 输出描述: 已有学生信息* 返回值  : 无*其他说明:********************************************************************************************************/void print(stu *p){    if(p==NULL)    {        printf("\n该生不存在!按任意键继续..");        getch();        return ;    }    p = p->next;    while (p)    {        printf("\n学号:%s 姓名:%s 年龄:%s 性别:%s 地址:%s 电话:%s 专业:%s 成绩:%d\n\n", p->number, p->name, p->age, p->sex, p->add, p->Tel, p->special, p->score);        p = p->next;    }    printf("\n按任意键继续..");    getch();}/******************************************************************************************************** 功能描述: 按成绩冒泡排序* 输入描述: 程序指令序号* 输出描述: 排序后的学生信息* 返回值  : x*其他说明:********************************************************************************************************/stu *sort(stu *x){    stu* p1;    stu* p2;    char number[20];//学号    char name[20];  //姓名    char age[20];//年龄    char sex[20];  //性别    char add[20];  //地址    char Tel[20];  //电话    char special[20];  //专业    int score;//成绩    p1 = x;    while (p1!=NULL)    {        p2 = p1->next;        while (p2!=NULL)        {            if(p2->score<p1->score)  //完成数值交换            {                strcpy(number, p2->number);                strcpy(name, p2->name);                strcpy(age, p2->age);                strcpy(sex, p2->sex);                strcpy(add, p2->add);                strcpy(Tel, p2->Tel);                strcpy(special, p2->special);                score= p2->score;                strcpy(p2->number, p1->number);                strcpy(p2->name, p1->name);                strcpy(p2->age, p1->age);                strcpy(p2->sex, p1->sex);                strcpy(p2->add, p1->add);                strcpy(p2->Tel, p1->Tel);                strcpy(p2->special, p1->special);                p2->score= p1->score;                strcpy(p1->number, number);                strcpy(p1->name, name);                strcpy(p1->age, age);                strcpy(p1->sex, sex);                strcpy(p1->add, add);                strcpy(p1->Tel, Tel);                strcpy(p1->special, special);                p1->score= score;            }            p2 = p2->next;        }        p1 = p1->next;    }    print(x);    printf("学生信息排序结束!按任意键继续..\n");    getch();    return x;}/******************************************************************************************************** 功能描述: 插入学生信息* 输入描述: 插入位置* 输出描述: 插入成功* 返回值  : 无* 其他说明:  位置大于链表长度时显示“没有找到该位置”********************************************************************************************************/void insert(stu *x){    int num,i;    student *p,*q;    p=x;    printf("请输入你要插入位置: ");    scanf("%d",&num);    if(num>length)//大于链表长度时    {        printf("没有找到该位置.按任意键继续..\n");    }    else    {        printf("请输入你要插入的学生的学号、姓名、年龄、性别、地址、电话、专业、成绩:\n");        q=(stu *)malloc(N);        scanf("%s %s %s %s %s %s %s %d",q->number,q->name,q->age,q->sex,q->add,q->Tel,q->special,&q->score);        for(i=0; i<num; i++)            p=p->next;        q->next=p->next;        p->next=q;        length++;        print(x);        printf("插入学生信息成功!\n");        return  ;    }    getch();}/******************************************************************************************************** 功能描述: 保存至文件* 输入描述: 无* 输出描述: 学生信息* 返回值  : 无* 其他说明:********************************************************************************************************/void outfile(stu *x){    stu *p=x;    FILE *fp;    int ch;    ofstream outfile("out.txt",ios::app);//以追加的方式录入信息,直接将信息追加到以前文件的末尾    if(!outfile)//未成功打开文件    {        exit(1);    }    fp=fopen("out.txt","r");//执行格式化输入    ch=fgetc(fp);    if ( ch==EOF )  //成功    {        outfile<<"学号    姓名    年龄   性别    地址    电话    专业    成绩";        outfile<<"\r\n";//回车换行    }    p = p->next;    while(p)    {        outfile<<" "<<p->number<<"    "<<p->name<<"    "<<p->age<<"    "<<p->sex<<"    "<<p->add<<"    "<<p->Tel<<"    "<<p->special<<"    "<<p->score;        outfile<<"\r\n";        p=p->next;    }    outfile.close();  //检查文件是否结束}//((((((((((((((((((系统主菜单))))))))))))))))))))int MainMenu(){    int a;    system("cls");  //清屏    printf("  =========================================================================\n");    printf("  ==                  欢迎来到学生信息管理系统主菜单!!!                    ==\n");    printf("  ==                                                                     ==\n");    printf("  ==                              1.指导员                               ==\n");    printf("  ==                              2.学生                                 ==\n");    printf("  ==                              0.退出                                 ==\n");    printf("  =========================================================================\n");    scanf("%d", &a);    return a;}//(((((((((((((((((指导员菜单)))))))))))))))))int ManageMenu(){    int a;    system("cls");//清屏    printf("=========================================================================\n");    printf("                              1. 添加学生信息                            \n");    printf("                              2. 修改学生信息                            \n");    printf("                              3. 删除学生信息                            \n");    printf("                              4. 查询学生信息                            \n");    printf("                              5. 插入学生信息                            \n");    printf("                              6. 显示学生信息                            \n");    printf("                              7. 成绩排序显示信息                        \n");    printf("                              0. 返        回                            \n");    printf("=========================================================================\n");    printf("请输入您要执行的操作代码:");    scanf("%d", &a);    return a;}//(((((((((((((((((查询主菜单)))))))))))))))))int FindMenu(){    int a;    system("cls");//清屏    printf("=========================================================================\n");    printf("=                               1.按学号                                =\n");    printf("=                               2.按姓名                                =\n");    printf("=                               0.退出                                  =\n");    printf("=========================================================================\n");    scanf("%d", &a);    return a;}//((((((((((((((((((学生菜单))))))))))))))))))int StudentMenu(){    int a;    system("cls");//清屏    printf("=========================================================================\n");    printf("                              1. 查询学生信息                            \n");    printf("                              0. 返        回                            \n");    printf("=========================================================================\n");    printf("请输入您要执行的操作代码:");    scanf("%d", &a);    return a;}


main.cpp

/***********************************************************************版权所有:2017,zhangcuiping**文件名称:a*文件标识:无*内容摘要:该部分代码用于显示模块*其他说明:无*当前版本:v1.0*作者:张翠平*完成日期:2017.12.22**修改记录:*修改日期:*版本号:v1.0*修改人:*修改内容:***********************************************************************/#include "stu.h"int main(){    int nChoose1;    int nChoose2;    int nChoose3;    int nChoose4;    int nEnd = 1;    int nEnd2 = 1;    int nEnd3 = 1;    char sName[20];    char sPassword[20];    //choice用于选择对数据执行操作,i循环,a主界面选择//    stu *x;    x = NULL;    while (nEnd)    {        nChoose1 = MainMenu();        switch (nChoose1)        {        case 0:            nEnd = 0;            sort(x);                //排序            outfile(x);               //将链表内容写入文件            system("cls");               //清屏            printf("         \n        谢     谢     使     用     !!!     \n");            break;        case 1:            printf("请输入指导员账号:\n");            scanf("%s", sName);            printf("请输入密码:\n");            scanf("%s", sPassword);            if (strcmp(sName,"zcp")!=0)            {                printf("账号错误!\n");            }            else            {                if (strcmp(sPassword,"123321")!=0)                {                    printf("密码错误!\n");                }                else                {                    nEnd2 = 1;                    while (nEnd2)                    {                        nChoose2 = ManageMenu();                        switch (nChoose2)                        {                        case 1:                            x= creatlink(x);                            break;                        case 2:                            x= modify(x);                            break;                        case 3:                            x= delet(x);                            break;                        case 4:                            nChoose4 = FindMenu();                            switch (nChoose4)                            {                            case 1:                                findNum(x);                                break;                            case 2:                                findName(x);                                break;                            default:                                printf(" 选项输入不正确,无法执行。\n");                                break;                            }                            break;                        case 5:                            insert(x);                            break;                        case 6:                            print(x);                            break;                        case 7:                            x= sort(x);                            break;                        case 0:                            nEnd2 = 0;                            break;                        default:                            printf(" 选项输入不正确,无法执行。\n");                            break;                        }                    }                }            }            break;        case 2:            nEnd3 = 1;            while (nEnd3)            {                nChoose3 = StudentMenu();                switch (nChoose3)                {                case 0:                    nEnd3 = 0;                    break;                case 1:                    nChoose4 = FindMenu();                    switch (nChoose4)                    {                    case 1:                        findNum(x);                        break;                    case 2:                        findName(x);                        break;                    default:                        printf(" 选项输入不正确,无法执行。\n");                        break;                    }                    break;                default:                    printf("选项输入不正确,无法执行。\n");                    break;                }            }            break;        default:            printf("选项输入不正确,无法执行。\n");            break;        }    }    return 0;}


运行结果:













知识点总结和心得体会:

把理论应用于实践,让学到的东西实现它本身的价值,用于我们的生活中;

这一学期养成了坚持写博客的习惯,及时把学到的东西放到实践中,这对于学习来说有很大的帮助,在这个平台上也可以看到同行人一些优秀的文章,加深了对本专业的理解。由一开始看着博客教程来规范的书写博客,做一个遵守行业规矩的人,到现在可以自己独立完成博客,并能利用博客,给自己带来收获,充实自己,以后会继续好好利用博客,做一个“规矩的行业中人”;

最后感谢一路走来在学习上不断帮助我的老师和同学们!!!

阅读全文
0 0
原创粉丝点击