-1

我无法从 do--while 循环中复制数据并在循环外重复它。这是在拆分功能期间,每个学生的考试成绩与他/她的名字在同一行输入。如果这是一个非常简单的问题,我很抱歉,但我找不到任何解决方法。非常感谢您的帮助。

    do {
        Console.Write("Enter the student's name followed by his/her score on the same line:");
        studentAndScore = Console.ReadLine();
        if (studentAndScore == "")
        {
            break;
        }
        string[] parsedInput;
        parsedInput = studentAndScore.Split();
            string student = parsedInput[0] = students[0];
            score = int.Parse(parsedInput[1]);
            score = studentScores[0];
        i++;
    } while (i<=MAX);
    Console.WriteLine("The test scores of the students are:");
    Console.WriteLine("students \t scores \t");
//And I need to repeat the list of student names and scores here
4

3 回答 3

4

这行代码:

string student = parsedInput[0] = students[0];

将首先复制students[0]parsedInput[0] 因此,您正在丢失已解析的输入。

相反,请尝试:

string student = parsedInput[0];
students[0] = student;

如果那是,事实上,你的意图。在同一行代码中执行两个任务很少是一个好主意。

很可能你真的想在你的索引器中使用,i而不是0在你的索引器中,比如在parsedInput[i]students[i].

于 2012-12-12T17:44:54.600 回答
0

只需创建两个列表...

var names = new List<String>();
var scores = new List<Int32>();

...将输入读入列表...

while (true)
{
    Console.Write("student/score: ");

    var input = Console.ReadLine();

    if (String.IsNullOrWhiteSpace(input))
    {
        var parts = input.Split();

        names.Add(parts[0]);
        scores.Add(Int32.Parse(parts[1]);
    }
    else
    {
         break;
    }
}

...并输出列表。

for (var i = 0; i < names.Count; i++)
{
    Console.WriteLine("{0}\t{1}", names[i], scores[i]);
}

当然还要添加很多错误处理。或者您可以使用字典,但我不太确定您获得的有关物品订购的保证。

var data = new Dictionary<String, Int32>();

while (true)
{
    Console.Write("student/score: ");

    var input = Console.ReadLine();

    if (String.IsNullOrWhiteSpace(input))
    {
        var parts = input.Split();

        data.Add(parts[0], Int32.Parse(parts[1]));
    }
    else
    {
         break;
    }
}

foreach (var entry in data)
{
    Console.WriteLine("{0}\t{1}", entry.Key, entry.Value);
}
于 2012-12-12T17:52:09.327 回答
0

罗伯特写的是真的。此外,您不使用循环变量 i 将每个学生存储在数组的不同“插槽”中,因此您将覆盖当前位于同一位置的所有内容。并且数组的声明必须在循环之外,否则它会在每次迭代中擦除它。

总结您的 C# 代码示例所需的更改,更正后的版本如下所示:

void Main()
{   
    int MAX = 20;

    var students = new string[MAX];
    var scores = new int[MAX];

    int i=0;
    do {
        Console.Write("Enter the student's name followed by his/her score on the same line:");
        var studentAndScore = Console.ReadLine();
        if (studentAndScore == "")
        {
            break;
        }

        string[] parsedInput = studentAndScore.Split();     
        students[i] = parsedInput[0];       
        scores[i] = int.Parse(parsedInput[1]);

        i++;
    } while (i<MAX);
    Console.WriteLine("The test scores of the students are:");
    Console.WriteLine("students \t scores \t");
    for(int k=0; k<i; k++) {
        Console.WriteLine("Student: {0}, Score: {1}", students[k], scores[k]);
    }
}

请注意,我ifor语句中使用的值而不是MAX,因为用户可以通过输入空行来跳出 do 循环。并且i始终包含先前输入的项目数。

当然,此代码尚不包含任何错误处理,这在现实世界中是必需的。

于 2012-12-12T17:50:41.227 回答