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

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


运行结果:













知识点总结和心得体会:

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

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

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

猜你喜欢

转载自blog.csdn.net/zcp773344/article/details/78869206