课程设计——学生信息管理系统

来源:互联网 发布:苏州大学大数据培训 编辑:程序博客网 时间:2024/05/18 02:01
/***********************************************************   * 版权所有 (C)2016,test  *   * 文件名称:学生信息管理 * 文件标识:   * 内容摘要:模拟学生信息管理系统   * 其它说明:主函数   * 当前版本: V8.0   * 作 者:王曼 * 完成日期: 20161229   **********************************************************/

#include <stdio.h>#include <iostream>#include <stdlib.h>#include <string.h>#include <windows.h># define Suh sizeof(struct Student)using namespace std;struct Student {char num[10];       //学号char name[20];      //姓名char sex[2];        //性别int  birth;            char ad[20];            char  phone[12];            char email[12];        struct Student *next;};char fiSuhame[90];                     //全局变量,用来保存要打开的文件名字/*********************************************************  * 功能描述:生成链表  * 输入参数:学生信息  * 输出参数:无  * 返回值  :链表  * 其它说明:调用print_in输出需要输入的数据名称  ************************************************************/    struct Student *Creat(int n){    void menu_print_in(void);    struct Student *head;    struct Student *p1, *p2;    system("cls");    for(int i=1;i<n+1;i++)    {        p1 = (struct Student*)malloc(Suh); //将返回的指针强制转换        menu_print_in();        cin>>p1->num>>p1->name>>p1->sex>>p1->birth>>p1->ad>>p1->phone>>p1->email;        p1->next = NULL;        if(i==1)                           //尾插        {            head = p2 = p1;        }        else        {            p2->next = p1;            p2 = p1;        }    }    return(head);}/*学生信息存盘(wb只写)*/void WriteData_wb(struct Student *head){    FILE *fp;    struct Student *p;    if((fp = fopen(fiSuhame, "wb"))==NULL)    printf("不能打开此文件!");    p = head;    while(p!=NULL)    {        if(fwrite(p,Suh,1,fp)!=1)        {            printf("写入学生信息出错\n");            fclose(fp);            return;        }        p=p->next;    }    fclose(fp);}/*学生信息存盘(ab追加)*/void WriteData_ab(struct Student *head){    FILE *fp;    struct Student *p;    if((fp = fopen(fiSuhame, "ab"))==NULL)               printf("错误,不能读取文件");    p = head;    while(p!=NULL)    {    if(fwrite(p,Suh,1,fp)!=1)    {            printf("写入学生信息出错\n");            fclose(fp);            return;    }        p=p->next;    }    fclose(fp);}/*读取学生信息*//*读取学生信息文件保存到链表中 ,返回指向此链表头指针*/struct Student *ReadData(void){    struct Student *head = NULL;    struct Student *p1, *p2;    FILE *fp;    if((fp=fopen(fiSuhame,"rb+"))==NULL)    {        printf("打开文件出错\n");        exit(0);    }    while(!feof(fp))    {        if((p1=(struct Student*)malloc(Suh))==NULL)        {            printf("内存申请出错\n");            fclose(fp);            exit(0);        }        if(fread(p1,Suh,1,fp)!=1)        {            free(p1);            break;        }        if(head==NULL)        head=p2=p1;        else        {            p2->next=p1;            p2=p1;        }    }    fclose(fp);    return (head);}/*********************************************************  * 功能描述:查询指定文件下所有学生信息  * 输入参数:无  * 输出参数:该文件下所有学生信息************************************************************/ void Print_inquire_all(void){    void menu_print_out(void);    struct Student *pt;    pt = ReadData();    menu_print_out();    do    {        cout<<pt->num<<"       "<<pt->name<<"       "<<pt->sex<<"       "<<pt->birth<<"       "<<pt->ad<<"       "<<pt->phone<<"        "<<pt->email<<endl;        pt = pt->next;    }while(pt!=NULL);    printf("\n");}/*********************************************************    * 功能描述:查询指定文件下学号num的信息    * 输入参数:学号str_num    * 输出参数:该生信息  ************************************************************/  Print_inquire_num(){    void menu_print_out(void);    struct Student *pt;    char str_num[10];    printf("请输入您要查询的学号:");    cin>>str_num;    pt = ReadData();    menu_print_out();    do    {        if(strcmp(pt->num,str_num)==0)        {           cout<<pt->num<<"       "<<pt->name<<"       "<<pt->sex<<"       "<<pt->birth<<"       "<<pt->ad<<"       "<<pt->phone<<"        "<<pt->email;            printf("\n");            return 0;        }        pt = pt->next;    }    while(pt!=NULL);    printf("学生信息库中没有存储您要查询的学生信息!\n");    printf("\n");    return 0;}/*********************************************************  * 功能描述:查询指定文件下学生name的信息  * 输入参数:学号str_name * 输出参数:该生信息 ************************************************************/ int Print_inquire_name(){    void menu_print_out(void);    struct Student *pt;    char str_name[20];    printf("请输入您要查询的姓名:");    cin>>str_name;    pt = ReadData();    menu_print_out();    do    {        if(strcmp(pt->name,str_name)==0)        {           cout<<pt->num<<"       "<<pt->name<<"       "<<pt->sex<<"       "<<pt->birth<<"       "<<pt->ad<<"       "<<pt->phone<<"        "<<pt->email;            printf("\n");            return 0;        }        pt = pt->next;    }while(pt!=NULL);    printf("学生信息库中没有存储您要查询的学生信息!\n");    printf("\n");    return 0;}/*********************************************************  * 功能描述:删除指定文件下学号num的信息  * 输入参数:学号str_num  * 输出参数:已成功删除该生数据*注:输出语句在二级菜单之修改数据中的case语句中************************************************************/ int Delete(){    struct Student *pt1, *pt2, *head;    char str_num[20];    printf("\n请输入要删除的学号:");                                             scanf("%s", str_num);    pt1 = ReadData();    pt2 = pt1->next;    head = pt1;    while(pt2!=NULL)    {        if(strcmp(pt1->num,str_num)==0)        {            WriteData_wb(pt2);        }        else if(strcmp(pt2->num,str_num)==0)        {            pt1->next = pt2->next;            WriteData_wb(head);        }        pt2 = pt2->next;        pt1 = pt1->next;    }    if(pt2!=NULL)    printf("没有存储要删除的数据!\n");    printf("\n\n");    return 0;}/*********************************************************  * 功能描述:修改指定文件下学号num的信息  * 输入参数:学号str_num                新的信息  * 输出参数:已成功修改该生数据*注:输出语句在二级菜单之修改数据中的case语句中************************************************************/ int Amend(){    void menu_print_in(void);    struct Student *pt1, *pt2, *head;    char str_num[20];    printf("请输入要修改的学号:");    scanf("%s", str_num);    pt1 = ReadData();    pt2 = pt1->next;    head = pt1;    while(pt2!=NULL)    {        if(strcmp(pt1->num,str_num)==0)        {            menu_print_in();            cin>>pt1->num>>pt1->name>>pt1->sex>>pt1->birth>>pt1->ad>>pt1->phone>>pt1->email;            WriteData_wb(head);        }        else if(strcmp(pt2->num,str_num)==0)        {            menu_print_in();            cin>>pt2->num>>pt2->name>>pt2->sex>>pt2->birth>>pt2->ad>>pt2->phone>>pt2->email;            WriteData_wb(head);        }        pt2 = pt2->next;        pt1 = pt1->next;    }    if(pt2!=NULL)    printf("没有存储要删除的数据!\n");    return 0;}/*********************************************************  * 功能描述:对指定文件下所有的信息按学号大小排序  * 输入参数: * 输出参数:数据已成功按照学号重新排列*注:输出语句在二级菜单之修改数据中的case语句中 *使用冒泡排序************************************************************/ int Neaten(){    struct Student *first;    struct Student *tail;    struct Student *p_min;    struct Student *min;    struct Student *p;    struct Student *head;        head = ReadData();    first = NULL;    while(head!=NULL)    {        for(p=head,min=head; p->next!=NULL; p=p->next)        {            if(strcmp(p->next->num,min->num)<0)            {                p_min = p;                min = p->next;            }        }        if(first==NULL)        {            first = min;            tail = min;        }        else        {            tail->next = min;            tail = min;        }        if(min==head)        {            head = head->next;        }        else        {            p_min->next = min->next;        }    }    if(first!=NULL)    {        tail->next = NULL;    }    head = first;    WriteData_wb(head);    return 0;}/*输入写入学生信息的数量*/int Creat_num(void){    printf("请输入您此次要添加的学生信息个数:");    int n;    if(scanf("%d", &n)!=1)         {        printf("a error!");    }    return n;}/*选择将要打开的文件*/int File_name(){    printf("\n请输入您想要创建访问的班级:");    if(scanf("%s", fiSuhame)!=1)    printf("\a error!");    return 0;}/*********************************************************  * 功能描述:主界面 * 输入参数:case选择1~4 * 输出参数:无  * 返回值  :无  * 其它说明:界面1  ************************************************************/  void menu(void){    void menu_add(void);    void menu_inquire(void);    void menu_amend(void);    printf("                学生信息管理系统    \n");    printf("  ———————————————————————\n");    printf(" 【1】添加学生信息             【3】修改学生信息   \n");    printf("                                                 \n");    printf("                                                \n");    printf("                                                 \n");    printf(" 【2】查询学生信息             【4】退出系统       \n");printf("  ———————————————————————\n");    printf(" \n");    printf("请填入序号进入相应服务:【   】\b\b");    int a = 0;    a = getchar();    while(a!='1'&&a!='2'&&a!='3'&&a!='4')    {        printf("error! please input the right number!\n");        putchar('\a');        getchar();        printf("请重新填入序号进入相应服务:【   】\b\b");        a = getchar();    }    switch(a)    {        case '1': File_name();menu_add();        break;        case '2': File_name();menu_inquire();        break;        case '3': File_name();menu_amend();        break;        case '4': exit(0);        break;    }    getchar();}/*********************************************************  * 功能描述:子菜单 添加学生信息界面* 输入参数:case选择1~3* 输出参数:无  ************************************************************/      void menu_add(void){    system("cls");                //清屏    getchar();    printf("                添加学生信息方式                     \n");    printf("                                                     \n");    printf(" 【1】新建班级文件 【2】增添学生信息 【3】返回菜单  \n");    printf(" \n");    printf(" \n");    printf("请填入序号进入相应服务:【   】\b\b");    int a = 0;    a = getchar();    while(a!='1'&&a!='2'&&a!='3')    {        printf("输入错误!请输入正确的选择");        putchar('\a');        getchar();        printf("请重新填入序号进入相应服务:【   】\b\b");        a = getchar();    }    switch(a)    {        case '1': WriteData_wb(Creat(Creat_num()));         printf("\n新建文件成功且学生信息已成功保存\n");             system("pause");         system("cls");         menu_add();        break;        case '2': WriteData_ab(Creat(Creat_num()));             printf("\n学生信息已成功添加\n");             system("pause");         system("cls");         menu_add();        break;        case '3': system("cls");         getchar();         menu();        break;    }}/*二级菜单查询学生信息*/void menu_inquire(void){    system("cls");    getchar();    while(1)    {    system("cls");    printf("              查询学生信息方式               \n");    printf("  —————————————————————\n");    printf("     【1】精确查询         【2】学号查询      \n");    printf("                                             \n");    printf("                                             \n");    printf("                                             \n");    printf("     【3】姓名查询         【4】返回菜单     \n");    printf("  —————————————————————\n");    printf("请填入序号进入相应服务:【   】\b\b");    int a = 0;    a = getchar();    while(a!='1'&&a!='2'&&a!='3'&&a!='3'&&a!='4'&&a!='5'&&a!='6')        {            printf("输入有误,请重新输入!【   】\b\b\n");            printf("请输入功能前的序号进入相应的工具:");            putchar('\a');            getchar();            printf("请重新填入序号进入相应服务:【   】\b\b");            a = getchar();        }        switch(a)        {            case '1': Print_inquire_all();system("pause");getchar();            break;            case '2': Print_inquire_num();system("pause");getchar();            break;            case '3': Print_inquire_name();system("pause");getchar();            break;            case '4': system("cls");getchar();menu();            break;        }    }}/*二级菜单之修改数据*/void menu_amend(void){    system("cls");    getchar();    while(1)    {    system("cls");    printf("\n");    printf("                   修改数据方式                \n");    printf("  ———————————————————————\n");    printf("    【1】删除学生信息          【3】整理数据    \n");    printf("                                            \n");    printf("    【2】修改学生信息          【4】返回菜单    \n");    printf("  ———————————————————————\n");     printf("\n");    printf("请填入序号进入相应服务:【   】\b\b");    int a = 0;    a = getchar();    while(a!='1'&&a!='2'&&a!='3'&&a!='4')    {        printf("error! please input the right number!\n");        putchar('\a');        getchar();        printf("请重新填入序号进入相应服务:【   】\b\b");        a = getchar();    }        switch(a)        {            case '1': Delete();             printf("\n\n已成功删除该生数据\n");             system("pause");                     //按任意键返回             getchar();            break;            case '2': Amend();                 printf("\n\n已成功修改指定数据\n");             system("pause");                 getchar();            break;            case '3': Neaten();             printf("\n\n数据已成功按照学号重新排列\n");             system("pause");             getchar();            break;            case '4': system("cls");             getchar();             menu();            break;        }    }}/*输入输出提示栏*/void menu_print_in(void){    printf("学号   姓名    性别      出生年月     地址      电话       E-mail       \n");}void menu_print_out(void){    printf("学号   姓名    性别      出生年月     地址      电话       E-mail       \n");}/*主函数*/int main(void){    SetConsoleTitle("学生信息管理系统");//设置控制台窗口的标题    menu();    return 0;}

运行结果

主菜单


添加学生信息


查找

全部查找


按学号


按姓名

修改数据

排序


删除


修改


打开文件失败


0 0
原创粉丝点击