具有直方图的C#等级数组

时间:2011-10-02 12:42:39

标签: c# arrays

我正在瑞典学习C#的基础编程,我想知道你是否可以帮我理解一个简单的例子。

我的目标是用随机数填充数组,然后显示星号(*)或任意符号,这是随机生成的数字。

这就是我的意思:

Student 1 has a grade: 4 : * * * *
Student 2 has a grade: 9 : * * * * * * * * *
etc.

这是我到目前为止提出的代码:

using System;
using System.Text;

namespace Array_1_10
{
    class Program
    {
        static void Main(string[] args)
        {
            //declar and create an int array object with 5 elements

            string tempStars = "";
            int[] grades = new int[11];
            // initiate the array using Random class methods
            Random grade = new Random();
            for (int j = 1; j < 11; j++)
                grades[j] = grade.Next(1, 9);
            //Read and display the array's elements

            for (int j = 1; j < 11; j++)
            {
                tempStars += "*" + " ";

                tempStars += "";
                Console.WriteLine("Student {0} has got: {1} : {2} ", j, grades[j], tempStars);
            }   
        }
    }
}

它填充数组,但无论生成什么数字,星号都会从1到10,如下所示:

Student 1 has a grade 5 : *
Student 2 has a grade 1 : * *
etc.

你能帮我解决这个问题吗?非常感谢你。 Vojtech

6 个答案:

答案 0 :(得分:2)

using System;
using System.Text;

namespace Array_1_10
{
    class Program
    {
        static void Main(string[] args)
        {
            //declar and create an int array object with 5 elements


            int[] grades = new int[11];
            // initiate the array using Random class methods
            Random grade = new Random();
            for (int j = 1; j < 11; j++)
                grades[j] = grade.Next(1, 9);

            //Read and display the array's elements
            for (int j = 1; j < 11; j++)
            {
                string tempStars = ""; //initialize string each time
                for (int lp = 0 ; lp < grades[j] ; lp++)) { // build the string
                    tempStars += "*" + " ";
                }
                Console.WriteLine("Student {0} has got: {1} : {2} ", j, grades[j], tempStars);
            }   
        }
    }
}

这是一个使用StringBuilder的更简洁的版本:

using System;
using System.Text;

namespace SO7626386
{
    class Program
    {
        static void Main(string[] args)
        {
            var grades = new int[11];
            // initiate the array using Random class methods
            var grade = new Random();
            for (int j = 1; j < 11; j++)
            {
                grades[j] = grade.Next(1, 10);
            }

            //Read and display the array's elements
            for (int j = 1; j < 11; j++)
            {
                Console.WriteLine("Student {0} has got: {1} : {2} ", j, grades[j], new StringBuilder().Insert(0,"* ",grades[j]).ToString());
            }   
        }
    }
}

答案 1 :(得分:2)

作为一种额外的解决方案,您可以自由研究:

for (int j = 1; j < 11; j++)
{
    string tempStars = new String('*', grades[j]).Replace("*", "* ");
    Console.WriteLine ....

我不会向你解释,因为research上的MSDN很容易解释。

这很有趣,因为它显示了new.之间的优先级(更明确的是,在C#中你不需要写这个:(new String('*', grades[j])).Replace("*", "* "),用其他语言你必须添加括号。)

答案 2 :(得分:2)

跟踪代码的这一部分:

        for (int j = 1; j < 11; j++)
        {
            tempStars += "*" + " ";

            tempStars += "";
            Console.WriteLine("Student {0} has got: {1} : {2} ",
                                j, grades[j], tempStars);
        }

在每次迭代中,无论要分配多少tempStars,您都会向*添加新的星号,因此您需要更改它。

例如,首先在for循环中定义tempStars,然后将*作为等级[j]的大小添加到tempStars变量,然后打印出来。

答案 3 :(得分:1)

您需要更改显示星号数量的代码,以考虑等级。所以来自for循环的代码将是:

For(j=1; j<11; j++)
{
    StringBuilder ab = new StringBuilder(grades[j]);
    For(int i=0; i<grades[j]; i++)
    {
        sb.Append(" *");
    }

    Console.WriteLine("Student {0} has grade {1} : {2}", j, grades[j], sb.ToString());

}

额外的for循环是用一个学生所拥有的星星数来构建一个字符串。您应该使用stringbuilder进行这些操作,因为它比创建大量字符串更有效。

需要注意的一点是,代码将stringbuilder初始化为正确的字符串长度。这为字符串构建器类保存了在用于构建字符串的引擎盖下调整其数组大小的工作。

答案 4 :(得分:0)

您编写代码的方式是,您只在第一个循环中打印一个星号,然后在循环的每次迭代中添加一个额外的星号。您需要一个内部循环来打印正确数量的星号,然后您需要在打印后清除外部循环中的tempStars变量。

尝试更改代码中相应显示星号的部分:(未经测试)

string tempStars = "";
for (int j = 1; j < 11; j++)
{
    for (int i = 0; i < grades[j]; i++)
        tempStars += "*" + " ";
    Console.WriteLine("Student {0} has got: {1} : {2} ", j, grades[j], tempStars);
    tempStars = "";
}

答案 5 :(得分:0)

这应该更好:

using System;
using System.Text;

namespace Array_1_10
{
    class Program
    {
        string stars(int count)
        {
            if (count == 0) return "";

            string st = "*";
            for (int i = 1; i < count; i++)
            {
                st += " *";
            }
            return st;
        }

        static void Main(string[] args)
        {
            //declar and create an int array object with 10 elements
            int[] grades = new int[10];

            // initiate the array using Random class methods
            Random grade = new Random();
            for (int j = 0; j < 10; j++)
                grades[j] = grade.Next(1, 9);

            //Read and display the array's elements
            for (int j = 0; j < 10; j++)
                Console.WriteLine("Student {0} has got: {1} : {2} ", j, grades[j], stars(grades[j]));
        }
    }
}