院(系):机械与电子信息学院指导教师:董理君
2016 年 1 2月2016.12 中国地质大学C语言课程设计 1
第一章
§1.1题目描述
1.题目与要求
1)制作一个歌曲信息管理系统
2) 歌曲信息包括歌曲名,作者,演唱者,发行年月等。
3) 可以对歌曲信息进行输入,删除,浏览。
4) 可以查询根据歌曲名,作者,演唱者歌曲信息。
5) 可以提供按作者分组显示功能。
6) 用文件存储信息。
[需求分析]
1)根据题目要求,数据以文件的形式存储,所以应提供文件的输入,输出等操作;还需要文件具有查找,修改数据,删除等功能。
§1.2算法设计
1.流程图根据上面的需求分析,可以将这个系统的设计分为如下五大模块:
*(其中“分组显示”功能未在程序中实现)
2
汪通辉 2016.12
§1.3程序设计及代码分析
1.定义声明
程序:
struct song { char name[20]; char author[20]; char singer[20]; char data[20];
}so[N]; //定义结构体
void menu(); void input(int i); void save(int n); void enter(); void browse(); void delet(); void search();
void back(); //声明调用函数
2.main 函数
程序: int main() {
system("color 74"); //改变界面颜色 menu(); exit(0); return 0; }
程序:
void menu()
{
int n;
system("cls");
printf("\\n\\n\\n\\n\\n\\n\\n\\\\ ***************歌曲管理系统***************\\n\\n\\n");
printf("\\\\\\ 1.存入歌曲。\\n");
printf("\\\\\\ 2.浏览所有曲目。\\n");
printf("\\\\\\ 3.删除歌曲。\\n");
printf("\\\\\\ 4.分类查询歌曲。\\n");
printf("\\\\\\ 5.退出。\\n");
printf("\\n\\n\\\\ *******************************************\\n");
printf("\\n\\n\\\\请输入一个数字(1-5)选择一项功能:");
scanf("%d
printf("%d
if(n>0&&n<6) //选择语句,调用函数
{
switch(n)
{
case 1:enter();break;
case 2:browse();break;
case 3:delet();break;
case 4:search();break;
case 5:exit(0);4 汪通辉2016.12
}
}
else
{
printf("\\a\\a\\a\\a");
menu();
}
return;
}
4.存入功能
程序:
void enter()
{
int i,n;
system("cls");
printf("\\n\\n\\n\\n你想输入几首歌?\\n\\n");
scanf("%d
printf("开始输入歌曲!\\n\\n");
printf("*****************************\\n");
for(i=0;i printf("\\n请输入第%d首歌信息\\n input(i); //调用输入函数 } if(i!=0) { save(n);//调用储存函数 printf("\\n存储成功!\\n"); } back(); return 0; } 2016.12 中国地质大学C 语言课程设计 5 5.浏览功能 程序: void browse() { FILE*fp; int i; if((fp=fopen("song.txt fscanf(fp,"%s%s%s%s printf("%s %s %s %s\\n } fclose(fp); back(); return 0; } 6.删除功能 程序: void delet() { char s[20]; int i,n,j; FILE*fp; fp=fopen("song.txt if(fp==NULL) { printf("无法打开此文件\\n"); exit(0); } system("cls"); printf("\\n\\n\\n\\n所有歌曲记录如下:\\n"); for(i=0;!feof(fp);i++) { fscanf(fp,"%s%s%s%s printf("%s %s %s %s\\n } j=i-1; printf("\\n请输入你要删除的歌曲名字:\\n"); scanf("%s printf("%s\\n共有歌曲%d首\\n for(i=0;i if(strcmp(s,so[i].name)==0) n=i; } printf("删除第%d首 fclose(fp); fp=fopen("song.txt for(i=0;i if(i!=n) fprintf(fp,"%s %s %s %s\\n } fclose(fp); printf("删除成功!"); back(); return ; } [说明]因为已将所有的曲目数据输出到屏幕上,所以选择时未加入容错功能。 7.查找功能 程序: void search() { FILE*fp;int n=100,k;int ch;int i;char c[20]; if((fp=fopen("song.txt { printf("无法打开此文件"); exit(0); } system("cls"); for(i=0;!feof(fp)&&i fscanf(fp,"%s%s%s%s /*printf("%s %s %s %s\\n } n=i-1; printf("\\n\\n\\n\\n你想用什么方式查询\\n\\n1.歌名 2.时间 3.歌手\\n"); scanf("%d switch(ch) { case 1: printf("请输入歌名\\n"); scanf("%s for(i=0;i if(strcmp(c,so[i].name)==0) break; } break; case 2: printf("请输入时间\\n"); scanf("%s { if(strcmp(c,so[i].data)==0)break; }break; case 3: printf("请输入歌手\\n"); scanf("%s for(i=0;i if(strcmp(c,so[i].singer)==0) break; } break; } k=i; if(k==n) printf("并没有这首歌\\n"); else { printf("这是第%d首歌:\\n printf("歌名作者歌手时间\\n"); printf("%s %s %s %s\\n } fclose(fp); back(); } 8.各种公共函数 (1)输入函数 程序: void input(int i) { printf("歌名:"); scanf("%s printf("作者:"); scanf("%s printf("演唱者:");scanf("%s printf("发行日期:"); scanf("%s } (2)储存函数 程序: void save(int n) { FILE*fp; int i; fp=fopen("song.txt if(fp==NULL) { printf("ERROR:can not open this file \\n"); return; } for(i=0;i fprintf(fp,"%s %s %s %s\\n } fclose(fp); } (3)返回函数 程序: void back() { int n; printf("\\n\\n\\n\\n\\n是否返回主菜单?\\n\\n1.返回主菜单 2.退出\\n\\n\\n\\n\\n"); scanf("%d if(n==1) menu(); return; } §1.4实验数据及运行效果截图1.主界面 2.存入功能 3.展示文件 4.浏览功能 5.删除歌曲 6.删除后文件展示 7.分类查询功能 演示结束!§1.5 关于程序设计的几点说明 (1)运行删除功能前,先将文件内所有的数据打印在屏幕上,再进行选择,所以设计程序的时候未设计出容错性。 (2)在查询功能中,由于未知是否有查找的数据,所以设计了容错功能,可以分辨出从键盘输入的歌曲是否存在。 (3)为了使程序界面更加简洁流畅,源文件中使用了system(“cls”);和system(“color 74”);语句,取得了较好的效果。 (4)为了方便使用,该程序写入了返回主菜单函数,可进行连续操作。 §1.6 设计中出现的错误及解决方法 1.菜单功能 进行功能选择时,一开始未加入容错功能,导致程序不完善,后来加入了if else语句后解决。 代码: if(n>0&&n<6) { switch(n) { case 1:enter();break; case 2:browse();break; case 3:delet();break; case 4:search();break; case 5:exit(0); } } else { printf("\\a\\a\\a\\a"); menu(); } 2.关于文件读写 由于对文件读写内容的不熟,刚开始不分“r”和“rb”,而且弄不清什么时候读,什么时候写; 所以在读写文件上老是出错。但后来经老师详细解答和自己看书复习,分清了两者区别,察觉二进制读写目前难以驾驭,所以统统改成了格式化读写。 代码: if((fp=fopen("song.txt { printf("无法打开此文件\\n"); exit(0); } //格式化打开文件 for(i=0;!feof(fp) && i fscanf(fp,"%s%s%s%s printf("%s %s %s %s\\n } //从文件中读文件到结构体中 3.关于删除信息的方式 一开始想了很多关于删除信息的方法但大多以我目前水平难以实现,后来找到了一个较简洁的方法就是先找到要删除的那首歌,而后除了那首歌外重写如文件内。 代码: for(i=0;i if(strcmp(s,so[i].name)==0) n=i; } //找到要删除的那首歌 for(i=0;i if(i!=n) fprintf(fp,"%s %s %s %s\\n } //将除了那首歌外的数据重写进文件里 4.查询歌曲的容错性代码: for(i=0;i if(strcmp(c,so[i].singer)==0) break; } k==i if(k==n) //n=i表示比较完所有数据也没break printf("并没有这首歌\\n"); else //否则输出该首歌 { printf("这是第%d首歌:\\n printf("歌名作者歌手时间\\n"); printf("%s %s %s %s\\n } §1.7课程设计总结心得 这次C语言课程设计给我留下了十分深刻的印象,通过一步步的摸索,更加了解C语言,一点点被C语言的魅力所感染。 自己动手起来,发现课本上那些生涩的逻辑和零碎的知识点都在上机过程中变得鲜活而具体,学起来更有趣味,而且记忆更加深刻,也许有些学科就是这样,实践更能够提升,纸上得来终觉浅。 这次课程设计,我们指导老师董理君温和而耐心,即便是丢三落四的小毛病被他找出来他也不会责备学生,然我们大家都乐于向老师请教。更重要的,老师不仅指出我们的鄂错误,还教我们如何去一步步的调试程序,一点点地找出问题,很快的,面对一些不太难的error,我也能独自找出并解决了。我觉得这样的指导方式让我受益匪浅。 经过课设6天的苦苦煎熬,再加上写报告时的再次回顾与打磨,我才敢说我真正的入门C语言,我相信这次课程设计带给我的收获会给我在今后的学习路上很大的帮助。、 2016.12