Palsur 2021-06-26 13:12 采纳率: 44.4%
浏览 31
已结题

学生信息管理系统中的几个运行问题

#include <stdio.h>   
#include <malloc.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct Student  
{  
   int  age;            //年龄 
   char name[100]; 		//姓名  
   char num[100];  		//学号  
   char sex;			//性别 (m代表女生f代表男生)  
   char collage;        //学院 
   char depart;         //系 
   char clas;           //班级 
   char adm;            //宿舍 
   char bron;           //籍贯 
   char tel;            //电话 
};
typedef struct LNode  
{  
    struct Student data;  
    struct LNode *next;  
}LinkList;

int  ag;            //年龄 
char nam[100]; 		//姓名  
char nu[100];  		//学号  
char se;			//性别 (m代表女生f代表男生)  
char collag;        //学院 
char depar;         //系 
char cla;           //班级 
char ad;            //宿舍 
char bro;           //籍贯 
char te;            //电话   


void menu()/* 菜单界面*/
{
	printf("\t\t\t  ******************************************************\n\n");
	printf("\t\t\t  *                学生信息管理系统                   * \n\n");
	printf("\t\t\t  ******************************************************\n\n"); 
	printf("\t\t\t*********************系统功能菜单*************************\n");
	printf("\t\t\t     ----------------------   ----------------------  \n");
	printf("\t\t\t     *********************************************  \n");
	printf("\t\t\t     * 0.系统帮助及说明  * *  1.刷新学生信息   *   \n");
	printf("\t\t\t     *********************************************  \n"); 
	printf("\t\t\t     * 2.查询学生信息    * *  3.修改学生信息   *   \n");
	printf("\t\t\t     *********************************************  \n");
	printf("\t\t\t     * 4.增加学生信息    * *  5.按学号删除信息 *   \n");
	printf("\t\t\t     *********************************************  \n");
	printf("\t\t\t     * 6.显示当前信息    * *  7.保存当前学生信息*   \n");
	printf("\t\t\t     ********************** **********************  \n");
	printf("\t\t\t     * 8.退出系统        *        \n");
	printf("\t\t\t     **********************        \n");
	printf("\t\t\t     ----------------------   ----------------------  \n");
	 
}

