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));

}


站长地图