黑马程序员技术交流社区
标题:
有没有更简单的方法
[打印本页]
作者:
xiabingxiejiang
时间:
2013-8-8 01:11
标题:
有没有更简单的方法
//班级学生总成绩和平均成绩计算:
//1)让用户输入班级人数
//2)让用户依次输入该班级每个学员的成绩(0-100之间)
//3)成绩输入完成后,给用户显示该班学生的总成绩和平均成绩
static void Main(string[] args)
{
bool flag = false;
int sum = 0;
Console.WriteLine("请输入班级人数");
do //do while 循环确保输入的人数为int类型,若不是int类型则需要从新输入;
{
try //检测输入的人数是否有异常;
{
int number = Convert.ToInt32(Console.ReadLine());//接收输入的人数;
flag = true; //跳出do while循环的判断条件;
int[] score = new int[number]; //声明一个数组;
for (int i = 0; i < number; i++) //对数组中的元素进行赋值
{
Console.WriteLine("请输入学生成绩");
score[i] = Convert.ToInt32(Console.ReadLine());//这里也可以判断输入的是否为int类型
if (score[i] > 0 && score[i] < 100)// 判断输入的学生分数是否正确;
{
Console.WriteLine("第{0}个学生的成绩为{1}", i + 1, score[i]);
}
else
{
Console.WriteLine("你输入的成绩有误,请重新输入:");
i -= 1;//与下面的contin一起,让for循环重新回到上一次循环,也就是这次循环输入错误,重新循环一次;
continue; //输入的分数有误,重新执行循环一边;
}
sum = sum + score[i];//分数之和
}
Console.WriteLine("该班的总成绩为{0},平均成绩为{1}", sum,sum / score.Length);
}
catch
{
Console.WriteLine("你输入有误,请重新输入:");
}
} while (flag == false);
Console.ReadKey();
复制代码
作者:
brucel50
时间:
2013-8-8 08:49
本帖最后由 brucel50 于 2013-8-8 08:51 编辑
//尽量不要用try{}catch{}
using System;
namespace Que
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入班级人数:");
bool b = true;
int iNum = 0;
do
{
b = int.TryParse(Console.ReadLine(),out iNum);
if(b!=true)
{
Console.WriteLine("输入有误,请重新输入!");
}
}while(!b);
//Console.WriteLine(iNum);
int[] iNums = new int[iNum];
for(int i=0;i<iNum;i++)
{
bool btemptemp;
do
{
Console.WriteLine("请输入第{0}个数:",i+1);
bool btemp = true;
do
{
btemp = int.TryParse(Console.ReadLine(),out iNums[i]);
if(btemp !=true)
{
Console.WriteLine("第{0}个数输入有误,请重新输入!",i+1);
}
}while(!btemp );
btemptemp = (iNums[i]>=0 && iNums[i]<=100);
if(btemptemp)
{
continue;
}
else
{
Console.WriteLine("第{0}个数范围不对,请重新输入!",i+1);
}
}while(!btemptemp);
}
int isum = 0;
foreach(int i in iNums)
{
isum += i;
}
double douave = isum/(double)iNum;
Console.WriteLine("总分为{0},平均分为{1}",isum,douave);
Console.ReadKey();
}
}
}
复制代码
作者:
彭家贰小姐
时间:
2013-8-8 08:54
以下仅个人意见,其实你考虑的已经很周全了:
你的代码有个小瑕疵:
当学员成绩认为输入字符(转不成int),再输入任意键就自动退出了,没有做到继续判断循环.
2013-8-8 8-44-44.png
(9.72 KB, 下载次数: 15)
下载附件
2013-8-8 08:46 上传
以下是我的方法,不敢说比楼主更好,大家互相学习:
using System;
namespace test45
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("请输入班级人数: ");
var num = GetNum(false); //获取班级人数 false:班级人数 true:学生分数
var i = 1;
var sum = 0; //总分
while (i <= num) //根据班级个数循环
{
Console.WriteLine("请输入第{0}位学生的成绩: ", i);
var score = GetNum(true); //获取学生分数 false:班级人数 true:学生分数
sum += score;
i++;
}
Console.WriteLine("学员的平均成绩为{0},总成绩为{1}", sum / num, sum);
Console.ReadKey();
}
/// <summary>
/// 验证用户输入且自动循环
/// </summary>
/// <param name="isScore">true 分数 false 班级人数</param>
/// <returns>数字</returns>
public static int GetNum(bool isScore)
{
do
{
try
{
var number = Convert.ToInt32(Console.ReadLine());
if (!isScore || (number >= 0 && number <= 100)) return number; //分数0-100之间
Console.WriteLine("您输入的分数有误,请重新输入该名学生分数!");
}
catch //转不成int的时候
{
Console.WriteLine(isScore ? "您输入的分数有误,请重新输入该名学生分数!" : "您输入的班级人数有误,请重新输入!");
}
} while (true);
}
}
}
复制代码
说明:1.将获取int的方法单独提出
需求中有两处获取int,其一是班级人数,其二是学生分数.因为有两处所以定义一个变量isScore来区分当isScore=true时是要得到一个分数,当为false时是要获取班级人数
2.GetNum方法中不仅做了数字的验证,还可以实现如果输入不合理自动循环
3.主方法中仅需调用GetNum就好,无需再考虑用户输入不合理要做的事情,因为都已经交给GetNum了
4.Console.WriteLine("请输入第{0}位学生的成绩: ", i);这句可以清晰让用户知道,他当前正输入的是哪位学生的成绩.
代码也刚刚写好,如果测试有问题,还请交流学习...
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2