实验设计

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct Student         //定义学生信息的结构体
{
    char   Number[13];
    char   Name[9];
    char   Banji[6];
    char   Sex[20];
    char   Data[5];
    char   MainPhone[12];
    char   Mail[30];

    struct Student* Next;//指针域
};
//用于存储队列的单链表简称为链队
int NodeNumber=0;//统计个数
char MESSAGE[20]={'\0'};//保存文件名字,用来判断是否重复输入
struct Student *top=NULL,*rear=NULL;// 初始化队列

void menu();//  界面系统
void WriteMessage();//录入多位同学的相关信息
void AddStudent();  //增加1位新同学的相关信息
void Amend();   //修改一位同学的相关信息
void Delete();//删除一位同学的信息
void Save();   //将信息保存到文件中
void PrintOne();//打印某一位同学的相关信息
void PrintALL();  //将学号进行排序,按照学号打印所有同学的信息
void PrintSame();//将文件中成绩相同的学生信息打印出来
//界面选项
void menu()
{
    printf("\t卍卍卍卍卍卍卍卍卍卍卍欢迎进入烟台大学学生信息管理系统卍卍卍卍卍卍卍卍卍卍\n");
    printf("\t卍                                                              卍\n");
    printf("\t卍       系统功能说明:                                         卍\n");
    printf("\t卍                                                              卍\n");
    printf("\t卍       1.录入多位同学的相关信息;                             卍\n");
    printf("\t卍       2.增加1位新同学的相关信息;                            卍\n");
    printf("\t卍       3.修改1位同学的相关信息;                              卍\n");
    printf("\t卍       4.删除1位同学的所有信息;                              卍\n");
    printf("\t卍       5.将当前系统中的所有信息保存到文件中;                 卍\n");
    printf("\t卍       6.打印某位同学(按照姓名或手机号查找)的所有相关信息   卍\n");
    printf("\t卍       7.按照学号顺序打印系统中所有同学的信息;               卍\n");\
    printf("\t卍       8.打印系统中所有成绩相同的同学的信息;                 卍\n");
    printf("\t卍                                                              卍\n");
    printf("\t卍         ---------退出系统请输入exit---------               卍\n");
    printf("\t卍                                                              卍\n");
    printf("\t卍卍卍卍卍卍卍卍卍卍卍卍卍谢谢使用卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍\n");
    printf("\n");
}
void  Out(struct Student *t)
{
            printf("\t学  号:%s   姓  名:%s\n",t->Number,t->Name);
            printf("\t班  级:%s\n",t->Banji);
            printf("\t性  别:%s   手机号:%s\n",t->Sex,t->MainPhone);
            printf("\t成  绩: %s\n",t->Data);
            printf("\t------------------------------------------\n");
            printf("\n");
}
//插入链表
void inrear(struct Student *p) //构建链队
{

      if(top==NULL)//若链队为空,则新节点既是队首节点又是队尾结点
    {
        top=p;
        rear=p;
    }
      else                         //将*p节点链到队尾,并将rear指向它
    {
        rear->Next=p;
        rear=p;
    }
    NodeNumber++;//节点数加一
}
//对学号排序
void Sort()
{
    struct Student *p,*q,*r,*s; //创建结点,q指向p的前元素,r指向p的后元素
    bool flag=true;
    s=(struct Student *)malloc(sizeof(struct Student)); //创建头结点,分配空间
    s->Next=top;
    top=s;
    p=top->Next;
    q=s;
    while(flag&&p!=NULL)
    {
        flag=false;
        while(p->Next!=NULL) //扫描单链表用p从头扫到尾
        {
            r=p->Next; //r指向p后 r为p指向的后一结点
            if(strcmp(p->Number,r->Number)==1)
            {
                q->Next=r;//将*r节点插入到*q之后
                p->Next=r->Next;//将*p插入到*r之后
                r->Next=p;//
                q=r;
                flag=true;//返回为真
            }
            else
            { // q,p向后移位
                q=p;
                p=p->Next;//继续比较其他节点
            }
        }
        q=s;//q,p重新到第一个元素
        p=top->Next;
    }
    top=top->Next;
    free(s);//释放*s节点
}
//检查学生是否重复
bool Check(struct Student *t)
{
    struct Student *p=top;//
    while(p!=NULL)
    {
        if(strcmp(p->Number,t->Number)==0||strcmp(p->Name,t->Name)==0)
            return false;
        p=p->Next;
    }
    return true;
}
void WriteMessage()
{
    FILE *f;//本地文件传输协议,FILE主要用于访问本地计算机中的文件
    char str[20]={'\0'};
    printf("请输入文件名称:");
    scanf("%s",str);
    //比较文件名字是否重复
    if(strcmp(MESSAGE,str)==0)
    {
        printf("错误,多次输入同一文件!\n");
        printf("是否重新输入(Y or N)\n");
        char ch=getchar();//输入字符
        ch=getchar();
        if(ch=='Y'||ch=='y')
        {
            system("CLS");
            WriteMessage();//调用函数
        }
        else
        {
            system("PAUSE");//暂停进程,直到新信号的出现
            system("CLS");
            menu();
        }
    }
    else
    {
        strcpy(MESSAGE,str);//将str与MESSAGE保存内容进行比较
        f=fopen(str,"r");//读文件
        if(!f)//如果不存在
        {
            printf("文件打开失败!即将创立新的%s文件",str);
            f=fopen(str,"w");
        }
        else//向文件中输入内容
        {
            while(!feof(f))
            {
                struct Student *p=(struct Student *)malloc(sizeof(struct Student));
                p->Next=NULL;
                fscanf(f,"%s",&p->Number);
				fscanf(f,"%s",&p->Banji);
                fscanf(f,"%s",&p->Name);
                fscanf(f,"%s",&p->Sex);
                fscanf(f,"%s",&p->Data);
                fscanf(f,"%s",&p->MainPhone);
                if(Check(p))
                    inrear(p);
            }
                printf("文件已成功写入!\n");
                printf("学生数为: %d\n",NodeNumber);
                system("PAUSE");
                system("CLS");
            menu();
        }
        fclose(f);
    }
}
//增加学生
void AddStudent(){
    struct Student *p=(struct Student *)malloc(sizeof(struct Student));//创建节点
    p->Next=NULL;
    printf("\n请输入学号:");
    scanf("%s",&p->Number);
    printf("\n请输入姓名:");
    scanf("%s",&p->Name);
	printf("\n请输入班级:");
	scanf("%s",&p->Banji);
    printf("\n请输入性别:");
    scanf("%s",&p->Sex);
    printf("\n请输入成绩:");
    scanf("%s",&p->Data);
    printf("\n请输入手机号:");
    scanf("%s",&p->MainPhone);
    if(Check(p))
        inrear(p);
        Save();
    printf("已成功存储!");
    system("PAUSE");//让进程暂停直到信号出现
    system("CLS");//调用DOS命令,清零信号
    menu();
};
//修改信息
void Amend()
{
    printf("\n请输入要修改的同学的学号或姓名:");
    char str[8];
    scanf("%s",str);
    struct Student *p=top;//初始化
    while(p!=NULL)
    {
        if((strcmp(str,p->Number)==0)||(strcmp(str,p->Name)==0))//strcmp 比较两个字符串
            break;
        else
            p=p->Next;//指向下一结点
    }
    if(p!=NULL)
    {
        printf("\n请选择要修改的信息:\n\n");
        printf("1.学号  2.姓名  3.班级   4.性别  5.成绩 6.电话号码 ");
        int n;
        scanf("%d",&n);
        while(n>0)
        {
            switch(n)//进行选择
            {
            case 1:printf("请输入新的学号:");
                char NewNumber[9];
                scanf("%s",NewNumber);
                strcpy(p->Number,NewNumber);//将修改内容复制到Number中
                printf("已成功修改!\n");
                break;
            case 2:printf("请输入新的姓名:");
                char NewName[9];
                scanf("%s",NewName);
                strcpy(p->Name,NewName);
                printf("已成功修改!\n");
                break;
			case 3:printf("请输入新的班级:");
				char NewBanji[6];
				scanf("%s",NewBanji);
				strcpy(p->Banji,NewBanji);
				printf("已完成修改! \n");
				break;
            case 4:printf("请输入新的性别:");
                char NewSex[3];
                scanf("%s",NewSex);
                strcpy(p->Sex,NewSex);
                printf("已成功修改!\n");
                break;
            case 5:printf("请输入新的成绩:");
                char NewMainPhone[12];
                scanf("%s",NewMainPhone);
                strcpy(p->MainPhone,NewMainPhone);
                printf("已成功修改!\n");
                break;
            case 6:printf("请输入新的成绩:");
                char NewData[5];
                scanf("%s",NewData);
                strcpy(p->Data,NewData);
                printf("已成功修改!\n");
                break;
            
                
               
            default:printf("输入错误!\n");
                break;
            }
            printf("\n请输入修改选项或输入0退出修改!\n");
            scanf("%d",&n);
        }
        system("PAUSE");
        system("CLS");
        menu();
    }
    else
    {
        printf("该系统中无此学生,是否添加(Y or N)\n");
        char ch=getchar();//滤去回车
        ch=getchar();
        if(ch=='Y'||ch=='y')
            AddStudent();
        if(ch=='N'||ch=='n')
        {
            system("PAUSE");
            system("CLS");
            menu();
        }
    }
};
//删除学生
void Delete()
{
    printf("\n请输入要删除的学生的学号或姓名:");
    char str[9];
    scanf("%s",str);
    struct Student *s=(struct Student *)malloc(sizeof(struct Student)),*p,*q;//创建节点  定义指针
    s->Next=top;
    top=s;
    q=s;
    p=q->Next;
    while(p!=NULL)
    {
        if((strcmp(str,p->Number)==0)||(strcmp(str,p->Name)==0))//将输入与已存数据进行比较
        {
            q->Next=p->Next;
            p=p->Next;
        }
        else
        {
            q=q->Next;
            p=p->Next;
        }
    }
    top=top->Next;
    free(s);//释放节点*s
    NodeNumber--;//节点数减一

    printf("\n是否继续删除(Y or N)\n\n");
    char ch=getchar();//滤去回车
    ch=getchar();
    if(ch=='Y'||ch=='y')
        Delete();
    if(ch=='N'||ch=='n')
    {
        system("PAUSE");
        system("CLS");
        menu();
    }
};
 //保存信息到文件
