中国地质大学本科生课程论文封面C语言课程设计课程名称计算机高级语言课程设计(C)教师姓名刘刚本科生姓名本科生学号***********本科生专业机械设计制造及其自所在院系机械电子信息学院类别: C. 本科生日期: 2013.07.11课程设计评语注:1、无评阅人签名成绩无效;2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
目录1.题目要求 (1)2.需求分析 (1)3.总体设计 (1)4.详细设计 (1)5.上机操作 (16)6.总结 (25)7.致谢 (26)参考文献 (26)1.题目要求制作一个歌曲信息管理系统,要求提供以下功能。
1)歌曲信息包括歌曲名,作者,演唱者,发行年月等。
2)可以对歌曲信息进行输入,删除,浏览。
3)可以查询根据歌曲名,作者,演唱者歌曲信息。
4)可以提供按作者分组显示功能。
5)用文件存储信息。
2.需求分析根据题目要求,由于歌曲信息数据以文本文件的方式存放,所以应提供文件的输入、输出等操作;在程序中需要浏览歌曲的信息,应提供显示、查询等操作(其中查询方式可以按歌曲名、作者、演唱者或日期进行查询)。
并且要提供可以按作者进行分组的方法;另外还应提供键盘式选择菜单以实现功能选择。
3.总体设计【主函数】:主函数一般设计比较简洁,只提供输入,处理和输出部分的函数调用。
,本系统主函数只起到一个将系统载入到主菜单的作用。
至于系统内其他功能的实现,则是通过主函数下的主菜单来实现的例如int main() /*主函数*/{menu();return 0;}【菜单界面】:本系统中,主菜单是实现系统功能的主要媒介,同样也是整个系统的核心所在,进入系统是首先进入菜单界面,然后根据菜单上的提示进行功能的选取从而进行正常使用。
【程序】:/**************************主界面***********************/void menu(){int k,w1;do{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.歌曲浏览");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);switch(k){case 1:enter();break; //输入模块case 2:delet();break; //删除模块case 3:browse();break; //浏览模块case 4:search();break; //查找模块case 5:devide();break; //分组模块case 6:add();break; //添加模块case 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文件中若已经有文件,再次输入时,文件内容将被清空,若仍要使用,请选择歌曲添加!【流程图】0时/****************************输入模块***************************/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(); //返回}【删除模块】:其功能是在显示所有歌曲信息后,用户输入要删除歌曲的名字,根据歌名查找记录并删除。
删除的一般做法是将数据从文件中删除,删除位置后面的记录往前挪。
从而达到删除效果。
【流程图】/****************************删除模块*******************************/ 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\t1).继续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\t1).继续2).不,返回。
[ ]\b\b");scanf("%d",&w0);w2=1;}else{w0=0;if(w2==1)so[k]=s;}}while(w0==1);menu();}【浏览模块】:浏览模块功能是显示全部歌曲信息【流程图】:【程序】/******************************浏览模块***************************/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();}【查询模块】:该模块的功能是根据输入的歌曲名、作者、演唱者、日期或四者全部查找相应的歌曲记录,找到后问是否继续查找还是返回主菜单。
/******************************查找模块***************************/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);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_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();else menu();}}【作者分组显示模块】:本模块的作用是将歌曲按作者分类,然后显示出来。