数据结构课程设计

/***********************************************************
* 文件名称: 学生信息查询.cpp
* 文件标示: 无
* 功能简介:增添学生信息、修改删除学生信息、查询统计学生信息
* 其他说明:无
* 当前版本:v1.0
* 作者:孙翰文
* 完成日期: 2015.12.24
************************************************************/
#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 chi;
int eng;
int mat;
struct Student *next;
};
char fiSuhame[90];                     //全局变量,用来保存要打开的文件名字

/*生成链表*/
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->chi>>p1->eng>>p1->mat;
        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);
}

/*【1】全量查询*/
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->chi<<pt->eng<<pt->mat;
        pt = pt->next;
    }while(pt!=NULL);
    printf("\n");
}

/*【2】学号查询*/
int 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->chi<<pt->eng<<pt->mat;
            printf("\n");
            return 0;
        }
        pt = pt->next;
    }
    while(pt!=NULL);
    printf("学生信息库中没有存储您要查询的学生信息!\n");
    printf("\n");
    return 0;
}
/*【3】姓名查询*/
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->chi<<pt->eng<<pt->mat;
            printf("\n");
            return 0;
        }
        pt = pt->next;
    }while(pt!=NULL);
    printf("学生信息库中没有存储您要查询的学生信息!\n");
    printf("\n");
    return 0;
}

/*修改数据,记录*/
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;
}

/*【2】修改数据 修改记录*/
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->chi>>pt1->eng>>pt1->mat;
            WriteData_wb(head);
        }
        else if(strcmp(pt2->num,str_num)==0)
        {
            menu_print_in();
            cin>>pt2->num>>pt2->name>>pt2->sex>>pt2->chi>>pt2->eng>>pt2->mat;
            WriteData_wb(head);
        }
        pt2 = pt2->next;
        pt1 = pt1->next;
    }
    if(pt2!=NULL)
    printf("没有存储要删除的数据!\n");
    return 0;
}
/*【3】修改数据 整理数据*/
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;
}
/*主菜单*/
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("请输入功能前的序号进入相应的工具:【   】\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();
}

/*子菜单添加学生信息*/
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("    【1】删除记录          【3】整理数据    \n");
    printf("                                            \n");
    printf("    【2】修改记录          【4】返回菜单    \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("学号      姓名     性别    语文     英语         数学               \n");
}
void menu_print_out(void)
{
    printf("学号      姓名     性别    语文     英语        数学                 \n");
}
/*主函数*/
int main(void)
{
    SetConsoleTitle("学生信息管理系统");
    menu();
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值