上机内容:(大奖赛计分拓展)在歌星大奖赛计分程序中,成绩在1~100分之间。选手最后得分为:
上机目的:控制结构综合
我的程序:
去掉一个最高分和一个最低分后其余8个分数的平均值。要求:
1)输入错误(输入不是在0~100分之间)时要能马上重新输入
2)评委人数需要在在程序开始运行时输入
3)输出当前选手的最后得分后,提示“退出请选择N或n,按其他键计算下一位选手的成绩:”。上机目的:控制结构综合
我的程序:
/*
* 程序的版权和版本声明部分:
* Copyright (c) 2013, 青岛农业大学理信学院
* All rights reserved.
* 文件名称:大奖赛计分拓展.cpp
* 作 者:幻影行者
* 完成日期:2013 年 7 月 31 日
* 版 本 号:v1.0
* 对任务及求解方法的描述部分:
* 输入描述:略
* 问题描述:在歌星大奖赛计分程序中,成绩在1~100分之间。选手最后得分为:
* 去掉一个最高分和一个最低分后其余8个分数的平均值。要求:
* 1)输入错误(输入不是在0~100分之间)时要能马上重新输入
* 2)评委人数需要在在程序开始运行时输入(这比固定10个评委的程序更有适应性)
* 3)输出当前选手的最后得分后,提示“退出请选择N或n,按其他键计算下一位选手的成绩:”。
* 程序输出:略
* 问题分析:首先,内层用do...while循环(不可用for循环)实现对选手的计分,外层用do...while循环做类似的工作,实现对下一位选手的计分
* 算法设计:略
*/
#include<iostream>
using namespace std;
int main()
{
char choice; //choice表示用户的选择,即选择退出或继续
int i,n; //i为评委的编号,n为评委的个数,从键盘输入
cout<<"请输入评委的个数:"<<endl; //评委的个数由用户输入,更灵活
cin>>n;
float score,max_score,min_score,total_score,final_score;//score为评委的打分,max_score,min_score为评委打的最高最低分,
//total_score选手总分,final_score选手最后得分
do
{ i=1;
max_score=-1,min_score=101,total_score=0; //设置初值
do
{
cout<<"请输入第"<<i<<"个评委给选手的打分(1~100):"<<endl;
cin>>score;
if((score<0)||(score>100))
continue; //输入不是在0~100分之间,使用continue退出for循环,不再往下执行,重新开始for循环的执行
if(max_score<score) //人为设置max_score初值为-1,通过每次比较,最终找到最高分
max_score=score;
if(min_score>score) //人为设置min_score初值为101,通过每次比较,最终找到最低分
min_score=score;
total_score+=score; //总分
++i;
}while(i<=n);
//此处用for循环不能实现输入错误时重新输入的功能
/*for(i=1;i<=n;++i)
{
cout<<"请输入第"<<i<<"个评委给选手的打分(1~100):"<<endl;
cin>>score;
if((score<0)||(score>100))
continue; //输入不是在0~100分之间,使用continue退出for循环,不再往下执行,重新开始for循环的执行
if(max_score<score) //人为设置max_score初值为-1,通过每次比较,最终找到最高分
max_score=score;
if(min_score>score) //人为设置min_score初值为101,通过每次比较,最终找到最低分
min_score=score;
total_score+=score; //总分
}*/
final_score=(total_score-max_score-min_score)/(n-2); //计算选手最后得分
cout<<"去掉一个最高分:"<<max_score<<endl;
cout<<"去掉一个最低分:"<<min_score<<endl;
cout<<"选手最后得分:"<<final_score<<endl;
cout<<"退出请选择N或n,按其他键计算下一位选手的成绩:"; //提示用户是否继续
cin>>choice;
cout<<endl;
}while(choice!='N'&&choice!='n');
return 0;
}
运行结果:
心得体会:
(1)continue和break用法区别:continue是退出循环,不再往下执行,重新执行循环,如本程序;而break是直接跳出循环,执行循环以后的程序
特别注意:continue用在for循环中,只要满足条件,执行continue后,本次循环结束,然后++i,执行下一个循环,这也是在此程序中不能使
用for循环实现输入错误时重新输入功能的原因。
(2)do...while...的用法,本程序恰当好处的使用do...while...循环实现对不同的对象(即不同的选手)执行相同的操作,即计分操作。这类用法值得好好学习。