软件课设正文.docx
《软件课设正文.docx》由会员分享,可在线阅读,更多相关《软件课设正文.docx(19页珍藏版)》请在冰点文库上搜索。
软件课设正文
一、题目分析
本次软件技术基础课程设计的题目是用C语言编写一个可以对学生信息进行管理的学生学籍管理系统。
该系统应具备如下功能:
1.添加学生信息功能:
该系统能添加一个学生的七项基本信息,包括生姓名,学生学号,学生年龄,学生性别,学生电话,学生生日,学生家庭住址。
2.删除学生信息功能:
能够对一个姓名的学生信息进行按姓名进行删除。
3.显示学生信息功能:
显示所有学生的主要信息,包括姓名,学号,家庭住址,学生家庭电话号码此四项基本信息。
4.查找学生信息功能:
根据用户键入的学生姓名进行查找,并显示学生姓名,学号等全部七项学生信息。
5.修改学生信息功能:
对学生信息进行修改。
通过对题目所要求的5项功能的分析可知,要实现全部上述5项功能,此系统必须应该含有6个不同的功能模块。
分别为:
添加功能模块,删除功能模块,显示功能模块,查找功能模块,修改功能模块以及目录模块。
目录模块作为总函数,对其余5个功能模块进行整合与调用,以实现上述5项功能。
编写此程序时,拟将每名学生的所有信息存储在结构体中,对学生信息的添加,删除,查找,修改时,就是对结构体中的各个数据进行读取,写入,打开等一系列操作。
在主函数以及各个功能模块中将会大量使用各种选择语句和循环语句。
二、设计过程(程序流程图)
1.添加信息功能模块。
此模块的功能是实现向系统添加学生信息,在添加信息时打开D\\:
guanli.txt中存储的学生信息文件,将它们与新添加的学生信息一并存储在结构体类型的数组中,最后再将数组存放在文本文档中。
对学生信息的添加实际上就是对结构体数组的添加操作。
添加功能的程序流程图如图1所示。
图1添加功能模块流程图
2.删除学生信息功能。
这一功能模块实现对学生学籍信息按照学生姓名进行删除。
删除功能首先是打开学生学籍管理文档D\\:
guanli.txt,读取文档中的学生信息,并将信息存入结构体数组中,对学生信息的删除实际上是对结构体中数组的数据进行删除,最后再将数据信息重新存入D\\:
guanli.txt中。
删除信息功能模块的流程图如图2所示。
图2删除功能模块
3.显示学生信息功能。
要实现显示学生信息的功能的步骤是:
先打开存储学生学籍信息的文档D\\:
guanli.txt,通过循环语句将文档中的信息逐条读取,并且将信息全部输出到屏幕上。
显示功能模块的流程图如图3所示。
图3显示功能模块
4.查找学生信息功能。
这一模块的功能是对学生学籍信息的查询。
首先打开存放学籍信息的文档D\\:
guanli.txt,将文档中的数据信息存放入结构体数组中,再实现对结构体数组的查找,将查找到得结构体数组数据一一输出到屏幕上,再将数组中的文件存放到文档D\\:
guanli.txt中。
查找模块的流程图如图4所示。
图4查找功能流程图
5.修改功能模块。
对学生信息的修改就是对存放有学生信息的结构体数组进行修改的过程,最后再将经过修改后的数据存放到学生信息文档D\\:
guanli.txt中。
具体的修改模块流程图如图5所示。
图5修改功能流程图
6.目录模块。
目录模块作为总函数,对其余5个功能模块进行整合与调用,以实现上述5项功能。
具体目录模块流程图如图6所示。
图6目录模块流程图
三、调试过程以及实验结果
1.调试过程。
通过对系统的调试,基本实现了任务书中所要求的添加,删除,查找等基本功能。
在菜单中输入各个功能的代号能够完成对学生信息的管理。
而且程序对于某些错误情况做出了一些处理,例如在查找学生信息时若文档D\\:
guanli.txt中没有相应的学生信息时,系统会输出“无此人”。
在添加学生信息时,如果学生信息已经存在文档D\\:
guanli.txt中,系统则会输出“已经存在”来提示用户此学生信息已经存在。
在修改学生信息时,如果新输入学生信息时,出现学号重复的情况,系统会提示“学号重复,需要重新输入吗?
”来提示用户重新修改学生信息。
在调试的过程中,同样也发现了许多错误,例如在添加学生学号过长时,再显示学生信息时会出现乱码;在主函数菜单中输入不存在的菜单代号时,系统不能够进行提示并跳出提示等缺陷和问题。
2.运行结果
1)程序主菜单界面
程序的主菜单界面如下图7所示。
图7程序主菜单界面截图
2)显示功能界面
程序的显示功能界面如图8所示
图8显示学生信息功能截图
四、结论
经过对程序的编写,修改以及调试,最终完成了学生学籍管理系统的设计。
本程序结构简单明了,层次分明,程序界面简单,友好,在编写程序的过程中考虑到了对用户的人性化设计,对用户的操作进行了很多提示,能过完成任务书中所要求的各种功能。
五、程序清单
#include
#include
#include
#include
#defineN100
structstudent
{
charnum[20];
charname[20];
chartel[21];
charsex[20];
charage[20];
charbir[20];
charloc[50];
};
voidmyadd()
{charc;
intn=0;
structstudenttemp,record[N],*p;
FILE*fp;
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
!
!
!
!
\n");
return;
}
p=record;
while(feof(fp)==0)
{fscanf(fp,"%s%20s%20s%20s%20s%20s%20s\n",p->num,
p->name,p->tel,p->sex,p->age,p->bir,p->loc);
p++;
n++;
}fclose(fp);
do
{printf("请输入新记录的学号:
");
do
{gets(temp.num);
}while(strcmp(temp.num,"")==0);
printf("请输入新记录同学的姓名:
");
gets(temp.name);
printf("请输入新记录的电话号码:
");
gets(temp.tel);
printf("请输入新记录的性别:
");
gets(temp.sex);
printf("请输入新记录的年龄:
");
gets(temp.age);
printf("请输入新记录的生日:
");
gets(temp.bir);
printf("请输入新记录的家庭地址:
");
gets(temp.loc);
if(p==record+n)
{*p=temp;
break;
}
}while(c=='Y'||c=='y');
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
\n");
return;
}
for(p=record;pfprintf(fp,"%s%20s%20s%20s%20s%20s%20s\n",p->num,
p->name,p->tel,p->sex,p->age,p->bir,p->loc);
fclose(fp);
}
voiddel_name(FILE*fp)
{intn=0;
chartempname[10];
structstudentrecord[N],*p,*k;
p=record;
while(feof(fp)==0)
{fscanf(fp,"%s%20s%20s%20s%20s%20s%20s\n",p->num,
p->name,p->tel,p->sex,p->age,p->bir,p->loc);
p++;
n++;
}
fclose(fp);
printf("\n请输入要删除记录的姓名:
");
gets(tempname);
for(k=record;kif(strcmp(tempname,k->name)==0)
break;/*找到要删记录循环结束*/
if(kfor(p=k;p*p=*(p+1);
elseprintf("\n无此人!
\n");
fp=fopen("d:
\\guanli.txt","w");
if(fp==NULL)
{printf("\n打开文件失败!
\n");
return;
}
for(p=record;pfprintf(fp,"%s%20s%20s%20s%20s%20s%20s\n",p->num,
p->name,p->tel,p->sex,p->age,p->bir,p->loc);
}
voidmydelete()
{
charc;
FILE*fp;
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
");
return;}
del_name(fp);
fclose(fp);
}
voidmydisplay()
{intn=0;
structstudenttemp;
FILE*fp;
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
\n");
return;
}
while(feof(fp)==0)
{fscanf(fp,"%s%20s%20s%20s%20s%20s%20s\n",&temp.num,&temp.name,&temp.tel,&temp.sex,&temp.age,&temp.bir,&temp.loc);
printf("%s%20s%20s%20s\n",temp.num,temp.name,temp.tel,temp.loc);
n++;
}
if(n==0)
printf("\n文件中无记录!
\n");
}
voidsch_name(FILE*fp)
{intflag=0,n=0;
chartempname[10];
structstudenttemp;
printf("\n请输入要查询记录的姓名:
");
gets(tempname);
while(feof(fp)==0)
{fscanf(fp,"%s%20s%20s%20s%20s%20s%20s\n",&temp.num,&temp.name,&temp.tel,&temp.sex,&temp.age,&temp.bir,&temp.loc);
if(strcmp(tempname,temp.name)==0)
{if(flag==0)
printf("%s%20s%20s%20s%20s%20s%20s\n",temp.num,temp.name,temp.tel,temp.sex,temp.age,temp.bir,temp.loc);
flag=1;
}n++;
}
if(n==0)
printf("\n文件中无记录!
\n");
else
if(flag==0)
printf("\n文件中无此人!
\n");
}
voidmysearch()
{
charc;
FILE*fp;
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
\n");
return;
}sch_name(fp);
fclose(fp);
}
voidmymodify()
{charc;
intn=0;
structstudent*find,temp,record[100],*p;/*最多有100个记录*/
FILE*fp;
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
\n");
return;
}
p=record;
while(feof(fp)==0)
{fscanf(fp,"%s%20s%20s%20s%20s%20s%20s\n",p->num,
p->name,p->tel,p->sex,p->age,p->bir,p->loc);
p++;
n++;
}
fclose(fp);
if(n==0)
{printf("\n文件中无记录!
\n");
return;
}
printf("\n请输入要修改记录的学号:
");
gets(temp.num);
for(p=record;pif(strcmp(temp.num,p->num)==0)
{find=p;/*find记住修改记录的位置*/
break;
}
if(p==record+n)
{printf("\n无此人!
\n");
return;
}
do
{printf("请输入正确的学号:
");
do
{gets(temp.num);
}
while(strcmp(temp.num,"")==0);
printf("请输入正确的姓名:
");
gets(temp.name);
printf("请输入正确的电话号码:
");
gets(temp.tel);
printf("请输入正确的性别:
");
gets(temp.sex);
printf("请输入正确的年龄:
");
gets(temp.age);
printf("请输入正确的生日:
");
gets(temp.bir);
printf("请输入正确的家庭住址:
");
gets(temp.loc);
for(p=record;pif((strcmp(temp.num,p->num)==0)&&(p!
=find))
{printf("\n学号重复,需要重新输入吗?
(y/n)");
do
{c=getch();
}
while(c!
='Y'&&c!
='y'&&c!
='N'&&c!
='n');
putchar('\n');
break;
}
if(p==record+n)
{*find=temp;/*find指向需要修改记录的位置*/
break;
}
}
while(c=='Y'||c=='y');
fp=fopen("d:
\\guanli.txt","r+");
if(fp==NULL)
{printf("\n打开文件失败!
");
return;}
for(p=record;pfprintf(fp,"%s%20s%20s%20s%20s%20s%20s\n",p->num,
p->name,p->tel,p->sex,p->age,p->bir,p->loc);
fclose(fp);
}
voidmain()
{charchoose,yes_no;
chara,choose1;
do{printf("\n\n\n");
printf("|--------------------------|\n");
printf("|请输入编号(0-5):
|\n");
printf("|--------------------------|\n");
printf("|1--添加学生信息|\n");
printf("|2--删除学生信息|\n");
printf("|3--显示学生信息|\n");
printf("|4--查找学生信息|\n");
printf("|5--修改学生信息|\n");
printf("|0--退出|\n");
printf("|--------------------------|\n");
choose=getch();
switch(choose)
{case'1':
myadd();break;/*添加*/
case'2':
mydelete();break;/*删除*/
case'3':
mydisplay();break;/*显示*/
case'4':
mysearch();break;/*查找*/
case'5':
mymodify();break;/*修改*/
case'0':
break;
default:
printf("\n%c为非法选项!
",choose);
}
if(choose=='0')
break;
printf("\n要继续吗?
(y/n)\n");
do
{yes_no=getch();
}while(yes_no!
='Y'&&yes_no!
='y'&&yes_no!
='N'&&yes_no!
='n');
}while((yes_no!
='Y'||yes_no!
='n')&&(yes_no=='Y'||yes_no=='y'));
}