链表的维护与文件形式的保存.docx
- 文档编号:4383707
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:79.10KB
链表的维护与文件形式的保存.docx
《链表的维护与文件形式的保存.docx》由会员分享,可在线阅读,更多相关《链表的维护与文件形式的保存.docx(15页珍藏版)》请在冰豆网上搜索。
链表的维护与文件形式的保存
链表的维护与文件形式的保存
一、软件源代码与测试数据
(1):
测试数据:
输入今天的年,月,日060906
输入昨天的年,月,日060905
选择1,选择2,选择3;选择4
选择5
Input:
型号进价售价进货渠道经办人数量
115108280
选择5
Input:
236107170
选择5
Input:
21122082100
选择6
Input:
115108210
选择6
Input:
236107120
选择11
Account=130
选择9
存盘总库存文件:
115108270
21122082100
236107150
进货文件:
115108280
21122082100
236107170
售货文件:
115108210
236107120
选择12
(2)测试数据输入今天的年,月,日060907
输入昨天的年,月,日060906
选择1,选择2,选择3;选择4
选择5型号进价售价进货渠道经办人数量
Input:
32101535100
选择5
Input:
318204350
选择6
Input:
211220824
选择6
Input:
3210153512
选择11
Account=92
选择9
存盘总库存文件:
115108270
2112208296
236107150
318204350
3210153588
进货文件:
318204350
32101535100
售货文件:
211220824
3210153512
选择12
(3)测试数据输入今天的年,月,日060908
输入昨天的年,月,日060907
选择1,选择2,选择3;选择4
选择5型号进价售价进货渠道经办人数量
Input:
115108220
选择6
Input:
318204310
选择11
Account=120
选择9
存盘总库存文件:
115108290
2112208296
236107150
318204340
3210153588
进货文件:
115108220
出货文件:
318204310
选择10(当今日库存文件损坏,恢复系统)
总库存文件:
115108290
2112208296
236107150
318204340
3210153588
选择12
(4)测试数据
选择8输入查询日期:
060907
库存:
115108270
2112208296
236107150
318204350
3210153588
选择7输入查询方式1,品牌2,名字1
输入数字1
Amount=90
选择7输入查询方式1,品牌2,名字2
输入数字2
Amount=88
选择12
二.设计报告
(1).算法思想
a数据结构设计:
数据域:
家电型号(由品牌+产品名组成);
进货价;
售货价;
进货渠道;
经办人;
进货数量
typedefstructchanpin
{
intxinhao;
intinprice;
intoutprice;
intqudao;
intmanager;
intshuliang;
structchanpin*next;
}WU;
数据说明
型号=品牌+名字(品牌:
1:
熊猫2:
康佳3:
海尔4:
松下5:
LG6:
小天鹅)
(名字:
1:
洗衣机2:
电冰箱3:
电视机4:
空调5:
音响设备)
进货渠道(1:
南京**电器公司2:
深圳***电器公司3:
上海***公司4:
浙江***公司5:
杭州***公司6:
太原***公司7:
天津**电器公司8:
青岛***公司)
经办人(1:
manager12:
manager23:
manager34:
manager45:
manager5)
文件结构
每日库存.txt每日进货.txt每日售货.txt
b功能设计
Case1创建空的每日库存文件
Case2创建空的每日进货文件
Case3创建空的每日售货文件
Case4读空文件,建链表
Case5进货
Case6提货
Case7通过品牌,名称查询库存量
Case8通过日期查询历史文件
Case9下班存盘
Case10出现故障,若今日文件损坏,如何根据日志文件恢复系统
Case11下班结帐
Case12退出功能菜单
(2)程序结构
a自定义类型WU(包括以上的数据域)
b全局常量(包括一些下文用到的Path[5]=”d:
\\”,Postfix[5]=”.txt”,ZKC[5]=”zkc”,IN[5]=”in”,OUT[3]=”out”,m=0;
c符号指针*head1(读取库存文件所生成的链表表头),*head2(读取每日进货文件所生成链表表头),*head3(度曲每日售货文件所生成链表表头),*tempchin(查询时所使用的链表的表头),*p,*q;
Account(每个工作日后结帐数目),choice,method(查询时所要选择的方法选择),number(查询时输入的数据),amount(查询后得到的结果);
d函数的说明
①char*getfilename(charfilename1[],charfilename2[])
{
charfilename[40],*p=filename;
inti;
for(i=0;Path[i]!
='\0';i++)
filename[i]=Path[i];
filename[i]='\0';
strcat(filename,filename1);
strcat(filename,filename2);
strcat(filename,Postfix);
return(p);
}
/*由于保存的文件名是以路径+性质(如zkc)+日期+文件后缀,所以我们要根据某些字符串构成文件名,这就是这个函数的意义所在*/
②WU*insert(WU*head,WU*new)
{
WU*p,*pre;
for(pre=head,p=pre->next;p;pre=p,p=p->next)
if(p->xinhao>=new->xinhao)break;
if(p==NULL||p->xinhao>new->xinhao)
{new->next=p;
pre->next=new;
}
else
{p->shuliang+=new->shuliang;}
return(head);
}
/*向链表中添加接点,这种是普通的插入*/
③WU*insert1(WU*head,WU*new)
{
WU*p,*pre;
for(pre=head,p=pre->next;p;pre=p,p=p->next)
if(p->xinhao>=new->xinhao)break;
if(p==NULL||p->xinhao>new->xinhao)
{new->next=p;
pre->next=new;
m++;
}
else
{p->shuliang+=new->shuliang;}
return(head);
}
/*向链表中添加结点,这个函数是为下文的查询读文件时设置循环条件时使用*/
④WU*delete(WU*head,WU*new)
{WU*p;
for(p=head;p;p=p->next)
{if(p->xinhao==new->xinhao)
{p->shuliang-=new->shuliang;
if(p->shuliang==0)
{p->next=p->next->next;
m--;
}
}
}
return(head);
}
/*从链表中删除接点*/
⑤Voidsave(WU*head,charfilename[])
{
WU*cursor;
FILE*fp;
cursor=head;
if((fp=fopen(filename,"w"))==NULL)
{printf("Thisfilecannotbeopened!
\n");
}
for(cursor=head;cursor->next!
=NULL;cursor=cursor->next)
{fprintf(fp,"%-3d%-3d%-3d%-3d%-3d%-3d\n",cursor->next->xinhao,cursor->next->inprice,cursor->next->outprice,cursor->next->qudao,
cursor->next->manager,cursor->next->shuliang);
}
fclose(fp);
}
/*把链表以文件的形式保存起来*/
⑥WU*load(charfilename[])
{
WU*tempnode,*head,*cursor;
FILE*fp;
head=(WU*)malloc(sizeof(WU));
if(head==NULL)
{printf("\nerror,endprogram");
exit(0);
}
head->next=NULL;
cursor=head;
if((fp=fopen(filename,"w"))==NULL)
{puts("\nthisfilecannotbeopened");
exit(0);
}
while(head->next!
=NULL)
{tempnode=(WU*)malloc(sizeof(WU));
fscanf(fp,"%d%d%d%d%d%d\n",&tempnode->xinhao,&tempnode->inprice,&tempnode->outprice,&tempnode->qudao,&tempnode->manager,&tempnode->shuliang);
tempnode->next=NULL;
cursor->next=tempnode;
cursor=cursor->next;
}
printf("\n");
fclose(fp);
return(head);
}
/*把空文件中转变为链表形式*/
⑦Voidcreatempty(charfilename[])
{
WU*head;
FILE*fp;
head=(WU*)malloc(sizeof(WU));
head->xinhao=2;
head->inprice=0;
head->outprice=0;
head->qudao=0;
head->manager=0;
head->shuliang=0;
head->next=NULL;
if((fp=fopen(filename,"a+"))==NULL)
{printf("thefile%scannotbecreated!
\n",filename);
}
fprintf(fp,"%d%d%d%d%d%d\n",head->xinhao,head->inprice,head->outprice,head->qudao,head->manager,head->shuliang);
fclose(fp);
}
/*根据文件名创建空文件*/
⑧Voidprint(WU*head)
{WU*p;
for(p=head->next;p;p=p->next)
printf("%-3d%-3d%-3d%-3d%-3d%-3d\n",p->xinhao,p->inprice,p->outprice,p->qudao,p->manager,p->shuliang);
}
/*把链表中的内容打印出来*/
⑨WU*load1(charfilename[])
{
WU*tempnode,*head,*cursor;
FILE*fp;
head=(WU*)malloc(sizeof(WU));
if(head==NULL)
{printf("\nerror,endprogram");
exit(0);
}
head->next=NULL;
cursor=head;
if((fp=fopen(filename,"r"))==NULL)
{puts("\nthisfilecannotbeopened");
exit(0);
}
while(m>=0)
{tempnode=(WU*)malloc(sizeof(WU));
tempnode->next=NULL;
fscanf(fp,"%d%d%d%d%d%d\n",&tempnode->xinhao,&tempnode->inprice,&tempnode->outprice,&tempnode->qudao,&tempnode->manager,&tempnode->shuliang);
cursor->next=tempnode;
cursor=cursor->next;
m--;
}
printf("\n");
return(head);
}
/*把不为空的文件转变为链表*/
e函数关系图
(3).技术讨论
A文件有序,无序的选择
通过产品编号的大小建立一个有序文件
B文本文件/二进制文件的选择
选择文本文件便于操作
C数据一致性的保持
在多个文件中,使总库存文件=进货文件—售货文件;如果不符,则说明出现错误
D多文件下,如何保证写记录的完整性
当进货时,不仅要向总库存文件里面添加记录,还要向进货文件添加记录;当售货时,在售货文件里添加记录的同时,还要在总库存文件里删除该记录。
E若今日库存文件损坏,如何根据日志文件恢复系统
见功能设计case10
有哪些可改进之处:
在技术讨论5里提到“若今日库存文件损坏,如何根据日志文件,恢复系统”可改为:
“若其中有任何一天的库存文件损坏,根据已知的文件,恢复系统。
”
Input:
损坏文件的日期:
*年*月*日
损坏文件的前一天日期:
*年*月*日)
WU*regood(charriqi[])
{WU*head1,*head2,*head3,*head4,*p;
Filename1=Getfilename(riqi2)(昨天的总库存文件);
filaname2=Getfilename(riqi1)(今天的进货文件);
Filename3=Getfilename(riqi1)(今天的售货文件);
head1=load(filename1);
head2=load(filename2);
head3=load(filename3);
for(p=head2;p;p=p->next)
insert(head1,p);
for(p=head3;p;p=p->next)
delete(head1,p);
return(head1);
}
(4)收获与体会
这次课程设计就是编程,我想先就单单对编程提一点感想和认识。
首先,写程序必须先确定整体框架,然后根据框架写出主函数,然后根据主函数的需要写出所需要的子函数。
可能有时在程序运行时会出现与预先不相符的情况,这时就需要重新写出一个子函数,哪怕这个子函数就是在原有的一个子函数的基础上改那么一丁点的地方。
第二,通过这次课程设计,我对指针的运用有了一个感性的认识。
原来在学习C语言时,知道了好多关于指针的知识,如:
指针数组,指针函数,指向函数的指针……,但在那时学习时只知道指针是表示地址的东西,通过指针可以找到这个指针数值所表示的地址里的东西,指针是跟其他变量不一样的,在使用时要多多留心。
停留在对书本上的认识总是得不到清晰明了的认识。
在我这次设计的课题里要使用到一个将多个字符串拼接构成一个新的字符串作为文件名的函数,在函数里拼接完字符串之后涉及到一个返还字符串的问题。
刚开始写这个函数时还想当然地认为只要返回一个字符串就可以了,但后来我在程序初步运行时我要使用的filename虽然是使用了这个函数,但却得不到我拼接好的字符串。
后来我又检查了几遍这个函数,在函数运行过程中它的运行都是正常的,但在主函数使用时却不是刚刚拼接好的字符串作为文件名,后来经过多次实验我才发现原来在子函数中是不可以直接返回字符串的,只可以返回字符。
但是我要用的是字符串,怎么办呢?
这时我就想到了上学期我们在学习哈夫曼树时用到了一个小函数使用指针把子函数里生成的东西带出来的情况,照此可以类推。
然后我就在我使用的这个函数里加了指针,让它的返回值是指针,然后再把指针所指向的内容放到一个字符串就可以了。
-----需要是发明之母
第三.这次课程设计最大的收获可能就是对文件的使用这块了。
恰巧这次我们的课题就是《链表的维护与文件形式的保存》,在当初我学C语言时文件这块我就没学好,在课程设计之前,我连打开文件,文件的读写我都需要翻书照着依葫芦画瓢写,根本不懂什么来龙去脉。
对书上所讲的“文件的流”根本就不懂是个什么玩意儿。
因为这个课题涉及大量的文件保存,文件读写,慢慢地使用也就深刻地记得了。
在使用文件时也要注意一些小的细节,生活中的“不拘小节”可能在程序设计中给你带来不必要的麻烦,对这点我有深切的体会。
譬如说我开始在写文件的路径时“D:
\\,我写成了D:
\,虽然这看起来问题不大,但在使用时它就会造成文件写不到或者读不到指定的文件,这时你会怎么找也找不到问题所在,当你发现之后你会恍然大悟,接着是后悔万分。
还有就是在使用文件名这个参数时究竟应不应该在filename上加上双引号,经过老师的指点,我知道了如果加上双引号就是建立使用的以filename为文件名的文件,而不加上引号就是使用的filename所代表的字符的文件名的文件,两者大相径庭。
原来我们在使用文件时都没有一个好的习惯把文件给关了,但有时读文件完不把文件给关了会给下面的程序使用该文件带来麻烦。
-----实践出真知
第四.原来我在使用电脑时,尤其是在用TC编程时很少有感觉电脑的速度在程序运行时起到一定的作用。
刚开始我在程序中创建空文件,在用户选择启动系统时创建空文件,我把创建三个文件放在同一个case中。
运行时却发现同样的三条语句,创建文件的条件全都具备,但前面两个文件能够创建,而最后的一个文件却不能创建,问题到底出在哪里呢?
我把程序用单步跟踪执行了几遍,在单步跟踪时三个文件就能全部创建,这就很矛盾了。
说明程序本身没有错误,可能是机器反映问题。
然后我就想到了把建立文件的这三条语句进行分解,放到不同的三个case里面,以减轻机器反映速度的负担。
这是通过这次课程设计得到的几点关于程序设计的几点具体的认识,我以后在编程时要在这次犯的错误上引以为戒。
不过这次课程设计最大的体会就是“要有足够的耐心和信心,这样失望才能变成希望。
”
可能在你刚刚开始启动它时你会发现你有各种各样的想法,但在你操作过程中,你会发现很多的问题,这时就需要你冷静地面对你所遇到的问题,心急是解决不了问题的。
我记得我在建立空文件时,我把程序中的语句一遍遍地对应着语法进行检查——没有错误;可我在所指定的文件路径下就是没有我所创建的文件。
当时我记得我找这个错误花了一个晚上带一个上午。
按F7单步跟踪几乎那个键都快被我砸坏了,最终当我在D:
\\下看到我所建的那个文件时,我心里有一种说不出的高兴。
还有就是在课程设计的末期,可能有很多组已经把成果提交给老师看了,而可能你们的课题还没有做完,这时你会觉得很着急,事实上越到这种时候你越要冷静,要有耐心把课题做完。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 维护 文件 形式 保存