黑马程序员技术交流社区

标题: 有没有更简单的方法 [打印本页]

作者: xiabingxiejiang    时间: 2013-8-8 01:11
标题: 有没有更简单的方法
  1.       //班级学生总成绩和平均成绩计算:

  2.       //1)让用户输入班级人数

  3.       //2)让用户依次输入该班级每个学员的成绩(0-100之间)

  4.       //3)成绩输入完成后,给用户显示该班学生的总成绩和平均成绩

  5.         static void Main(string[] args)
  6.         {
  7.             bool flag = false;
  8.             int sum = 0;
  9.             Console.WriteLine("请输入班级人数");
  10.             do                                                         //do  while 循环确保输入的人数为int类型,若不是int类型则需要从新输入;
  11.             {
  12.                 try                                                   //检测输入的人数是否有异常;
  13.                 {
  14.                     int number = Convert.ToInt32(Console.ReadLine());//接收输入的人数;
  15.                     flag = true;                                    //跳出do while循环的判断条件;
  16.                     int[] score = new int[number];   //声明一个数组;
  17.                     for (int i = 0; i < number; i++) //对数组中的元素进行赋值
  18.                     {
  19.                         Console.WriteLine("请输入学生成绩");
  20.                         score[i] = Convert.ToInt32(Console.ReadLine());//这里也可以判断输入的是否为int类型
  21.                         if (score[i] > 0 && score[i] < 100)// 判断输入的学生分数是否正确;
  22.                         {
  23.                             Console.WriteLine("第{0}个学生的成绩为{1}", i + 1, score[i]);
  24.                         }
  25.                         else
  26.                         {
  27.                             Console.WriteLine("你输入的成绩有误,请重新输入:");
  28.                             i -= 1;//与下面的contin一起,让for循环重新回到上一次循环,也就是这次循环输入错误,重新循环一次;
  29.                             continue; //输入的分数有误,重新执行循环一边;
  30.                         }
  31.                         sum = sum + score[i];//分数之和
  32.                     }
  33.                     Console.WriteLine("该班的总成绩为{0},平均成绩为{1}", sum,sum / score.Length);
  34.                 }
  35.                 catch
  36.                 {
  37.                     Console.WriteLine("你输入有误,请重新输入:");
  38.                 }
  39.             } while (flag == false);
  40.             Console.ReadKey();
复制代码

作者: brucel50    时间: 2013-8-8 08:49
本帖最后由 brucel50 于 2013-8-8 08:51 编辑
  1. //尽量不要用try{}catch{}
  2. using System;
  3. namespace Que
  4. {
  5.   class Program
  6.   {
  7.      static void Main(string[] args)
  8.      {
  9.          Console.WriteLine("请输入班级人数:");
  10.          bool b = true;
  11.          int iNum = 0;
  12.          do
  13.          {
  14.              b = int.TryParse(Console.ReadLine(),out iNum);   
  15.              if(b!=true)
  16.              {
  17.                  Console.WriteLine("输入有误,请重新输入!");
  18.              }
  19.          }while(!b);
  20.          //Console.WriteLine(iNum);
  21.          int[] iNums = new int[iNum];
  22.          for(int i=0;i<iNum;i++)
  23.          {

  24.              bool btemptemp;
  25.              do
  26.              {
  27.                  Console.WriteLine("请输入第{0}个数:",i+1);
  28.                  bool btemp = true;

  29.                  do
  30.                  {
  31.                      btemp = int.TryParse(Console.ReadLine(),out iNums[i]);   
  32.                      if(btemp !=true)
  33.                      {
  34.                          Console.WriteLine("第{0}个数输入有误,请重新输入!",i+1);
  35.                      }
  36.                  }while(!btemp );


  37.                  btemptemp = (iNums[i]>=0 && iNums[i]<=100);
  38.                  if(btemptemp)
  39.                  {
  40.                      continue;
  41.                  }
  42.                  else
  43.                  {
  44.                      Console.WriteLine("第{0}个数范围不对,请重新输入!",i+1);
  45.                  }
  46.              }while(!btemptemp);
  47.               
  48.          }
  49.          int isum = 0;
  50.          foreach(int i in iNums)
  51.          {
  52.              isum += i;
  53.          }
  54.          double douave = isum/(double)iNum;
  55.          Console.WriteLine("总分为{0},平均分为{1}",isum,douave);
  56.          Console.ReadKey();         
  57.      }
  58.   }
  59. }
复制代码

作者: 彭家贰小姐    时间: 2013-8-8 08:54
以下仅个人意见,其实你考虑的已经很周全了:
你的代码有个小瑕疵:
当学员成绩认为输入字符(转不成int),再输入任意键就自动退出了,没有做到继续判断循环.

以下是我的方法,不敢说比楼主更好,大家互相学习:
  1. using System;

  2. namespace test45
  3. {
  4. internal class Program
  5. {
  6. private static void Main(string[] args)
  7. {
  8. Console.WriteLine("请输入班级人数: ");
  9. var num = GetNum(false); //获取班级人数 false:班级人数 true:学生分数
  10. var i = 1;
  11. var sum = 0; //总分
  12. while (i <= num) //根据班级个数循环
  13. {
  14. Console.WriteLine("请输入第{0}位学生的成绩: ", i);
  15. var score = GetNum(true); //获取学生分数 false:班级人数 true:学生分数
  16. sum += score;
  17. i++;
  18. }
  19. Console.WriteLine("学员的平均成绩为{0},总成绩为{1}", sum / num, sum);
  20. Console.ReadKey();
  21. }
  22. /// <summary>
  23. /// 验证用户输入且自动循环
  24. /// </summary>
  25. /// <param name="isScore">true 分数 false 班级人数</param>
  26. /// <returns>数字</returns>
  27. public static int GetNum(bool isScore)
  28. {
  29. do
  30. {
  31. try
  32. {
  33. var number = Convert.ToInt32(Console.ReadLine());
  34. if (!isScore || (number >= 0 && number <= 100)) return number; //分数0-100之间
  35. Console.WriteLine("您输入的分数有误,请重新输入该名学生分数!");
  36. }
  37. catch //转不成int的时候
  38. {
  39. Console.WriteLine(isScore ? "您输入的分数有误,请重新输入该名学生分数!" : "您输入的班级人数有误,请重新输入!");
  40. }
  41. } while (true);
  42. }
  43. }
  44. }
复制代码
说明:1.将获取int的方法单独提出
           需求中有两处获取int,其一是班级人数,其二是学生分数.因为有两处所以定义一个变量isScore来区分当isScore=true时是要得到一个分数,当为false时是要获取班级人数
        2.GetNum方法中不仅做了数字的验证,还可以实现如果输入不合理自动循环
        3.主方法中仅需调用GetNum就好,无需再考虑用户输入不合理要做的事情,因为都已经交给GetNum了
        4.Console.WriteLine("请输入第{0}位学生的成绩: ", i);这句可以清晰让用户知道,他当前正输入的是哪位学生的成绩.

代码也刚刚写好,如果测试有问题,还请交流学习...






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2