学生籍贯信息记录簿课程设计报告.docx
- 文档编号:3844536
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:94.70KB
学生籍贯信息记录簿课程设计报告.docx
《学生籍贯信息记录簿课程设计报告.docx》由会员分享,可在线阅读,更多相关《学生籍贯信息记录簿课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
学生籍贯信息记录簿课程设计报告
《高级语言》课程设计
题目:
学生信息记录簿
学院班级
姓名学号
成绩指导老师
年月日
目录
一、目的
二、题目要求
三、系统设计
四、程序代码和运行结果
五、编程中遇到的困难及解决方法
六、心得体会
七、参考文献
一、目的
1.进一步掌握和利用C语言进行程序设计的能力
2.进一步了解和运用文件和链表的思想和方法
3.初步掌握开发一个小型实用系统的基本方法
4.学会调试一个较长程序的基本方法
5.掌握书写程序设计开发文档的能力
二、题目要求
编制一个学生籍贯信息记录簿,每个学生信息包括:
学号、姓名、籍贯。
具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的籍贯信息;
(3)按学号或姓名查询其籍贯;
(4)按籍贯查询并输出该籍贯的所有学生;
(5)能添加、删除和修改学生的籍贯信息;
(6)显示输出唐山籍和非唐山籍学生的信息并可分别存盘。
三、系统设计
1.设计原始资料
(1)链表基础知识
(2)文件处理基础知识
2.数据结构
structStudent
{
charnum[21];//学生学号
charname[256];//学生姓名
charaddress[562];/学生籍贯
structStudent*next;
};
声明一个结构体类型Student
3.模块设计
(1)creat函数:
添加需要录入的学生信息
(2)name_surch函数:
根据姓名查找学生
(3)num_surch函数:
根据学号查找学生
(4)NativePlace_surch函数:
按籍贯查找学生
(5)modification_shiyan函数:
修改学生信息
(6)showSzechwan_No函数分别显示唐山和非唐山籍学生并非别存盘
(7)print_save函数:
保存文件信息
(8)fileout函数:
显示文件信息
2.程序流程图
四、程序代码和运行结果
程序代码
#include
#include
#include
#defineLENsizeof(structStudent)
structStudent
{
charnum[21];
charname[256];
charaddress[562];
structStudent*next;
};
intn;//n为全局变量,本文件模块中各函数均可使用它
structStudent*creat()//定义函数。
此函数返回一个指向链表头的指针
{
structStudent*head;
structStudent*p1,*p2;
n=0;
p1=p2=(structStudent*)malloc(LEN);
printf("请依次输入学生的信息,输入学号为零时退出。
\n");
printf("学号\t姓名\t地址\n");
scanf("%s%s%s",p1->num,p1->name,p1->address);
head=NULL;
while(p1->num[0]!
='0')//当学号是0时,退出
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(structStudent*)malloc(LEN);//开辟动态存储区,把起始地址付给p1
printf("学号\t姓名\t地址\n");
scanf("%s%s%s",p1->num,p1->name,p1->address);
}
p2->next=NULL;
system("cls");
return(head);
}
voidprint_save(structStudenthead)
{
FILE*fp;
structStudent*p;
fp=fopen("D:
\\stduent.txt","wb+");//打开文件
if(fp==NULL)
{
printf("文件无法打开\n");
exit(0);
}
printf("\n现在,有%d条记录,分别是:
\n",n);
p=&head;
if(&head!
=NULL)
do
{
printf("\n学号:
");
puts(p->num);
printf("\n姓名:
");
puts(p->name);
printf("\n地址:
");
puts(p->address);
fseek(fp,0,2);
if(fwrite(p,sizeof(structStudent),1,fp)!
=1)
printf("文件无法写入\n");
p=p->next;
}while(p!
=NULL);
fclose(fp);//关闭文件
getchar();
system("cls");
}
structStudent*pt;//定义一个Student类型的指针
charcomp[3];//comp为保存输入的变量
intmain()//一个调用这个creat函数的main函数c
{
voidShowView();//界面显示
voidname_surch();//按姓名查找
voidnum_surch();//按学号查找
voidNativePlace_surch();//按籍贯查找
voidmodification_shiyan();//修改学生信息
voidshowSzechwan_No();//分别显示唐山和非唐山籍学生并非别存盘
voidfileout(structStudent*p);//文件输出
voidprint_save(structStudenthead);
while
(1)
{
ShowView();
if(strnicmp(comp,"1",3)==0)//strnicmp比较两个字符串的函数
{
pt=creat();//函数返回链表第一个结点的地址
}
elseif(strnicmp(comp,"2",3)==0)
{
print_save(*pt);
}
elseif(strnicmp(comp,"3",3)==0)//输出文件内容
{
fileout(pt);
}
elseif(strnicmp(comp,"4",3)==0)
{
name_surch();
}
elseif(strnicmp(comp,"5",3)==0)
{
num_surch();
}
elseif(strnicmp(comp,"8",3)==0)
{
//modification();
modification_shiyan();//修改学生信息
}
elseif(strnicmp(comp,"7",3)==0)
{
showSzechwan_No();
}
elseif(strnicmp(comp,"6",3)==0)
{
NativePlace_surch();
}
elseif(strnicmp(comp,"0",3)==0)
{
break;
}
else
{
printf("输入错误!
!
!
!
!
!
\n");
}
getchar();
system("cls");
}
return0;
}
voidfileout(structStudent*p)
{
inti;
FILE*fp;
printf("现在有%d条记录,分别是:
\n",n);
fp=fopen("D:
\\stduent.txt","rb");//0x00429af0
if(fp==NULL)
{
printf("文件无法打开\n");
exit(0);
}
rewind(fp);
for(i=0;i { fread(p,sizeof(structStudent),1,fp);//从文件中读取一块数据 printf("%6s",p->num); printf("%6s",p->name); printf("%6s",p->address); puts("\n"); } fclose(fp); getchar(); system("cls"); } voidShowView()//主菜单 { printf("**********************欢迎进入学生籍贯信息记录簿*******************************\n"); printf("\n"); printf("*******************************************************************************\n"); printf("****1、添加学生信息********\n"); printf("****2、保存当前信息********\n"); printf("****3、显示文件中的信息********\n"); printf("****4、按名字搜索********\n"); printf("****5、按学号搜索********\n"); printf("****6、按籍贯搜索********\n"); printf("****7、分别显示唐山和非唐山籍学生并非别存盘********\n"); printf("****8、修改学生信息********\n"); printf("****0、退出********\n"); printf("*******************************************************************************\n"); printf("********************请输入您的选择: "); gets(comp); system("cls");//清屏 } voidname_surch() { FILE*fp; charsurch[256]; printf("请输入要查询的人的名字: \n"); gets(surch); fp=fopen("D: \\stduent.txt","r");//0x00429af0 if(fp==NULL) { printf("不能打开文件\n"); exit(0); } rewind(fp);//指向文件的开始 while(! feof(fp))//查找 { Studenta; while(! feof(fp)) { fread(&a,sizeof(Student),1,fp);//从p指向的文件读入一组数据 if(! strcmp(a.name,surch)) { printf("%s,%s,%s\n",a.num,a.name,a.address); break; } } if(! feof(fp)) {return;} else { printf("查无此人····\n"); } } fclose(fp); getchar(); system("cls"); } voidnum_surch() { FILE*fp; charsurch[256]; printf("请输入要查询的人的学号: "); gets(surch); fp=fopen("D: \\stduent.txt","rb");//0x0042aab8 if(fp==NULL) { printf("ERROR"); exit(0); } rewind(fp);//指向文件的开始 while(! feof(fp))//查找 { Studenta; while(! feof(fp)) { fread(&a,sizeof(Student),1,fp);//从p指向的文件读入一组数据 if(! strcmp(a.num,surch)) { printf("%s,%s,%s\n",a.num,a.name,a.address); break; } } if(! feof(fp)) {return;} else { printf("查无此人····\n"); } } fclose(fp); getchar(); system("cls"); } voidNativePlace_surch()//按籍贯查询 { FILE*fp; charsurch[256]; printf("请输入要查询的人的籍贯: \n"); gets(surch); fp=fopen("D: \\stduent.txt","rb");//0x00429af0 if(fp==NULL) { printf("文件打不开\n"); exit(0); } rewind(fp);//指向文件的开始 Studenta; while(! feof(fp)) { fread(&a,sizeof(structStudent),1,fp);//从p指向的文件读入一组数据 if(! strcmp(a.address,surch))//相当于strcmp(a.address,surch)==0 { printf("%s,%s,%s\n",a.num,a.name,a.address); } } if(! feof(fp)) {return;} fclose(fp); getchar(); system("cls"); } voidshowSzechwan_No()//分别显示唐山和非唐山籍学生并非别存盘 { FILE*fp; FILE*sfp;//指向唐山籍学生文件 sfp=fopen("D: \\唐山stduent.txt","wb"); if(sfp==NULL) { printf("不能打开文件\n"); exit(0); } FILE*ffp;//指向非唐山籍学生文件 ffp=fopen("D: \\非唐山stduent.txt","wb"); if(ffp==NULL) {printf("不能打开文件\n"); exit(0);} fp=fopen("D: \\stduent.txt","rb"); if(fp==NULL) { printf("不能打开文件\n"); exit(0); } rewind(fp);//指向文件的开始 printf("唐山籍学生信息: \n"); Studenta; inti; for(i=0;i { fread(&a,sizeof(structStudent),1,fp);//从p指向的文件读取一组数据 if(! strcmp(a.address,"唐山")||! strcmp(a.address,"tangshan")||! strcmp(a.address,"tangshanshi")||! strcmp(a.address,"唐山市")) { printf("%s,%s,%s\n",a.num,a.name,a.address); if(fwrite(&a,sizeof(structStudent),1,sfp)! =1) { printf("文件无法写入\n"); break; } } else { if(fwrite(&a,sizeof(structStudent),1,ffp)! =1) printf("文件无法写入\n"); } } fclose(fp); fclose(ffp); fclose(sfp); printf("非唐山籍学生信息: \n"); ffp=fopen("D: \\非唐山stduent.txt","rb"); if(NULL==ffp) { printf("文件打不开\n"); } for(i=0;i { fread(&a,sizeof(structStudent),1,ffp);//从p指向的文件读取一组数据 if(a.num=="0") break; printf("%s,%s,%s\n",a.num,a.name,a.address); } fclose(ffp); getchar(); system("cls"); } voidmodification_shiyan()//修改学生信息 { FILE*fp; FILE*fptemp; structStudenta; charsurch[256]; printf("请输入要修改的人的学号: \n"); gets(surch); fp=fopen("D: \\stduent.txt","rb");//0x0042aab8 fptemp=fopen("D: \\temp.txt","wb"); if(fp==NULL) { printf("文件打不开\n"); exit(0); } rewind(fp);//指向文件的开始 while(! feof(fp)) { fread(&a,sizeof(structStudent),1,fp);//从p指向的文件读入一组数据 if(0==strcmp(a.num,surch)) { charp; printf("%s,%s,%s\n",a.num,a.name,a.address); printf("如果以上信息与你要修改的人的信息对应,请输入(y/n): \n"); scanf("%c",&p); if('Y'==p||'y'==p) { printf("请输入要修改成的信息(学号、姓名、籍贯): \n");getchar(); printf("学号: "); gets(a.num); printf("姓名: "); gets(a.name); printf("地址: "); gets(a.address); } } fwrite(&a,sizeof(structStudent),1,fptemp); } fclose(fp); fclose(fptemp); FILE*bb; FILE*pp; bb=fopen("D: \\stduent.txt","wb");//0x0042aab8 pp=fopen("D: \\temp.txt","rb"); while(! feof(pp)) { fread(&a,sizeof(structStudent),1,pp); fwrite(&a,sizeof(structStudent),1,bb); } getchar(); getchar(); system("cls"); } 运行结果 1.进入界面 当每一个操作结束时,系统都会自动清屏,并返回主菜单,以保证屏幕整洁。 使用户能拥有一个好的心情使用此软件。 输入3,按enter键,查看文件中所存储的所有信息。 2.添加学生信息界面 3.保存信息界面 4.按姓名查找 5.按学号查找 6.按籍贯查找 7.分别显示唐山和非唐山籍贯学生信息并存盘 8.修改学生信息 按提示操作,如果现实的学生的信息是你要修改的,就输入y。 再输入要改成的详细信息,按enter键保存、退出。 五、编程中遇到的困难和解决方法 困难: 1.由于fread以及fwrite不能较熟练的应用,在实现唐山和非唐山籍学生分类时出错。 2.偶尔会出现文件打开错误的情况或者乱码现象 解决方法: 1.看书熟悉fread和fwrite的使用规则,在此基础上对程序加以修改 2.同时认真检查文件的打开格式是否出错,避免因打开方式错误而导致程序不能正常运行 六、心得体会 为了提高我们的实践能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期二周的VisualC++课程设计实习,并安排了指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。 在此次字符统计程序开发过程中,有很多东西值得我们思考并总结。 开发过程大体可分为以下几个步骤: (1)思考总体设计方案: 总体结构和模块外部设计,功能分配。 思考要实现整个程序大体需要的几个模块和其中用到的VisualC++语言基本操作符、语句等。 (2)画出总体设计方案流程图: 用流程图的形式展现你的基本编程思想。 (3)流程图具体化: 即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。 (4)编辑程序代码: 这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。 (5)代码的调试: 在VisualC++6.0环境下输入代码并进行调试和正确运行。 在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。 (6)最后修饰: 程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。 通过这次课程设计,使我们更加熟悉的掌握了VisualC++语言的运用。 帮助我们熟悉了更多VisualC++语言的功能,提高了我们的动手能力,学到了许多解决实际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。 我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。 七、参考文献 [1]马安鹏.Visua
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 籍贯 信息 记录簿 课程设计 报告