《课程设计报告书 --基于文件系统的自定义数据库.docx》由会员分享,可在线阅读,更多相关《课程设计报告书 --基于文件系统的自定义数据库.docx(74页珍藏版)》请在课桌文档上搜索。
1、课程设计报告书题目:基于文件系统的自定义数据库1 3L1312JziI可313VIAli32.Il-32. 1程序框架:33. 2主函数流程图:44. 3道路建设程序框架63.系统编码73. 1main函数73. 2CreateDataBase函数133. 3OPenDataBaSe函数163. 4SwitchToChar函数173. 5SwitchToInt函数173. 6AppendData函数183. 7Save_DataBase函数193. 8Save_as_DataBase函数203. 9BrowsDataBase函数213. 10Sort_a函数213. 11Sort_d函数243
2、. 12LocatedFor函数263. 13DeleteFor函数283. 14ChangeFor函数313. 15ZaP函数343. 16TestFunction函数343. 17DosHelp函数355. 18BuildRode.c364系统调试运行414.1帮助命令界面:414. 2creat命令创建新的数据库并打开414. 3append命令,添加数据项424 .4brows命令查看数据库全部数据425 .51。Cate查找定位命令,搜索数据库,查找关键字434 .6sort_asort_d根据关键字排序命令435 .7delete命令删除带有关键字的数据444 .8Change_f
3、or命令修改数据库中某项数据445 .9SaVe保存命令454 .10save_as另存为命令465 .11use打开新的数据库命令474. 12普里姆算法计算建设的最短道路486. 13附加功能485系统实用性检验507. 1搭建商场商品管理信息系统:505.Ll添加数据库基本项目:505.L2添加商品数据505.L3浏览数据:515.1.4根据价格排序:升序和降序525.L5修改价格:525.L6删除项目:525.L7保存文件:535.L8另存为:545.L9关闭现有数据库,打开新的数据库:555.L10用户输入出错时程序的自动判断:566课程设计总结57附录1学到的东西58附录2计算器源
4、程序59参考文献67外部文件基于文件系统的自定义数据库1系统分析1.1 背景在选择课程设计的题目时,发现大多题目都可以用基于文件系统的操作实现,而题目所需的操作也都类似,如插入数据、查找数据、排列数据、删除数据、保存数据等。在之前模仿过数据库的构建后(参考数据结构课程设计P34-57DBMS数据库管理系统),我想自己搭建一个可自定义的数据库,可由用户自己定义自己的数据库,并且管理不同的数据库,实现了FoXBASE数据库的基本功能。1.2 主要问题实现模拟命令符的识别、文件的准确读写、排序、查找、插入、删除1.3 3设计思路基于以前自己用单片机搭建的遥控智能小车的经验,明白了在程序设计前搭建好系
5、统框架的重要性,本课程设计在主函数中使用一个大WhiIe循环语句,和if判断语句实现字符命令的控制,在此基础上实现了数据库的基本操作、程序的调试。2系统设计2.1程序框架:函数实现区基本变量区测试变量区命令符控制区程序调试区数据库文件区附加功能区2.2主函数流程图:附加功能可自定义加入想要打开的文件、软件等,可扩展出很多功能。如搭建小区管理系统,数据库管理小区住户的信息,拓展功能区可加入摄像头、温度管理系统(随时查看安全隐患处的温度,提前预警)使用邻接矩阵表示的无向图:宏定义图的数据结构初始化函数定位函数普里姆算法道路生成函数道路数据文件3系统编码设计DataBase数组的结构:DataBas
6、e0DataBase1DataBase2DataBase3DataBase.data编号t0字段lt0字段2t0字段3t0DataBase.DataTypechar自定义自定义自定义File_Read_Write数组的结构:File_Read_WriteFile_Read_WriteFile_Read_WriteFile_Read_Write00.data01.data02.data03.dataFile_Read_WriteFile_Read_WriteFile_Read_WriteFile_Read_Write10.data11.data12.data13.dataFile_Read_Wr
7、iteFile_Read_WriteFile_Read_WriteFile_Read_Write20.data21.data22.data23.dataFile_Read_WriteFile_Read_WriteFile_Read_WriteFile_Read_Write30.data31.data32.data33.data其中*DataLength=5*DataCom=4每个空格代表大小为CharCh20;的字符数组所占的内存大小3.1main函数实现字符命令的控制,以及程序调试,数据库读写等操作命令intmain()(charFirStlnPUt100;记录输入的字符charSeCond
8、InPUt100;记录二次输入如文件名等charOpenFileNametlOO;记录要打开的文件的名字charSaVeASName100;记录另存为的文件名字charSortNametlOO;记录排序的字段名charLocateName100;charDeleteNameElOO;charCharName100;charChangeNameElOO;char01dCharName100;charNewCharNametlOO;char*cmdl=浏览器3.0.exe”;修改浏览器时要该动名字char*cmd2=计算器.exe”;/inthandle;intTypeNum=I;intDataL
9、ength=O;intDataCom=O;inti;FILE*fp;DataLinkList*DataBase10;测试用的变量区Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii/charch10;/Switch(ch,1234);/printf(,%sz,ch);SySten(pause);/inttest;用于测试SWitCh函数IiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiIiiiiiiiiiiiiiisystem(z,
10、color64);改变颜色DosHelpO;显示帮助界面SySteni(pause);/printfCwhile(scanf(z,%szz,FirstInput)!=EOF)SCanf(%s”,SecondInput);/SecondInput可写XXX.txt或者XXX.dochandle=creat(SecondInput,S_IREADS_IWRiTE);创建数据库文件CreateDataBase(DataBase,&TypeNum);for(i=0;idata,strlen(DataBasei-data);写入数据库printf(n);OpenDataBase(SecondInput,
11、&DataLength,DataCom);)/elseif(strcmp(FirstInput,另存为)=0)elseif(strcmp(FirstInput,use)=0)还要修改(SCanf(%s”,OpenFileName);/SecondInput可写XXX.txt或者XXX.docif(DataLength!=0&DataCom!=0)(Save_DataBase(SecondInput,&DataLength,&DataCom);Printf(原数据库已经保存n);)Zap(&DataLength,&DataCom);数组初始化OpenDataBase(OpenFileName,&
12、DataLength,&DataCom);strcpy(SecondInput,OpenFileName);将新打开的文件名复制给二次输入数组方便交换操作等)elseif(strcmp(FirstInput,“append)=0)AppendDataDataLength,&DataCom);scanf(%s,SortName);/SortNameSort_a(SortName,&DataLength,&DataCom);elseif(strcmp(FirstInput,sort_d)=0)(scanf(s,SortName);/SortNameSort_d(SortName,&DataLeng
13、th,&DataCom);)elseif(strcmp(FirstInput,“locate)=。)(SCanf(%s”,LocateName);scanf(,%sz,CharName);LocatedFor(LocateName,CharName,&DataLength,&DataCom);)elseif(strcmp(FirstInput,brows)=0)(BrowsDataBase(&DataLength,&DataCom);)elseif(strcmp(FirstInput,deletez,)=O)(scanf(z,%szz,DeleteName);scanf(,%szz,CharN
14、ame);DeleteFor(DeleteName,CharName,&DataLength,&DataCom);)elseif(strcmp(FirstInput,change-forz,)=0)(scanfChangeName);scanf(/,%szz,OldCharName);SCanf(%s”,NewCharName);ChangeFor(ChangeName,OldCharName,NewCharName,DataLength,WataCom);Save_DataBase(SecondInput,&DataLength,&DataCom);)elseif(strcmp(FirstI
15、nput,save_as)=0)(SCanf(%s”,SaveAsName);/SecondInput可写XXX.txt或者XXX.docSave_as_DataBase(SaveAsName,&DataLength,&DataCom);)elseif(strcmp(FirstInput,zap)=。)(ZapGDataLength,&DataCom);Printf(数组清空完毕!n);)elseif(strcmp(FirstInput,quit)=0)system(z,clsz);printf(n);printf119;Printf(n);printf(n);printfnzz);print
16、f(n);printf(n);printf119;printf(,谢谢使用!n);/可加入退出声明!加入退出动画printf(z,by电信3班郑浩东11,z);printf(n);SIeeP(Ioo0);延时退出break;DosHelpO;)/elseif(strcmp(FirstInput,use)=。)/SCanf(%s”,SeCOndInPUt);输入文件名称/if(fp=fopen(SecondInput,r)=NULL)判断数据库是否存在,存在则打开/Printf(数据库不存在!n);/Printf/continue;/else/Printf(数据库成功打开!n);/dosomet
17、hing!/)/)elseif(strcmp(FirstInput,cls)=O)(system(zzclsz,);)elseif(strcmp(FirstInput,test)=0)system(z,clsz,);Printf(现在进入程序测试模块!n);BuildRodeO;/SwitchToInt(,1235t0zz,&test);/printf(/,%dn,z,test);/CreateDataBase(DataBase,&TypeNum);)system(cmdl);Printf(浏览器已经打开!n);)elseif(strcmp(FirstInput,“opencalculator
18、)=0)(system(cmd2);Printf(计算器已经打开!!n);)else(Printf(语法错误!请重新输入命令(如需帮助请输入help命令)n);)/*elseif(strcmp(FirstInput,“XXXXX)=O)dosomething;*/SySten1(pause);return0;)3. 2CreateDataBase函数建立新的数据库,通过用户自定义数据库的数据类型,名称等,搭建适用用户的数据库。voidCreateDataBase(DataLinkListDataBase口,int*TypeNum)(chartou二编号t0”;建立数据库时自动添加编号字段cha
19、rch150,type150;intchlen;inti;DataBase0=(DataLinkList*)malIoc(sizeof(DataLinkList);strcpy(DataBase0-data,tou);建立编号字段Strcpy(DataBase0-DataTe,char);类型Printf(.请输入字段%d的名称以$结束输入n”,*TypeNum);printf(.);scanfch);Printf(.请输入字段%d的类型(String,int,double)n”,*TypeNum);SCanftype);whiIe(I)(if(strcmp(type,“string)=0st
20、rcmp(type,int)=0strcmp(type,“doub1e)-0)(break;)else(Printf(.您输入的类型非法!请重新输入n);Printf(.请输入字段%d的类型(string,int,double)nzz,*TypeNum);scanf(%s,type);)while(l)(if(strcmp(ch,$)=0)break;)chlen=strlen(ch);chchlen=t;添加制表符chchlen+l=,0,;结尾添加结束符防止出错DataBase*TypeNum二(DataLinkList*)malloc(sizeof(DataLinkList);strcp
21、y(DataBase*TypeNum-data,ch);讲数据类型名称复制进去strcpy(DataBase*TypeNum-DataType,type);复制类型标志*TieNum=*TypeNum+1;Printf(.请输入字段d的名称以$结束输入n”,*TypeNum);printf(.);scanf(,%szz,Ch);if(strcmp(ch,$)二二0)(break;)Printf(.请输入字段%d的类型(String,int,double)n,*TypeNum);scanf(z,%s,type);whiIe(I)if(strcmp(type,“string)=0strcmp(ty
22、pe,int)=0strcmp(type,“double)=0)break;)else(printf(.您输入的类型非法!请重新输入n);printf(.请输入字段%d的类型(string,int,double)nzz,*TypeNum);SCanftype);)for(i=0;idata,DataBasei-DataType);/可能字体有问题printfnz,);3. 3OpenDataBase函数打开建立好的数据库,并把数据库的信息全部读取在特定数组中,方便操作。voidOpenDataBase(charFiIeName,int*DataLength,int*DataCom)打开数据库,
23、并把数据读取出来,放在数组中,开始长宽都为0(FILE*fp;charFileDataEllO;charch;intIie=O;inti;memset(FileData,0,sizeof(FileData);fp-fopen(FiIeName,z,r+zz);打开文件ch=fgetc(fp);while(ch!=EOF)if(Ch=t)(strcpy(File_Reda_WriteWataLength*DataCom.data,FileData);i=strlen(File_Reda_Write*DataLength*DataCom.data);File_Reda_Write*DataLeng
24、th*DataCom.datai三,t,;/向文件交流数组写入制表符,方便写入和读取等File_Reda_Write*DataLength*DataCom.datai+l三,0;memset(FileData,0,Sizeof(FileData);复制完成后数组初始化*DataCom=*DataCom+1;Iie=O;/printf(z,fuzhichenggong!n,z);/fortest)elseif(Ch=n,)*DataLength=*DataLength+l;*DataCom=0;elseFiIeData1ie=ch;lie+;)ch=fgetc(fp);*DataLength=*
25、DataLength+l;Printf(数据库成功打开!n);)3.4SwitchToChar函数voidSwitchToChar(charch,intnum)将数字转换为字符(inti,j;charfanch10;memset(fanch,0,sizeof(fanch);初始化数组for(i=0;num!=O;i+)j=num%10;fanchi=j,0,;num=num10;)for(j=0;j,0,;)3.5SwitchToInt函数voidSwitchToInt(charch,int*num)可以去除最后含有制表符的字符串inti;intchlen;charcharcopyMAXCHA
26、RNUM;chlen=strlen(ch);for(i=0;ichlen;i+)charcopyi=chi;if(charcopych1en-1=-t,)(charcopychlen-1=,0,;chlen=chlen-l;)*num=0;for(i=0;il)自动生成编号,并写入数组。(j=strlen(File_Reda_Write*DataLength-l0.data);File_Reda_Write*DataLength-l0.dataj-l三,0;上一行的制表符用结束符代替,避免计算出错for(i=j-2;i=0;i-)sum=sum+(File_Reda_Write*DataLen
27、gth-l0.datai-,0,)*k;k*=10;sum+;SwitchToChar(bianhao,sum);File_Reda_Write*DataLength-10.dataj-l,t;讲改变的上一行的编号字符再次添加回来File_Reda_Write*DataLength-l0.dataj=,0;else(SwitchToChar(bianhao,1);)j=strlen(bianhao);bianhaoj=,t;添加制表符bianhaoj+l三,0,;strcpy(File_Reda_Write*DataLength0.data,bianhao);j=0;for(i=l;i*Dat
28、aCom;i+)(Printf(请输入:%s”,File_Reda_WriteOi.data);scanf(z,%szz,File_Reda_Write*DataLengthi.data);j=strlen(File_Reda_Write*DataLengthi.data);File_Reda_Write*DataLengthi.dataj=,t;添加制表符File_Reda_Write*DataLengthi.dataj+l三,0,;)WataLength=WataLength+1;Printf(数据成功添加到数据库中!!n);4. 7SaVe.DataBase函数voidSave_Data
29、Base(charFiIeName,intWataLength,intWataCom)/关闭数据库,并把数组中的数据写入文件中。(inti,j;FILE*fp;/intTypeLengthNfAXDATATYPE;fp-fopen(FileName,“w+);for(i=0;i*DataLength-l;i+)(for(j=0;j*DataCom;j+)(fprintf(fp,%s”,File_Reda_Writeij.data);/fputc(,t,fp);fputc(,n,fp);添加回车符)for(i=0;i*DataCom;i+)最后一行单独添加进去(fprintf(fp,s,File
30、_Reda_Write*DataLength-li.data);fclose(fp);Il*DataLength=O;/*DataCom=0;Printf(保存成功!n);)3. 8Save_as_DataBase函数voidSave_as_DataBase(charFiIeName,int*DataLength,int*DataCom)(inti,j;FILE*fp;/intTypeLengthMAXDATATYPE;fp-fopen(FileName,w+);for(i=0;i*DataLength-l;i+)(for(j=0;j*DataCom;j+)(fprintf(fp,s,File
31、_Reda_Writeij.data);/fputc(,t,fp);)fputc(,n,fp);添加回车符for(i=0;i*DataCom;i+)最后一行单独添加进去fprintf(fp,s,File_Reda_Write*DataLength-li.data);)fclose(fp);/*DataLength=O;/*DataCom=0;Printf(成功另存为%snzz,FileName);)3.9BroWSDataBaSe函数浏览数据库的全部信息voidBrowsDataBase(int*DataLength,int*DataCom)inti,j;for(i=0;i*DataLengt
32、h;i+)for(j=0;j*DataCom;j+)(printf%szz,File_Reda_Writeij.data);)printf(n);)3.10Sort_a函数voidSort_a(charSortName,intWataLength,int*DataCom)(inti;intj;/intk;intfOrExchangeSort;intfOrExchangeTag;intsortMAXDATANUM;储存要排序的列的所有数据inttagMAXDATANUM;记录排序好后输出的下标顺序for(i=0;iMAXDATANUM;i+)tagi=i;)J=Strlen(SortName);
33、为字段添加标准格式符,便于搜索SortNamej=,t;SortNamej+l三,0,;户0;for(i=0;i*DataCom;i+)(if(strcmp(SortName,File_RedaWrite0iLdata)=O)(j=i;记录字段的位置/printf(z,testsuccess!n,z);)if(strcmp(SortName,File_Reda_WriteOj.data)!=O)(Printf(没有找到相应字段!请检查是否输入错误,以下是数据库的字段:n);for(i=0;i*DataCom;i+)(printf(/,%szz,File_Reda_WriteOi.data);)
34、printf(n);for(i=0;i=0;i-)冒泡排序从小到大排列for(j=0;jsortj+l)fOrExchangeSort=Sortj;sortj=sortjl;sortj+l=fOrExchangeSort;forExchangeTag=tagj;tagj=tagj+l;tagj+l=fOrExchangeTag;*for(j=0;j*DataLengthl;j+)printf%d,tagj+l);)printf);for(j=0;j*DataLength-l;j+)(printf(,%d”,sortj);)printfnz,);*/)for(j=0;j*DataCom;j+)p
35、rintf(,z%sz,File_Reda_WriteOj.data);)printfnz,);for(i=0;i*DataLength;i+)(for(j=0;jFile_Reda_Writetagi+lj.data);printf(,n*);*for(i=0;i*DataLengthl;i+)Printf(%d,sorti);*/)3.11Sort_d函数voidSort_d(charSortName,int*DataLength,int*DataCom)(inti;intj;/intk;intfOrExchangeSort;intfOrExchangeTag;intsortMAXDATA
36、NUM;储存要排序的列的所有数据inttagMAXDATANUM;记录排序好后输出的下标顺序for(i=0;iMAXDATANUM;i+)tagi=i;)J=Strlen(SortName);为字段添加标准格式符,便于搜索SortNamej=,t;SortNamej+l三,0,;J=O;for(i=0;i*DataCom;i+)(if(strcmp(SortName,File_Reda_WriteOi.data)=O)(j=i;记录字段的位置/printf(z,testsuccess!n,z);if(strcmp(SortName,File_Reda_WriteOj.data)!=O)Prin
37、tf(没有找到相应字段!请检查是否输入错误,以下是数据库的字段:n);for(i=0;i*DataCom;i+)(printf(z,%szFile_Reda_WriteOi.data);printf(n);)for(i=0;i=0;i)冒泡排序从大到小排列(for(j=0;ji;j+)(if(j!=*DataLength_2&sortjsortj+l)fOrExchangeSort=Sortj;sortj=sortj+l;sortj+l=forExchangeSort;forExchangeTag=tagj;tagj=tagj+l;tagj+l=fOrExchangeTag;*for(j=0;
38、j*DataLengthl;j+)printf(,z%d,tagj+l);printf);for(j=0;j*DataLength-l;j+)(Printf(%d,sortj);)printf(,11,z);*/)for(j=0;j*DataCom;j+)(printf(,%sz,FileRedaWrite0j.data);)printf(n);for(i=0;i*DataLength;i+)(for(j=0;j*DataCom;j+)printf(,%s,z,File_Reda_Writetagi+lj.data);)printfnz,);)3.12LocatedFor函数voidLocat
39、edFor(charLocateName,charCharName,int*DataLength,int*DataCom)/IocateName记录要搜索的字段名CharName记录具体字段名称inti=0;intj=0;intk-0;intfOrExchangeLocateName;intfOrExchangeTag;intsortMAXDATANUM;储存要排序的列的所有数据inttagMAXDATANUM;记录排序好后输出的下标顺序for(i=o;Kmaxdatanum;i+)tagi=i;为字段添加标准格式符,便于搜索Iiiiiiiiiij=strlen(LocateName);LocateNamej=,t;LocateNamej+l三,0,;J=O;j=strlen(CharName);Ch