C++ assignment 辅导讲解 UML diagram 辅导、辅导Polymorphism and Complexity C++编程
- 首页 >> C/C++编程#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
typedef struct _SINGERINFO //歌手信息结构体
{
int nIndex;//序号
char szName[30];//名字
char szSex[10];//性别
int nAge;//年龄
float JudgesArr[10];//所有评委给的分数
float fScore;//去掉最高和最低后.8位评委的平均分
int nIsScore;//是否进行过打分.
}SINGERINFO,*PSINGERINFO;
PSINGERINFO g_pSingereInofArr;//存储歌手信息的数组首地址
int g_nCurIndex;//当前歌手数量计数(当前索引)
int g_nMaxIndex;//当前最大可存储的信息数量(最大索引)
void InitData();//初始化
void ShowMenu();//显示菜单
int Menu_Select();//得到所选菜单编号
void IsSpace();//数组是否需要扩容
int BinarySearchIndex(int nIndex);//是否存在此歌手-序号
int IsRepSingerName(char* szSingerName);//是否存在此歌手-名称
void InsertionSingerInfo();//增加一个歌手信息
void SingerScore();//评委打分
void SingerScoreSort();//按照成绩排序
void FindSingerInfo();//查找歌手信息
void SetSingerInfo();//输入歌手信息(修改歌手信息)
void SaveSingerInofToFile();//保存歌手信息到文件
int main()
{
InitData();//初始化数据
do
{
ShowMenu();//显示菜单
switch(Menu_Select())//根据Menu_Select函数返回值判断选择的哪个菜单选项
{
case 1://修改歌手信息
{
SetSingerInfo();//修改歌手信息
break;
}
case 2://评委打分
{
SingerScore();//评委打分
break;
}
case 3://成绩排序
{
SingerScoreSort();
break;
}
case 4://数据查询
{
FindSingerInfo();
break;
}
case 5://添加歌手
{
InsertionSingerInfo();//增加一个歌手信息
break;
}
case 6://写入数据文件
{
SaveSingerInofToFile();//保存歌手信息到文件
break;
}
case 7://退出系统
{
return 0;
}
}
} while (1);
return 0;
}
//保存歌手信息到文件
void SaveSingerInofToFile()
{
FILE *fp;
PSINGERINFO p;
char outfile[254];
int i;
printf("\t\t\t\t输入存盘文件名:");
scanf("%s",outfile);
if((fp=fopen(outfile,"w"))==NULL)
{
printf("\t\t\t\t打不开文件\n");
return;
}
p=g_pSingereInofArr;
for (i = 0;i<g_nCurIndex;i++)
{
fwrite(&p[i],sizeof(SINGERINFO),1,fp);
}
fclose(fp);
printf("\t\t\t\t保存成功\n");
}
void SetSingerInfo()
{
char cFlag = 0;//是否继续进行录入的控制字符
int nIndex=0;//临时存储输入的选手序号
int nIsRepIndex = 0;//序号是否存在
char szSex[10]={0};
int nAge=0;
do
{
system("CLS");
printf("*********************************评委打分**************************************\n\n");
printf(" 输入待评分歌手信息\n\n");
printf("请输入歌手编号:");
scanf("%d",&nIndex);
nIsRepIndex = BinarySearchIndex(nIndex);
if (nIsRepIndex == -1)
{
printf("编号不正确,是否重新输入?(Y/N)\n请输入:");
}
else
{
//查找到对应的歌手了.那么对其信息进行输入
printf("请输入要修改的数据:\n请输入年龄:");
scanf("%d",&nAge);
printf("请输入性别:");
scanf("%d",szSex);
g_pSingereInofArr[nIsRepIndex].nAge = nAge;
strcpy(g_pSingereInofArr[nIsRepIndex].szSex,szSex);
}
getchar();
scanf("%c",&cFlag);
printf("\n\n 按任意键回到主菜单\n");
} while (cFlag == 'Y' || cFlag == 'y');
_getch();
}
void FindSingerInfo()
{
int nIndex=0;//临时存储输入的选手序号
char cFlag = 0;//是否继续进行录入的控制字符
int nIsRepIndex = 0;//序号是否存在
int i=0;
do
{
system("CLS");
printf("*********************************评委打分**************************************\n\n");
printf(" 输入待评分歌手信息\n\n");
printf("请输入歌手编号:");
scanf("%d",&nIndex);
nIsRepIndex = BinarySearchIndex(nIndex);
if (nIsRepIndex == -1)
{
printf("编号不正确,是否重新输入?(Y/N)\n请输入:");
}
else
{
printf("歌手信息如下:\n姓名:%s\n编号:%d\n年龄:%d\n性别:",g_pSingereInofArr[nIsRepIndex].szName,g_pSingereInofArr[nIsRepIndex].nIndex,g_pSingereInofArr[nIsRepIndex].nAge);
if (!strcmp(g_pSingereInofArr[nIsRepIndex].szSex ,""))
{
printf("未录入\n");
}
else
{
printf("%s\n",g_pSingereInofArr[nIsRepIndex].szSex);
}
if (g_pSingereInofArr[nIsRepIndex].nIsScore)
{
printf("分数:%.2f\n",g_pSingereInofArr[nIsRepIndex].fScore);
}
else
{
printf("此歌手并未评分.");
}
printf("\n\n查询结束,是否继续对其他歌手评分?(Y/N)\n请输入:");
}
getchar();
scanf("%c",&cFlag);
printf("\n\n 按任意键回到主菜单\n");
} while (cFlag == 'Y' || cFlag == 'y');
_getch();
}
//成绩排序:冒泡
void ScoreSort()
{
const float EPSINON = 0.0000001f;
int i, j;
SINGERINFO temp;
for(i = 0; i < g_nCurIndex; ++i)
{
for(j = g_nCurIndex - 1; j > i; --j)
{
if( (g_pSingereInofArr[j].fScore - g_pSingereInofArr[j - 1].fScore) > EPSINON)
{
memcpy((void*)&temp,(void*)(&(g_pSingereInofArr[j])),sizeof(SINGERINFO));
memcpy((void*)&(g_pSingereInofArr[j]),(void*)&(g_pSingereInofArr[j - 1]),sizeof(SINGERINFO));
memcpy((void*)&(g_pSingereInofArr[j - 1]) ,(void*)&temp,sizeof(SINGERINFO));
}
}
}
}
void SingerScoreSort()
{
//PNODE temp = NULL;
int i;
system("CLS");
printf("*********************************成绩排序**************************************\n\n");
printf(" 成绩按从高到低排列\n\n");
if (g_nCurIndex>0)
{
ScoreSort();
for (i =0;i<g_nCurIndex;i++)
{
printf("第%d名:%s,平均分数为:%.2f\n",i+1,g_pSingereInofArr[i].szName,g_pSingereInofArr[i].fScore);
}
printf("\n\n 成绩排序完毕.\n\n 按任意键回到主菜单\n");
}
else
{
printf("\n\n 当前没有歌手.\n\n 按任意键回到主菜单\n");
}
_getch();
}
//10位评委分数排序:冒泡排序
void BubbleSort(float arr[], int len)
{
int i, j; float temp;
for (i = 0; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//评委打分
void SingerScore()
{
float AverageScore = 0;//平均分数
int nIndex=0;//临时存储输入的选手序号
char szName[30]={0};//临时存储输入的选手名称
char cFlag = 0;//是否继续进行录入的控制字符
int nIsRepName = 0;//名称是否存在
int nIsRepIndex = 0;//序号是否存在
int i=0;
do
{
system("CLS");
printf("*********************************评委打分**************************************\n\n");
printf(" 输入待评分歌手信息\n\n");
printf("请输入歌手编号:");
scanf("%d",&nIndex);
nIsRepIndex = BinarySearchIndex(nIndex);
printf("请输入歌手名字:");
scanf("%s",szName);
nIsRepName = IsRepSingerName(szName);
if (nIsRepName == -1 || nIsRepIndex == -1)
{
if (nIsRepName == -1)
printf("歌手名称不正确");
if(nIsRepIndex == -1)
printf("编号不正确");
printf(",是否重新输入?(Y/N)\n请输入:");
}
else
{
if (g_pSingereInofArr[nIsRepIndex].nIsScore == 0)
{
g_pSingereInofArr[nIsRepIndex].nIsScore =1;//没有评过分.则进行评分.并且将是否评分标志改为1;
printf("开始为 编号[ %d ]歌手[ %s ]开始进行打分:\n",g_pSingereInofArr[nIsRepIndex].nIndex,g_pSingereInofArr[nIsRepIndex].szName);
/*开始打分部分,10个评委随机打分.生成分数在0到100之间,去掉最高分,最低分, 求平均值*/
for (i=0;i<10;i++)
{
g_pSingereInofArr[nIsRepIndex].JudgesArr[i] = (float)rand() / RAND_MAX; //得到小数点后部分
g_pSingereInofArr[nIsRepIndex].JudgesArr[i] += (float)((int)(g_pSingereInofArr[nIsRepIndex].JudgesArr[i]*1000)%100); //计算小数点前边部分
if(g_pSingereInofArr[nIsRepIndex].JudgesArr[i] < 30.00)//如果得分低于30分.那么适当的补点分.省的选手太难看.
g_pSingereInofArr[nIsRepIndex].JudgesArr[i] += 30.00;
printf("第%.2u位评委给出的分数:%.2f\n",i+1,g_pSingereInofArr[nIsRepIndex].JudgesArr[i]);
}
BubbleSort(g_pSingereInofArr[nIsRepIndex].JudgesArr,10);
for (i=1;i<9;i++)
{
AverageScore += g_pSingereInofArr[nIsRepIndex].JudgesArr[i];//累加除了最低和最高分.得到其余8位评委的分数和
}
AverageScore = AverageScore/8;//得到平均分
g_pSingereInofArr[nIsRepIndex].fScore = AverageScore;
printf("去掉一个最低分:%.2f,去掉一个最高分:%.2f,最终选手的平均分数为:%.2f",g_pSingereInofArr[nIsRepIndex].JudgesArr[0],g_pSingereInofArr[nIsRepIndex].JudgesArr[9],g_pSingereInofArr[nIsRepIndex].fScore);
printf("\n\n评分结束,是否继续对其他歌手评分?(Y/N)\n请输入:");
}
else
{
printf("\n\n该选手已经评过分,分数为:%.2f,是否继续对其他歌手评分?(Y/N)\n请输入:",g_pSingereInofArr[nIsRepIndex].fScore);
}
}
getchar();
scanf("%c",&cFlag);
printf("\n\n 按任意键回到主菜单\n");
} while (cFlag == 'Y' || cFlag == 'y');
}
//序号采用折半查找.找到返回下标.否则返回-1
int BinarySearchIndex(int nIndex)
{
int nLow,nHigh,nMid;;
//bool bFlag = false;
nLow = 0;
nHigh = g_nCurIndex-1;
while (nLow <= nHigh)
{
nMid = (nLow + nHigh)/2;
if (nIndex > g_pSingereInofArr[nMid].nIndex)
nLow = nMid+1;
else if (nIndex < g_pSingereInofArr[nMid].nIndex)
nHigh = nMid - 1;
else
{
//bFlag = true;
return nMid;
}
}
return -1;
}
int IsRepSingerName(char* szSingerName)
{
int i;
for (i=0;i<g_nCurIndex;i++)
{
if (!strcmp(g_pSingereInofArr[i].szName,szSingerName))
{
return i;
}
}
return -1;
}
void InsertionSingerInfo()
{
int nIndex=0;//临时存储输入的选手序号
char szName[30]={0};//临时存储输入的选手名称
char cFlag = 0;//是否继续进行录入的控制字符
int nIsRepName = 0;//名称是否存在
int nIsRepIndex = 0;//序号是否存在
do
{
system("CLS");
printf("*******************************歌手比赛系统************************************\n\n");
printf(" 输入歌手基本信息\n\n");
printf("请输入歌手编号:");
scanf("%d",&nIndex);
nIsRepIndex = BinarySearchIndex(nIndex);
printf("请输入歌手名字:");
scanf("%s",szName);
nIsRepName = IsRepSingerName(szName);
if (nIsRepName != -1 || nIsRepIndex != -1)
{
if (nIsRepName != -1)
printf("歌手名称已存在");
if(nIsRepIndex != -1)
printf("编号已存在");
printf(",是否重新输入?(Y/N)\n请输入:");
}
else
{
//编号和名字都不存在.可以创建
IsSpace();//判断是否需要扩容数组
strcpy(g_pSingereInofArr[g_nCurIndex].szName,szName);//复制名称
g_pSingereInofArr[g_nCurIndex].nIndex = nIndex;//赋值序号
g_nCurIndex++;
printf("添加完毕!是否继续添加?(Y/N)\n请输入:");
}
getchar();
scanf("%c",&cFlag);
} while (cFlag == 'Y' || cFlag == 'y');
printf("\n\n 按任意键回到主菜单\n");
_getch();
}
void IsSpace()
{
if (g_nCurIndex >= g_nMaxIndex)//需要申请新的空间
{
PSINGERINFO Temp = (PSINGERINFO)malloc((g_nMaxIndex+10)*sizeof(SINGERINFO));
memset(Temp,0,(g_nMaxIndex+10)*sizeof(SINGERINFO));
memcpy(Temp,g_pSingereInofArr,sizeof(SINGERINFO)*g_nMaxIndex);//拷贝原来数据
g_nMaxIndex+=10;//最大下标+10
free(g_pSingereInofArr);//释放原空间
g_pSingereInofArr = Temp;//全局指针变量指向malloc的空间
}
}
//得到所选菜单编号
int Menu_Select()
{
int nRet = 0;
printf("您想进行的操作:");
scanf("%d",&nRet);
return nRet;
}
//显示菜单
void ShowMenu()
{
system("CLS");
printf("*******************************歌手比赛系统************************************\n");
printf(" 1.输入歌手信息\n");
printf(" 2.评委打分\n");
printf(" 3.成绩排序\n");
printf(" 4.数据查询\n");
printf(" 5.添加歌手\n");
printf(" 6.写入数据文件\n");
printf(" 7.退出系统\n");
printf("*******************************************************************************\n\n");
}
//初始化
void InitData()
{
g_nMaxIndex = 10;
g_nCurIndex = 0;
g_pSingereInofArr = (PSINGERINFO)malloc(g_nMaxIndex*sizeof(SINGERINFO));
memset(g_pSingereInofArr,0,g_nMaxIndex*sizeof(SINGERINFO));
}