Loading

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 }
resource.cpp

  因为用到了查找磁盘上音乐文件,所以可能要用到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
recourse.h

最后就是一个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 }
main.cpp

 

源文件

 

链接:https://pan.baidu.com/s/1JHDw9HnoC4VtaUurJRrl3w
提取码:lfmg
复制这段内容后打开百度网盘手机App,操作更方便哦

 

 

posted @ 2019-06-14 21:33  沉云  阅读(970)  评论(0编辑  收藏  举报