歌曲信息管理系统[要求]制作一个歌曲信息管理系统功能:1)歌曲信息包括歌曲名,作者,演唱者,发行年月等。
2)可以对歌曲信息进行输入,删除,浏览。
3)可以查询根据歌曲名,作者,演唱者歌曲信息。
4)可以提供按作者分组显示功能。
5)用文件存储信息。
我的设计思路根据题目要求,由于歌曲信息数据以文本文件的方式存放,所以应提供文件的输入、输出等操作;在程序中需要浏览歌曲的信息,应提供显示、查询等操作,按照一般的思路,我采用的就是按照歌曲名进行查找的方式。
并且要提供可以按作者进行分组的方法。
整体设计思路就是首先以一个主函数为主,将各个功能诸如浏览,删除等分别设计成函数,通过主函数的调用从而实现其功能。
由于程序中经常要用到一些函数,诸如加载函数,显示函数等,如果重复输入,会严重增加工作量,所以可以将这些函数作为公共函数编写出来,以被随时调用。
分析一下整个系统,根据上面的需求分析,可以将系统设计分为以下六大模块。
四.详细设计#include<stdio、h>#include<stdlib、h>#include<string、h>#include<malloc、h>#define N 100上面这些就是整个程序要用到的文件包含命令与宏定义struct song{char name[20];char creater[20];char singer[20];char date[6];}so[N];将下面所要编写的函数分别声明出来void shu_ru() ;void shan_chu();void liu_lan() ;void cha_zhao();void fz(int i,int n);void fen_zu ();void fname();void printf_one(int i);void input(int i);void save(int n);void printf_back();int load();void printf_face();int shan_chue_data(int j,int n);首先就是设计主函数,设计主函数一般应该做到简洁,主函数主要就是提供函数调用等方面的功能,各功能函数以菜单的形式在主函数中列出来,通过主函数的调用从而实现各功能函数的功能。
其用流程图可表示为:N菜单界面void menu(){int k,w1;do{printf("\t\t******************目录**********************\n\n");printf(" 1、输入\n");printf(" 2、删除\n");printf(" 3、浏览\n");printf(" 4、查找\n");printf(“5、分组\ n”)printf("6、退出\n");对选择的数字作判断printf("\n\n\t请选择(1-6):");scanf("%d",&k);if(k<1||k>6){w1=1;getchar();}else w1=0;根据选择调用功能函数}while(w1==1);switch(k){case 1:shu_ru();break;case 2:shan_chu();break;case 3:liu_lan();break;case 4:cha_zhao();break;case 5:fen_zu();break;case 6 exit(0);}}主函数void main(){menu();}设计输入功能函数模块数据信息存放在文件中,为方便管理,一条记录对应一个歌曲,自然的我们可以想到用结构体数组的形式存放多首歌曲信息。
struct song{char name[20]; /*歌曲名*/char creater[20]; /*作者*/char singer[20]; /*演唱者*/char date[6]; /*发行年月*/}so[N];该结构体中包含了歌曲所需的各项信息,so[N]中的N为歌曲数目,程序中采用宏定义方式,可以随时对N进行修该。
输入模块的设计思想就是根据所要输入的歌曲数目,循环调用输入函数,然后调用保存函数。
void shu_ru(){int i,n;printf("要输入几首歌?:",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();}设计删除函数模块其思想就是在显示所有歌曲信息后,这时用到加载函数等,用户输入要删除的歌曲的歌名,根据歌名查找记录并予以删除。
其中,删除的数据就是从文件中删除,删除数据后面的记录即歌曲信息往前移。
其流程图可表示为:struct song s;int i,n,k,w0=1,w1,w2=0;n=load();do{k=-1;printf_face();for(i=0;i<n;i++){if((i!=0)&&i%10==0){printf("\n\n,按任意键键继续");getchar();printf("\n\n");}printf_one(i);}do{printf("\n\n请输入您要删除的歌的歌名!Name:");scanf("%s",&s、name);for(i=0;i<n;i++){if(strcmp(s、name,so[i]、name)==0){k=i;s=so[i];break;}}if(k==-1){printf("\n\nNO exit! Are you again?\n\n\t1)、again 2)、no and back! ");scanf("%d",&n);if(n==1)shan_chu();else menu();}}while(k==-1);printf_face();printf_one(k);w1=shan_chue_data(i,n);if(w1==1){printf("\n成功、\n\n Are you again?\n\n\t1)、again 2)、no and back! ");scanf("%d",&w0);w2=1;}else{w0=0;if(w2==1)so[k]=s;}}while(w0==1);menu();}设计浏览函数模块所谓浏览,其思想就就是显示所有的歌曲信息,因为有时歌曲信息较多,这时可以通过设计一个循环,将歌曲信息以十个一屏的形式显示出来,这其中仍需调用加载函数及一些显示函数,最后按任意键返回主菜单。
void liu_lan() {int i,n;n=load();printf_face();for(i=0;i<n;i++){if((i!=0)&&(i%10==0)){printf("\n\n按任意键继续\n");getchar();printf("\n\n");}printf_one(i);}printf("\tThere are %d record、\n",n);printf("\nPass any key to back\n");getchar();menu();}设计查找函数模块该模块设计主要就是通过歌曲名来进行查找,如果文件中存在所要查找的歌曲,则显示出该歌曲的所有信息,包括歌曲名,作者,演唱者及日期。
查找结束后提示用户就是继续查找还就是返回主菜单。
其流程图可表示为:{、printf("Which you need?:");do{scanf("%d",&c);if(c>2||c<1){printf("\nChoice error!Please again!");m=1;}while(m!=0);switch(c){case 1:fname();break;}printf_back();}下面就是根据歌曲名茶找函数,其思想就是首先输入歌曲名,然后调用加载函数,通过strcmp函数找出该歌曲信息,如果存在则显示出歌曲信息,如果不存在则显示Not Found,并提示用户就是继续查找还就是返回主菜单。
void fname() /*根据歌曲名查找*/{int i,n;int k=-1;char name[20];printf("\n\n name :");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("\nNot Found\n");printf("\n\nAre you again?\n\t1)、again 2)、no and back [ ]\b\b");scanf("%d",&n);if(n==1)fname();else menu();}}设计按作者分组功能该模块的功能就是将所有歌曲信息按照作者名一样的进行分组,然后从新显示所有分组后的歌曲信息。
其操作过程就是加载歌曲作者名称,将所有歌曲作者进行比较,一致的放在一起,然后显示分组后的所有歌曲信息。
void fz(int i,int n){int j;struct song s;for (j=i+1;j<n;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);}void fen_zu() //显示分组后的所有歌曲信息{int i=0,n;n=load();fz(i,n);printf("\n\n");liu_lan();}设计公共函数部分有一些函数在多个函数模块中都有可能被用到,为了程序的简洁,减少程序的源代码长度,我们可以将这些函数分别写出,以便被其她函数随时调用。