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&&iif(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;jdictList[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;jif(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;ifprintf(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