[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/****************************************** 所有数据结构定义 *******************************************/
typedef struct data
{
char num[5]; //歌曲编号
char songname[21]; //歌曲名
char writer[21]; //曲作者
char singer[21]; //歌手
char strokenum[3]; //歌曲笔划
char type[9]; //歌曲类型
char initsinger[2]; //歌手名字首字母
char initwriter[2]; //曲作者名字首字母
}DATA; //DATA为此结构体变量的类型名
/****************************************** 所有功能函数声明 *******************************************/
void NewSong(char*); //1.歌曲信息输入
void BrowseSong(char*); //2.歌曲信息浏览
void ModifySong(char*); //3.歌曲信息修改
void DeleteSong(char*); //4.歌曲信息删除
void Writer(); //5.曲作者名字的字母顺序
void Singer(); //6.歌手名字的字母顺序
void StrokeNum(); //7.歌曲名笔划排序
void SongType(); //8.歌曲类别
void SongNum(); //9.歌曲编号
int Choose(int); //10.选择函数
int JudgeNum(char*); //11.判断是否为数字
int JudgeDaxie(char*); //12.判断是否为大写字母
/****************************************** 所有功能函数定义 *******************************************/
void NewSong(char *fn)
{
DATA d1[100]; //1000条歌曲信息
int i = 0, a = 0, j, k, ch1, ch2, ch3;
char ss;
char numx[10], songx[50], writerx[50], singerx[50], strokex[10], initw[10], inits[10];
char typex[6][9] = { "民歌","美声","戏曲" ,"流行乐","外语歌曲","其他" };
FILE *fp;
if ((fp = fopen(fn, "a+")) == NULL) exit(0); //打开文件
do
{
mark0:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌曲编号(4位数字):");
scanf("%s", numx);
getchar();
system("cls");
if ((strlen(numx) != 4)||(JudgeNum(numx)==0))//检查合法性
{
printf("编号格式错误,请按回车键后,重新输入编号!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark0;
}
rewind(fp);//使位置指针fp重返回文件的开头
for (k = 0; feof(fp) == 0; k++) //判断文件指针fp在其所指的文件末
{
fscanf(fp, "歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d1[k].num, d1[k].songname, d1[k].writer, d1[k].initwriter, d1[k].singer, d1[k].initsinger, d1[k].strokenum, d1[k].type);
//printf("歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d1[k].num, d1[k].songname, d1[k].writer, d1[k].initwriter, d1[k].singer, d1[k].initsinger, d1[k].strokenum, d1[k].type);
}
for (j=0;d1[j].num[0] != '\0';j++) //检查重复性
{
if (strcmp(d1[j].num, numx) == 0)
{
printf("此编号已存在,请按回车键后,重新输入编号!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark0;
}
}
j = 0;
strcpy(d1[i].num, numx);
mark1:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌曲名(不超过10位汉字):");
scanf("%s", songx);
getchar();
system("cls");
if ((strlen(songx) > 20) || (strlen(songx) == 0))//检查合法性
{
printf("歌曲名格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark1;
}
strcpy(d1[i].songname, songx);
mark2:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入曲作者名(不超过10位汉字):");
scanf("%s", writerx);
getchar();
system("cls");
if ((strlen(writerx) > 20) || (strlen(writerx) == 0))//检查合法性
{
printf("曲作者名格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark2;
}
strcpy(d1[i].writer, writerx);
mark3:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入曲作者名首字母(1位大写英文字母):");
scanf("%s", initw);
getchar();
system("cls");
if ((strlen(initw) != 1) || (JudgeDaxie(initw) == 0))//检查合法性?
{
printf("格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark3;
}
strcpy(d1[i].initwriter, initw);
mark4:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌手名(不超过10位汉字):");
scanf("%s", singerx);
getchar();
system("cls");
if ((strlen(singerx) > 20) || (strlen(singerx) == 0))//检查合法性
{
printf("歌手名格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark4;
}
strcpy(d1[i].singer, singerx);
mark5:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌手名首字母(1位大写英文字母):");
scanf("%s", inits);
getchar();
system("cls");
if ((strlen(inits) != 1) || (JudgeDaxie(inits) == 0))//检查合法性
{
printf("格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark5;
}
strcpy(d1[i].initsinger, inits);
mark6:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌曲名笔划(数字):");
scanf("%s", strokex);
getchar();
system("cls");
if ((strlen(strokex) != 1) || (JudgeNum(strokex) == 0))//检查合法性
{
printf("格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark6;
}
strcpy(d1[i].strokenum, strokex);
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("*******************\n");
printf("** 1.民歌 **\n");
printf("** 2.美声 **\n");
printf("** 3.戏曲 **\n");
printf("** 4.流行乐 **\n");
printf("** 5.外语歌曲 **\n");
printf("** 6.其他 **\n");
printf("*******************\n");
printf("最后请选择歌曲类型(1-6):");
//getchar();
ch2 = Choose(6);
strcpy(d1[i].type, typex[ch2 - 1]);
//getchar();
system("cls");
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("您将添加的歌曲信息如下:\n\n");
printf("歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n",d1[i].num, d1[i].songname, d1[i].writer, d1[i].initwriter,d1[i].singer, d1[i].initsinger,d1[i].strokenum,d1[i].type);
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否保存此条歌曲信息:");
ch3 = Choose(2);
system("cls");
if (ch3 == 1)
{
fprintf(fp, "歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d1[i].num, d1[i].songname, d1[i].writer, d1[i].initwriter, d1[i].singer, d1[i].initsinger, d1[i].strokenum, d1[i].type); //将数据格式化输出到文件中
printf("已保存此条歌曲信息!\n按回车键进行下一步!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
else
{
printf("未保存此条歌曲信息!\n按回车键进行下一步!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
i++;
system("cls");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否继续添加下一条歌曲信息:");
ch1 = Choose(2);
if (ch1 == 1)
a = 0;
else if (ch1 == 2)
a = 1;
} while (a==0);
fclose(fp);
}
void BrowseSong(char *fn)
{
int k;
DATA d2[100];
FILE *fp;
if ((fp = fopen(fn, "r")) == NULL) exit(0); //打开文件
printf("*******************************************************************************************************************************************************************************\n");
printf("** 所有歌曲 **\n");
rewind(fp);//使位置指针重返回文件的开头
for (k = 0; feof(fp) == 0; k++)
{
fscanf(fp, "歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d2[k].num, d2[k].songname, d2[k].writer, d2[k].initwriter, d2[k].singer, d2[k].initsinger, d2[k].strokenum, d2[k].type);
//printf("歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d2[k].num, d2[k].songname, d2[k].writer, d2[k].initwriter, d2[k].singer, d2[k].initsinger, d2[k].strokenum, d2[k].type);
printf("歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d2[k].num, d2[k].songname, d2[k].writer, d2[k].initwriter, d2[k].singer, d2[k].initsinger, d2[k].strokenum, d2[k].type);
}
printf("*******************************************************************************************************************************************************************************\n");
fclose(fp);
}
void ModifySong(char *fn)
{
}
void DeleteSong(char *fn)
{
DATA d3[100];
char numx[10];
char ss,c;
int i,k,ch1,ch2,ch3;
int len = 0;
FILE *fp;
mark2:
BrowseSong(fn);//显示所有歌曲
if ((fp = fopen(fn, "a+")) == NULL) exit(0); //打开文件
printf("请输入要删除的歌曲信息的编号:");
scanf("%s", numx);
getchar();
system("cls");
rewind(fp);//使位置指针重返回文件的开头
for (k = 0; feof(fp) == 0; k++)
{
fscanf(fp, "歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d3[k].num, d3[k].songname, d3[k].writer, d3[k].initwriter, d3[k].singer, d3[k].initsinger, d3[k].strokenum, d3[k].type);
if (strcmp(d3[k].num, numx) == 0)
{
printf("您将要删除的歌曲信息为:\n");
printf("歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d3[k].num, d3[k].songname, d3[k].writer, d3[k].initwriter, d3[k].singer, d3[k].initsinger, d3[k].strokenum, d3[k].type);
goto mark1;
}
}
k = 0;
printf("不存在此歌曲编号,按回车键后重新输入!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark2;
mark1:
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否删除此条歌曲信息:");
ch1 = Choose(2);
system("cls");
if (ch1 == 1)
{
//删除操作(未完成)
while ((c=fgetc(fp))!=EOF)
{
if(c=='\n')
len++;
}
for (;k<(len-1);k++)//10
{
d3[k] = d3[k + 1];
}
for (i = 0;i<(len - 1);i++)
{
rewind(fp);//使位置指针重返回文件的开头
fprintf(fp, "歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d3[i].num, d3[i].songname, d3[i].writer, d3[i].initwriter, d3[i].singer, d3[i].initsinger, d3[i].strokenum, d3[i].type);
}
len=0;
printf("已删除此条歌曲信息!\n");
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否继续删除其他歌曲信息:");
ch3 = Choose(2);
system("cls");
if (ch3 == 1)
{
goto mark2;
}
}
else if (ch1 == 2)
{
printf("已取消删除此条歌曲信息!\n");
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否继续删除其他歌曲信息:");
ch2 = Choose(2);
system("cls");
if (ch2 == 1)
{
goto mark2;
}
}
fclose(fp);
}
void Writer()
{
}
void Singer()
{
}
void StrokeNum()
{
}
void SongType()
{
}
void SongNum()
{
}
int Choose(int n)
{
char x[10];//防止恶意输入长字符串,溢出
int ch = 0;
char num[30][3] = { "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30" };
int i;
while (ch == 0)
{
gets(x);
fflush(stdin);
for (i = 0;i<n;i++)
{
if (strcmp(x, num[i]) == 0)
{
ch = i + 1;
return ch;
}
}
printf("对不起,没有这个选项。请重新输入!\n");
}
}
int JudgeNum(char *num)
{
int i;
for (i = 0;num[i]!='\0';i++)
{
if ((num[i] < '0') || (num[i] > '9'))
return 0; //含其他字符
}
return 1; //纯数字
}
int JudgeDaxie(char *zimu)
{
int i;
for (i = 0;zimu[i];i++)
{
if ((zimu[i] < 'A') || (zimu[i] > 'Z'))
return 0; //含其他字符
}
return 1; //大写字母
}
/****************************************** 主函数 *******************************************/
int main()
{
char filename[21];
//scanf("%s",filename);
FILE *fp;
//if ((fp = fopen(filename, "a+")) == NULL) exit(0); //打开文件
//fclose(fp);
FILE *mima;
char ss;
char ch0, ch1, ch2, ch3, ch4;
char password[70],pw[70];
int a = 0;
printf("\n");
printf("*********************************************************************************************\n");
printf("*** ***\n");
printf("*** 欢迎使用点歌台! ***\n");
printf("*** ***\n");
printf("*********************************************************************************************\n");
printf("\n\n");
printf("按回车键开始使用点歌台!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
do
{
system("cls");
printf("\n");
printf("*****************************************************************\n");
printf("** **\n");
printf("** 点歌台 **\n");
printf("** **\n");
printf("** 1.管理员操作 **\n");
printf("** 2.顾客点歌台 **\n");
printf("** 3.歌曲播放列表 **\n");
printf("** 4.退出系统 **\n");
printf("** **\n");
printf("*****************************************************************\n");
printf("请输入选择项(1-4):");
ch0 = Choose(4);
system("cls");
if (ch0 == 4)//退出系统
{
system("cls");
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 谢谢使用! **\n");
printf("** 再见! **\n");
printf("** **\n");
printf("***********************************\n");
printf("\n\n");
//getchar();
printf("按回车键关闭程序!\n");
scanf("%c", &ss);
exit(0);
}
if (ch0 == 1)//管理员操作
{
if ((mima = fopen("mima.dat", "r")) == NULL)
{
mima = fopen("mima.dat", "w+");
mark1:
system("cls");
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 管理员操作 **\n");
printf("** **\n");
printf("***********************************\n");
printf("首次使用系统,请设置管理员密码(六位字符):");
scanf("%s", password);
getchar();
system("cls");
if (strlen(password) != 6)//密码长度
{
printf("密码格式错误,请按回车键后,重新设置密码!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark1;
}
printf("!!!您设置管理员密码为:%s\n\n",password);
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否使用此密码:");
ch2 = Choose(2);
if (ch2 == 2)
goto mark1;
if (ch2 == 1)
{
fprintf(mima,"%s",password);
fclose(mima);
}
fflush(stdin);//清空输入缓存
system("cls");
}
mark:
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 管理员操作 **\n");
printf("** **\n");
printf("***********************************\n");
printf("输入管理员密码:");
scanf("%s", pw);
system("cls");
getchar();
fgets(password,7,mima);
if (strcmp(password, pw) == 0)
{
do
{
while (a == 0) /*********************************** 建立歌曲信息文件 **************************************/
{
printf("\n请建立歌曲信息文件!\n");
printf("\n请输入文件名:\n");
scanf("%s", filename);
getchar();
if ((fp = fopen(filename, "r+")) == NULL)
{
if ((fp = fopen(filename, "w+")) == NULL) exit(0); //打开文件
printf("\n新建歌曲信息文件成功!\n");
printf("\n按回车键开始使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
else
{
system("cls");
printf("%s此歌曲信息文件已存在!\n",filename);
printf("**************************\n");
printf("** **\n");
printf("** 1.继续使用 **\n");
printf("** 2.覆盖使用 **\n");
printf("** **\n");
printf("**************************\n");
printf("请选择继续使用或覆盖:");
ch4 = Choose(2);
if (ch4 == 1)
{
system("cls");
printf("将继续使用原文件!\n");
//if ((fp = fopen(filename, "a+"))== NULL) exit(0);
printf("\n按回车键开始使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
if (ch4 == 2)
{
system("cls");
printf("已覆盖原文件!\n");
if ((fp = fopen(filename, "w+")) == NULL) exit(0);
printf("\n按回车键开始使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
}
fclose(fp);
a = 1;
};
/************************************************* 管理员功能 ******************************************************/
system("cls");
printf("\n");
printf("****************************************************************\n");
printf("** **\n");
printf("** 管理员 **\n");
printf("** **\n");
printf("** 1.歌曲信息输入 **\n");
printf("** 2.歌曲信息浏览 **\n");
printf("** 3.歌曲信息修改 **\n");
printf("** 4.歌曲信息删除 **\n");
printf("** 5.修改管理密码 **\n");
printf("** 6.返回上一页面 **\n");
printf("** **\n");
printf("****************************************************************\n");
printf("请输入选择项(1-6):");
ch1 = Choose(6);
system("cls");
if (ch1 == 1)//新增歌曲信息
{
NewSong(filename);
//getchar();
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 2)//查看歌曲信息
{
BrowseSong(filename);/*查看所有歌曲的函数*/
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 3)//修改歌曲信息
{
/*修改歌曲信息的函数*/
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 4)//删除歌曲信息
{
DeleteSong(filename);/*删除歌曲信息的函数*/
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 5)//修改管理密码
{
mima = fopen("mima.dat", "r+");
mark2:
system("cls");
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 管理员操作 **\n");
printf("** **\n");
printf("***********************************\n");
printf("请设置新的管理员密码(六位字符):");
scanf("%s", password);
getchar();
system("cls");
if (strlen(password) != 6) //密码长度
{
printf("密码格式错误,请按回车键后,重新设置密码!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark2;
}
printf("!!!您设置管理员密码为:%s\n\n", password);
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否使用此密码:");
ch2 = Choose(2);
if (ch2 == 2)
goto mark2;
if (ch2 == 1)
{
fprintf(mima, "%s", password);
fclose(mima);
}
system("cls");
printf("\n修改密码成功!\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 6)
break; //返回主菜单
} while (1);
}
else
{
printf("\n密码错误,请按回车键后重新输入!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
goto mark;
}
}
if (ch0 == 2)//顾客点歌台
{
do
{
printf("\n");
printf("***********************************************************\n");
printf("** **\n");
printf("** 顾客点歌台 **\n");
printf("** **\n");
printf("** 1.按歌曲曲作者名字的字母顺序显示歌曲 **\n");
printf("** 2.按歌手名字的字母顺序显示歌曲 **\n");
printf("** 3.按歌曲名笔划排序显示歌曲 **\n");
printf("** 4.按歌曲类别显示歌曲 **\n");
printf("** 5.直接输入歌曲编号 **\n");
printf("** 6.返回主菜单 **\n");
printf("** **\n");
printf("***********************************************************\n");
printf("请输入选择项(1-6):");
ch3 = Choose(6);
system("cls");
if (ch3 == 6)//返回主菜单
{
break;
}
if (ch3 == 1)//曲作者名字字母顺序
{
}
if (ch3 == 2)//歌手名字的字母顺序
{
}
if (ch3 == 3)//歌曲名笔划排序
{
}
if (ch3 == 4)//歌曲类别
{
}
if (ch3 == 5)//歌曲编号
{
}
}while(1);
}
if (ch0 == 3)//歌曲播放列表
{
}
}while (1);
return 0;
}