学生兴趣特长信息管理系统课程设计
一、【课程设计】学生兴趣特长信息管理系统
问题描述:
学生兴趣特长信息管理软件设计。对学生信息进行管理,学生信息包括:学号、姓名、性别、年级、专业等;对兴趣信息进行管理,兴趣信息包括:兴趣类别信息和兴趣信息;还需要有查询信息的功能。
基本要求:
1. 必须使用文件存储数据,可更新数据写入文件中
2. 每一项兴趣属于一种类别,每个学生可以有多项兴趣特长
3. 兴趣类别、兴趣、学生信息是可以添加、删除、修改的
4. 给学生添加兴趣时,学生可挑选也可全选
5. 可查询某兴趣的所有爱好者信息,可查询某兴趣的所有爱好者信息
二、【数据格式分析】
三、【数据结构】
四、【算法分析】
1.对文件进行读和更新的操作
1.1从文件中读取兴趣类别和兴趣类别序号的信息:read_xqlb();
void read_xqlb()//读取兴趣类别和兴趣类别序号的信息
{
FILE *F = fopen("d:\\xqlb.txt","r");
fscanf(F,"%d\n",&xqlb_n);
for (int i=1;i<=xqlb_n;i++)
{
XQL[i].exi=0;
fscanf(F,"%s ",XQL[i].name);
fscanf(F,"%d ",&XQL[i].num);
for (int j=1;j<=XQL[i].num;j++)
fscanf(F,"%d ",&XQL[i].xq[j]);
fscanf(F,"\n");
}
fclose(F);
}
1.2从文件中读取兴趣信息:read_xq();
void read_xq()//读取兴趣信息
{
FILE *F = fopen("d:\\xq.txt","r");
fscanf(F,"%d ",&name_n);
for (int i=1;i<=name_n;i++)
fscanf(F,"%s ",xq_name[i]);
fclose(F);
}
1.3从文件中读取学生信息:read_stu();
void read_stu()//读取学生信息
{
FILE *F = fopen("d:\\stu.txt","r");
fscanf(F,"%d\n",&stu_n);
for (int i=1;i<=stu_n;i++)
{
fscanf(F,"%s ",STU[i].name);
fscanf(F,"%d ",&STU[i].id);
fscanf(F,"%s ",STU[i].sex);
fscanf(F,"%s ",STU[i].grade);
fscanf(F,"%s ",STU[i].major);
fscanf(F,"%s ",STU[i].mobile);
fscanf(F,"%s ",STU[i].jg);
fscanf(F,"%d ",&STU[i].num);
for (int j=1;j<=STU[i].num;j++)
fscanf(F,"%d ",&STU[i].xq[j]);
fscanf(F,"\n");
}
fclose(F);
}
1.4更新兴趣类别和兴趣序号的信息
void update_xq()//更新兴趣类别和兴趣序号的信息
{
FILE *F = fopen("d:\\xqlb.txt","w");
fprintf(F,"%d\n",xqlb_n);
for (int i=1;i<=xqlb_n;i++)
if (XQL[i].exi==0)
{
fprintf(F,"%s ",XQL[i].name);
fprintf(F,"%d ",XQL[i].num);
for (int j=1;j<=XQL[i].num;j++)
fprintf(F,"%d ",XQL[i].xq[j]);
fprintf(F,"\n");
}
fclose(F);
}
1.5更新学生信息
void update_stu()//更新学生信息
{
FILE *F = fopen("d:\\stu.txt","w");
fprintf(F,"%d\n",stu_n);
for (int i=1;i<=stu_n;i++)
{
fprintf(F,"%s ",STU[i].name);
fprintf(F,"%d ",STU[i].id);
fprintf(F,"%s ",STU[i].sex);
fprintf(F,"%s ",STU[i].grade);
fprintf(F,"%s ",STU[i].major);
fprintf(F,"%s ",STU[i].mobile);
fprintf(F,"%s ",STU[i].jg);
fprintf(F,"%d ",STU[i].num);
for (int j=1;j<=STU[i].num;j++)
fprintf(F,"%d ",STU[i].xq[j]);
fprintf(F,"\n");
}
fclose(F);
}
2.兴趣序号与名称的映射
int ys(char *str)//兴趣序号与名称的映射
{
FILE *F = fopen("d:\\xq.txt","r");
fscanf(F,"%d ",&name_n);
for (int i=1;i<=name_n;i++)
fscanf(F,"%s ",xq_name[i]);
fclose(F);
for (int i=1;i<=name_n;i++)
if (strcmp(xq_name[i],str)==0) return i; //当前兴趣在映射中直接返回序号
name_n++;
strcpy(xq_name[name_n],str); //不在映射中将其加入映射
F = fopen("d:\\xq.txt","w"); //更新映射信息
fprintf(F,"%d ",name_n);
for (int i=1;i<=name_n;i++)
fprintf(F,"%s ",xq_name[i]);
fclose(F);
return name_n; //返回新的序号
}
总体设计
3.兴趣管理系统
3.1 添加兴趣类别
3.2删除兴趣类别
3.3修改兴趣类别
void up_xqlb()//修改兴趣类别
{
while(true)
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请输入需要修改的兴趣类别的序号:");
int x;
scanf("%d",&x);
printf("请输入该兴趣类别的新名字:");
char str[20];
scanf("%s",str);
printf("“%s”兴趣类别已修改为“%s\n”",XQL[x].name,str);
strcpy(XQL[x].name,str);
update_xq();
printf("还要继续修改兴趣类别吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //while循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
3.4添加兴趣
3.5删除兴趣
void del_xq()//删除兴趣
{
while(true) //外循环 用于判断是否继续删除其它兴趣类别里的兴趣
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续删除该兴趣类别里的兴趣
{
for (int i=1;i<=XQL[x].num;i++)
printf("%d.%s\n",i,xq_name[XQL[x].xq[i]]);
printf("请输入需要删除的兴趣的序号:");
int y;
scanf("%d",&y);
printf("“%s”兴趣类别已删除“%s”兴趣\n",XQL[x].name,xq_name[XQL[x].xq[y]]);
XQL[x].xq[y]=XQL[x].xq[XQL[x].num];
XQL[x].num--;
update_xq();
printf("还要继续删除该兴趣类别中的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还要继续删除其它兴趣类别中的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
3.6修改兴趣
void up_xq()//修改兴趣
{
while(true)//外循环 用于判断是否继续修改该兴趣类别里的兴趣
{
for (int i=1;i<xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续修改该兴趣类别里的兴趣
{
for (int i=1;i<=XQL[x].num;i++)
printf("%d . %s \n",i,xq_name[XQL[x].xq[i]]);
printf("请输入需要修改的兴趣的序号:");
int y;
scanf("%d",&y);
printf("请输入该兴趣的新名字:");
char str[20];
scanf("%s",str);
printf("“%s”兴趣已修改为“%s”\n",xq_name[XQL[x].xq[y]],str);
strcpy(xq_name[XQL[x].xq[y]],str);
update_xq();
printf("还要继续修改该兴趣类别中的兴趣吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还要继续修改其它兴趣类别中的兴趣吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
4.学生信息管理
4.1添加学生信息
4.2删除学生兴趣
void del_stu()//删除学生信息
{
while(true)
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d . %s \n",i,STU[i].name); //输出所有学生
printf("请输入需要删除的学生的序号:");
int x;
scanf("%d",&x);
printf("“%s”已删除\n",STU[x].name);
XQL[x].exi=1; //标记需删除的文件
STU[x]=STU[stu_n];
stu_n--;
update_stu();
printf("还要继续删除学生信息吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
4.3修改学生信息
void up_stu()//修改学生信息
{
while(true)
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s\n",i,STU[i].name); //输出所有学生
printf("请输入需要修改的学生的序号:");
int x;
scanf("%d",&x);
printf("请输入学号:");
scanf("%d",&STU[x].id);
printf("请输入性别:");
scanf("%s",STU[x].sex);
printf("请输入年级:");
scanf("%s",STU[x].grade);
printf("请输入专业:");
scanf("%s",STU[x].major);
printf("请输入手机号码:");
scanf("%s",STU[stu_n].mobile);
printf("请输入籍贯:");
scanf("%s",STU[stu_n].jg);
printf("“%s”已修改\n",STU[x].name);
update_stu();
printf("还要继续修改学生信息吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
4.4添加学生兴趣
void add_stu_xq()//添加学生兴趣
{
while(true)//外循环 用于判断是否继续添加其他学生的兴趣
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s \n",i,STU[i].name); //输出所有学生名字
printf("请输入需要添加兴趣的学生的序号:");
int x;
scanf("%d",&x);
while(true) //二级循环 用于判断是否继续添加某学生的兴趣类别(目的是继续添加兴趣)
{
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s \n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int y;
scanf("%d",&y);
while(true) //内循环 用于判断是否继续添加某学生该兴趣类别里的兴趣
{
for (int i=1;i<=XQL[y].num;i++)
printf("%d . %s \n",i,xq_name[XQL[y].xq[i]]);//输出所有兴趣
printf("请输入需要添加的兴趣的序号:");
int z;
scanf("%d",&z);
STU[x].num++;
STU[x].xq[STU[x].num]=XQL[y].xq[z];
printf("“%s”已新增“%s”兴趣\n",STU[x].name,xq_name[XQL[y].xq[z]]);
update_stu();
printf("还要继续添加该兴趣类别的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //内循环结束
printf("还需要添加其它兴趣类别的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //二级循环结束
printf("还需要添加其他学生的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
4.5删除学生兴趣
void del_stu_xq()//删除学生兴趣
{
while(true)//外循环 用于判断是否继续删除其他学生的兴趣
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s \n",i,STU[i].name); //输出所有学生
printf("请输入需要删除兴趣的学生的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续删除该学生的兴趣
{
for (int i=1;i<=STU[x].num;i++)
printf("%d.%s \n",i,xq_name[STU[x].xq[i]]); //输出所有兴趣
printf("请选择需要删除的兴趣的序号:");
int y;
scanf("%d",&y);
printf("“%s” 已删除“%s”兴趣\n",STU[x].name,xq_name[STU[x].xq[y]]);
STU[x].xq[y]=STU[x].xq[STU[x].num];
STU[x].num--;
update_stu();
printf("还需要删除该同学的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还需要删除其他同学的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
5. 查询系统
5.1学生信息查询
void ser_stu()//查询学生信息
{
while(true)
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s \n",i,STU[i].name); //输出所有学生
printf("请输入需要查询的学生的序号:");
int x;
scanf("%d",&x);
printf("姓名:%s\n",STU[x].name);
printf("学号:%d\n",STU[x].id);
printf("性别:%s\n",STU[x].sex);
printf("年级:%s\n",STU[x].grade);
printf("专业:%s\n",STU[x].major);
printf("手机:%s\n",STU[x].mobile);
printf("籍贯:%s\n",STU[x].jg);
printf("兴趣:\n");
for (int i=1;i<=STU[x].num;i++)
printf("%s ",xq_name[STU[x].xq[i]]);
printf("\n还需要查询其他同学的信息吗?\n输入“1”继续查询,输入“0”停止查询:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
}
5.2兴趣爱好者信息查询
void ser_xq_stu()//查询兴趣爱好者信息
{
while(true)//外循环 用于判断是否继续查询其它兴趣类别里兴趣爱好者的信息
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s \n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续查询该兴趣类别里兴趣爱好者的信息
{
for (int i=1;i<=XQL[x].num;i++)
printf("%d.%s \n",i,xq_name[XQL[x].xq[i]]);//输出所有兴趣
printf("请输入需要查询的兴趣的序号:");
int y;
scanf("%d",&y);
printf("拥有该兴趣的同学有:\n");
int z=XQL[x].xq[y];
int mk=0;
for (int i=1;i<=stu_n;i++)
{
mk=0;
for (int j=1;j<=STU[i].num;j++)
if (STU[i].xq[j]==z){mk=1;break;}
if (mk) printf("%s\n",STU[i].name);
}
printf("\n还需要查询该兴趣类别里兴趣爱好者的信息吗?\n输入“1”继续查询,输入“0”停止查询:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还需要查询其它兴趣类别里兴趣爱好者的信息吗?\n输入“1”继续查询,输入“0”停止查询:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
}
五、【运行截图】
六、【设计总结】
1.思路出发点
1.1如何解决文件存储问题?
首先,定义一个文件指针:FILE *fp;和一个数组:int a[5];
然后,打开文件:fp = fopen ("filename.txt", "w"); //"w"是打开文件方式,将原有内容清空写入新数据,如果文件不存在则新建,类似的还有"r"只读打开(不能写入);"a"向文件中追加内容,原有内容不变,等等
把数据存入到数组里:
for (i=0; i<5; i++)
scanf ("%d", &a[i]);
再把数组里的数一个一个的保存到txt文件中:
for (i=0; i<5; i++)
fprintf (fp, "%d", a[i]); //fprintf 函数和printf 函数类似,只是输出的对象不同.fprintf 函数的输出对象是文件,而printf 函数的输出对象是屏幕
最后记得关闭文件: fclose (fp);
这样就把一组数保存到:filename.txt文件中
本课程设计所需三个文件,依此命名为xqlb.txt、xq.txt、stu.txt
文件存储路径都为D盘,如FILE *F = fopen("d:\\xqlb.txt","r");
1.2信息存储体之间的相互联系是什么?
1.3思考如何解决“每一项兴趣属于一种类别,每个学生可以有多项兴趣特长”?
对兴趣按顺序编排序号,兴趣类别文件与学生信息文件存储各自兴趣序号信息
序号与兴趣名称有一一对应的关系,即映射,故需定义映射函数
2.利用system(“cls”);来实现清屏的功能,它的位置需要清楚放置,我在很多地方都写了“printf("\n\n请输入任意字符并按回车键继续:");char a;scanf("%s",&a);”来防止因自动清屏而提前关闭当前页面;
多留意会重复的地方,如添加兴趣类别这个功能,当你实际运行时你应该可以多次重复使用这个功能输入,所以就要采用合适的循环方法,在这个课程设计中我采用的都是while循环
3. 我写的程序曾有两次突然运行不了,后来我从codeblock换到DEVc++发现还是同样的问题,上网查了后发现是溢价导致的,删了文件里的信息后,改了数组大小,最后终于可以运行
4. 前前后后敲了有五天,自己的基本功不扎实,所以头一天基本没思路,本来是利用链表来存储数据的,但是写了一半后发现自己不知道怎么联系存储学生信息的文件和存储兴趣类别兴趣兴趣信息的文件,于是上网查,看了半天也不知道怎么弄。看到有人说用继承的方法,兴趣为子类,兴趣类别为父类,想了想后感觉这个方法比较复杂,便暂时搁到一边,中间请教了同学,又看了网上的一些,想到了用结构体数组来写。从开始着手到有了较清晰的思路,自己花了两天的时间,说明自己基础不好,写程序经验少,需要自己花更多时间来参与进来学习和积累经验。代码敲完后运行时一堆问题,到现在还有一些瑕疵,尽量去完善。
七、【完整源程序代码】
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int xqlb_n; //兴趣类别数目
int name_n; //兴趣个数
char xq_name[30][30]; //兴趣的序号与之对应的名字
int stu_n; //学生个数
struct xqlb //兴趣类别的结构体
{
int num; //该类别中兴趣的个数
int exi; //该兴趣是否存在
char name[20]; //该兴趣类别的名称
int xq[30]; //兴趣类别中兴趣的序号
}XQL[100];//结构体数组
struct stu//学生结构体
{
char name[20]; //学生名字
int xq[30]; //该学生的兴趣
int num; //该学生有的兴趣个数
int id; //学号
char sex[8]; //性别
char grade[20]; //年级
char major[20]; //专业
char mobile[20]; //手机
char jg[20]; //籍贯
}STU[100];//结构体数组
void read_xqlb()//读取兴趣类别和兴趣类别序号的信息
{
FILE *F = fopen("d:\\xqlb.txt","r");
fscanf(F,"%d\n",&xqlb_n);
for (int i=1;i<=xqlb_n;i++)
{
XQL[i].exi=0;
fscanf(F,"%s ",XQL[i].name);
fscanf(F,"%d ",&XQL[i].num);
for (int j=1;j<=XQL[i].num;j++)
fscanf(F,"%d ",&XQL[i].xq[j]);
fscanf(F,"\n");
}
fclose(F);
}
void read_stu()//读取学生信息
{
FILE *F = fopen("d:\\stu.txt","r");
fscanf(F,"%d\n",&stu_n);
for (int i=1;i<=stu_n;i++)
{
fscanf(F,"%s ",STU[i].name);
fscanf(F,"%d ",&STU[i].id);
fscanf(F,"%s ",STU[i].sex);
fscanf(F,"%s ",STU[i].grade);
fscanf(F,"%s ",STU[i].major);
fscanf(F,"%s ",STU[i].mobile);
fscanf(F,"%s ",STU[i].jg);
fscanf(F,"%d ",&STU[i].num);
for (int j=1;j<=STU[i].num;j++)
fscanf(F,"%d ",&STU[i].xq[j]);
fscanf(F,"\n");
}
fclose(F);
}
void read_xq()//读取兴趣信息
{
FILE *F = fopen("d:\\xq.txt","r");
fscanf(F,"%d ",&name_n);
for (int i=1;i<=name_n;i++)
fscanf(F,"%s ",xq_name[i]);
fclose(F);
}
int ys(char *str)//兴趣序号与名称的映射
{
FILE *F = fopen("d:\\xq.txt","r");
fscanf(F,"%d ",&name_n);
for (int i=1;i<=name_n;i++)
fscanf(F,"%s ",xq_name[i]);
fclose(F);
for (int i=1;i<=name_n;i++)
if (strcmp(xq_name[i],str)==0) return i; //当前兴趣在映射中直接返回序号
name_n++;
strcpy(xq_name[name_n],str); //不在映射中将其加入映射
F = fopen("d:\\xq.txt","w"); //更新映射信息
fprintf(F,"%d ",name_n);
for (int i=1;i<=name_n;i++)
fprintf(F,"%s ",xq_name[i]);
fclose(F);
return name_n; //返回新的序号
}
void update_xq()//更新兴趣类别和兴趣序号的信息
{
FILE *F = fopen("d:\\xqlb.txt","w");
fprintf(F,"%d\n",xqlb_n);
for (int i=1;i<=xqlb_n;i++)
if (XQL[i].exi==0)
{
fprintf(F,"%s ",XQL[i].name);
fprintf(F,"%d ",XQL[i].num);
for (int j=1;j<=XQL[i].num;j++)
fprintf(F,"%d ",XQL[i].xq[j]);
fprintf(F,"\n");
}
fclose(F);
}
void update_stu()//更新学生信息
{
FILE *F = fopen("d:\\stu.txt","w");
fprintf(F,"%d\n",stu_n);
for (int i=1;i<=stu_n;i++)
{
fprintf(F,"%s ",STU[i].name);
fprintf(F,"%d ",STU[i].id);
fprintf(F,"%s ",STU[i].sex);
fprintf(F,"%s ",STU[i].grade);
fprintf(F,"%s ",STU[i].major);
fprintf(F,"%s ",STU[i].mobile);
fprintf(F,"%s ",STU[i].jg);
fprintf(F,"%d ",STU[i].num);
for (int j=1;j<=STU[i].num;j++)
fprintf(F,"%d ",STU[i].xq[j]);
fprintf(F,"\n");
}
fclose(F);
}
void add_xqlb()//添加兴趣类别
{
while(true)
{
system("cls");
printf("请输入新的兴趣类别的名称:");
char str[20];
scanf("%s",str);
printf("“%s”新兴趣类别已添加\n",str);
++xqlb_n;
XQL[xqlb_n].num=0;
strcpy(XQL[xqlb_n].name,str);
update_xq();
printf("还要继续添加新的兴趣类别?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return ;
}
void del_xqlb()//删除兴趣类别
{
while(true)
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请输入需要删除的兴趣类别的序号:");
int x;
scanf("%d",&x);
printf("“%s”兴趣类别已删除\n",XQL[x].name);
XQL[x].exi=1; //标记需删除的兴趣类别的序号
update_xq();
read_xq();
xqlb_n--;
update_xq();
printf("还要继续删除兴趣类别吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void up_xqlb()//修改兴趣类别
{
while(true)
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请输入需要修改的兴趣类别的序号:");
int x;
scanf("%d",&x);
printf("请输入该兴趣类别的新名字:");
char str[20];
scanf("%s",str);
printf("“%s”兴趣类别已修改为“%s\n”",XQL[x].name,str);
strcpy(XQL[x].name,str);
update_xq();
printf("还要继续修改兴趣类别吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //while循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void add_xq()//添加兴趣
{
while(true)//外循环 用于判断是否继续添加其它兴趣类别里的兴趣
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续添加该兴趣类别里的兴趣
{
printf("请输入新的兴趣名称:");
char str[20];
scanf("%s",str);
int y=ys(str);
printf("“%s”兴趣类别已新增“%s”兴趣\n",XQL[x].name,str);
XQL[x].num++;
XQL[x].xq[XQL[x].num]=y;
update_xq();
printf("还要继续向该兴趣类别添加新的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还要继续向其它兴趣类别添加新的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void del_xq()//删除兴趣
{
while(true) //外循环 用于判断是否继续删除其它兴趣类别里的兴趣
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续删除该兴趣类别里的兴趣
{
for (int i=1;i<=XQL[x].num;i++)
printf("%d.%s\n",i,xq_name[XQL[x].xq[i]]);
printf("请输入需要删除的兴趣的序号:");
int y;
scanf("%d",&y);
printf("“%s”兴趣类别已删除“%s”兴趣\n",XQL[x].name,xq_name[XQL[x].xq[y]]);
XQL[x].xq[y]=XQL[x].xq[XQL[x].num];
XQL[x].num--;
update_xq();
printf("还要继续删除该兴趣类别中的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还要继续删除其它兴趣类别中的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void up_xq()//修改兴趣
{
while(true)//外循环 用于判断是否继续修改该兴趣类别里的兴趣
{
for (int i=1;i<xqlb_n;i++)
printf("%d.%s\n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续修改该兴趣类别里的兴趣
{
for (int i=1;i<=XQL[x].num;i++)
printf("%d . %s \n",i,xq_name[XQL[x].xq[i]]);
printf("请输入需要修改的兴趣的序号:");
int y;
scanf("%d",&y);
printf("请输入该兴趣的新名字:");
char str[20];
scanf("%s",str);
printf("“%s”兴趣已修改为“%s”\n",xq_name[XQL[x].xq[y]],str);
strcpy(xq_name[XQL[x].xq[y]],str);
update_xq();
printf("还要继续修改该兴趣类别中的兴趣吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还要继续修改其它兴趣类别中的兴趣吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void add_stu()//添加学生信息
{
while(true)
{
system("cls");
stu_n++;
printf("请输入学生的名字:");
scanf("%s",STU[stu_n].name);
printf("请输入学号:");
scanf("%d",&STU[stu_n].id);
printf("请输入性别:");
scanf("%s",STU[stu_n].sex);
printf("请输入年级:");
scanf("%s",STU[stu_n].grade);
printf("请输入专业:");
scanf("%s",STU[stu_n].major);
printf("请输入手机号码:");
scanf("%s",STU[stu_n].mobile);
printf("请输入籍贯:");
scanf("%s",STU[stu_n].jg);
STU[stu_n].num=0;
printf("“%s”学生的信息已添加\n",STU[stu_n].name);
update_stu();
printf("还要继续添加学生信息吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void del_stu()//删除学生信息
{
while(true)
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d . %s \n",i,STU[i].name); //输出所有学生
printf("请输入需要删除的学生的序号:");
int x;
scanf("%d",&x);
printf("“%s”已删除\n",STU[x].name);
XQL[x].exi=1; //标记需删除的文件
STU[x]=STU[stu_n];
stu_n--;
update_stu();
printf("还要继续删除学生信息吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void up_stu()//修改学生信息
{
while(true)
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s\n",i,STU[i].name); //输出所有学生
printf("请输入需要修改的学生的序号:");
int x;
scanf("%d",&x);
printf("请输入学号:");
scanf("%d",&STU[x].id);
printf("请输入性别:");
scanf("%s",STU[x].sex);
printf("请输入年级:");
scanf("%s",STU[x].grade);
printf("请输入专业:");
scanf("%s",STU[x].major);
printf("请输入手机号码:");
scanf("%s",STU[stu_n].mobile);
printf("请输入籍贯:");
scanf("%s",STU[stu_n].jg);
printf("“%s”已修改\n",STU[x].name);
update_stu();
printf("还要继续修改学生信息吗?\n输入“1”继续修改,输入“0”停止修改:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void add_stu_xq()//添加学生兴趣
{
while(true)//外循环 用于判断是否继续添加其他学生的兴趣
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s \n",i,STU[i].name); //输出所有学生名字
printf("请输入需要添加兴趣的学生的序号:");
int x;
scanf("%d",&x);
while(true) //二级循环 用于判断是否继续添加某学生的兴趣类别(目的是继续添加兴趣)
{
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s \n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int y;
scanf("%d",&y);
while(true) //内循环 用于判断是否继续添加某学生该兴趣类别里的兴趣
{
for (int i=1;i<=XQL[y].num;i++)
printf("%d . %s \n",i,xq_name[XQL[y].xq[i]]);//输出所有兴趣
printf("请输入需要添加的兴趣的序号:");
int z;
scanf("%d",&z);
STU[x].num++;
STU[x].xq[STU[x].num]=XQL[y].xq[z];
printf("“%s”已新增“%s”兴趣\n",STU[x].name,xq_name[XQL[y].xq[z]]);
update_stu();
printf("还要继续添加该兴趣类别的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //内循环结束
printf("还需要添加其它兴趣类别的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
} //二级循环结束
printf("还需要添加其他学生的兴趣吗?\n输入“1”继续添加,输入“0”停止添加:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void del_stu_xq()//删除学生兴趣
{
while(true)//外循环 用于判断是否继续删除其他学生的兴趣
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s \n",i,STU[i].name); //输出所有学生
printf("请输入需要删除兴趣的学生的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续删除该学生的兴趣
{
for (int i=1;i<=STU[x].num;i++)
printf("%d.%s \n",i,xq_name[STU[x].xq[i]]); //输出所有兴趣
printf("请选择需要删除的兴趣的序号:");
int y;
scanf("%d",&y);
printf("“%s” 已删除“%s”兴趣\n",STU[x].name,xq_name[STU[x].xq[y]]);
STU[x].xq[y]=STU[x].xq[STU[x].num];
STU[x].num--;
update_stu();
printf("还需要删除该同学的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还需要删除其他同学的兴趣吗?\n输入“1”继续删除,输入“0”停止删除:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
return;
}
void ser_stu()//查询学生信息
{
while(true)
{
system("cls");
for (int i=1;i<=stu_n;i++)
printf("%d.%s \n",i,STU[i].name); //输出所有学生
printf("请输入需要查询的学生的序号:");
int x;
scanf("%d",&x);
printf("姓名:%s\n",STU[x].name);
printf("学号:%d\n",STU[x].id);
printf("性别:%s\n",STU[x].sex);
printf("年级:%s\n",STU[x].grade);
printf("专业:%s\n",STU[x].major);
printf("手机:%s\n",STU[x].mobile);
printf("籍贯:%s\n",STU[x].jg);
printf("兴趣:\n");
for (int i=1;i<=STU[x].num;i++)
printf("%s ",xq_name[STU[x].xq[i]]);
printf("\n还需要查询其他同学的信息吗?\n输入“1”继续查询,输入“0”停止查询:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
}
void ser_xq_stu()//查询兴趣爱好者信息
{
while(true)//外循环 用于判断是否继续查询其它兴趣类别里兴趣爱好者的信息
{
system("cls");
for (int i=1;i<=xqlb_n;i++)
printf("%d.%s \n",i,XQL[i].name); //输出所有兴趣类别
printf("请选择兴趣类别的序号:");
int x;
scanf("%d",&x);
while(true)//内循环 用于判断是否继续查询该兴趣类别里兴趣爱好者的信息
{
for (int i=1;i<=XQL[x].num;i++)
printf("%d.%s \n",i,xq_name[XQL[x].xq[i]]);//输出所有兴趣
printf("请输入需要查询的兴趣的序号:");
int y;
scanf("%d",&y);
printf("拥有该兴趣的同学有:\n");
int z=XQL[x].xq[y];
int mk=0;
for (int i=1;i<=stu_n;i++)
{
mk=0;
for (int j=1;j<=STU[i].num;j++)
if (STU[i].xq[j]==z){mk=1;break;}
if (mk) printf("%s\n",STU[i].name);
}
printf("\n还需要查询该兴趣类别里兴趣爱好者的信息吗?\n输入“1”继续查询,输入“0”停止查询:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//内循环结束
printf("还需要查询其它兴趣类别里兴趣爱好者的信息吗?\n输入“1”继续查询,输入“0”停止查询:");
int i;
scanf("%d",&i);
if(i==1) continue;
if(i==0) break;
}//外循环结束
printf("\n\n请输入任意字符并按回车键继续:");
char a;
scanf("%s",&a);
}
int xq_menu()//兴趣类别和兴趣信息管理菜单
{
while(true)
{
system("cls");
system("title 兴趣类别和兴趣信息管理菜单");
system("date /T");
system("TIME /T");
printf("\n\n");
printf(" 欢迎使用兴趣信息管理菜单\n\n");
printf("\t1.添加兴趣类别\n");
printf("\t2.删除兴趣类别\n");
printf("\t3.修改兴趣类别\n");
printf("\t4.添加兴趣\n");
printf("\t5.删除兴趣\n");
printf("\t6.修改兴趣\n");
printf("\t7.回到主菜单\n");
printf("\t8.退出程序\n\n");
printf(" 请输入数字选择相应功能:");
int x;
scanf("%d",&x);
system("cls");
switch(x)
{
case 1: add_xqlb(); break;//添加兴趣类别
case 2: del_xqlb(); break;//删除兴趣类别
case 3: up_xqlb(); break;//修改兴趣类别
case 4: add_xq(); break; //添加兴趣
case 5: del_xq(); break; //删除兴趣
case 6: up_xq(); break; //修改兴趣
case 7: return 1;
case 8: exit(0); //退出系统
default: {printf("输入错误!\n请按回车键继续...");char a;scanf("%c",&a);char c=getchar(); } break;
}
}
return 0;
}
int stu_menu()//学生信息管理菜单
{
while(true)
{
system("cls");
system("title 学生信息管理菜单"); //运行界面标题
system("date /T"); //显示系统日期
system("TIME /T"); //显示系统时间
printf("\n\n");
printf(" 欢迎使用学生信息管理菜单\n\n");
printf("\t1.添加学生信息\n");
printf("\t2.删除学生信息\n");
printf("\t3.修改学生信息\n");
printf("\t4.添加学生兴趣\n");
printf("\t5.删除学生兴趣\n");
printf("\t6.回到主菜单\n");
printf("\t7.退出程序\n\n");
printf(" 请输入数字选择相应功能:");
int x;
scanf("%d",&x);
system("cls");
switch(x)
{
case 1: add_stu(); break; //添加兴趣类别
case 2: del_stu(); break; //删除兴趣类别
case 3: up_stu(); break; //修改兴趣类别
case 4: add_stu_xq();break; //添加兴趣
case 5: del_stu_xq();break; //删除兴趣
case 6: return 1;
case 7: exit(0); //退出系统
default: {printf("输入错误!\n请按回车键继续...");char a;scanf("%c",&a);char c=getchar(); } break;
}
}
return 0;
}
int ser_menu()//查询信息管理菜单
{
while(true)
{
system("cls");
system("title 查询信息管理菜单"); //运行界面标题
system("date /T"); //显示系统日期
system("TIME /T"); //显示系统时间
printf("\n\n");
printf(" 欢迎使用信息查询菜单\n\n");
printf("\t1.查询学生信息\n");
printf("\t2.查询兴趣爱好者信息\n");
printf("\t3.回到主菜单\n");
printf("\t4.退出程序\n\n");
printf(" 请输入数字选择相应功能:");
int x;
scanf("%d",&x);
system("cls");
switch(x)
{
case 1: ser_stu(); break;
case 2: ser_xq_stu(); break;
case 3: return 1;
case 4: exit(0);
default: {printf("输入错误!\n请按回车键继续...");char a;scanf("%c",&a);char c=getchar(); } break;
}
}
return 0;
}
void main_menu()//主菜单
{
while(true)
{
system("cls");
system("title 学生兴趣特长信息管理系统"); //运行界面标题
system("date /T"); //显示系统日期
system("TIME /T"); //显示系统时间
printf("\n\n");
printf(" 欢迎使用学生兴趣特长信息管理系统\n");
printf("\n\t1.兴趣信息管理\n");
printf("\t2.学生信息管理\n");
printf("\t3.信息查询管理\n");
printf("\t4.退出程序\n\n");
printf(" 请输入数字选择相应功能:");
int x;
scanf("%d",&x);
system("cls");
if(x==1) xq_menu(); //显示兴趣信息管理菜单
else if(x==2) stu_menu(); //显示学生信息管理菜单
else if(x==3) ser_menu(); //显示信息查询管理菜单
else if(x==4) exit(0); //退出系统
else {printf("输入错误!\n请按回车键继续...");char a;scanf("%c",&a);char c=getchar(); continue; }
system("pause");
}
}
int main()
{
system("mode con cols=48 lines=35"); //设定运行界面的宽和高
system("color 3E"); //设定运行界面的背景颜色
read_xqlb(); //提前加载兴趣类别信息
read_xq(); //提前加载兴趣的信息
read_stu(); //提前加载学生的信息
main_menu(); //执行main_menu()函数
return 0;
}