C语言程序设计报告菜单+源码+测试.docx
- 文档编号:3771137
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:58.45KB
C语言程序设计报告菜单+源码+测试.docx
《C语言程序设计报告菜单+源码+测试.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告菜单+源码+测试.docx(20页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告菜单+源码+测试
一:
系统功能
基本功能:
图书的录入,删除,查找,和导入导出等。
图书属性:
书号,书名,第一作者,版次,出版年等。
菜单功能:
1.InputRecords(输入若干条记录)
从键盘一次输入一本书的信息,存放到结构体数组中,然后显示。
提示信息,确认是否输入下一条记录。
2.DisplayAllRecords(显示所有记录)
按顺序显示所有记录,每屏显示10条记录,按
3.DeleteaRecord(按书名查找,删除一本书)
输入待删除书的书名,显示该书名的所有书目,提示输入待删除书目的书号,提示是否删除,确认后,删除该书。
4.Sort(排序)
以书名为升序排列数组
5.Insertarecord(插入一条记录)
以书名为序排列的数组中插入一条记录,插入后,数组仍然有序。
输出插入成功后的信息。
6.Query(查找并显示一个记录)
输入书名,查找并显示包含该书名的所有图书信息
7.AddRecordsfromaTextFile(从文件读入图书信息到结构体数组中)
用户可事先建立一个文本文件Dictory.txt。
存放所有图书信息,文件格式如下:
2
1182高等数学刘浩荣5同济大学出版社2013
7300物理化学王德明2化学工业出版社2015
8.WritetoaTextFile
将数组中的全部记录写入文件Records.txt中,要求格式与Dictory.txt相同。
1.Quit(退出图书管理系统)
新增加菜单功能:
9.Changearecord
修改某一条记录的值
a.Menu
显示菜单
b.ClearScreen
清屏
c.Pause
按暂停,按任意键继续
二:
数据结构
Typedefstruct
{
charISBN[10];//书号
charbook[30];//书名
charauthor[20];//作者
Intedition;//版本号
charpress[50];//出版社名
intyear;//出版年
}Bookinfo;
三:
函数调用关系
四:
主要算法及实现
b=strcmp((*s).book,dictList[i].book)>=0
c=strcmp((*s).book,dictList[i+1].book)<=0
语句A:
dictList[j]=dictList[j-1];
语句B:
dictList[i+1]=*s;
插入算法
排序算法
b=strcmp(dictList[p].book,dictList[j].book)
语句A:
t=dictList[p];
dictList[p]=dictList[i];
dictList[i]=t;
五:
源程序(含注释)
#include
#include
#include
#defineNUM100
typedefstruct//定义结构体数组
{
charISBN[10];//书号
charbook[30];//书名
charauthor[20];//作者
intedition;//版本号
charpress[50];//出版社名
intyear;//出版年
}Bookinfo;
intInput(BookinfodictList[],intn)//从键盘输入数据,存入结构体数组dictList
{
charc1,c2;
do{
c1=getchar();
printf("PleaseinputISBN:
\n");
gets(dictList[n].ISBN);
printf("Pleaseinputbook:
\n");
gets(dictList[n].book);
printf("Pleaseinputauthor:
\n");
gets(dictList[n].author);
printf("Pleaseinputpress:
\n");
gets(dictList[n].press);
printf("Pleaseinputedition:
\n");
scanf("%d",&dictList[n].edition);
printf("Pleaseinputyear:
\n");
scanf("%d",&dictList[n].year);
n+=1;
printf("是否输入下一条?
确认(y)|取消(n)\n");//提示信息
c1=getchar();
}while((c2=getchar())=='y');
return(n);//返回值为新的记录数量
}
voidDisplay(BookinfodictList[],intn)//显示所有记录,每10个暂停一次,输入回车继续显示
{
inti=0,j;
charinput,c;
printf("%-10s%-23s%-18s%-8s%-15s%-4s\n","ISBN","book","author","edition","press","year");
c=getchar();
do{
j=10;//每10个循环一次
do
{
printf("%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year);
i++;
j--;
}while(j&&i if(i==n)break;//若数据全部输出,则跳出循环, scanf("%c",&input); }while(input=='\n');//输入回车,执行循环 } intdelete(BookinfodictList[],intn,char*ISBN)//只删除书号为ISBN的第一条记录 { inti,j; for(i=0;i { if(! strcmp(dictList[i].ISBN,ISBN))//strcmp()函数判断两个字符串是否相等 { for(j=i;j dictList[j]=dictList[j+1];//将目标值右面的数据全部左移一位 return(n-1);//删除后记录数减少1 } } return(n); } intDelete_a_record(BookinfodictList[],intn)//删除某一条记录 { inti,j=0; charbook[30],isbn[10],s,c; c=getchar(); printf("请输入待删除的书目的书名\n"); gets(book);//获取书名字符串 printf("%-10s%-23s%-18s%-8s%-15s%-4s\n","ISBN","book","author","edition","press","year"); for(i=0;i { if(! strcmp(dictList[i].book,book)) {//找到同名的数据,并输出 printf("%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year); j++; } } if(j>0) { printf("请输入待删除的书目的书号\n"); gets(isbn);//获取要删除的数据的书号 printf("确实要删除该记录? 是(y)|否(n)\n");//提示删除 if((s=getchar())=='y') { for(i=0;i { if(! strcmp(dictList[i].ISBN,isbn)) { //调用delete函数删除 printf("删除成功! \n"); return(delete(dictList,n,dictList[i].ISBN)); } } printf("未找到待删除记录! \n"); //删除成功后记录减1 } else { printf("已取消删除! \n");//取消删除后记录数不变 returnn; } }else printf("未找到待删除记录! \n"); } voidSort_by_name(BookinfodictList[],intn)//选择法按书名升序排列 { inti,j,p; Bookinfot; for(i=0;i { p=i; for(j=i+1;j if(strcmp(dictList[p].book,dictList[j].book)>0) p=j; if(p! =i) { t=dictList[p]; dictList[p]=dictList[i]; dictList[i]=t; } } } intinsert(BookinfodictList[],intn,Bookinfo*s)//按书名顺序插入记录 { inti,j; Sort_by_name(dictList,n); for(i=0;i { if(strcmp((*s).book,dictList[0].book)<0) { for(j=n;j>0;j--) dictList[j]=dictList[j-1]; dictList[0]=*s; return(n+1); } elseif(strcmp((*s).book,dictList[i].book)>=0&&strcmp((*s).book,dictList[i+1].book)<=0) { for(j=n;j>i+1;j--) dictList[j]=dictList[j-1]; dictList[i+1]=*s;//放在i和i+1之间或者放在最后一个 return(n+1); } } dictList[n]=*s; return(n+1); } intInsert_a_record(BookinfodictList[],intn)//出现问题,调用该函数时总是全部显示记录? { intk; charc; Bookinfos; //输入数据 c=getchar(); printf("PleaseinputISBN: \n"); gets(s.ISBN); printf("Pleaseinputbook: \n"); gets(s.book); printf("Pleaseinputauthor: \n"); gets(s.author); printf("Pleaseinputpress: \n"); gets(s.press); printf("Pleaseinputedition: \n"); scanf("%d",&s.edition); printf("Pleaseinputyear: \n"); scanf("%d",&s.year); k=insert(dictList,n,&s);//根据insert的返回值是否大于n判断插入成功与否 if(k>n) { printf("插入成功! \n"); return(k); } else { printf("插入失败! \n"); return(n); } } intQuery(BookinfodictList[],intn,char*book)//查询并显示书名为book的记录 { inti,count=0; printf("%-10s%-23s%-18s%-8s%-15s%-4s\n","ISBN","book","author","edition","press","year"); for(i=0;i { if(! strcmp(dictList[i].book,book)) { printf("%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year); count++; } } if(count) returncount;//查询成功,返回个数 else return-1;//未找到,返回-1 } voidQuery_a_record(BookinfodictList[],intn) { inti; charbook[30],c; c=getchar(); printf("请输入待查找的书名\n");//输入书名 gets(book); if((i=Query(dictList,n,book))>0)printf("共找到%d条记录\n",i);//若查到数据,Query函数的返回值为正数 elseprintf("未找到所查找的记录\n"); } intAddfromText(BookinfodictList[],intn,char*filename) { inti; Bookinfos; FILE*p; p=fopen(filename,"r"); fscanf(p,"%d",&i);//先读取文件第一行的记录数 while(i--) { fscanf(p,"%s%s%s%d%s%d\n",s.ISBN,s.book,s.author,&s.edition,s.press,&s.year);//读取记录的具体值 n=insert(dictList,n,&s);//插入到dictList数组中 } fclose(p); printf("读取成功! \n"); return(n); } voidWritetoText(BookinfodictList[],intn,char*filename) { FILE*p2; inti; p2=fopen(filename,"w"); for(i=0;i fprintf(p2,"%-10s%-23s%-18s%-8d%-15s%-4d\n",dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year); fclose(p2); printf("写入成功! \n"); } voidDisplay_main_menu()//显示菜单,另外添加了三个功能,显示菜单,清屏,暂停 { printf("------------------------------\n1.Inputrecords\n2.DisplayAllRecords\n3.DeleteaRecord\n4.sort\n5.InsertaRecord\n6.Query\n7.AddRecordsfromaTextFile\n8.WritetoaTextFile\n9.Changearecord\n0.Quit\n\nTIPS\ta.Menu\n\tb.ClearScreen\n\tc.Pause\n------------------------------\nGiveyourchoice: \n"); } voidChange_a_record(BookinfodictList[],intn)//修改某一记录的值 { inti; charbook[30],ISBN[30],c; c=getchar(); printf("请输入待修改图书的书名\n"); gets(book); if((i=Query(dictList,n,book))>0)//确认找到待修改记录 { printf("共找到%d条记录\n请输入待修改图书的书号\n",i); gets(ISBN); for(i=0;i { if(! strcmp(dictList[i].ISBN,ISBN)) { printf("请更新书号为%s的图书数据\n",ISBN);//开始修改 printf("PleaseinputISBN: \n"); gets(dictList[i].ISBN); printf("Pleaseinputbook: \n"); gets(dictList[i].book); printf("Pleaseinputauthor: \n"); gets(dictList[i].author); printf("Pleaseinputpress: \n"); gets(dictList[i].press); printf("Pleaseinputedition: \n"); scanf("%d",&dictList[i].edition); printf("Pleaseinputyear: \n"); scanf("%d",&dictList[i].year); printf("修改完成! \n"); } } } elseprintf("未找到相关记录\n"); } main() { staticintn=12; charfilename1[30],filename2[30],c; //创建初始结构体数组,应不少于十个 Bookinfobooks[NUM]={ {"97814842","pythonLanguage","gnusLieland",2,"Berkeley",2014}, {"97871190","historyofChinese","Goaqua",2,"Beijing",2009}, {"97814129","publiccommunication","RonaldE.Rice",3,"London",2013}, {"97836422","culturalcomposition","YangPan",2,"pardon",2012}, {"97801240","analyzingthesocial","Jenniferbeck",1,"Walt",2013}, {"78016958","recoredservicing","ScottishQua",1,"Chinese",2004}, {"01354851","managementguide","FerdinandK.Levy",1,"Englewood",1969}, {"1096-424","macroeconomics","Dusk",2,"Gog",1977}, {"04448649","competitiveeconomics","KiHangKim",2,"Amsterdam",1983}, {"08531419","guidetobanking","RobinPr",7,"London",1973}, {"01311606","guidetobanking","JerryS.Rosen",2,"Englewood",1972}, {"97875100","dirtpricingdynamic","PamelaLa",1,"Worldbook",2013}}; Display_main_menu();//显示菜单 while(c=getchar())//持续获取输入,并用switch语句调用相应函数 { switch(c) { case'0': exit (1);break; case'1': n=Input(books,n);break; case'2': Display(books,n);break; case'3': n=Delete_a_record(books,n);break; case'4': Sort_by_name(books,n);break; case'5': n=Insert_a_record(books,n);break; case'6': Query_a_record(books,n);break; case'7': printf("请输入文件名\n"); scanf("%s",filename1); n=AddfromText(books,n,filename1); break; case'8': printf("请输入文件名\n"); scanf("%s",filename2); WritetoText(books,n,filename2); break; case'9': Change_a_record(books,n);break; case'a': Display_main_menu();break; case'b': system("cls");break; case'c': system("pause");break; } } } 六: 程序执行(包含典型测试数据) ------------------------------ 1.Inputrecords 2.DisplayAllRecords 3.DeleteaRecord 4.sort 5.InsertaRecord 6.Query 7.AddRecordsfromaTextFile 8.WritetoaTextFile 9.Changearecord 0.Quit TIPSa.Menu b.ClearScreen c.Pause ------------------------------ Giveyourchoice: 1 PleaseinputISBN: 4296 Pleaseinputbook: 明朝那些事 Pleaseinputauthor: 当年明月 Pleaseinputpress
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告 菜单 源码 测试