从一个不同的类中打印一个方法中的数组?

时间:2010-04-03 16:06:25

标签: c# arrays class methods

我是一个相当缺乏经验的程序员,我目前正在开发一个控制台应用程序项目。这基本上是一个'数学游戏';应用程序生成两个随机数,这些随机数已经被随机地相加,相减,相乘或相除。答案显示在屏幕上,用户必须从菜单中选择正确的数学运算符,一旦选择了正确的答案,应用程序就会在屏幕上显示用户花费的时间(以毫秒为单位)输入正确的答案。 / p>

现在我想将玩家的时间保存在一个阵列中,以后可以通过所有分数调出。我需要在这个程序中包含一个方法,我想方法将时间保存到数组中是合适的。我似乎偶然发现了一个小问题。

我不太确定出了什么问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mathgame
{
    class Program
    {
    }

    class arrayclass
    {
        public static void saveInArray(int duration)
        {
            int[] TopTenScores = {000,1000,2000,3000,4000,5000,6000,7000,8000,9000};

            if (duration < 1000)
            {
                duration = TopTenScores[000];
            }
            else if ((duration >= 1000) && (duration <= 1999))
            {
                duration = TopTenScores[1000];
            }
            else if ((duration >= 2000) && (duration <= 2999))
            {
                duration = TopTenScores[2000];
            }
            else if ((duration >= 3000) && (duration <= 3999))
            {
                duration = TopTenScores[3000];
            }
            else if ((duration >= 4000) && (duration <= 4999))
            {
                duration = TopTenScores[4000];
            }
            else if ((duration >= 5000) && (duration <= 5999))
            {
                duration = TopTenScores[5000];
            }
            else if ((duration >= 6000) && (duration <= 6999))
            {
                duration = TopTenScores[6000];
            }
            else if ((duration >= 7000) && (duration <= 7999))
            {
                duration = TopTenScores[7000];
            }
            else if ((duration >= 8000) && (duration <= 8999))
            {
                duration = TopTenScores[8000];
            }
            else if ((duration >= 9000) && (duration <= 9999))
            {
                duration = TopTenScores[9000];
            }

            Console.WriteLine(TopTenScores);
        }

    static void Main(string[] args)
    {
        int intInput, num1, num2, incorrect, array1;
        float answer;
        string input;

        System.Random randNum = new System.Random();
        Console.WriteLine("Welcome to the Maths game!");
        Console.WriteLine("(Apologies for the glitchiness!)");
        Console.WriteLine();
        Console.WriteLine("Please choose from the following options:");
        Console.WriteLine();
    retry:
        Console.WriteLine("1 - Test your Maths against the clock!");
        Console.WriteLine("2 - Exit the application.");
        Console.WriteLine("3 - Top scores");
        Console.WriteLine();
        input = Console.ReadLine();
        intInput = int.Parse(input);

        if (intInput == 1)
        {
            goto start;
        }
        else if (intInput == 2)
        {
            goto fin;
        }
        else if (intInput == 3)
        {

            array1 = array1.saveInArray;

          goto retry;
        }

现在,在代码中的最后一个'else if'语句中,您可以看到我的变量array1尝试调用该方法,但无论我做什么,我都会遇到错误。

这是我目前唯一的错误,但我很快就有了解决这个错误的感觉,另一个会出现。现在我只是决心克服这个错误:

'int' does not contain a definition for 'saveInArray' and no extension method 'saveInArray' accepting a first argument of type 'int' could be found (are you missing a using directive or an assembly reference?).

任何帮助都会受到赞赏,为我丑陋的书面代码道歉!谢谢你给我的任何帮助!

此致 奥马。

2 个答案:

答案 0 :(得分:4)

好的,

此代码中有相当一部分需要修复TBH。

我先从你的错误开始:

您将变量array1声明为整数。在C#中,整数是原始类型。这意味着他们没有方法,也没有班级成员。所以,当你调用array1.saveInArray时,编译器基本上是说“类型整数没有任何方法......我找不到合适的方法来匹配你的调用”。

我没有打电话给array1.saveInArray,而是认为你打算称之为arrayclass.saveInArray(x)

注意上面调用中的x。我将一个名为x的变量int传递给函数saveInArray()

这给我们带来了第二个错误。如果saveInArray是属性,那么您可以转到arrayclass.saveInArray。但是,它是一个需要参数的函数...即整数。

当您致电arrayclass.saveInArray(someInteger)时,您将someInteger作为参数传递给方法。然后,该方法可以自由地使用此参数进行计算。

这应该可以修复你最基本的错误,希望你能编译。

继续讨论在运行时会导致问题的其他错误:

在方法saveInArray中,您声明了一个名为TopTenScores的整数数组。

你宣布这个很好......但是当你索引到TopTenScores时,你使用的索引超出了TopTenScores的范围。

以下是您对TopTenScores的声明:

int[] TopTenScores = {000,1000,2000,3000,4000,5000,6000,7000,8000,9000};

请注意,此声明中有 10 个数字。这意味着您可以拥有的最大索引 9 。为什么?因为数组在C#中开始索引为0。

我想你可能会认为这个数组是关联的......但事实并非如此。当你TopTenScores[1000]时,你会说“给我1000指数的价值”。该值不存在,您将收到运行时错误。

相反,如果您想要访问值1000,则需要调用TopTenScores[1]

此外,您不会使用新的最高分覆盖默认值,而是使用默认值覆盖新的最高分。我不认为这是有意的。而是切换您的呼叫:duration = TopTenScores[1000];

TopTenScores[1] = duration;

编辑:最后,正如评论者指出的那样,使用goto是不好的做法,并且非常气馁。当您开始更好地理解程序流程和组织时,您将理解为什么会这样。目前,最好尽量避免使用goto的习惯。 goto映射到低级系统构造,我们应该避免使用C#等更高级别的语言。使用goto时,您的代码可能会很快出现混乱和错误。

无论如何,如果您有疑问或需要澄清某些内容,请随时提出更多问题/评论等。欢迎来到StackOverflow!

答案 1 :(得分:1)

你的一个问题是你错过了数组的基本概念。将数组视为一行编号的邮箱。这行代码:

int[] TopTenScores = {000,1000,2000,3000,4000,5000,6000,7000,8000,9000};

正在创建一个包含10个整数的数组,在内存中看起来像这样:

  Index  Value
  -----  -----
  0          0
  1       1000
  2       2000
  3       3000
  4       4000
  5       5000
  6       6000
  7       7000
  8       8000
  9       9000

目前还不清楚这是一个有用的结构来表示您的最高分,我不确定您的saveInArray方法尝试做什么。在该方法中,以下是您的一行代码的解释方式:

duration = TopTenScores[1000];

这意味着“取TopTenScores的索引1000处的内容并将其存储在duration中。”从上表中可以看出, 没有索引1000,此外,该代码与保存最高分无关。

您遇到的另一个问题是您似乎没有完成任务的算法。对于十大功能,如果您是一名得分管理员,请尝试将需要完成的工作分解为如何手动执行。它会是这样的:

  • 我通过堆叠索引卡片来记录最高分,并按照从最高到最低的顺序对其进行分数。起初,我没有索引卡。
  • 我可以做两件事:记录分数并告诉别人前十名分数。
  • 当有人要我录制分数时,我:
    1. 将分数写在索引卡上
    2. 按顺序查看以前的分数,直到我找到低于这个新分数的分数。
    3. 如果我发现得分低于这个新分数,我会将卡放在较低分数的顶部。
    4. 否则,如果这个得分是最低分数,包括这是第一个得分,我会将得分放在堆栈的底部。
  • 当有人要我告诉他们前10名时,我:
    1. 如果我的卡少于10张,请查看前10张卡或所有卡片。
    2. 对于每个分数,请按顺序写下来。
    3. 将分数列表提供给请求分数的人。

执行此操作似乎很愚蠢,但大多数程序实际上只是简单步骤的序列,作为程序员,您需要能够在将它们转换为编译器可以理解的语言之前确定这些步骤。一旦用简单的术语表达问题,就可以开始将其翻译成代码,例如:

// You can think of a role a person would do for a manual process as a class
// in a program.
public class ScoreKeeper
{
    // Our high score list (stack of cards) is empty to begin with.  Unlike
    // arrays, lists allow us insert items rather than placing them in 
    // numbered slots.
    private List<int> _scores = new List<int>();

    // This is the method for when someone asks us to record a score.  The
    // "score" parameter is the new score which you can think of as being 
    // written on a card.
    public void RecordScore(int score)
    {
        // Go through each of the existing scores.  "i" is the index in the
        // list.
        for (int i = 0; i < _scores.Count; i++)
        {
            // See if the new score is less than the score at index #i
            if (_scores[i] < score)
            {
                // It is lower than this new score.  Insert the new score
                // above that score.
                _scores.Insert(i, score);

                // We're done.  Stop looping and exit RecordScore.
                return;
            }
        }

        // If we get here, we found no scores lower than this new one.  Add 
        // this score to the bottom of the stack.
        _scores.Add(score);
    }

    // This is the method for when someone asks us for the top 10 scores.
    // Notice that we return an array of integers, which will represent 
    // our piece of paper we hand back to the one requesting the scores.
    public int[] GetTop10Scores()
    {
        // We start with a blank piece of paper.
        int[] result = new int[10];

        // Go through the scores.  The first 10 are the top 10 because
        // RecordScore puts them in order.  We also need to make sure
        // we don't try to get more scores than we've recorded.
        for (int i = 0; i < 10 && i < _scores.Count; i++)
        {
            // Write down the score on the paper
            result[i] = _scores[i];
        }

        // Send back the list of scores to the requester
        return result;
    }
}

现在,在您的主程序中,您可以创建一个ScoreKeeper并要求它保持分数:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to the Maths game!");
        Console.WriteLine("(Apologies for the glitchiness!)");
        Console.WriteLine();
        Console.WriteLine("Please choose from the following options:");
        Console.WriteLine();

        // This object keeps track of scores
        ScoreKeeper scoreKeeper = new ScoreKeeper();

        bool keepRunning = true;
        while (keepRunning)
        {
            Console.WriteLine("1 - Test your Maths against the clock!");
            Console.WriteLine("2 - Exit the application.");
            Console.WriteLine("3 - Top scores");
            Console.WriteLine();
            string input = Console.ReadLine();
            int intInput = int.Parse(input);

            if (intInput == 1)
            {
                // You should avoid gotos.  Try writing a method instead

                // Play the game and get the player's score.
                int newScore = PlayGame();

                // Have the score keeper record the new score.
                scoreKeeper.RecordScore(newScore);
            }
            else if (intInput == 2)
            {
                keepRunning = false;
            }
            else if (intInput == 3)
            {
                // Get the top scores from the score keeper
                int[] topScores = scoreKeeper.GetTop10Scores();

                // Print each score
                for (int i = 0; i < topScores.Length; i++)
                {
                    Console.WriteLine("{0}: {1}", i + 1, topScores[i]);
                }
            }
        }
    }

    private static int PlayGame()
    {
        // Put your game logic in here.  Return the score.
    }
}

一旦你对编程的基础知识越来越熟悉,你会发现现有的类可以重用,比如SortedList,它们已经可以处理维护有序列表等常见任务。