題目:歌星大賽獎
要求:
(1)在歌星大賽中,有十個評委為參賽的選手打分。分?jǐn)?shù)為1-100分。選手最后得分為:去掉一個最高分,去掉一個最低分其余8個分?jǐn)?shù)的平均值。試寫一段程序?qū)崿F(xiàn)。
(2)同時對評委評分進(jìn)行判斷,即在10個評委中找出最公平(評分最接近平均分)的和最不公平的(即與平均分的差距最大)的評委。
這個問題的第一個算法要求簡單,但是要注意在程序中判斷最大,最小的變量是如何賦值;第二個要求要考慮效率,要用到排序技術(shù)。注意,要用到文件儲存信息。
評分系統(tǒng)需要錄入歌星的信息,輸入10個評委的評分,然后求出相應(yīng)的平均數(shù),再求出最公平的和最不公平的評委,保存再相應(yīng)的文件夾中。分為錄入,計算,瀏覽,修改,刪除,查詢模塊。














數(shù)據(jù)結(jié)構(gòu)體設(shè)計:定義結(jié)構(gòu)體變量struct people,進(jìn)行數(shù)據(jù)輸入,輸出,保存,修改等功能。
其中定義M=50,指該數(shù)據(jù)庫最多能放50組數(shù)據(jù)。N為可變數(shù)據(jù)組數(shù),即當(dāng)前數(shù)據(jù)組數(shù)。
main()
{
void re_file(); //讀文件
int sele;
sele=1;
while(sele)
{
system("cls");
printf("\n\n"); //顯示界面
printf(" ****************************************\n");
printf(" * *\n");
printf(" * 1:瀏覽 2:刪除 *\n");
printf(" * 3:增加 4:修改 *\n");
printf(" * 5:退出 6:計算 *\n");
printf(" * 7查詢 *\n");
printf(" * *\n");
printf(" ****************************************\n");
printf("\n\n 請輸入選擇功能序號:");
scanf("%d",&sele); //通過輸入按鍵來判斷執(zhí)行那個步驟
switch(sele)
{
case 1:display();break;
case 2:display();delete1();break;
case 3:apepend();display();break;
case 4:display();modify();break;
case 5:sele=0;break;
case 6:caculate();display();break;
case 7:query();break;
}
wr_file(); //寫文件
printf("\n按任意鍵繼續(xù)\n");
getch();
}
}
/*先定義一個結(jié)構(gòu)體struct people,包含每位歌星的評分信息,在用可讀的方式打開文件zhongmo.txt.*/
struct people
{
char name[40];
char xuhao;
float pinjunfen;
float pingfen[10];
char xuanpingwei[2];
}ss[M];
/*M為最多的明星個數(shù),程序中采用宏定義的方式,可以隨時改變源程序中定義的修改值。本程序中宏定義:#define M 50。*/
//數(shù)據(jù)讀入模塊
void re_file()
{
char i;
FILE *fp;
fp=fopen("zhangmo.txt","r");
while(fscanf(fp,"%s%s%d%d%d",ss[i].name,&ss[i].xuhao,&ss[i].pinjunfen,
ss[i].xuanpingwei[0],ss[i].xuanpingwei[1]
)!=EOF) i++;
fclose(fp);
}
/*本程序為了簡化計算結(jié)果,分?jǐn)?shù)采用100進(jìn)制整數(shù)形式,如果需要修改,可以定義為float類型。*/
本程序的目的是為了計算出每位明星的平均分和最佳或者最差評分員。采用冒泡法來計算最小值和最大值,從而判斷平均值。在判斷最好和最差評分員。
void caculate()
{char fenshu[10],zhongjinazhi;
int zhonggong=0;
int i,j,k;
int zuixiaozhi,zuidazhi;
for(k=0;k<N;k++)
{
for(i=0;i<10;i++)
fenshu[i]=ss[k].pingfen[i];
for(i=0;i<9;i++)
for(j=i;j<9;j++)
{
if(fenshu[i]>fenshu[j+1])
{
zhongjinazhi=fenshu[i];
fenshu[i]=fenshu[j+1];
fenshu[j+1] =zhongjinazhi;
}
}
for(i=1;i<9;i++)
zhonggong=zhonggong+fenshu[i];
zhonggong=zhonggong/8;
ss[k].pinjunfen=zhonggong;
zuidazhi=abs(zhonggong-ss[k].pingfen[0])
for(i=1;i<10;i++)
{
if(abs(zhonggong-ss[k].pingfen[i])>zuidazhi)
j=i;
}
ss[k].xuanpingwei[0]=j;//最差評委
zuixiaozhi=abs(zhonggong-ss[k].pingfen[0]);
for(i=1;i<10;i++)
{
if(zuixiaozhi>abs(zhonggong-ss[k].pingfen[i]))
{
zuixiaozhi=abs(zhonggong-ss[k].pingfen[i]);
j=i;
}
}
ss[k].xuanpingwei[1]=j;//最好評委
}
}
從鍵盤添加新的明星信息和評分
void apepend()
{
int n,i,j;
printf("\n增加歌星人數(shù)");
scanf("%d",&n); N=N+n; //新增人數(shù)疊加,不影響原來的明星
printf("\n現(xiàn)在,輸入相關(guān)信息:\n");
for(i=1;i<n+1;i++)
{
printf("歌星:");
scanf("%s",&ss[N-n-1+i].name);
printf("序號:");
scanf("%s",&ss[N-n-1+i].xuhao);
printf("評委打分:");
for(j=0;j<10;j++)
{
printf("評委%d:",j+1);
scanf("%d",&ss[N-n-1+i].pingfen[j]);
}
}
}
該程序的功能是根據(jù)姓名或者序號修改明星的評分,序號,或者姓名。
void modify()
{
int i,j=-1,t;
char m[40],d[10];
printf("\n\n\n");
printf(" *******************************************\n");
printf(" * *\n");
printf(" * 1:姓名 2:序號 *\n");
printf(" * *\n");
printf(" *******************************************\n");
printf("請輸入修改選項:");
scanf("%d",&i);
if(i==1)
{
printf("請輸入歌星:");
scanf("%s",&m);
for(i=0;i<N;i++)
if(strcmp(m,ss[i].name)==0)
j=i;
}
else if(i==2)
{
printf("請輸入序號:");
scanf("%s",&d);
for(i=0;i<N;i++)
if(strcmp(d,ss[i].xuhao)==0)
j=i;
}
if(j==-1)
printf("沒有找到!\n");
else {
printf("序號 歌星 評委1 2 3 4 5 6 7 8 9 10 平均分最差評委最好評委\n");
printf("%3s%6s%8d%5d%5d%4d%4d%4d%4d%4d%4d%4d%8d%8d%6d\n",ss[j].xuhao,ss[j].name,
ss[j].pingfen[0],ss[j].pingfen[1],ss[j].pingfen[2],ss[j].pingfen[3],
ss[j].pingfen[4],ss[j].pingfen[5],ss[j].pingfen[6],ss[j].pingfen[7],
ss[j].pingfen[8],ss[j].pingfen[9],ss[j].pinjunfen,ss[j].xuanpingwei[0],
ss[j].xuanpingwei[1]);
}
printf("\n\n");
printf(" ********************************************************************\n");
printf(" * *\n");
printf(" * 1:序號 2:歌星名 3:評分 *\n");
printf(" * *\n");
printf(" ********************************************************************\n");
scanf("%d",&t);
switch(t)
{
case 1:printf("序號改為:");scanf("%s",&ss[j].xuhao);break;
case 2:printf("姓名改為:");scanf("%s",ss[j].name);break;
case 3:printf("評分改為:");
{
for(i=0;i<10;i++)
{
printf("評委%d",i+1);
scanf("%f",&ss[i].pingfen[i]);
}
}
break;
}
}
該程序的功能是根據(jù)序號或者明星姓名刪除某位明星的評分?jǐn)?shù)據(jù)。
void delete1()
{
int i,j=-1;
char m[40],d[10];
printf("刪除模塊:");
printf("\n\n");
printf(" ******************************************************************\n");
printf(" * *\n");
printf(" * 1:歌星名 2:序號 *\n");
printf(" * *\n");
printf(" ******************************************************************\n");
printf("輸入刪除選項:\n");
scanf("%d",&i);
if(i==1)
{
printf("輸入歌星名:");
scanf("%s",m);
for(i=0;i<N;i++)
if(strcmp(m,ss[i].name)==0)
j=i;
}
if(i==2)
{
printf("輸入序號:");
scanf("%s",d);
for(i=0;i<N;i++)
if(strcmp(d,ss[i].xuhao)==0)
j=i;
}
if(j!=-1)
{
N=N-1;
for(i=j;i<=N&&j!=-1;i++)
ss[i]=ss[i+1];
}
else if(j==-1)
printf("沒有找到!\n");
}
該模塊的功能是顯示所有的明星評分?jǐn)?shù)據(jù)。
void display()
{
int i,j;
system("cls");
printf("序號 歌星 評委1 2 3 4 5 6 7 8 9 10 平均分最差評委最好評委\n");
for(j=0,i=1;j<N;i++,j++)
{ printf("%3s%6s%8d%5d%5d%4d%4d%4d%4d%4d%4d%4d%8d%8d%6d\n",ss[j]. xuhao,ss[j].name,
ss[j].pingfen[0],ss[j].pingfen[1],ss[j].pingfen[2],ss[j].pingfen[3],
ss[j].pingfen[4],ss[j].pingfen[5],ss[j].pingfen[6],ss[j].pingfen[7],
ss[j].pingfen[8],ss[j].pingfen[9],ss[j].pinjunfen,ss[j].xuanpingwei[0],
ss[j].xuanpingwei[1]);
if(i%10==0)
{
printf("按任意鍵繼續(xù)....");
getch();
puts("\n");
printf("序號 歌星 評委1 2 3 4 5 6 7 8 9 10 平均分最差評委最好評委\n");
}
}
}
通過輸入序號或者歌星名,調(diào)取歌星的信息
void query()
{
int i,j[20]={-1},d,k,t=0;
char m[20];
printf("查詢模塊:");
printf("\n\n");
printf(" ********************************************************************\n");
printf(" * *\n");
printf(" * 1:歌星名 2:序號 *\n");
printf(" * *\n");
printf(" ********************************************************************\n");
printf("輸入查詢選項:\n");
scanf("%d",&k);
if(k==1)
{
printf("請輸入姓名:");
scanf("%s",&m);
for(i=0;i<N;i++)
if(strcmp(m,ss[i].name)==0)
{
j[t]=i;t=t+1;
}
else if(k==2)
{
printf("請輸入序號");
scanf("%d",&d);
for(i=0;i<N;i++)
if(d==ss[i].xuhao)
{
j[t]=i;t++;
}
if(j[0]==-1&&t==0)
printf("沒有找到!\n");
if(j[0]!=-1&&t!=0)
{
printf("序號 歌星 評委1 2 3 4 5 6 7 8 9 10 平均分最差 評委最好評委\n");
for(i=0;i<t;i++) printf("%3s%6s%8d%5d%5d%4d%4d%4d%4d%4d%4d%4d%8d%8d%6d\n",ss[i].xuhao,ss[i].name,
ss[i].pingfen[0],ss[i].pingfen[1],ss[i].pingfen[2],ss[i].pingfen[3],
ss[i].pingfen[4],ss[i].pingfen[5],ss[i].pingfen[6],ss[i].pingfen[7],
ss[i].pingfen[8],ss[i].pingfen[9],ss[i].pinjunfen,ss[i].xuanpingwei[0],
ss[i].xuanpingwei[1]);
}
}
}
}
5上機(jī)操作
5.1主界面顯示:

