如何完成这个程序?

时间:2014-09-10 19:37:19

标签: c#

我想创建一个小型测试程序,程序会要求您选择"参赛者"的数量,输入他们的名字,他们最喜欢的歌手,每个人都选择了其他人选出的歌手并制定排名

我在开始时还有很多工作要做...但我开始编写一些代码。这是:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Ciao,Benvenuto/a a 'Vota Cantante', il nuovo gioco in cui puoi votare il tuo cantante preferito.");
        Console.Write("Premi INVIO sulla tastiera per continuare..");
        Console.ReadLine();

        Console.Write("(NOTA BENE: Sono necessari almeno due giocatori per poter giocare) Indica il numero dei giocatori: ");
        int GiocatoriN = int.Parse(Console.ReadLine());

        string[] ArrayGiocatori = new string[GiocatoriN];

        for (int i = 0; i < GiocatoriN; i++)
        {
            Giocatori Gio = new Giocatori();
            Gio.NomeECantante();
        } 
    }

    class Giocatori
    {
        public void NomeECantante()
        {
            Console.WriteLine("Inserisci il tuo nome: ");
            string Giocatore =Console.ReadLine();

            Console.WriteLine(Giocatore + " inserisci il tuo cantante preferito: ");
            string CantantePreferito = Console.ReadLine();
            CantantePreferito.ToArray();

            Console.WriteLine("Dai un voto da 1 a 10 a " + CantantePreferito + ": ");
            int Voto = int.Parse(Console.ReadLine());
        }
    }
}

目前我有两个问题。

该程序有效,但我想要实例化你需要构造函数的类,但我设法创建它没有。构造者是强制性的吗?

我可以将这段代码放在构造函数中,而不是放在方法中。但变化不大:

(即使可以将它放在构造函数中)

Console.WriteLine("Inserisci il tuo nome: ");
            string Giocatore = Console.ReadLine();

第二个问题是:我希望程序为GiocatoriN的数量创建一个新玩家,所以如果你让玩家为3,我想创建3个对象。

我在for循环中给了Gio这个名字,并且在我写完之初,它给了我一个错误:

for (int i= 0; i<GiocatoriN; i++)
        {
            Giocatori Gio[i] = new Giocatori();
            Gio.NomeECantante();

我曾尝试使用Gio [GiocatoriN],但错误仍然存​​在。

实际上,我重复NomeECantante()的方法来选择玩家的数量,但是我每次都会覆盖Gio,只存储最后一个玩家,不是吗? (我的意思是没有错误的代码)。

那我接下来要做什么呢?

3 个答案:

答案 0 :(得分:2)

您的代码中存在许多问题,我会尝试逐一解释它们:

首先,您需要重写您的Giocatore类:

class Giocatore
{
    public string Nome {get;set;}
    public string CantantePreferito {get;set;}
    public int Voto {get;set;}

    public Giocatore(string nome, string cantante, int voto)
    {
       this.Nome = nome;
       this.CantantePreferito = cantante;
       this.Voto = voto;
    }
}

这里我删除了获取输入的方法。我添加了一些公共属性,让Giocatore类的实例保留其内部值,并添加了一个获取三个值的构造函数。您当前的代码将变量声明为NomeECantante方法的本地变量,因此当您退出该方法时它们会丢失。 (构造函数也可以省略,但是当你构建Giocatore的实例时,它会让生活更轻松)

现在在主代码中,您将逻辑更改为类似

static void Main(string[] args)
{
    ....
    int GiocatoriN;
    if(!Int32.TryParse(Console.ReadLine(), out GiocatoriN))
    {
        Console.WriteLine("Write a number please");
        return;
    }

    List<Giocatore> giocatori = new List<Giocatore>();

    for (int i = 0; i < GiocatoriN; i++)
    {
        Giocatore g = LoadGiocatoreData();
        if(g == null)
          return;
        giocatori.Add(g);
    } 
}

这里我添加了对输入输入的一些检查,并删除了无用的字符串数组以使用允许添加任意数量元素的List<Giocatore>
最后,新Giocatore的数据输入位于类

外部的方法中
 public Giocatore LoadGiocatoreData()
 {
     string nome;
     string cantante;
     int voto;

     Console.WriteLine("Inserisci il tuo nome: ");
     nome = Console.ReadLine();
     Console.WriteLine(nome + " inserisci il tuo cantante preferito: ");
     string cantante = Console.ReadLine();
     Console.WriteLine("Dai un voto da 1 a 10 a " + cantante + ": ");
     if(!Int32.TryParse(Console.ReadLine(), out voto))
     {
         Console.WriteLine("Please insert a number");
         return null;
     }

     Giocatore g = new Giocatore(nome, cantante, voto);
     return g;
 }

此时,main方法中的List包含用户在代码开头请求的Giocatore类型的元素。您可以通过像这样的简单循环来检查这个

 foreach(Giocatore g in giocatori)
 {
     Console.WriteLine("Giocatore:" + g.Nome);
     Console.WriteLine("Cantante:" + g.CantantePreferito);
     Console.WriteLine("Voto:" + g.Voto.ToString());
     Console.WriteLine("----------------------------------);
 }

答案 1 :(得分:1)

如果没有给出构造函数,编译器会添加一个默认构造函数

class Foo
{
}

相同
class Foo
{
   public Foo()
   {
   }
}

对于另一个问题,请尝试

Giocatori Gio = new Giocatori(); //create new instance of Giocatori
Gio.NomeECantante(); //invoke method NomeECantante
ArrayGiocatori[i] = Gio; //save instance inside array at index i

同样Giocatori是错误的(想想是Giocatore,一个包含播放器所有信息的类),并为要存储的每个属性添加一个字段。

class Giocatori
{
    public string Name;
    public string CantantePreferito;
    public int Voto;

    public void NomeECantante()
    {
        Console.WriteLine("Inserisci il tuo nome: ");
        Nome =Console.ReadLine();

        Console.WriteLine(Giocatore + " inserisci il tuo cantante preferito: ");
        CantantePreferito = Console.ReadLine();
        // not
        //string CantantePreferito = Console.ReadLine();
        // otherwise you create a local variable with same name instead of set field Cantante

        Console.WriteLine("Dai un voto da 1 a 10 a " + CantantePreferito + ": ");
        Voto = int.Parse(Console.ReadLine());
    }
}

之后可以打印这样的所有玩家:

    for (int i = 0; i < GiocatoriN; i++)
    {
        Giocatori Gio = ArrayGiocatori[i];
        Console.WriteLine("a {0} piace sentir cantare {1} (voto {2}, Gio.Nome, Gio.CantantePreferito, Gio.Voto);
    } 

答案 2 :(得分:0)

关于构造函数的第一个问题,如果你不写一个,程序会为每个类提供一个默认的构造函数。所以它只存在于你看到它。 对于第二个问题,您需要首先定义对象数组,然后您可以为其分配单个元素。

Giocatori[] array = new Giocatori[3];
foreach(Giocatori g in array)
{
    g = new Giocatori();
}

应该做的伎俩。