歌曲信息管理系统 通用完整版.docx
《歌曲信息管理系统 通用完整版.docx》由会员分享,可在线阅读,更多相关《歌曲信息管理系统 通用完整版.docx(56页珍藏版)》请在冰豆网上搜索。
歌曲信息管理系统通用完整版
中国地质大学
本科生课程论文封面
C语言课程设计
课程名称计算机高级语言课程设计(C)
教师姓名刘刚
本科生姓名
本科生学号20121003009
本科生专业机械设计制造及其自
所在院系机械电子信息学院
类别:
C.本科生
日期:
2013.07.11
课程设计评语
对课程论文的评语:
平时成绩:
课程论文成绩:
总成绩:
评阅人签名:
注:
1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
1.题目要求
制作一个歌曲信息管理系统,要求提供以下功能。
1)歌曲信息包括歌曲名,作者,演唱者,发行年月等。
2)可以对歌曲信息进行输入,删除,浏览。
3)可以查询根据歌曲名,作者,演唱者歌曲信息。
4)可以提供按作者分组显示功能。
5)用文件存储信息。
2.需求分析
根据题目要求,由于歌曲信息数据以文本文件的方式存放,所以应提供文
件的输入、输出等操作;在程序中需要浏览歌曲的信息,应提供显示、查询等操作(其中查询方式可以按歌曲名、作者、演唱者或日期进行查询)。
并且要提供可以按作者进行分组的方法;另外还应提供键盘式选择菜单以实现功能选择。
3.总体设计
根据整个系统的需求分析可知要实现本系统的功能,需要有以下七个模块。
4.详细设计
【主函数】:
主函数一般设计比较简洁,只提供输入,处理和输出部分的函数调用。
,本系统主函数只起到一个将系统载入到主菜单的作用。
至于系统内其他功能的实现,则是通过主函数下的主菜单来实现的
例如
intmain()/*主函数*/
{
menu();
return0;
}
下面是菜单栏实现系统功能的流程图
继续时
【菜单界面】:
本系统中,主菜单是实现系统功能的主要媒介,同样也是整个系统的核心所在,进入系统是首先进入菜单界面,然后根据菜单上的提示进行功能的选取从而进行正常使用。
【程序】:
/**************************主界面***********************/
voidmenu()
{
intk,w1;
do
{
system("cls");
puts("\t\t*******************主菜单********************\n");
puts("\t\t*********************************************\n");
puts("\t\t欢迎来到歌曲信息管理系统\n");
puts("\t\t*********************************************\n");
puts("\t\t\t\t1.歌曲录入");
puts("\t\t\t\t2.歌曲删除");
puts("\t\t\t\t3.歌曲浏览");
puts("\t\t\t\t4.歌曲查找");
puts("\t\t\t\t5.作者分组显示");
puts("\t\t\t\t6.添加新歌");
puts("\t\t\t\t7.退出");
puts("\n\t\t**********************************************\n");
puts("\t\t开发人:
赵彦斌\n");
printf("请选择您所需要的功能(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);
}
}
【输入模块】:
数据信息存放在文件中,一条记录对应一个歌曲,即符合习惯也方便管理。
现在要考虑的问题是一条歌曲的记录从文件读进来后以什么形式存放?
这里选择应用下面的结构体
structsong
{
charname[20];//歌曲名*/
charauthor[20];//作者*/
charsinger[20];//演唱者*/
charup_date[10];//日期*/
}so[N];
需要注意的是:
so[N]中的N为歌曲数目,程序中采用宏定义方式,可以随时对N进行修改。
本程序宏定义#defineN100
特别注意!
song.txt文件中若已经有文件,再次输入时,文件内容将被清空,若仍要使用,请选择歌曲添加!
【流程图】
存入歌曲数不为0时
【程序】:
/****************************输入模块***************************/
voidenter()
{
inti,n;
system("cls");
printf("您想要输入多少首歌?
(0-%d)?
:
",N-1);
scanf("%d",&n);//要输入的歌曲数目
printf("\n现在起请您开始输入!
\n\n");
for(i=0;i{
printf("\n请输入第%d首歌的记录.\n",i+1);
input(i);//调用输入函数
}
if(i!
=0)save(n);//调用保存函数
printf_back();//返回
}
【删除模块】:
其功能是在显示所有歌曲信息后,用户输入要删除歌曲的名字,根据歌名查找记录并删除。
删除的一般做法是将数据从文件中删除,删除位置后面的记录往前挪。
从而达到删除效果。
【流程图】
YN
Y
N
【程序】:
/****************************删除模块*******************************/
voiddelet()
{
structsongs;
inti,n,k,w0=1,w1,w2=0;
n=load();//调用加载函数
system("cls");
do
{
k=-1;
printf_face();//调用显示数据结构项目函数
for(i=0;i{
printf_one(i);//调用显示一个记录函数
}
do
{
printf("\n\n请输入您所要删除歌曲的名字。
歌名:
");
scanf("%s",&s.name);
for(i=0;i{
if(strcmp(s.name,so[i].name)==0)
{
k=i;
s=so[i];
break;
}
}
for(;iso[i]=so[i+1];
save(n-1);
if(k==-1)
{
printf("\n\n不存在!
您想要继续么?
\n\n\t
1).继续2).不,返回。
[]\b\b");
scanf("%d",&n);
if(n==1)delet();
elsemenu();
}
}
while(k==-1);
printf_face(i);//调用显示数据结构项目函数
printf_one(k);//调用显示一个记录函数
w1=delete_data(i,n);//调用显示删除数据函数
if(w1==1)
{
printf("\n恭喜,歌曲已成功删除\n\n您想要继续么?
\n\n\t
1).继续2).不,返回。
[]\b\b");
scanf("%d",&w0);
w2=1;
}
else
{
w0=0;
if(w2==1)
so[k]=s;
}
}
while(w0==1);
menu();
}
【浏览模块】:
浏览模块功能是显示全部歌曲信息
【流程图】:
【程序】
/******************************浏览模块***************************/
voidbrowse()
{
inti,n;
n=load();//调用加载函数
printf_face();//调用显示数据结构项目函数
system("cls");
for(i=0;i{
if((i!
=0)&&(i%10==0))
{
printf("\n\n请按任意键继续\n");
getchar();
puts("\n\n");
}
printf_one(i);//调用显示一个记录函数
}
printf("\t这里有%d个记录.\n",n);
printf("\n按任意键继续\n");
getchar();
system("pause");
menu();
}
【查询模块】:
该模块的功能是根据输入的歌曲名、作者、演唱者、日期或四者全部查找相应的歌曲记录,找到后问是否继续查找还是返回主菜单。
【流程图】
YN
N
Y
【程序】
/******************************查找模块***************************/
voidsearch()
{
intc,m=0;
system("cls");
printf("\n\n\n\t***********************查找模块*************************\n");
printf("\t**\n");
printf("\t*1.歌名2.作者3.演唱者*\n");
printf("\t**\n");
printf("\t**\n");
printf("\t**\n");
printf("\t********************************************************\n");
printf("您想要通过哪种方式查找?
:
[]\b\b");
do
{
scanf("%d",&c);
if(c>5||c<1)
{
printf("\n选择错误!
请重新选择!
");
m=1;
}
}while(m!
=0);
switch(c)
{
case1:
fname();break;//根据歌曲名查找
case2:
fauthor();break;//根据作者名查找
case3:
fsinger();break;//根据演唱者查找
case4:
fup_date();break;//根据日期查找
case5:
fall();break;//根据歌曲详细信息查找
}
printf("\n\n查找完成!
");
printf_back();
}
1.根据歌曲名查找fname()
voidfname()//根据歌曲名查找
{
inti,n;
intk=-1;
charname[20];
printf("\n\n歌名:
");
scanf("%s",&name);
n=load();
for(i=0;iif(strcmp(so[i].name,name)==0)
{
k=i;
printf_one(k);
}
if(k==-1)
{
printf("\n抱歉,没有找到所找歌曲\n");
printf("\n\n您想要继续么?
\n\t1).继续2).不,返回[]\b\b");
scanf("%d",&n);
if(n==1)fname();
elsemenu();
}
}
2.按作者名查找fcreater()
voidfauthor()//根据作者名查找
{
inti,n;
intk=-1;
charauthor[20];
n=load();
printf("\n\n作者:
");
scanf("%s",&author);
for(i=0;iif(strcmp(so[i].author,author)==0)
{k=i;
printf_one(k);
}
if(k==-1)
{
printf("\n抱歉,没有找到所找歌曲\n");
printf("\n\n您想要继续么?
\n\t1).继续2).不,返回[]\b\b");
scanf("%d",&n);
if(n==1)fauthor();
elsemenu();
}
}
3.根据演唱者查找fsinger()
voidfsinger()//根据演唱者查找
{
inti,n;
intk=-1;
charsinger[20];
n=load();
printf("\n\n演唱者:
");
scanf("%s",&singer);
for(i=0;iif(strcmp(so[i].singer,singer)==0)
{k=i;
printf_one(k);
}
if(k==-1)
{
printf("\n抱歉,没有找到所找歌曲\n");
printf("\n\n您想要继续么?
\n\t1).继续2).不,返回[]\b\b");
scanf("%d",&n);
if(n==1)fsinger();
elsemenu();
}
}
4.根据日期查找fdate()
voidfup_date()//根据日期查找
{
inti,n;
intk=-1;
charup_date[8];
n=load();
printf("\n\n发行年月:
");
scanf("%d",&up_date);
for(i=0;iif(strcmp(so[i].up_date,up_date)==0)
{k=i;
printf_one(k);
}
if(k==-1)
{
printf("\n抱歉,没有找到所找歌曲\n");
printf("\n\n您想要继续么?
\n\t1).继续2).不,返回[]\b\b");
scanf("%d",&n);
if(n==1)fup_date();
elsemenu();
}
}
5.根据歌曲详细信息查找fall()
voidfall()//根据歌曲详细信息查找
{
inti,n;
intk=-1;
structsongs;
n=load();
printf("\n歌名:
");
scanf("%s",&s.name);
printf("\n作者:
");
scanf("%s",&s.author);
printf("\n演唱者:
");
scanf("%s",&s.singer);
printf("\n发行年月:
");
scanf("%s",&s.up_date);
for(i=0;iif((strcmp(so[i].name,s.name)==0)&&(strcmp(so[i].author,s.author)==0)&&(strcmp(so[i].singer,s.singer)==0)&&(strcmp(so[i].up_date,s.up_date)==0))
{k=i;
printf_one(k);
}
if(k==-1)
{
printf("\n抱歉,没有找到所找歌曲\n");
printf("\n\n您想要继续么?
\n\t1).继续2).不,返回[]\b\b");
scanf("%d",&n);
if(n==1)fall();
elsemenu();
}
}
【作者分组显示模块】:
本模块的作用是将歌曲按作者分类,然后显示出来。
【流程图】:
【程序】
/************************作者分组显示模块***************************/
voidfz(inti,intn)
{
intj;
structsongs;
system("cls");
for(j=i+1;j{
if(strcmp(so[i].author,so[j].author)==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);
}
voiddevide()
{
inti=0,n;
n=load();
fz(i,n);
printf("\n\n");
browse();
}
【添加模块】:
本模块的作用是在已有歌曲的基础上,用户通过键盘输入新的歌曲。
且不对以前歌曲产生影响。
【流程图】:
【程序】
/************************添加模块***************************/
voidadd()
{
inti,n,m,k;
FILE*fp;
n=load();
printf("请问您想要添加多少首歌?
(0-%d)?
:
",N-1-n);
scanf("%d",&m);
k=m+n;
for(i=n;i{
printf("\n请输入第%d首歌的记录.\n",i-n+1);
input(i);
}
if((fp=fopen("song.txt","w"))==NULL)
{
printf("\n无法打开文件\n");
}
for(i=0;i{
fprintf(fp,"%s%s%s%s\n",so[i].name,so[i].author,so[i].singer,so[i].up_date);
}
fclose(fp);
printf_back();
}
【注意】问题的整个程序还要用到文件包含命令和宏定义
#include
#include
#include
#include
#defineN100
【公共函数】
下面是一些通用的公共函数
储存函数:
voidsave(intn)
{
FILE*fp;
inti;
if((fp=fopen("song.txt","w"))==NULL)
{
printf("\n无法打开文件\n");
exit
(1);
}
for(i=0;i{
fprintf(fp,"%s%s%s%s\n",so[i].name,so[i].author,so[i].singer,so[i].up_date);
}
fclose(fp);
}
显示记录函数:
voidprintf_one(inti)
{
printf("\n%-20s%-10s%-10s%-6s\n",so[i].name,so[i].author,so[i].singer,so[i].up_date);
}
输入函数:
voidinput(inti)
{
printf("\n歌名:
");
scanf("%s",so[i].name);
printf("\n作者:
");
scanf("%s",so[i].author);
printf("\n演唱者:
");
scanf("%s",so[i].singer);
printf("\n发行年月:
");
scanf("%s",so[i].up_date);
}
数据结构项目函数:
voidprintf_face()
{
printf("\n歌名\t\t作者演唱者发行年月\n");
}
voidprintf_back()
{
voidbrowse();
voidmenu();
intw;
printf("\n\n\t恭喜您,输入成功成功!
\n\n");
printf("请问您想要做什么\n\n\t1).浏览全部文件\t2).返回:
[]\b\b");
scanf("%d",&w);
if(w==1)browse();
elsemenu();
}
载入函数模块:
intload()
{
FILE*fp;
inti;
if((f