圖5-1主界面
5.2瀏覽模塊:按1進(jìn)入

圖5-2瀏覽模塊
5-3增加模塊:按3

圖5-3增加模塊
5-4刪除模塊:刪除歌星1的數(shù)據(jù)

圖5-4刪除模塊
5.5修改模塊:按2修改。已將序號2變成了序號33.

圖5-5修改模塊
5.6刪除模塊:已將序號為33的學(xué)員信息刪除。

圖5-6刪除模塊
5.7計算模塊:計算當(dāng)前輸入信息,判斷平均分,最好評委,最差評委。

圖5-7計算模塊
5.8查詢模塊,可通過序號或者歌星名查詢信息。

圖5-8-1查詢模塊
顯示相應(yīng)的值:

5-8-2查詢模塊
5.9退出程序:

圖5-9退出程序
5-10保存的文件夾

通過對本程序的寫入,運行,調(diào)試,我知道如何將分離的模塊函數(shù)綜合起來,將C語言課程中學(xué)到的理論知識運用到實際中,編寫一個小小的明星評分系統(tǒng),很有些成就感。
在運行程序中,我有幾次忘了改文件的輸出格式,導(dǎo)致輸出結(jié)構(gòu)體亂碼,文件的寫入方式不對,也導(dǎo)致文件不能打開。明星評分系統(tǒng)寫的函數(shù)不對,也導(dǎo)致輸出的結(jié)果不對,最后改對了。
感謝學(xué)校能給我們這次機(jī)會實習(xí),有幸接觸到計算機(jī)編程,雖然和專業(yè)不大關(guān)系,但我們學(xué)習(xí)到了編程的奧秘和樂趣。
[1] 譚浩強(qiáng). C程序設(shè)計(第三版)[M]. 北京: 清華大學(xué)出版社, 2005.
[2] 張冬梅, 劉遠(yuǎn)興, 陳晶, 等. 基于PBL的C語言課程設(shè)計及學(xué)習(xí)指導(dǎo)[M]. 北京: 清華大學(xué)出版社, 2011.
[3] 網(wǎng)絡(luò)資源……