c语言课程设计--图书/音乐管理系统
这个代码因为配置信息的原因不能直接整个拿去用(o゜▽゜)o☆
这个代码因为配置信息的原因不能直接整个拿去用(o゜▽゜)o☆
这个代码因为配置信息的原因不能直接整个拿去用(o゜▽゜)o☆
只能提供一个思路(其实也可以把里面函数拿去用)ˋ( ° ▽、° )
(ง •_•)ง
这个小系统包含一些除任务要求外额外附加的功能
本来做出来差不多是这个效果基本上来说比任务要求多加了:
{ 1.导入音乐文件并播放;2简单的图形化界面;3.模糊查询功能;}
所有信息的显示与输入都是在dos窗口完成,图形界面实质只是提供了更加便利调用函数的方式(伪图形化操作)ˋ( ° ▽、° )
(纳个suprise其实就是随机播放一首导入的音乐。)
当时使用codeblocks(现在早就转VS) Win32 GUI project 项目加上制作图形的插件。
因为时间较长,只记得当时这个软件配置比较麻烦。。就在这只分享一些源码。
首先文件总体分为三部分(因为用到了这个图形化界面所以多出了main.cpp)
简单说一下程序的逻辑:开启程序 --> 读取磁盘上的配置文件以检测是否是第一次使用该系统以跳转不同管理模式 --> 第一次使用要求设置密码或者限制一些权限。
创建链表并从文件读取信息(其实这部没有必要,之间对文件进行操作即可,没必要单独创建链表把文件中的信息挂载上来)
接下来就是一些查删改等基础操作
先介绍核心部分 ——resource.cpp
1 #include<string.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<stdio.h> 5 #include"resource.h" 6 #include<stdbool.h> 7 #include <windows.h> 8 #include<io.h> 9 10 extern int N1; // 虚拟音乐信息数目 11 extern int N2; // 音乐文件数目//不超过10个 12 char add[10][50]={0};// 音乐文件地址 13 FILE *file1;// 内置默认文件 //moren.txt 14 FILE *file2;// 用户更改的信息库//data.txt 15 extern char code[11];// 记录密码 16 extern MUSIC *head; 17 extern bool FFLAG;//FFLAG 是否第一次使用该系统 18 extern bool FLAG;//FLAG 是否拥有管理员权限 19 extern FILE *fp; 20 MUSIC *nowlist;// 链表最后一个节点 21 MUSIC *now;// 在链表中移动的节点 22 void print_help(void)// 帮助按钮 23 { 24 printf("请通过按钮选择你所需要的功能\n" 25 "ps: 1.第一次使用,请先初始化并刷新音乐库\n" 26 " 2.若要播放音乐,请先刷新音乐库\n" 27 " 4.通过CLEAR按键清除屏幕\n" 28 " 3.若要退出系统请先关闭图形化窗口,不要直接关闭dos窗口\n"); 29 } 30 31 void Scanf(MUSIC *now)// 读取MUSIC 32 { 33 scanf("%d%s%s%s",&canshu); 34 } 35 void Printf(MUSIC *now)// 打印MUSIC 36 { 37 printf("%7d%10s%10s%10s\n",canshu); 38 } 39 void Fscanf(MUSIC *now,FILE *nowf)// 从文件中获取信息 40 { 41 fscanf(nowf,"%d%s%s%s",&canshu); 42 } 43 void Fprint(MUSIC *now,FILE *nowf)// 将输入的信息保存到文件中 44 { 45 fprintf(nowf,"%d %s %s %s ",canshu); 46 } 47 void Fprint1(MUSIC *now,FILE *nowf)// 将输入的信息保存到文件中 48 { 49 fprintf(nowf,"%d %s %s %s\n",canshu); 50 } 51 void chushihua1(void)// 预置信息 52 { 53 printf("第一次使用,请先设置密码\n"); 54 setcode(); 55 CreatList(head,3,0); 56 } 57 void chushihua(void)// 初始化按键功能 58 { 59 if(FFLAG==true)printf("你还没有管理员权限,请先登录\n"); 60 else{chushihua1();return;} 61 if(FLAG)//如果有权限 62 { 63 fp=fopen("C:\\Users\\EA\\Desktop\\date.txt","w"); 64 chushihua1(); 65 fclose(fp); 66 } 67 else printf("你还没有管理员权限,请先登录\n"); 68 } 69 void setcode(void)// 设置密码 70 { 71 scanf("%s",code); 72 printf("密码设置成功!!\n"); 73 } 74 void onling(void)// 管理员登陆 75 { 76 char nowcode[11]={0}; 77 printf("请输入密码\n"); 78 scanf("%10s",nowcode); 79 while(!Strcmp(code,nowcode,strlen(code),strlen(nowcode))) 80 {////如果密码正确 81 printf("密码错误,请再次输入" 82 "若取消登陆,请输入Q\n"); 83 memset(nowcode,0,sizeof(nowcode)); 84 scanf("%s",nowcode); 85 if(*nowcode=='Q'&&strlen(nowcode)==1)break;//如果用户选择退出 86 } 87 if(strlen(nowcode)!=1){printf("登陆成功\n");FLAG=true;} 88 } 89 int Strcmp(const char *x,const char *y,int n,int m)// 密码比较 90 { 91 int i=0; 92 if(n!=m)return 0; 93 while(*x==*y&&*x&&*y){i++;x++;y++;} 94 if(i==m)return 1; 95 return 0; 96 } 97 void play_sound(void)// 随机播放音乐 98 { 99 srand(time(NULL)); 100 PlaySound(TEXT(add[rand()%N2]),NULL, SND_ASYNC | SND_NODEFAULT); 101 } 102 void CreatList(MUSIC *head,int n,int m)// 创建链表,并保存数据 103 { 104 N1+=n;// 虚拟信息数目 105 int i = 0;// 当m==0初始化读取预置信息,否则创建新的节点 106 if(m==0){file1=fopen("C:\\Users\\EA\\Desktop\\moren.txt","r");nowlist = (MUSIC*)head;} 107 else{nowlist->next = (MUSIC *)malloc(sizeof(MUSIC));nowlist=nowlist->next;} 108 for(i=0; i<n; i++) 109 { 110 if(m==0)Fscanf(nowlist,file1);//从预置信息文件读取信息 111 else Scanf(nowlist); 112 if(i<n-1)// 当节点数量小于所需数量 113 { 114 nowlist ->next =(MUSIC *)malloc(sizeof(MUSIC)); 115 nowlist = nowlist ->next; 116 } 117 } 118 nowlist->next=NULL; 119 if(m==0)fclose(file1); 120 //fclose(file2); 121 } 122 void load_music_info(void)// 在链表后加入新节点 123 { 124 int n=0; 125 printf("请输入你想要导入音乐信息的数量:"); 126 scanf("%d",&n); 127 printf("请按以下格式输入信息:\n" 128 "0001 musicname singer album\n"); 129 CreatList(nowlist,n,1); 130 } 131 132 void search_actual(int x)// 寻找真实具有的音乐 133 { 134 N2=0;// 将文件数目初始化为0 135 long hand; 136 struct _finddata_t fileinfo; 137 int i=0; 138 char fileadd[]="C:\\Users\\EA\\Music\\shili\\";//在该文件下搜索 139 char fileformat[]="*.wav";// 搜索该格式文件 140 char name[100]; 141 strcpy(name,fileadd); 142 strcat(name,fileformat); 143 hand=_findfirst(name,&fileinfo); 144 if(hand!=-1L) 145 { 146 if(x!=0)printf("音乐库有以下音乐文件:\n"); 147 do 148 { 149 strcpy(name,fileadd); 150 strcat(name,fileinfo.name); 151 if(x!=0)printf("%s\n",fileinfo.name); 152 strcpy(add[i++],name);// 把音乐文件路径保存下来 153 N2++;// 如果扫描到一个,则真实文件数目加1 154 }while(_findnext(hand,&fileinfo)==0); 155 } 156 // if(x!=0)else{printf("no sereach !!!\n");} 157 for(i=0; i<N2; i++)abss(add[i],add[i]); 158 } 159 void abss(char *x,char*z)// 转化成绝对地址 160 { 161 int k=0; 162 char b[100] = {0}; 163 for(; (*x)!=0; x++,k++) 164 { 165 if((*x)!='\\')b[k]=*x; 166 else{b[k++]='\\';b[k]='\\';} 167 } 168 b[k]=0;strcpy(z,b); 169 } 170 171 void chudu(void)// 从系统文件加载信息 172 { 173 file2=fopen("C:\\Users\\EA\\Desktop\\date.txt","r"); 174 int i = 0; 175 MUSIC *nowlist = (MUSIC*)head;// 把磁盘信息导入到链表中 176 for(i=0; i<N1; i++) 177 { 178 Fscanf(nowlist,file2); 179 if(i<N1-1) 180 { 181 nowlist ->next =(MUSIC *)malloc(sizeof(MUSIC)); 182 nowlist = nowlist ->next; 183 } 184 } 185 nowlist->next=NULL; 186 fclose(file2); 187 } 188 void view_all(void)// 显示所有链表信息 189 { 190 printf("共有%d条音乐信息!!\n",N1); 191 now = (MUSIC *)head; 192 while(now) 193 { 194 printf("%04d%12s%12s%12s\n",canshu); 195 now = now->next; 196 } 197 } 198 void revise(void)// 修改音乐信息 199 { 200 int n; 201 int m=0; 202 printf("请输入你想要修改的音乐编号;"); 203 scanf("%d",&n); 204 now = (MUSIC *)head; 205 while(now) 206 { 207 if(now->next->number==n) 208 { 209 printf("请输入更改后的信息;\n"); 210 Scanf(now->next);m=1;break; 211 } 212 now = now->next; 213 } 214 if(m==0)printf("no search!!\n"); 215 else printf("修改成功!!\n"); 216 } 217 int searchname(int x,int y)// 系列查找 218 { 219 int i=0; 220 int m=0; 221 char name1[20]={0}; 222 if(x==1)printf("请输入你想要查询的歌手:"); 223 else 224 { 225 if(y==1)printf("请输入你想要播放的音乐名:"); 226 else printf("请输入你想要查询的音乐名:"); 227 } 228 scanf("%s",name1); 229 now = (MUSIC *)head; 230 while(now) 231 { 232 if(x==1) 233 {if(Strcmp(now->S_N,name1,strlen(now->S_N),strlen(name1))) 234 {Printf(now);m=1;break;}} 235 else 236 { 237 if(Strcmp(now->M_N,name1,strlen(now->M_N),strlen(name1))) 238 {Printf(now);m=1;if(y==1)return i;break;}//当x==0,y==1,返回查找所要播放音乐文件的地址下标 239 } 240 now = now->next; 241 i++; 242 } 243 if(m==0)printf("no search!!\n"); 244 return -1; 245 } 246 void play(void)// 输入音乐名播放音乐 247 { 248 int i=-1; 249 i = searchname(0,1); 250 if(i!=-1){printf("请欣赏!!\n");PlaySound(TEXT(add[i]),NULL, SND_ASYNC | SND_NODEFAULT);} 251 } 252 void searchkey(void)// 关键字查找 253 { 254 int i=0; 255 int m=0; 256 char name1[20]={0}; 257 printf("请输入你想查找的关键字:"); 258 scanf("%s",name1); 259 now = (MUSIC *)head; 260 while(now) 261 { 262 if(strstr(now->M_N,name1)||strstr(now->S_N,name1)) 263 {Printf(now);i++;m=1;} 264 now = now->next; 265 } 266 printf("共找到了%d条相关信息!!\n",i); 267 if(m==0)printf("未找到\n"); 268 } 269 270 void wenjian(void) 271 { 272 printf("请把音乐文件放入C:\\Users\\EA\\Music\\shili\n"); 273 printf("请按以下格式输入你导入音乐信息:\n" 274 "0001 musicname singer album\n"); 275 charu(1);// 在真实音乐文件信息后插入 276 } 277 void charu(int x) 278 { 279 now = (MUSIC*)head; 280 MUSIC *nowlist2 = (MUSIC*)malloc(sizeof(MUSIC));// 要插入的节点信息 281 int i=0; 282 if(x==1)for(i=0; i<N2-1; i++)now=now->next;//在预置音乐后插入真实音乐文件信息 283 else 284 { 285 int n; 286 printf("请输入你想要插入的位置:"); 287 scanf("%d",&n); 288 if(n<N2){printf("前%d个为系统预置,不能插入!!\n",N2);return;} 289 for(i=0; i<n-1; i++)now=now->next; 290 printf("请输入音乐信息:\n"); 291 292 } 293 Scanf(nowlist2); 294 nowlist2 ->next = now->next; 295 now ->next = nowlist2; 296 if(x==1) 297 { 298 file1=fopen("C:\\Users\\EA\\Desktop\\moren.txt","a+"); 299 fprintf(file1,"%04d %s %s %s\n",nowlist2->number,nowlist2->M_N,nowlist2->S_N,nowlist2->album); 300 fclose(file1); 301 } 302 if(x!=1){N1++;printf("插入成功!!\n");} 303 if(x==1)printf("保存成功!!\n"); 304 if(x==1)search_actual(0); 305 } 306 void sc(void) 307 { 308 int m=0; 309 now = (MUSIC*)head; 310 MUSIC *nowlist2; 311 int num; 312 printf("请输入你要删除音乐的编号:"); 313 scanf("%d",&num); 314 if(num<=N2){printf("预置音乐无法删除!!\n");return;} 315 while(now) 316 { 317 if(now->next->number==num) 318 { 319 nowlist2 = now->next; 320 now->next = nowlist2->next; 321 free(nowlist2);m=1; 322 break; 323 } 324 now = now->next; 325 } 326 if(m==1)printf("删除成功!!\n"); 327 else printf("no search!!\n"); 328 } 329 void baocun(void) 330 { 331 file2=fopen("C:\\Users\\EA\\Desktop\\date.txt","w"); 332 now = (MUSIC*)head; 333 N1=0; 334 while(now) 335 { 336 N1++;//音乐信息文件++ 337 Fprint(now,file2); 338 now = now->next; 339 } 340 fclose(file2); 341 } 342 void px(void)// 排序 343 { 344 //先把所有信息放在数组上,再对数组进行排序,再把信息返回链表 345 int i=0; 346 int j=0; 347 MUSIC a[N1]; 348 now = (MUSIC*)head; 349 while(now) 350 {a[i].number = now->number; 351 strcpy(a[i].M_N,now->M_N); 352 strcpy(a[i].S_N,now->S_N); 353 strcpy(a[i].album,now->album); 354 now=now->next;i++;} 355 int minnum; 356 int mins; 357 now = (MUSIC*)head; 358 MUSIC temp; 359 for(i=0; i<N1; i++)// 选择排序 360 { 361 minnum=a[i].number; 362 mins = i; 363 for(j=i; j<N1; j++) 364 {if(a[j].number<minnum) 365 {minnum = a[j].number;mins = j;}} 366 if(i!=mins)//MUSIC类型变量交换 367 { 368 sscp(&temp,&a[mins]); 369 sscp(&a[mins],&a[i]); 370 sscp(&a[i],&temp); 371 } 372 if(i>=N2)//对除预置信息外的音乐排序 373 { 374 now->number=a[i].number; 375 strcpy(now->M_N,a[i].M_N); 376 strcpy(now->S_N,a[i].S_N); 377 strcpy(now->album,a[i].album); 378 } 379 now=now->next; 380 } 381 } 382 void sscp(MUSIC *x,MUSIC *y)// MUSCI类型赋值 383 { 384 x->number = y->number; 385 strcpy(x->M_N,y->M_N); 386 strcpy(x->S_N,y->M_N); 387 strcpy(x->album,y->M_N); 388 }
因为用到了查找磁盘上音乐文件,所以可能要用到c++函数(时间长了不确定了)
接下来是头文件——里面包含了一些按钮的定义是图形化插件主动创建的,这些按钮将在main.cpp检测是否点击按钮
1 #ifndef IDC_STATIC 2 #define IDC_STATIC (-1) 3 #define canshu now->number,now->M_N,now->S_N,now->album 4 5 typedef struct MUSIC 6 { 7 int number;// 编号 8 char M_N[20];// 歌曲名 9 char S_N[20];// 歌唱者 10 char album[20];// 专辑 11 struct MUSIC *next; 12 }MUSIC; 13 int Strcmp(const char *,const char *,int ,int );// 核对密码 //前两个字符串。后两个字符串长度 14 void setcode(void);// 设置密码 15 void chushihua(void);// 系统初始化 16 void chushihua1(void);// 导入预存歌曲信息 17 void Printf(MUSIC *);// 将信息打印 18 void Fprint(MUSIC *,FILE *);// 将信息保存到文件中 19 void Scanf(MUSIC *);// 从键盘获取成员信息 20 void Fscanf(MUSIC *,FILE *);// 从文件获取成员信息 21 void onling(void);// 登陆 22 void print_help(void);// 打印帮助信息 23 void CreatList(MUSIC *,int n,int m);// 创建链表 //n:创建的链表数,m==0,导入默认信息,m==1,加入新的节点 24 void play_sound(void);// 播放音乐 25 void abss(char *,char*);// 转化绝对地址 26 void search_actual(int);// 查看真实存在的音乐 27 void load_music_info(void);// 录入音乐信息 28 void view_all(void);// 显示所有音乐信息 29 void revise(void);// 修改音乐信息 30 int searchname(int x,int y);// 系列查询 //当x==1查询歌手,否则{当y==1时寻找要播放的音乐名,否则查询音乐名} 31 void searchkey(void);// 模糊查找 32 void play(void);// 播放音乐 33 void chudu(void);// 从文件中读取数据 34 void baocun(void);// 保存数据到文件 35 void charu(int x);// 插入音乐信息 //当x==1时导入真实音乐信息,否则插入虚拟信息 36 void wenjian(void);// 导入音乐文件 37 void sscp(MUSIC *x,MUSIC *y);// MUSIC类型赋值 38 void px(void);// 排序 39 void sc(void);// 删除音乐信息 40 41 #endif 42 43 #define DLG_MAIN 100 44 #define daoruxinxi 40000 45 #define search_singer 40001 46 #define Surprise 40002 47 #define On 40003 48 #define Off 40004 49 #define search_key 40005 50 #define INITIALISE 40006 51 #define daoruwenjian 40007 52 #define xiugaixinxi 40008 53 #define onlin 40009 54 #define CLEAR 40010 55 #define HELP 40011 56 #define settcode 40012 57 #define bofangyinyue 40013 58 #define shuaxin 40014 59 #define search_name 40015 60 #define xianshixinxi 40016 61 #define charuxinxi 40018 62 #define paixu 40019 63 #define shanchuxinxi 40020
最后就是一个Win32 GUI project的框架
主要是检测按钮是否被按下以调用对应函数
1 #include <windows.h> 2 #include <commctrl.h> 3 #include <stdio.h> 4 #include <windef.h> 5 #include "resource.h" 6 #include <mmsystem.h> 7 int N1=0;// 虚拟文件数目 8 int N2=0;// 真实文件数目 9 bool FFLAG = false;// 是否第一次使用系统(有没有创建数据文件) 10 bool FLAG= false;// 是否具有管理员权限 11 FILE *fp;// 配置信息文件 12 char code[11];// 保存密码 13 MUSIC *head = (MUSIC *)malloc(sizeof(MUSIC)); 14 HINSTANCE hInst; 15 BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 16 { 17 18 switch(uMsg) 19 { 20 case WM_INITDIALOG: 21 { 22 printf("欢迎使用歌曲管理系统!!\n"); 23 search_actual(0); 24 if((fp=fopen("C:\\Users\\EA\\Desktop\\setting.txt","r"))==NULL) 25 {FFLAG = 0;printf("您是第一次使用本系统,请先初始化。\n");} 26 else 27 {fscanf(fp,"%s%d%d",code,&N1,&N2);chudu();fclose(fp);}//从配置文件读取信息 28 } 29 return TRUE; 30 31 case WM_CLOSE: 32 { 33 EndDialog(hwndDlg, 0); 34 baocun();// 则保存链表信息到文件 35 fp=fopen("C:\\Users\\EA\\Desktop\\setting.txt","w"); 36 fprintf(fp,"%s %d %d",code,N1,N2);//把配置信息保存至文件 37 fclose(fp); 38 printf("谢谢你的使用!\n"); 39 } 40 return TRUE; 41 42 case WM_COMMAND: 43 { 44 switch(LOWORD(wParam)) 45 { 46 case HELP:// 打印help 47 {print_help();break;} 48 case INITIALISE:// 初始化 49 {chushihua();break;} 50 case onlin:// 登陆 51 {onling();break;} 52 case On:// 随机播放音乐 53 {play_sound();break;} 54 case Off:// 关闭音乐 55 {PlaySound(NULL,NULL,SND_FILENAME);break;} 56 case Surprise:// 随机播放音乐 57 {play_sound();break;} 58 case shuaxin:// 刷新音乐库列表 59 {search_actual(1);break;} 60 case xianshixinxi:// 显示所有音乐信息 61 {view_all();break;} 62 case search_name:// 按名称查询 63 {searchname(0,0);break;} 64 case search_singer:// 按歌手查询 65 {searchname(1,0);break;} 66 case search_key:// 关键字查询 67 {searchkey();break;} 68 case CLEAR:// 清理屏幕 69 {system("cls");printf("欢迎使用歌曲管理系统!!\n");break;} 70 case bofangyinyue:// 选择播放音乐 71 {play();break;} 72 case paixu:// 对音乐信息进行排序 73 {px();break;} 74 case charuxinxi:// 插入音乐信息 75 { if(FLAG)charu(0); 76 else printf("你还没有管理员权限,请先登陆\n"); 77 break; 78 } 79 case shanchuxinxi:// 删除音乐信息 80 { 81 if(FLAG)sc(); 82 else printf("你还没有管理员权限,请先登陆\n"); 83 break; 84 } 85 86 case daoruwenjian:// 导入音乐文件 87 { 88 if(FLAG)wenjian(); 89 else printf("你还没有管理员权限,请先登陆\n"); 90 break; 91 } 92 case xiugaixinxi:// 修改音乐信息 93 { 94 if(FLAG)revise(); 95 else printf("你还没有管理员权限,请先登陆\n"); 96 break; 97 } 98 case settcode:// 设置密码 99 { 100 if(FLAG){printf("请输入你修改后的密码:");setcode();} 101 else printf("你还没有管理员权限,请先登陆\n"); 102 break; 103 } 104 case daoruxinxi:// 加入音乐信息 105 { 106 if(FLAG)load_music_info(); 107 else printf("你还没有管理员权限,请先登陆\n"); 108 break; 109 } 110 } 111 } 112 return TRUE; 113 } 114 return FALSE; 115 } 116 117 118 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 119 { 120 hInst=hInstance; 121 InitCommonControls(); 122 return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain); 123 }
源文件
链接:https://pan.baidu.com/s/1JHDw9HnoC4VtaUurJRrl3w
提取码:lfmg
复制这段内容后打开百度网盘手机App,操作更方便哦