歌曲信息管理系统-通用完整版
- 格式:doc
- 大小:1.66 MB
- 文档页数:77
歌曲信息管理系统-通用完整版
中国地质大学
本科生课程论文封面
C语言课程设计
课程名称计算机高级语言课程设计(C)
教师姓名刘刚
本科生姓名
本科生学号***********
本科生专业机械设计制造及其自
所在院系机械电子信息学院
类别: C. 本科生
日期: 2013.07.11
注:1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
目录
1.题目要求 (1)
2.需求分析 (1)
3.总体设计 (1)
4.详细设计 (2)
5.上机操作 (32)
6.总结 (43)
7.致谢 (44)
参考文献 (44)
1.题目要求
制作一个歌曲信息管理系统,要求提供以下功能。
1)歌曲信息包括歌曲名,作者,演唱者,发行年月等。
2)可以对歌曲信息进行输入,删除,浏览。
3)可以查询根据歌曲名,作者,演唱者歌曲信息。
4)可以提供按作者分组显示功能。
5)用文件存储信息。
2.需求分析
根据题目要求,由于歌曲信息数据以文本文件的方式存放,所以应提供文件的输入、输出等操作;在程序中需要浏览歌曲的信息,应提供显示、查询等操作(其中查询方式可以按歌曲名、作者、演唱者或日期进行查询)。
并且要提供可以按作者进行分组的方法;另外还应提供键盘式选择菜单以实现功能选择。
3.总体设计
歌曲信息管理系统
输入
第1页
第2页
4.详细设计 【主函数】:主函数一般设计比较简洁,只提供输入,处理和输出部分的函数调用。
,本系统主函数只起到一个将系统载入到主菜单的作用。
至于系统内其他功能的实现,则是通过主函数下的主菜单来实现的
例如
int main() /*主函数*/
{
menu();
return 0;
}
下面是菜单栏实现系统功能的流程图
继续时
【菜单界面】:本系统中,主菜单是实现系统功能的主要媒介,同样也是整个系统的核心所在,进入系统是首先进入菜单界面,然后根据菜单上的提示进行功能的选取从而进行正常使用。
【程序】: /**************************主界面
删除退
浏览查找分组添加 运行系统,进由菜单提示输入1-7功能完成指定功能,决
***********************/
void menu()
{
i nt k,w1;
d o
{
system("cls");
puts("\t\t*******************主菜单********************\n");
puts("\t\t******************************** *************\n");
puts("\t\t 欢迎来到歌曲信息管理系统\n");
puts("\t\t******************************** *************\n");
puts("\t\t\t\t 1.歌曲录入");
puts("\t\t\t\t 2.歌曲删除");
puts("\t\t\t\t 3.歌曲浏览");
第3页
puts("\t\t\t\t 4.歌曲查找");
puts("\t\t\t\t 5.作者分组显示");
puts("\t\t\t\t 6.添加新歌");
puts("\t\t\t\t 7.退出");
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();
}
else w1=0;
}while(w1==1);
s witch(k)
第4页
{case 1:enter();break; //输入模块
c ase 2:delet();break; //删除模块
c ase 3:browse();break; //浏览模块
c ase 4:search();break; //查找模块
c ase 5:devide();break; //分组模块
c ase 6:add();break; //添加模块
c ase 7:exit(0);
}
}
【输入模块】:数据信息存放在文件中,一条记录对应一个歌曲,即符合习惯也方便管理。
现在要考虑的问题是一条歌曲的记录从文件读进来后以什么形式存放?
这里选择应用下面的结构体
struct song
{
char name[20]; //歌曲名*/
char author[20]; //作者*/
char singer[20]; //演唱者*/
char up_date[10]; //日期*/
}so[N];
需要注意的是:so[N]中的N为歌曲数目,程序中采用宏定义方式,可以随时对N进行修改。
本程序宏定义#define N 100
特别注意!song.txt文件中若已经有文件,再次输入时,文件内容将被清空,若仍要使用,请选择歌曲添加!
【流程图】
输入用户要输
i从0到n-1调
存入歌曲数不为0时
保存调用函数save(n)
【程序】:
/****************************输入模块***************************/
void enter()
{
int i,n;
system("cls");
printf("您想要输入多少首歌?(0-%d)?:",N-1);
scanf("%d",&n); //要输入的歌曲数目
printf("\n 现在起请您开始输入!\n\n");
for(i=0;i<n;i++)
{
printf("\n 请输入第%d 首歌的记录.\n",i+1);
input(i); //调用输入函数
}
if(i!=0) save(n); //调用保存函数
printf_back(); //返回
}
【删除模块】:其功能是在显示所有歌曲信息后,用户输入要删除歌曲的名字,
根据歌名查找记录并删除。
删除的一般做法是将数据从文件中删除,删除位置后
面的记录往前挪。
从而达到删除效果。
【流程图】
Y N
Y
N
【程序】: /****************************删除模块
*******************************/
显示所有歌曲记录,看用户需要删除哪个 输入要删除的歌是否找显示没显示找到的询问是否继续删除 返回主
void delet()
{
struct song s;
int i,n,k,w0=1,w1,w2=0;
n=load(); //调用加载函数
system("cls");
do
{
k=-1;
printf_face(); //调用显示数据结构项目函数
for(i=0;i<n;i++)
{
printf_one(i); //调用显示一个记录函数
}
do
{
printf("\n\n请输入您所要删除歌曲的名字。
歌名:");
scanf("%s",&);
for(i=0;i<n;i++)
{
if(strcmp(,so[i].name)==0)
{
k=i;
s=so[i];
break;
}
}
for(;i<n;i++)
so[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();
else menu();
}
}
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();
}
【浏览模块】:浏览模块功能是显示全部歌曲信息
【流程图】:
显示歌曲记录信息(10个一屏)
按任意键显示下一屏
按任意键返回主菜单
【程序】
/******************************浏览模块***************************/
void browse()
{
int i,n;
n=load(); //调用加载函数
printf_face(); //调用显示数据结构项目函数
system("cls");
for(i=0;i<n;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();
}
【查询模块】:该模块的功能是根据输入的歌曲名、作者、演唱者、日期或四者全部查找相应的歌曲记录,找到后问是否继续查找还是返回主菜单。
Y N
N
Y
【程序】 输入歌曲名/作者/演唱者/日期/全部 是否找到该显示找提示没有询问是否返回主
/******************************查找模块***************************/
void search()
{
int c,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)
{
case 1:fname();break; //根据歌曲名查找
case 2:fauthor();break; //根据作者名查找
case 3:fsinger();break; //根据演唱者查找
case 4:fup_date();break; //根据日
期查找
case 5:fall();break; //根据歌曲详细信息查找
}
printf("\n\n 查找完成!");
printf_back();
}
1.根据歌曲名查找fname()
void fname() //根据歌曲名查找
{
int i,n;
int k=-1;
char name[20];
printf("\n\n 歌名:");
scanf("%s",&name);
n=load();
for(i=0;i<n;i++)
if(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();
else menu();
}
}
2.按作者名查找fcreater()
void fauthor() //根据作者名查找
{
int i,n;
int k=-1;
char author[20];
n=load();
printf("\n\n 作者:");
scanf("%s",&author);
for(i=0;i<n;i++)
if(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();
else menu();
}
}
3.根据演唱者查找fsinger()
void fsinger() //根据演唱者查找
{
int i,n;
int k=-1;
char singer[20];
n=load();
printf("\n\n 演唱者:");
scanf("%s",&singer);
for(i=0;i<n;i++)
if(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();
else menu();
}
}
4.根据日期查找fdate()
void fup_date() //根据日期查找
{
int i,n;
int k=-1;
char up_date[8];
n=load();
printf("\n\n 发行年月:");
scanf("%d",&up_date);
for(i=0;i<n;i++)
if(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();
else menu();
}
}
5.根据歌曲详细信息查找fall()
void fall() //根据歌曲详细信息查找
{
int i,n;
int k=-1;
struct song s;
n=load();
printf("\n歌名: ");
scanf("%s",&);
printf("\n作者: ");
scanf("%s",&s.author);
printf("\n演唱者: ");
scanf("%s",&s.singer);
printf("\n发行年月: ");
scanf("%s",&s.up_date);
for(i=0;i<n;i++)
if((strcmp(so[i].name,)==0)&&(strcmp( so[i].author,s.author)==0)&&(strcmp(so[i].sing er,s.singer)==0)&&(strcmp(so[i].up_date,s.up_da
te)==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();
else menu();
}
}
【作者分组显示模块】:本模块的作用是将歌曲按作者分类,然后显示出来。
【流程图】:
输入歌曲作者名字
)
将所有歌曲的作者进行比较,一致
的分组放在一起
显示分组后的所有歌曲信息
【程序】
/************************作者分组显示模块***************************/
void fz(int i,int n)
{
int j;
struct song s;
system("cls");
for (j=i+1;j<n;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);
}
void devide()
{
int i=0,n;
n=load();
fz(i,n);
printf("\n\n");
browse();
}
【添加模块】:本模块的作用是在已有歌曲的基础上,用户通过键盘输入新的歌曲。
且不对以前歌曲产生影响。
【流程图】:
【程序】调用加载函数n=load();并计算可以记录个数n
K=m+n
输入用户要添加歌曲记录的个数m
显示分组后的所有歌曲信息
I从n到k调用输入函数input(i)
/************************添加模块***************************/
void add()
{
i nt i,n,m,k;
F ILE *fp;
n=load();
p rintf("请问您想要添加多少首歌?(0-%d)?:",N-1-n);
s canf("%d",&m);
k=m+n;
f or(i=n;i<k;i++)
{
printf("\n 请输入第%d 首歌的记录.\n",i-n+1);
input(i);
}
i f((fp=fopen("song.txt","w"))==NULL)
{
printf("\n无法打开文件\n");
}
f or(i=0;i<k;i++)
{
fprintf(fp,"%s %s %s %s\n",so[i].name,so[i].a uthor,so[i].singer,so[i].up_date);
}
f close(fp);
p rintf_back();
}
【注意】问题的整个程序还要用到文件包含命令和宏定义
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define N 100 【公共函数】
下面是一些通用的公共函数
储存函数:
void save(int n)
{
FILE *fp;
int i;
if((fp=fopen("song.txt","w"))==NULL)
{
printf("\n无法打开文件\n");
exit(1);
}
for(i=0;i<n;i++)
{
fprintf(fp,"%s %s %s %s\n",so[i].name,so[i].a uthor,so[i].singer,so[i].up_date);
}
fclose(fp);
}
显示记录函数:
void printf_one(int i)
{
printf("\n%-20s%-10s%-10s%-6s\n",so[i].name, so[i].author,so[i].singer,so[i].up_date);
}
输入函数:
void input(int i)
{
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);
}
数据结构项目函数:
void printf_face()
{
printf("\n歌名\t\t 作者演唱者发行年月\n");
}
void printf_back()
{
void browse();
void menu();
int w;
printf("\n\n\t恭喜您,输入成功成功!\n\n");
printf("请问您想要做什么\n\n\t1).浏览全部文件\t2).返回:[ ]\b\b");
scanf("%d",&w);
if(w==1)browse();
else menu();
}
载入函数模块:
int load()
{
FILE *fp;
int i;
if((fp=fopen("song.txt","r"))==NULL)
{
printf("\n无法打开文件\n");
return 0;
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s %s %s %s",so[i].name,so[i].autho r,so[i].singer,so[i].up_date);
}
fclose(fp);
return(i);
}
删除写入函数:
int delete_data(int j,int n)
{
FILE *fp;
int i;
if((fp=fopen("song.txt","w"))==NULL)
{
printf("\n无法打开文件\n");
exit(1);
}
for(i=0;i<n;i++)
{
if(i!=j)
fprintf(fp,"%s %s %s %s\n",so[i].name,so[i].aut hor,so[i].singer,so[i].up_date);
}
fclose(fp);
return 1;
}
5.上机操作
1【数据源】:第一次时,数据来自于用户的键盘输入,当用户第二次使用时,数据来自于保存的源文件song.txt
2.编译、链接和运行
3.结果
【主菜单】函数界面
(1)输入模块
在主界面出现后输入1按回车看到下图:(2)下面是输入时的样子
(3)输入完成后会有图示提示根据选择有不同结果。
(4)选择一浏览全部歌曲如下图所示(5)返回主菜单后输入2进入删除模块
(6)删除后结果曲目惠元华已经被删除
(7)第一次输入后,选择浏览选项
(8)输入4进入查找模块1按歌曲名查找
2按作者查找
3按演唱者查找
(9)返回菜单输入5进入作者分组模块(10)返回菜单,输入6进入歌曲添加模块(11)添加后进行浏览
添加已经成功!进入源文件song.txt
添加成功写入文件!
6.总结
通过这段时间的实习,我学到了一些c语言课本上所没有的东西,比如怎样编译一个系统,同时对课本上知识的了解接更加的透彻了。
在这次实习当中,我发现了在学习中一些掌握不太牢靠的地方,并且得到了一定程度的加强。
以前在c语言课上机时,我总是模仿书本上的程序,照样画葫芦,没太大进
步。
这次由于所编译的系统与课本上的实例不太一样,我通过向老师请教,向同学请教以及上网查看有关资料才完成了任务,这对我本身已是一种锻炼、一种提高!十分感谢所有帮助过我的人!
这次实习我也发现了课本上一个错误,由于课本结构体发行日期定义的太小,程序运行时老是出错,思来想去想不明白,还好在老师的帮助下发现了这个问题。
7.致谢
感谢教务处为我们安排了这次实习,更加巩固了我们对c语言程序的了解,掌握能力。
在这里,我尤其要感谢我的任课老师刘刚老师和陈文姬老师。
没有他们的帮助,我不可能在这么短的时间内发现自己程序的不足,并作出改进,圆满的完成任务。
同时也要感谢所有帮助过我的同学们。
谢谢!
参考文献
[1] 谭浩强. C程序设计(第三版)[M]. 北京: 清华大学出版社, 2005.
[2] 张冬梅, 刘远兴, 陈晶, 等. 基于PBL的C语言课程设计及学习指导[M]. 北
京: 清华大学出版社, 2011.
[3] ……
附录
程序源代码:。