void help() 
{
	printf("\n这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
	printf("\n                  注意事项:                    \n ");
	printf("\n       1、请根据提示进行操作!\n");
	printf("\n       2、初次使用请先选择增加学生信息!\n");
	printf("\n       3、修改或者增加学生信息后切记保存!\n");
	printf("\n       4、如果数据有错误,请先修改再保存!\n"); 
	printf("\n       5、若您之前使用过,下次进入系统请先刷新学生信息!\n");
	printf("\n       6、在添加学生时,用两个字符代表不同的性别,比如男用‘M’代替,女用‘W’代替!\n");
	printf("\n       7、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt,系统会在源程序\n");
	printf("\n          “学生管理系统.exe”的相同目录建立一个.txt文件来保存学生信息,您可以查看\n"); 
	printf("\n          该文件,但非专业人员不要轻易改动,否则会造成刷新数据异常或刷新失败!\n");	
	printf("\n       8、学生信息包括:姓名、学号、性别、年龄、学院、系、班级、宿舍、籍贯、联系电话!\n");
	printf("\n       9、使用遇到任何问题请与我们联系,邮箱:pulsar1141064@outlook.com\n");
	printf("\n       10、最后感谢您的使用!\n"); 
	system("pause"); 
} 


void InitList(LinkList *&L)//初始化链表  
{  
    L=(LinkList *)malloc(sizeof(LinkList));  
    L->next=NULL;  
}
void ListInsert(LinkList *&L,LinkList *p)//插入新的节点  
{  
    LinkList *q=NULL;  
    q=L;  
    p->next=q->next;  
    q->next=p;  
}  
void addstu(LinkList *&L)//增加新的学生  
{   
    printf("请输入学生的信息:\n");  
    printf("学号:");  
    scanf("%s",nu);  
    LinkList *q=L->next;  
    while(q!=NULL )  //用于判断学生信息是否已经存在
    {  
        if(0==strcmp(q->data.num,nu))  
        {  
            printf("该学生已存在\n");  
            break;  
        }  
        q=q->next;  
    }  
    if(q==NULL)  
    {  
        LinkList *p;  
        InitList(p);  
        strcpy(p->data.num,nu);  
        printf("姓名: ") ;  
        scanf("%s",nam) ;  
        strcpy(p->data.name,nam);  
        printf("性别:(m为男 f为女)");  
        scanf(" %c",&se);  
        p->data.sex=se;  
        printf("年龄:");  
        scanf("%d",&ag);  
        p->data.age=ag;  
		ListInsert(L,p);  
    }  
}  

void deletestu(LinkList *L)//删除学生  
{   
    printf("请输入您要删除的学生的学号:");  
    scanf("%s",nu);  
    //判断  
    LinkList *p,*pre;  
    if(L->next==NULL)  
    {  
        printf("还没有学生信息,请增加学生信息\n");  
        return;  
    }  
    pre=L;  
    p=pre->next;  
    int judge=0;  
    while(p)  
    {  
         if(0==strcmp(p->data.num,nu))  
         {  
                 judge=1;  
                 pre->next =p->next;  
                 free(p);  
                 printf("删除学生成功\n");  
                 break;  
         }  
         pre=p;  
         p=p->next;  
    }  
    if(judge==0)  
       printf("这个学生不存在\n");  
}  

void changestu(LinkList *L)//改变学生信息  
{  
	int judge=0;  
    printf("请输入您要修改学生的学号:\n");  
    scanf("%s",nu);  
    LinkList *q=L->next;  
    while(q!=NULL )  
    {  
        if(0==strcmp(q->data.num,nu))  
        {  
            judge=1;  
            printf("请输入您要修改的信息选项:\n"); 
            printf("1.姓名  2.性别  3.年龄    \n");
			printf("4.学院  5.系    6.班级   \n ") ;
			printf("7.宿舍  8.籍贯  9.电话 \n  ");
            int choose;  
            scanf("%d",&choose); 
            switch(choose)  
            {  
            case 1:  
                	printf("请输入您要修改的名字:");  
                	scanf("%s",nam);  
                	printf("修改的名字为:%s\n",nam);  
                	strcpy(q->data.name,nam);
                	printf("修改名字成功!\n");  
                	break;
		   case 2:  
                	printf("请输入您要修改的性别:");  
                	scanf(" %c",&se); 
                	printf("修改的性别为:%c\n",se);  
                	q->data.sex=se; 
                	printf("修改名字成功!\n");  
                	break;   
            case 3:  
                	printf("请输入您要修改的年龄:");  
                	scanf("%d",&ag);  
                	printf("修改的年龄为:%d\n",ag);  
               		q->data.age=ag;  
                	printf("修改年龄成功!\n");  
                	break;  
            case 4:  
                	printf("请输入您要修改的学院:");  
                	scanf("%s",collag);  
                	printf("修改的学院为:%s\n",collag);  
                	q->data.collage=collag;
                	printf("修改学院成功!\n");  
                	break;  
            case 5:  
                	printf("请输入您要修改的系:");  
                	scanf("%s",depar);  
                	printf("修改的系为:%s\n",depar);  
                	q->data.depart =depar;
                	printf("修改系成功!\n");  
                	break;  
            case 6:  
                	printf("请输入您要修改的班级:");  
                	scanf("%s",cla);  
                	printf("修改的班级为:%s\n",cla);  
                	q->data.clas =cla;
                	printf("修改班级成功!\n");  
                	break;  
            case 7:  
                	printf("请输入您要修改的宿舍:");  
                	scanf("%s",ad);  
                	printf("修改的宿舍为:%s\n",ad);  
                	q->data.adm=ad;
                	printf("修改宿舍成功!\n");  
                	break;
			case 8:  
                	printf("请输入您要修改的籍贯:");  
                	scanf("%s",bro);  
                	printf("修改的籍贯为:%s\n",bro);  
                	q->data.bron=bro;
                	printf("修改籍贯成功!\n");  
                	break;  
			case 9:  
                	printf("请输入您要修改的电话:");  
                	scanf("%s",te);  
                	printf("修改的电话为:%s\n",te);  
                	q->data.tel=te;
                	printf("修改电话成功!\n");  
                	break;  
	
            default :  
                	printf("请输入正确的选项\n");  
                	break;  
            }  
        }  
        q=q->next;  
    }  
   if(judge==0)  
   {  
     printf("该生不存在\n");  
   }  
}  
void findstu(LinkList *L)//按学号或者姓名查找学生并输出该生信息  
{   
    printf("1.按学号查询:\n");
    printf("2.按姓名查询:\n");
    printf("3.按学院查询:\n");
	printf("4.按系查询: \n");
	printf("5.按班级查询: \n");
	printf("6.按宿舍查询: \n") ;
    printf("7.按籍贯查询: \n");
    printf("请输入查询方式:");
    int flag;
    scanf("%d",flag); 
	if(flag==1){
        printf("请输入该生学号:"); 
        scanf("%s",nu);   
        LinkList *q=L->next;  
        while(q!=NULL )  
        {  
            if(strcmp(q->data.num,nu)==0)  
            {  
                printf("姓名:%s\n",q->data.name);  
                printf("学号:%s\n",q->data.num);  
                printf("性别:%c\n",q->data.sex);  
                printf("年龄:%d\n",q->data.age);  
				printf("学院:%s\n",q->data.collage);
				printf("系:  %s\n",q->data.depart);
				printf("班级:%s\n",q->data.clas);
				printf("宿舍:%s\n",q->data.adm);
				printf("籍贯:%s\n",q->data.bron);
				printf("电话:%s\n",q->data.tel); 
				break;
            }  
             q=q->next;  
        }  
        if(q==NULL)  
            printf("该生不存在\n");  
    }
    else if(flag==2){    	
        	printf("请输入该生姓名:");
        	scanf("%s",nam);  
        	LinkList *q=L->next;  
        	while(q!=NULL)  
        	{  
            	if(strcmp(q->data.name,nam)==0)  
            	{  
                	printf("姓名:%s\n",q->data.name);  
                    printf("学号:%s\n",q->data.num);  
                    printf("性别:%c\n",q->data.sex);  
                    printf("年龄:%d\n",q->data.age);  
				    printf("学院:%s\n",q->data.collage);
				    printf("系:  %s\n",q->data.depart);
				    printf("班级:%s\n",q->data.clas);
				    printf("宿舍:%s\n",q->data.adm);
				    printf("籍贯:%s\n",q->data.bron);
				    printf("电话:%s\n",q->data.tel); 
                	break;  
            	}  
             	q=q->next;  
        	}  
        	if(q==NULL)  
            	printf("该生不存在\n"); 
        }
    else if(flag==3){    	
        printf("请输入学院:");
       	scanf("%s",collag);  
       	LinkList *q=L->next;  
       	while(q!=NULL)  
       	{  
           	if(q->data.name==nam)  
           	{  
               	printf("姓名:%s\n",q->data.name);  
                printf("学号:%s\n",q->data.num);  
                printf("性别:%c\n",q->data.sex);  
                printf("年龄:%d\n",q->data.age);  
				printf("学院:%s\n",q->data.collage);
				printf("系:  %s\n",q->data.depart);
				printf("班级:%s\n",q->data.clas);
				printf("宿舍:%s\n",q->data.adm);
				printf("籍贯:%s\n",q->data.bron);
				printf("电话:%s\n",q->data.tel);   
            }  
            q=q->next;  
        }  
        if(q==NULL)  
            printf("该生不存在\n"); 
        }
    else if(flag==4){    	
        	printf("请输入系:");
        	scanf("%s",depar);  
        	LinkList *q=L->next;  
        	while(q!=NULL)  
        	{  
            	if(q->data.depart==depar)  
            	{  
                	printf("姓名:%s\n",q->data.name);  
                    printf("学号:%s\n",q->data.num);  
                    printf("性别:%c\n",q->data.sex);  
                    printf("年龄:%d\n",q->data.age);  
				    printf("学院:%s\n",q->data.collage);
				    printf("系:  %s\n",q->data.depart);
				    printf("班级:%s\n",q->data.clas);
				    printf("宿舍:%s\n",q->data.adm);
				    printf("籍贯:%s\n",q->data.bron);
				    printf("电话:%s\n",q->data.tel);   
            	}  
             	q=q->next;  
        	}  
        	if(q==NULL)  
            	printf("该生不存在\n"); 
        }
    else if(flag==5){    	
        	printf("请输入学院班级:");
        	scanf("%s",cla);  
        	LinkList *q=L->next;  
        	while(q!=NULL)  
        	{  
            	if(q->data.clas ==cla)  
            	{  
                	printf("姓名:%s\n",q->data.name);  
                    printf("学号:%s\n",q->data.num);  
                    printf("性别:%c\n",q->data.sex);  
                    printf("年龄:%d\n",q->data.age);  
				    printf("学院:%s\n",q->data.collage);
				    printf("系:  %s\n",q->data.depart);
				    printf("班级:%s\n",q->data.clas);
				    printf("宿舍:%s\n",q->data.adm);
				    printf("籍贯:%s\n",q->data.bron);
				    printf("电话:%s\n",q->data.tel);   
            	}  
             	q=q->next;  
        	}  
        	if(q==NULL)  
            	printf("该生不存在\n"); 
        }
    else if(flag==6){    	
        	printf("请输入宿舍:");
        	scanf("%s",ad);  
        	LinkList *q=L->next;  
        	while(q!=NULL)  
        	{  
            	if(q->data.adm ==ad)  
            	{  
                	printf("姓名:%s\n",q->data.name);  
                    printf("学号:%s\n",q->data.num);  
                    printf("性别:%c\n",q->data.sex);  
                    printf("年龄:%d\n",q->data.age);  
				    printf("学院:%s\n",q->data.collage);
				    printf("系:  %s\n",q->data.depart);
				    printf("班级:%s\n",q->data.clas);
				    printf("宿舍:%s\n",q->data.adm);
				    printf("籍贯:%s\n",q->data.bron);
				    printf("电话:%s\n",q->data.tel);   
            	}  
             	q=q->next;  
        	}  
        	if(q==NULL)  
            	printf("该生不存在\n"); 
        }
    else if(flag==7){    	
        	printf("请输入籍贯:");
        	scanf("%s",bro);  
        	LinkList *q=L->next;  
        	while(q!=NULL)  
        	{  
            	if(q->data.bron==bro)  
            	{  
                	printf("姓名:%s\n",q->data.name);  
                    printf("学号:%s\n",q->data.num);  
                    printf("性别:%c\n",q->data.sex);  
                    printf("年龄:%d\n",q->data.age);  
				    printf("学院:%s\n",q->data.collage);
				    printf("系:  %s\n",q->data.depart);
				    printf("班级:%s\n",q->data.clas);
				    printf("宿舍:%s\n",q->data.adm);
				    printf("籍贯:%s\n",q->data.bron);
				    printf("电话:%s\n",q->data.tel);   
            	}  
             	q=q->next;  
        	}  
        	if(q==NULL)  
            	printf("该生不存在\n"); 
        }
 }  
void display(LinkList *&L)//浏览全部学生信息  
{  
    LinkList *q=L->next;  
    if(q==NULL)  
    {  
        printf("还没有学生信息,请增加学生信息\n");  
        return;  
    }  
    while(q)  
    {   
  		printf("姓名:%s\n",q->data.name);  
        printf("学号:%s\n",q->data.num);  
        printf("性别:%c\n",q->data.sex);  
		printf("年龄:%d\n",q->data.age);  
		printf("学院:%s\n",q->data.collage);
		printf("系:  %s\n",q->data.depart);
		printf("班级:%s\n",q->data.clas);
		printf("宿舍:%s\n",q->data.adm);
		printf("籍贯:%s\n",q->data.bron);
		printf("电话:%s\n",q->data.tel); 
  		q=q->next;  
    }  
}  
void sort(LinkList *L)//按学号排序排序 并输出排序后的结果  
{   
    LinkList *q,*p,*r=L->next;  
    //判断  
    if(r==NULL)  
    {  
        printf("还没有学生信息,请增加学生信息\n");  
        return;  
    }  
    while(r) //两层循环完成排序  
    {  
         p=r;  
         q=r->next;  
         LinkList *tmp;//用于排序时暂存节点  
         InitList(tmp);  
         while(q)  
         {  
             if(q->data.num < p->data.num)  //学号由小到大
             {  
                /*先复制q结点信息到tmp*/  
                strcpy(tmp->data.num,q->data.num);  
                strcpy(tmp->data.name,q->data.name);  
                tmp->data.sex=q->data.sex;  
                tmp->data.age=q->data.age;  
                tmp->data.collage=q->data.collage;
				tmp->data.depart=q->data.depart;
				tmp->data.clas=q->data.clas;
				tmp->data.adm=q->data.adm;
				tmp->data.bron=q->data.bron;
				tmp->data.tel=q->data.tel; 
				/*再复制p结点信息到q*/  
                strcpy(q->data.num,p->data.num);  
                strcpy(q->data.name,p->data.name);  
                q->data.sex=p->data.sex;  
                q->data.age=p->data.age;  
                q->data.collage=p->data.collage; 
                q->data.depart=p->data.depart; 
                q->data.clas=p->data.clas; 
                q->data.adm=p->data.adm; 
                q->data.bron=p->data.bron;
                q->data.tel=p->data.tel; 
				/*最后复制exchange结点信息到p*/  
                strcpy(p->data.num,tmp->data.num);  
                strcpy(p->data.name,tmp->data.name);  
                p->data.sex=tmp->data.sex;  
                p->data.age=tmp->data.age;  
                p->data.collage=tmp->data.collage;
                p->data.depart=tmp->data.depart;
                p->data.clas=tmp->data.clas;
                p->data.adm=tmp->data.adm;
                p->data.bron=tmp->data.bron;
                p->data.tel=tmp->data.tel;
             }  
              q=q->next;  
         }  
         r=r->next; 
         }
        printf("刷新后的学生信息是:\n");  
    	display(L);  
}  
void saveStuDentFile(LinkList * &L)//保存学生信息到文件  
{  
    FILE *fp;  
    LinkList *p=L->next;  
    if((fp=fopen("student.txt","w"))==NULL)// 以可写的方式打开当前目录下的.txt  
    {  
        printf("不能打开此文件,请按任意键退出\n");  
        exit(1);  //异常退出
    }  
    while(p)  
    {  
        fprintf(fp,"%s  %s  %c  %s  %s  %s  %s  %s  %s  %s \n",p->data.num,p->data.name,p->data.sex,p->data.age,
		p->data.collage,p->data.depart,p->data.clas,p->data.adm,p->data.bron,p->data.tel);  
        p=p->next;  
        printf("保存成功\n");  
    }  
    fclose(fp);  
}  

void readStuDentput (LinkList *&L) //运行前把文件内容读取到电脑内存  
{  
    FILE *fp;  
    fp=fopen("student.txt","rb"); //以只读方式打开当前目录下的.txt  
    if(fp==NULL)  
    {  
        printf("文件不存在\n");  
        exit(0);                   //终止程序  
    }  
    int i=0;  
    while(!feof(fp))  
    {  
        int  ag;            //年龄 
        char nam[100]; 		//姓名  
        char nu[100];  		//学号  
        char se;			//性别 (m代表女生f代表男生)  
        char collag;        //学院 
        char depar;         //系 
        char cla;           //班级 
        char ad;            //宿舍 
        char bro;           //籍贯 
        char te;            //电话   
        fscanf(fp,"%s %s %c %s %s %s %s %s %s %s",nu,nam,&se,&ag,&collag,&depar,&cla,&ad,&bro,&te);
        i++;  
    }  
    fclose(fp);  
    FILE *FP;  
    FP=fopen("student.txt","rb"); //以只读方式打开当前目录下的.txt  
    if(FP==NULL)  
    {  
        printf("无法打开文件\n");  
        exit(0); //终止程序  
    }  
    int b=i-1;  
    int j=1;  
        while(!feof(FP))  
        {  
            fscanf(FP,"%s %s %c %s %s %s %s %s %s %s",nu,nam,&se,&ag,&collag,&depar,&cla,&ad,&bro,&te);  
            LinkList *n=(LinkList *)malloc(sizeof(LinkList));  
            strcpy(n->data.num,nu);//把后者的内容拷贝到前者中  
            strcpy(n->data.name,nam);//把后者的内容拷贝到前者中  
            n->data.sex=se;  
            n->data.age=ag;  
            n->data.collage =collag;
            n->data.depart =depar;
            n->data.clas =cla;
            n->data.adm =ad;
            n->data.bron =bro;
            n->data.tel =te;
            ListInsert(L,n);//插入新的节点  
            n=n->next;  
            if(j==b)  
               break;  
            j++;  
        }  
    fclose(FP);    //关闭文件  
}  

int main()  
{       
	LinkList *L;  
    InitList(L);  
    readStuDentput (L);   //运行前把文件内容读取到电脑   
    int choose;  
    while(1)  
    {  
  		printf("\n");
        menu();     //功能菜单 
  		printf("请输入您的选择:\n"); 
        scanf("%d",&choose);  
        switch(choose)  
        {  
        case 0://系统帮助及说明
   			help();
   			break; 
        case 1://刷新信息(按学号排序)
   			sort(L);
   			break;
  		case 2: //查询学生信息
            findstu(L);  
            break;  
        case 3://修改学生信息  
   			changestu(L); 
            break; 
  		case 4://增加学生信息  
            addstu(L); 
            break; 
 		case 5://删除学生信息  
            deletestu(L);  
            break;  
        case 6://输出所有学生的信息  
            display(L);  
            break; 
        case 7://保存学生信息到文件   
            saveStuDentFile(L);  
            break;
  		case 8://退出  
            printf("谢谢使用!");  
            exit(0);        
        default:  
            printf("请输入正确的选择\n");  
            break;  
        }
		system("pause");
		system("cls");  
    } 
    system("pause");
 	return 0;
}  

 1.在增加学生信息这个函数变成下面这个

void addstu(LinkList *&L)//增加新的学生  
{   
    printf("请输入学生的信息:\n");  
    printf("学号:");  
    scanf("%s",nu);  
    LinkList *q=L->next;  
    while(q!=NULL )  //用于判断学生信息是否已经存在
    {  
        if(0==strcmp(q->data.num,nu))  
        {  
            printf("该学生已存在\n");  
            break;  
        }  
        q=q->next;  
    }  
    if(q==NULL)  
    {  
        LinkList *p;  
        InitList(p);  
        strcpy(p->data.num,nu);  
        printf("姓名: ") ;  
        scanf("%s",nam) ;  
        strcpy(p->data.name,nam);  
        printf("性别:(m为男 f为女)");  
        scanf(" %c",&se);  
        p->data.sex=se;  
        printf("年龄:");  
        scanf("%d",&ag);  
        p->data.age=ag;  
	 	printf("学院: ") ;  
        scanf("%s",collag) ;  
        p->data.collage =collag;
        printf("系  : ") ;  
        scanf("%s",depar) ;  
        p->data.depart = depar;
        printf("班级: ") ;  
        scanf("%s",cla) ;  
        p->data.clas = cla;
        printf("宿舍: ") ;  
        scanf("%s",ad) ;  
        p->data.adm = ad;
        printf("籍贯: ") ;  
        scanf("%s",bro) ;  
        p->data.bron = bro;
        printf("联系电话: ") ;  
        scanf("%s",te) ;  
        p->data.tel = te;  
		ListInsert(L,p);  
    }  
}  

就会出现到“学院”为止,而且之后会退出程序;

2.输入7保存信息后会退出程序,而且同目录下的student.txt没有信息被保存

 

希望大佬们能帮我解决麻烦,球球了

  • 写回答

1条回答 默认 最新

  • qq_27881409 2021-06-26 14:29
    关注

    自己查查是不是换行符也被输入到变量里了,可以用VS的监视窗口在运行过程中

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月18日
  • 已采纳回答 9月18日

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services