数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
长治学院
课程设计报告
课程名称:
数据结构
设计题目:
购房贷款管理系统(等额本息)
系别:
计算机系
专业:
计算机科学与技术
组别:
7
学生姓名:
武文超学号:
12407237
起止日期:
2013年9月23日~2013年12月29日
指导教师:
孙俊杰
目录
第一章需求分析3
1.1课程设计题目3
1.2课程设计任务及要求3
1.3课程设计思想3
1.4软硬件运行环境及开发工具3
第二章概要设计4
2.1主要的数据结构4
2.2流程图4
2.3所用方法及其原理的简要说明5
第三章详细设计5
3.1计算公式及过程5
3.2程序代码6
3.2.1建立算法程序6
3.2.2删除算法程序8
第四章调试与操作说明12
4.1运行与测试期间遇到的问题及其解决办法12
4.2说明12
第五章课程设计总结与体会12
谢辞:
14
参考文献:
14
附录:
14
购房贷款管理系统(等额本息)
-----采用不带头结点的单链表利用类型定义二(第一部分)
专业:
计算机科学与技术姓名:
武文超学号:
12407237
指导教师:
孙俊杰
第一章需求分析
1.1课程设计题目
题目:
购房贷款管理系统(等额本息)
-----采用不带头结点的单链表利用类型定义二(第一部分)
1.2课程设计任务及要求
任务:
(1)系统结构:
身份证、姓名、工作单位、贷款额、贷款日期、贷款期限、贷款利率、还款形式、还款额,信贷员。
(2)系统内容:
密码启动修改模块,数据录入模块,还款计划模块,数据删除模块,数据统计模块(分别统计贷款人数,贷款总额;还款人数,还款总额,还款本金,还款利息;已还本金,已还利息;欠款人数,欠款总额,欠款本金,欠款利息)。
要求:
(1)系统中不能同时保存两个身份证号一样的人
(2)当系统中存在一个数据库时,不能重新建立新数据库或不能从磁盘中读取新的数据库;系统中可实现几个库的切换,但内存中只能有一个库。
(3)还款计划可打印成文本文件输出。
(4)界面友好,易于操作。
1.3课程设计思想
链式存储结构中的每个结点都包含数据域和指针域两个部分,它用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的,线性表的逻辑顺序与存储顺序不是始终一致。
每个链表要占用的空间不必事先预定,而可以在需要时申请。
是一种可以灵活实现动态分配和管理的存储结构。
此处运用单链表的基本结构类型,综合运用各种运算,完成课程设计的任务及要求。
1.4软硬件运行环境及开发工具
硬件设备:
计算机一台
操作系统:
Windows7
使用环境:
VisualC++6.0.
第二章概要设计
2.1主要的数据结构
数据采用链式结构存储,每个链表要占用的空间不必事先预定,而可以在需要时申请。
表的增长通过动态存储分配解决,表的收缩通过动态存储释放实现。
2.2流程图
图1程序流程图
2.3所用方法及其原理的简要说明
后插法建立链表、密码启动修改、利用查找删除信息、系统时间提取函数、C语言文件知识、调用库函数以及各个模块之间的相互调用。
第三章详细设计
3.1计算公式及过程
按等额本息还款法:
设贷款额为a,月利率为r,年利率为R,还款月数为m,每月还款额为b,还款利息总和为x,还款总额为y
1:
R=12×r
2:
x=m×b-a
3:
第一月还款利息为:
a×r
第二月还款利息为:
〔a-(b-a×r)〕×r=(a×r-b)×(1+r)^1+b
第三月还款利息为:
{a-(b-a×r)-〔b-(a×r-b)×(1+r)^1-b〕}×r=(a×r-b)×(1+r)^2+b
第四月还款利息为:
(a×r-b)×(1+r)^3+b.....
第n月还款利息为:
(a×r-b)×(1+r)^(n-1)+b
求以上和为:
x=(a×r-b)×〔(1+r)^n-1〕÷r+n×b
4:
以上两项x值相等求得
月均还款:
b=a×r×(1+r)^m÷〔(1+r)^m-1〕
支付利息:
x=m×a×r×(1+r)^m÷〔(1+r)^m-1〕-a
还款总额:
y=m×a×r×(1+r)^m÷〔(1+r)^m-1〕
注:
a^b表示a的b次方。
3.2程序代码
3.2.1建立算法程序
voidsetlink(linklist*h)
{/*(采用后插法)建立单链表*/
charnumstr[15],ch;
lNode*q,*p,*r;
doubley;
printf("是否录入数据?
(y/n)");
scanf("%c%*c",&ch);
if(ch=='y')
{
printf("输入身份证号姓名单位贷款贷款日期期限利率方式总额信贷员\n");
p=(lNode*)malloc(sizeof(lNode));
p->next=NULL;
h->head=p;q=p;
}
while(ch=='y')
{
printf("输入身份证号:
");
gets(numstr);
while(!
strlen(numstr)||!
flagint(numstr))
{
printf("输入身份证号:
");
gets(numstr);
}
r=h->head;
while(r!
=NULL&&!
(strcmp(r->numb,numstr)==0))r=r->next;
if(r!
=NULL)
{
printf("身份证号已经存在!
是否重新录入数据?
(y/n):
");
scanf("%c%*c",&ch);
if(ch=='y')continue;
elsebreak;
}
strcpy(p->numb,numstr);
printf("输入姓名:
");
gets(p->name);
while(!
strlen(p->name)||flagint(p->name))
{
printf("输入姓名:
");
gets(p->name);
}
printf("输入工作单位:
");
gets(p->gzdw);
while(!
strlen(p->gzdw))
{
printf("输入工作单位:
");
gets(p->gzdw);
}
printf("输入贷款额(元)");
gets(numstr);
while(!
strlen(numstr)||!
flagints(numstr))
{
printf("输入贷款额(元)");
gets(numstr);
}
p->dkee=atof(numstr);
printf("输入贷款日期(2013.11.11):
");
gets(p->dkrq);
while(!
strlen(p->dkrq)||!
flagday(p->dkrq))
{
printf("输入贷款日期(2013.11.11):
");
gets(p->dkrq);
}
printf("输入贷款期限(年):
");
gets(numstr);
while(!
strlen(numstr)||!
flagint(numstr))
{
printf("输入贷款期限(年):
");
gets(numstr);
}
p->dkqx=atoi(numstr);
printf("输入贷款利率(年息):
");
gets(numstr);
while(!
strlen(numstr)||!
flagints(numstr))
{
printf("输入贷款利率(年息):
");
gets(numstr);
}
p->dkll=atof(numstr);
strcpy(p->dkxs,"本息");
y=pow((1+p->dkll/1200),p->dkqx*12);/*计算:
(1+月利率)^还款次数*/
p->hkje=p->dkee*p->dkqx*12*(p->dkll/1200)*y/(y-1);printf("输入信贷员:
");
gets(p->sidy);
while(!
strlen(p->sidy)||flagint(p->sidy))
{
printf("输入信贷员:
");
gets(p->sidy);
}
if(p!
=h->head)
{
p->next=q->next;
q->next=p;
q=q->next;
}
printf("是否继续录入数据?
(y/n)\n");
scanf("%c%*c",&ch);
if(ch=='y')
p=(lNode*)malloc(sizeof(lNode));
}
}
3.2.2删除算法程序
lNode*delnumb(linklist*h)
{/*按身份证号删除*/
lNode*p,*q;charnumb[15];charch,chs='y';
printlink(*h);
printf("\n\n");
while(chs=='y')
{
printf("请输入要删除记录的身份证号:
");
gets(numb);
while(!
strlen(numb)||!
flagint(numb))
{
printf("请输入要删除记录的身份证号:
");
gets(numb);
}
p=h->head;
while(p!
=NULL&&strcmp(p->numb,numb)!
=0)p=p->next;
if(p!
=NULL)
{
printf("\n\n身份证号姓名单位贷款贷款日期期限利率方式总额信贷员\n");
printf("%s%7s%7s%11.1lf%12s%4d%7.3lf%%本息%10.2lf%7s\n",p->numb,p->name,p->gzdw,p->dkee,p->dkrq,p->dkqx,p->dkll,p->hkje,p->sidy);
printf("\n是否删除此条记录?
(y/n):
");
scanf("%c%*c",&ch);
if(ch=='y')
{
if(p==h->head)
{
h->head=h->head->next;
q=h->head;
}
else{
q=h->head;
while(q->next!
=p)q=q->next;
q->next=p->next;
}
free(p);
printf("\n此条记录已经被删除!
!
!
");
}
}
elseprintf("\n该条记录不存在,无法进行删除操作!
!
!
");
printf("\n是否继续进行删除操作?
(y/n):
");
scanf("%c%*c",&chs);
}
returnh->head;
}
lNode*delname(linklist*h)
{/*按姓名删除*/
lNode*p,*q;
intfound,i;
charch,chs='y',cha,str[15];
printlink(*h);
printf("\n\n");
while(chs=='y')
{
printf("请输入要删除记录的姓名:
");
gets(str);
p=h->head;
found=1,i=0;
while(p!
=NULL&&found)
{
if(strcmp(p->name,str)==0)
{
printf("\n\n身份证号姓名单位贷款贷款日期期限利率方式总额信贷员\n");
printf("%s%7s%7s%11.1lf%12s%4d%7.3lf%%本息%10.2lf%7s\n",p->numb,p->name,p->gzdw,p->dkee,p->dkrq,p->dkqx,p->dkll,p->hkje,p->sidy);
printf("\n是否删除此条记录?
(y/n):
");
scanf("%c%*c",&ch);
if(ch=='y')
{
i++;
if(p==h->head)
{
h->head=h->head->next;
free(p);
p=h->head;
}
else{
q=h->head;
while(q->next!
=p)q=q->next;
q->next=p->next;
free(p);
p=q->next;
}
printf("\n此条记录已经被删除!
!
!
");
printf("\n是否继续查找相同姓名的记录?
(y/n):
");
scanf("%c%*c",&cha);
if(cha!
='y')
found=0;
}
elsep=p->next;
}
elsep=p->next;
}
if(i==0)printf("\n该条记录不存在,无法进行删除操作!
!
!
");
printf("\n是否重新进行删除操作?
(y/n):
");
scanf("%c%*c",&chs);
}
returnh->head;
}
第四章调试与操作说明
4.1运行与测试期间遇到的问题及其解决办法
问题1:
日期卡得不是太严,好几种形式都能进入系统运行程序。
解决方法:
找资料、请教同学。
问题2:
删除记录时,可以按姓名删除原数据库中没有的记录。
解决方法:
修改程序的右括号位置。
问题3:
不知怎样从磁盘读入算法程序。
解决方法:
复习C语言文件知识、请教同学。
4.2说明
有时程序好编,但调试会很繁琐。
程序较长时,可将程序分块,将程序打注释,找到程序中第一个有错误的地方,不断改正,不断调试与改进;也有可能不提示错误,但运行时出现错误,这时就需要冷静、仔细分析程序,不断改进,以达到预期效果。
第五章课程设计总结与体会
经过一个学期的学习,我对数据结构这门课程有了很大的了解。
这次的课程设计让我对自己的专业也有了更进一步的了解,也使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的。
只有把所学的理论知识与实践相结合起来,从理论中得出结论,从实践中验证理论,从而提高自己的实际动手和独立思考的能力才是成功之道。
当然,在设计的过程中遇到许许多多的问题,也可以说是困难重重,毕竟这是一次课程设计,需要掌握的知识面比较广,同时在设计的过程中也发现了自己的不足之处,对之前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
在设计中vc++软件使用的也更加的娴熟,也更加深刻的了解作为一名计算机专业的大学生,我们不仅要有过硬专业知识,更重要的是耐心和恒心。
一个看似简单的程序,也许我们只需要短短十几分钟就可以编写完成,但是我们却需要一个小时甚至更长的时间来不断地调试和改进它,让它变得完美。
但就是在这不断地修改中,我们体会到了编程带给我们的乐趣和程序完美运行时的激动快乐。
我相信其他专业的同学们是永远体会不到这样的快乐。
刚刚拿到题目的时候,心里真的是有一点小小的激动,感觉自己距离传说中的程序员更近了一步。
但是当我正式开工的时候,突然觉得很茫然,不知道应该从哪里下手。
但是通过研究学长、学姐们去年的模板,我渐渐有了思路,慢慢知道了如何下手。
我在一次次的错误中仔细研究,在一次次的警告中细心摸索,一个个模块的顺利完成,让我真的体会到了成功的喜悦。
我的课程设计内容是购房贷款管理系统,采用无头结点,单链表定义二。
系统内分为数据录入、查找、修改、插入、删除模块,还有还款情况,还款计划等模块,还具有建立数据库、调用数据库和数据库之间的切换的功能,十分方便用户使用。
每一个模块都经过了很多次的修改、完善,争取做到完美。
可是最后还是有一部分模块出现了一些小问题,没能达到完美的效果,但是我会继续努力修改,将我人生中的第一个大型编程任务换上一个圆满的句号!
这并不是一个结束,反而是另一个新的开始,是我成为一名合格的程序员的开始!
通过这次课程设计使我进一步达到理论与实际相结合,提高了自己组织数据及编写程序的能力,培养良好的程序设计技能,掌握设计程序的思路,学会用计算机语言编写程序,以实现所需处理的任务,锻炼自己的动脑能力,学会用自己的思路解决现实中的问题,虽然一开始也走了一些弯路,不过在同学和老师的帮助下顺利完成了这次课程设计任务。
这次课程设计中遇到了很多问题。
比如在编写删除模块的时候,一开始没有考虑到重名的情况,再敲完程序之后运行的时候才发现了这个严重的设计错误,而且很多模块之间还有联系,一个模块出错很多模块就需要跟着修改,所以无奈的还得从头修改。
我在调试过程中,还发生了许多小细节上的问题,它们提醒了我要在以后编程的时候注意细节,即使是一个分号的遗漏或者一个字符的误写都会造成大量的错误,浪费许多时间去寻找并修改,所以当我们编写程序的时候,一定要仔细、认真、专注,千万不能三心二意,马马虎虎。
我还有一个很深的体会就是格式和注释,由于平时不注意格式和注释这方面的要求,导致有的时候在检查和调试的时候很不方便。
有的时候甚至刚刚完成一部分的编辑,结果一不注意,就忘记了这一部分程序的功能。
修改的时候也有不小心误删的情况出现。
如果注意格式风格,并且养成随手加注释的习惯,就能减少这些不必要的反复和波折。
还有一点,就是在修改的时候,要注意修改前后的不同点在哪里,改后调试结果要在原有的基础上更加精确。
回顾这次的课程设计,令我仍感慨颇多。
从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,我学到了很多的东西,不仅巩固了以前所学过的知识加深了对编程知识的认识,而且学到了很多在书本上所没有学到过的知识,尤其是那些从书本里学不到的经验。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正的学好一门课。
这次的课程设计虽然完成了,但是我的编程之路才刚刚开始。
我要以此次课程设计为起点,不断的锻炼自己,加强自己的编程能力,了解更多的计算机知识,在学习中不断提高自己,完善自己。
为以后考研,找工作打下坚实的基础。
这次课程设计真的很锻炼人,让我学习到很多做人的道理:
做什么事情都要认真仔细、有恒心、有耐心,要善始善终,把每一件事情都尽自己最大的努力去完成,这样在回忆这件事的时候才不会后悔自责!
我很感谢在做课程设计过程同学们对我的帮助,让我体会到团队力量的强大!
致谢:
最后我很感谢在我完成课程设计过程中孙俊杰老师我的帮助。
没有您的帮助不可能这么快、这么好的完成此次课程设计。
是您在我迷茫时是给予我帮助,真的很感谢您!
参考文献:
【1】《C程序设计(第四版)》,谭浩强编著,清华大学出版社,2010
【2】《C程序设计(第四版)学习辅导》,谭浩强编著,清华大学出版社,2010
【3】《数据结构(C语言版)》,严蔚敏,吴伟民著,清华大学出版社,2007
附录:
暂无。
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.1
2、设计技术水平
0.4
3、编程风格
0.2
4、设计报告书写及图纸规范程度
0.3
总成绩