【问题标题】:Print a grade Distribution chart of all students using stars to determine each time a grade appears打印所有学生的成绩分布图,使用星号确定每次出现成绩的时间
【发布时间】:2018-10-30 12:11:48
【问题描述】:

如标题所述。我现在完成了程序的大部分代码,这是最后一部分。老实说,在这一点上,我只是不明白如何执行此操作。我知道我应该使用类似于实现等级字母的方式来实现它,但是我如何以这样的方式实现它,即对于等级范围内的每个等级,分布图都会在相关等级范围内添加一个星号。

基本上分布图应该是这样的:

整体成绩分布:

0-9:

10-19:

20-29:

30-39:

40-49:

50-59:

60-69:***

70-79: ******

80-89: ***********

90-99: *******

100:***

认为通过链接提供所有代码可能会更好,因此您可以这样做:

This is my code on dotnetfiddle

我试图弄清楚这一点。我被告知从 0 循环到 100 到 10 秒,然后嵌套循环从 0 循环到星星的数量。 N 等于学生人数,5 与每个学生的成绩相关:

for (int i = 0; i <= 100; i += 10)
{
    Console.WriteLine(i + " - " + (i + 10));
    for (int j = 0; j < (n*5); j++)
    {
        // add stars here
    }
}

【问题讨论】:

    标签: c# loops for-loop nested-loops


    【解决方案1】:

    首先在 .net fiddle 上查看您的代码,您需要实现一些方法来从学生那里获取成绩,在我的示例中,我使用了 GetGrades 方法。其次,我确信有比这更好或更清晰的方法(linq),但至少它有效:)

            // Array where each value represents number of grades within range
            // distribution[0]: 0 - 9
            // distribution[1]: 10 - 19
            // distribution[2]: 20 - 29
            // distribution[3]: 30 - 39
            // distribution[4]: 40 - 49
            // distribution[5]: 50 - 59
            // distribution[6]: 60 - 69
            // distribution[7]: 70 - 79
            // distribution[8]: 80 - 89
            // distribution[9]: 90 - 99
            // distribution[10]: 100
            var distribution = new int[11]; 
            // Fill the array with distribtions for all students 
            // *Don't forget to implement GetGradse method for student 
            foreach (var s in students)
            foreach (var g in s.GetGrades())
            {
                // skip the grade thats less than 0 or greater than 100 (invalid grade)
                // in every other case increment distribution at g / 10 index
                if (g < 0 || g > 100) continue;
                else distribution[(int)g / 10]++;
            }
            // Now we can print out the grades distribution
            for (var i = 0; i < distribution.Length - 1; i++)
                Console.WriteLine($"{i * 10}-{i * 10 + 9}: {new String('*', distribution[i])}");
            Console.WriteLine($"100: {new String('*', distribution[10])}");
    

    编辑(另一种方法,打印部分保持不变):您还可以在学生数组旁边声明分布数组,并在您为学生分配成绩的同一位置填写它,如果您这样做,您将不需要再次循环遍历所有学生和成绩:

                ...
                Student[] students = new Student[n];
                var distribution = new int[11];
                ...
                for (int j = 0; j < 5; j++)
                {
                    Console.WriteLine($"Enter grade {j + 1} for student {i + 1}: ");
                    double grade = double.Parse(Console.ReadLine());
                    students[i].addGrade(grade);
                    // assuming grade value won't be greater than 100 or less than 0
                    distributions[(int)grade / 10]++;
                }
                ...
                ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多