歌曲信息管理系统.docx
《歌曲信息管理系统.docx》由会员分享,可在线阅读,更多相关《歌曲信息管理系统.docx(30页珍藏版)》请在冰点文库上搜索。
歌曲信息管理系统
C语言课程设计
歌曲信息管理
III
.题目要求
制作一个歌曲信息管理系统
功能:
1)歌曲信息包括歌曲名,作者,演唱者,发行年月等)
2)可以对歌曲信息进行输入,删除,浏览。
3)可以查询根据歌曲名,作者,演唱者歌曲信息。
4)可以提供按作者分组显示功能。
5)用文件存储信息。
二.需求分析
根据题目要求,由丁歌曲信息数据以文本文件的方式存放,所以应提供文件的输入、输出等操作;在程序中需要浏览歌曲的信息,应提供显示、查询等操作(其中查询方式可以按歌曲名、作者、演唱者或日期进行查询)。
并且要提供
可以按作者进行分组的方法;另外还应提供键盘式选择菜单以实现功能选择。
总体设计
分析一下整个系统,根据上面的需求分析,可以将系统设计分为以下七大模块
1.主函数
主函数一般设计比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
[流程图]
显示一系列功能选项
输入n,判断n是否是1-7
根据n的值调用各功能模块函数
[程序]
voidmenu()
(intk,w1;
do
(puts(”\t\t*******************MENU**********************\n\n”);
puts("\t\t\t\tl.enter");
puts("\t\t\t\t2.delete");
puts("\t\t\t\t3.browse");
puts("\t\t\t\t4.search");
puts("\t\t\t\t5.devide");
puts("\t\t\t\t6.add");
puts("\t\t\t\t7.exit");
puts("\n\n\t\t*********************************************\n");
printf("choiceyournumber(1-7):
[]\b\b");
scanf("%d",&k);
if(k<1||k>7)
(w1=1;
getchar();
}
elsew1=0;
}while(w1==1);
switch(k)
(case1:
enter();break;
case2:
delet();break;
/*主界面*/
/*对选择的数字作判断*/
/*输入模块*/
/*删除模块*/
case3:
browse();break;/*浏览模块*/
case4:
search();break;
case5:
devide();break;
case6:
add();break;
case7:
exit(0);
}
}
/*查找模块*//*分组模块*//*添加模块*/
main()
(
menu();
}
/*主函数*/
2.各功能模块设计
(1)输入模块
[分析]
数据信息存放在文件中,一条记录对应一个歌曲,即符合习惯也方便管理。
现在要考虑的问题是一条歌曲的记录从文件读进来后以什么形式存放?
我们很容易知道存放若干个歌曲就用结构体数组。
structsong
(
charname[20];/*歌曲名*/
charcreater[20];/*作者*/
charsinger[20];/*演唱者*/
chardate[6];/*日期*/
}so[N];
[注意]so[N]中的N为歌曲数目,程序中采用宏定义方式,可以随时对N进行修
改。
本程序宏定义#defineN100
[流程图]
[程序]
enter()/*输入模块*/
(
inti,n;
printf("Howmanysongs(0-%d)?
:
",N-1);
scanf("%d",&n);/*要输入的歌曲数目*/
printf("\nEnterdatanow\n\n");
for(i=0;i(
printf("\ninput%dthsongrecord.\n",i+1);
input(i);/*调用输入函数*/
}
if(i!
=0)save(n);/*调用保存函数*/
printf_back();/*返回*/
}—
(2)删除模块
[分析]
功能是在显示所有歌曲信息后,用户输入要删除歌曲的名字,根据歌名查找记录并删除。
删除的一般做法是将数据从文件中删除,删除位置后面的记录往前挪。
[流程图]
【程序】
voiddelet()/*删除模块*/
(
structsongs;
inti,n,k,w0=1,w1,w2=0;
n=load();/*调用加载函数*/
do
(
k=-1;
printf_face();/*调用显示数据结构项目函数*/
for(i=0;i(
if((i!
=0)&&i%10==0)
(
printf("\n\nRememberwhichneededdelete.passanykeytocontiune");
getchar();
puts("\n\n");
}
printf_one(i);/*调用显示一个记录函数*/
}—
do
(
printf("\n\nEnterName.thatyouwanttodelete!
Name:
");
scanf("%s”,&s.name);
for(i=0;i(
if(strcmp(s.name,so[i].name)==0)
(
k=i;
s=so[i];
break;
}
}
if(k==-1)
(
printf("\n\nNOexit!
Areyouagain?
\n\n\t1).again2).noandback!
[]\b\b");
scanf("%d",&n);
if(n==1)delet();
elsemenu();
}
}
while(k==-1);
printf_face();/*调用显示数据结构项目函数*/
printf_one(k);/*调用显示一个记录函数*/w1=delete_data(i,n);/*调用显示删除数据函数*/if(w1==1)(
printf("\nSuccessfulA-A.\n\nAreyouagain?
\n\n\t1).again2).noandback!
[]\b\b");
scanf("%d",&w0);
w2=1;
}else(
w0=0;
if(w2==1)so[k]=s;
}
}
while(w0==1);
menu();
}
(3)浏览模块
[分析]
该模块功能是显示所以歌曲记录信息
[流程图]
[程序]
voidbrowse()/*浏览模块*/
(
inti,n;
n=load();/*调用加载函数*/
printf_face();/*调用显示数据结构项目函数*/
for(i=0;i(
if((i!
=0)&&(i%10==0))
(
printf("\n\nPassanykeytocontinue\n");
getchar();
puts("\n\n");
}
printf_one(i);/*调用显示一个记录函数*/
}—
printf("\tThereare%drecord.\n",n);
printf("\nPassanykeytoback\n");
getchar();
menu();
}
(4)查找模块
[分析]
该模块的功能是根据输入的歌曲名、作者、演唱者、日期或四者全部查找相应的歌曲记录,找到后问是否继续查找还是返回主菜单。
[流程图]
search()
(
intc,m=0;
printf("\n\nsearchby=>\n\n1).name2).creater3).singer4).date5).all6).back");
printf("Whichyouneed?
:
[]\b\b");
do
(
scanf("%d”,&c);
if(c>5||c<1)
(
printf("\nChoiceerror!
Pleaseagain!
");
m=1;
}
}while(m!
=0);
switch(c)
(
case1:
fname();break;/*根据歌曲名查找*/
case2:
fcreater();break;/*根据作者名查找*/
case3:
fsinger();break;/*根据演唱者查找*/
case4:
fdate();break;/*根据日期查找*/
case5:
fall();break;/*根据歌曲详细信息查找*/
}
printf("\n\nSearchingisover!
");
printf_back();
}—
其中查找模块调用了具体查找的5个函数。
①根据歌曲名查找fname()
【说明】
流程图与总的查找模块流程图一致。
【程序】
fname()
(
inti,n;
intk=-1;
charname[20];
printf("\n\nname:
");
scanf("%s”,&name);
n=load();
for(i=0;iif(strcmp(so[i].name,name)==0)
(
k=i;
printf_one(k);
}
if(k==-1)
(
printf("\nNotFound\n");
printf("\n\nAreyouagain?
\n\t1).again2).noandback[]\b\b");
scanf("%d",&n);
if(n==1)fname();
elsemenu();
}
}
②)根据作者名查找fcreater()
【说明】
流程图与总的查找模块流程图一致。
【程序】
fcreater()
(
inti,n;
intk=-1;
charcreater[20];
n=load();
printf("\n\ncreater:
");
scanf("%s",&creater);
for(i=0;iif(strcmp(so[i].creater,creater)==0)
(k=i;
printf_one(k);
}
if(k==-1)
(
printf("\nNotFound\n");
printf("\n\nAreyouagain?
\n\t1).again2).noandback[]\b\b");
scanf("%d",&n);
if(n==1)fcreater();
elsemenu();
}
}
3)根据演唱者查找fsinger()
【说明】
流程图与总的查找模块流程图一致。
【程序】
fsinger()
(
inti,n;
intk=-1;
charsinger[20];
n=load();
printf("\n\nsinger:
");
scanf("%s",&singer);
for(i=0;iif(strcmp(so[i].singer,singer)==0)
(k=i;
printf_one(k);
}
if(k==-1)
(
printf("\nNotFound\n");
printf("\n\nAreyouagain?
\n\t1).again2).noandback[]\b\b");
scanf("%d",&n);
if(n==1)fsinger();
elsemenu();
④根据日期查找fdate()
【说明】
流程图与总的查找模块流程图一致。
【程序】
fdate()
(
inti,n;
intk=-1;
chardate[8];
n=load();
printf("\n\ndate:
");
scanf("%s",&date);
for(i=0;iif(strcmp(so[i].date,date)==0)
(k=i;
printf_one(k);
}—
if(k==-1)
(
printf("\nNotFound\n");
printf("\n\nAreyouagain?
\n\t1).again2).noandback[]\b\b");
scanf("%d",&n);
if(n==1)fdate();
elsemenu();
}
}
◎根据歌曲详细信息查找fall()
【说明】
流程图与总的查找模块流程图一致。
【程序】
fall()
(
inti,n;
intk=-1;
charname[20];
charcreater[20];
charsinger[20];
chardate[8];
structsongs;
n=load();
printf("\nname:
");
scanf("%s",&s.name);
printf("\ncreater:
");
scanf("%s",&s.creater);
printf("\nsinger:
");
scanf("%s",&s.singer);
printf("\ndate:
");
scanf("%s",&s.date);
for(i=0;iif((strcmp(so[i].name,s.name)==0)&&(strcmp(so[i].creater,s.creater)==0)&&(
strcmp(so[i].singer,s.singer)==0)&&(strcmp(so[i].date,s.date)==0))
(k=i;
printf_one(k);
}
if(k==-1)
(
printf("\nNotFound\n");
printf("\n\nAreyouagain?
\n\t1).again2).noandback
[]\b\b");
scanf("%d",&n);
if(n==1)fall();
elsemenu();
}
}
(5)分组模块
【分析】
该模块的功能是将所有歌曲信息按照作者名一样的进行分组,然后从新显示分组后的所有歌曲信息。
【流程图】
输入歌曲作者名字
将所有歌曲的作者进行比较,
致的分组放在一起
显示分组后的所有歌曲信息
【程序】
fz(inti,intn)
(
intj;
structsongs;
for(j=i+1;j(
if(strcmp(so[i].creater,so[j].creater)==0)
(
if(j==i+1)
(
i++;
fz(i,n);
}
else
(
s=so[i+1];
so[i+1]=so[j];
so[j]=s;
}
else
(
if(j==n-1)
(
i++;fz(i,n);
}
}
}
save(n);
}devide()
(
inti=0,n;
n=load();
fz(i,n);
printf("\n\n");
browse();
}
(6)添加模块
【分析】
该模块的功能是用户需要增加新的歌曲信息,用户通过键盘逐条写到原来的输入文件中,注意是添加新的歌曲信息而不能覆盖原有歌曲信息。
【流程图】
【程序】
voidadd()
(
inti,n,m,k;
FILE*fp;
n=load();
printf("Howmanysongsdoyouwanttoadd(0-%d)?
:
",N-1-n);
scanf("%d",&m);
k=m+n;
for(i=n;i(
printf("\nInput%dthsongrecord.\n",i-n+1);input(i);
}
if((fp=fopen("song.txt","w"))==NULL)
(printf("\nCannotopenfile\n");
}
for(i=0;i(
fprintf(fp,"%s%s%s%s\n",so[i].name,so[i].creater,so[i].singer,so[i].date);
}
fclose(fp);
printf_back();
}—
【注意】问题的整个程序还要用到文件包含命令和宏定义
#include#include#include#include#defineN100
3.公共函数
下面是在每个功能模块中都有可能用到的一些公共函数。
(1)显示一个记录函数
voidprintf_one(inti)
{—
printf("\n%s%s%s%s\n",so[i].name,so[i].creater,so[i].singer,so[i].date);
}
(2)输入一个完整记录函数
input(inti)
{
printf("\nname:
");
scanf("%s",so[i].name);
printf("\ncreater:
");
scanf("%s",so[i].creater);
printf("\nsinger:
");
scanf("%s",so[i].singer);
printf("\ndate:
");
scanf("%s",so[i].date);
(3)保存函数
save(intn)
(
FILE*fp;
inti;
if((fp=fopen("song.txt","w"))==NULL)
(
printf("\nCannotopenfile\n");
exit
(1);
}
for(i=0;i(
fprintf(fp,"%s%s%s%s\n",so[i].name,so[i].creater,so[i].singer,so[i].date);
}
fclose(fp);
}
(4)返回上一级函数
printf_back()
{—
voidbrowse();
voidmenu();
intw;
printf("\n\n\tSuccessful.A-A\n\nH);
printf("Whatdoyouwanttodo?
\n\n\t1).Browseall
now\t2).Back:
[]\b\b");
scanf("%d",&w);
if(w==1)browse();
elsemenu();
}
(5)加载函数
intload()
{
FILE*fp;
inti;
if((fp=fopen("song.txt","r"))==NULL)
{
printf("\nCannotopenfile\n");
return0;
}
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%s%s%s",so[i].name,so[i].creater,so[i].singer,so[i].date);
}
fclose(fp);
return(i);
}
(6)显示数据结构项目函数
printf_face()
{—
printf("\nnamecreatersingerdate\n");
(7)显示删除数据函数
intdelete_data(intj,intn)
{—
FILE*fp;
inti;
if((fp=fopen("song.txt","w"))==NULL)
{
printf("\nCannotopenfile\n");
exit
(1);
}
for(i=0;i{
if(i!
=j)
fprintf(fp,"%s%s%s%s\n",so[i].name,so[i].creater,so[i].singer,so[i].date);
}
fclose(fp);
return1;
}
五.上机操作
1.数据源
程序经过编译、运行后,由用户经键盘输入歌曲信息
2.编译、链接和运行
3.结果
下面是各个模块的界面图
(2)输入模块
在主界面出现后输入1按回车看到下图:
C:
MC\TC,EKB
1234567
enterdeletebrowseseai^clideuideaddexit
choiceyournumber>:
113
Hownanusonas<0-99>?
:
(3)输入要输入的歌曲记录数然后逐条增加,如下图:
:
hoiceyoui*numbepCl-75:
11Jlounanysongrs<0—?
?
>?
=3
Enterdatanou
inputl^hsonsFCGord-
lAne=qqq[
:
reat&y:
q(f
late=1
input2fchsanyi*eeai'dl_
lane-uwvj
:
i'eatep:
uu
ii«ger=u
late-2
input3thsonsrecordl-
lane*eee
ir&ater:
ee
m土n.套e
late"3
GiiccessFuilwA
dououuanctodo?
(4)返回主菜单后输入2进入删除模块
bhoiceyoupnunhev[2J
name
epeater
singei*
qq
q
1
l-H-JUJ
IHJ
u
2
bee
ee
e
3
Entei^Name.thatyouvanttodel«te!
Nane:
eeenameCPeatei*singerdateeeeeee2EuccessfulA—A_fireyouagain?
|1〉_己ggizln2〉*ni)andbad?
[_]
(5)输入2后返回主菜单再输入3进入浏览模块
choiceyaupnunfcer>:
[3]
lamecpestersingerd就t”
邮aaq1
叫hhhu2
ThereaiEe2reccrd.
Passanykeytohack
MKMMKMMMMMXMKMMKMMWflliHUKNHWMHKMKMMKMKKKKMKKMH
1_ente^
2-delet#
3-hx。
叩雪酷
4.scareli
5.djeuide
6.Md
7,exit
JtKUKJtJtJCJtJtKZKJtJ(3t