void Save()
{
    FILE *out;
    out=fopen("PresentMessage.txt","w");
    struct Student *p=top;
    while(p!=NULL)
    {
        fprintf(out,"%s %s %s %s %s %s\n",p->Number,p->Name,p->Banji,p->Sex,p->Data,p->MainPhone);
        p=p->Next;
    }
    fclose(out);
    printf("数据已成功导入文件PresentMessage.txt!\n");
    system("PAUSE");
    system("CLS");
    menu();
};

//打印指定学生
void PrintOne(){
    printf("请输入要打印的同学的姓名或手机号:");
    bool flag=false;
    char str[12];
    scanf("%s",str);
    struct Student *p=top;
    while(p!=NULL)//判断节点是否为空
    {
        if((strcmp(str,p->MainPhone)==0)||(strcmp(str,p->Name)==0))
        {
            flag=true;//判断正确
            Out(p);//输出
            p=p->Next;//指向下一节点
        }
        else
            p=p->Next;
    }
    if(!flag)
        printf("该系统中无此学生或输入错误!\n");
    system("PAUSE");
    system("CLS");
    menu();

};
//打印所有学生
void PrintALL(){
    Sort();//调用进行排序
    struct Student* p=top;
    printf("\t系统中共有%d个学生\n\n",NodeNumber);
    if(p==NULL)
         printf("文件中没有学生信息!\n");
    else
    {
        while(p!=NULL)
        {
            Out(p);//输出信息
            p=p->Next;//指向下一节点
        }
    }
    system("PAUSE");
    system("CLS");
    menu();
};
//打印含有相同成绩的学生
void PrintSame()
{
    int n=1,m=0;//n用来统计p,m用来统计q
    bool flag=true;//flag判断当前节点
    bool *Handle=(bool *)malloc(NodeNumber+1);//用bool型的数组关联链表,true代表相同的
    for(int i=0;i<NodeNumber;i++)
        Handle[i]=true;
    struct Student *q=top,*p;//定义节点
    if(q==NULL)
    {
        printf("系统中无学生信息!\n");
        system("PAUSE");
        system("CLS");
        menu();
    }
    else
    {
        p=q->Next;//指向下一结点
        while(q->Next!=NULL)
        {
            while(p!=NULL)
            {
                if(strcmp(q->Data,p->Data)==0)//比较两节点是否一样
                {
                    //用flag控制当前节点的输出
                    if(flag)
                    {
                        Out(q);
                        Out(p);
                        flag=false;
                        Handle[n++]=false;
                    }
                    else
                    {
                        Out(p);
                        Handle[n++]=false;
                    }
                }
                else
                    n++;
                p=p->Next;
            }
            m++;
            q=q->Next;
            flag=true;
            //判断当前节点是否可访问
            while(Handle[m]==false)
            {
                q=q->Next;
                if(q->Next==NULL)
                    break;
                m++;
            }
            n=m+1;
            p=q->Next;
        }
    }
    system("PAUSE");
    system("CLS");
    menu();
};
int main()
{
    system("color 04");//调用库函数对颜色进行选择
    menu();
    int num;
    printf("请输入功能选项:");
    while(scanf("%d",&num))
    {
        switch(num)//对输入项进行选择
        {
        case 1:system("CLS");
            WriteMessage();
            break;
        case 2:system("CLS");
            AddStudent();
            break;
        case 3:system("CLS");
            Amend();
            break;
        case 4:system("CLS");
            Delete();
            break;
        case 5:system("CLS");
            Save();
            break;
        case 6:system("CLS");
            PrintOne();
            break;
        case 7:system("CLS");
            PrintALL();
            break;
       case 8:system("CLS");
            PrintSame();
            break;

        default:system("CLS");
            printf("输入错误!\n");
            system("PAUSE");
            system("CLS");
            menu();
            break;
        }
        printf("请输入功能选项:");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值