2016-05-31 7 views
2

Also habe ich dieses Programm, wo ich im Grunde versuche, eine zufällige Anordnung von 20 Elementen zu erzeugen und dann die Werte darin nach a verschieben Wert, der vom Benutzer eingegeben wird. Wenn der Benutzer also 5 eingibt, verschiebt sich das Array um 5 Stellen und das ausgegebene Array hat an seinem ersten Index [0] den Wert des Index [6] (da der Index bei 0 -> 5 + 1 beginnt) und am Index [ 1] der Wert des ursprünglichen Index [7] und so weiter.C# Aufrufen einer Methode aus der Hauptklasse mit Parametern

Das Problem, mit dem ich konfrontiert bin, liegt bei den Eingabeparametern. Ich versuche, den vom Benutzer angegebenen Wert zu geben, wenn der Benutzer also 5 eingibt, gebe ich der Methode "shiftValueX" als "_shiftValueX", um damit zu arbeiten.

Noch unten bei der "ToString" -Methode, wo ich die "shiftPos()" - Methode drucke ich bekomme diesen Fehler, "Es gibt kein Argument gegeben, dass die erforderlichen formalen Parameter entspricht". Was soll ich machen? Ich habe versucht, Parameter auf die Methode im ToString Abschnitt zu setzen, aber nichts funktioniert. Rufe ich die Methode falsch an? Wie kann ich es reparieren? Ich danke dir sehr.

Dies ist die Klasse "Arrays"

class Arrays 
{ 
    //constants 
    public const int AMOUNT_OF_VALUES = 20; 
    public const int MAX_RND_VALUES = 100; 

    private int[] array = new int[AMOUNT_OF_VALUES]; 


    //Random Generator 
    private static Random rnd = new Random(); 

    //Class Constructors 
    public Arrays(int[] num) 
    { 
     for (int i = 0; i < array.Length; i++) 
     { 
      array[i] = num[i]; 
     } 
    } 

    public Arrays() 
    { 
     for (int i = 0; i < array.Length; i++) 
     { 
      array[i] = rnd.Next(MAX_RND_VALUES); 
     } 
    } 

    //Methods 
    public int[] shiftPos(int _shiftValueX) 
    { 
     int y = 0; 
     int[] array2 = new int[AMOUNT_OF_VALUES]; 

     for (int i = _shiftValueX; i <= (array.Length - 1); i++) 
     { 
      array2[y] = array[i]; 
      y++; 
     } 

     for (int i = 0; i < (array.Length - (_shiftValueX)); i++) 
     { 
      array2[y] = array[i]; 
      y++; 
     } 

     return array2; 
    } 

    //Override ToString Method 
    public override string ToString() 
    { 
     return "The original array was: " + string.Join(", ", array.Select(v => v.ToString())) + "\n" + 
       "The rotated array is: " + string.Join(", ", shiftPos().Select(v => v.ToString())); 
           //This is where I'm getting the error^

    } 
} 

Dies ist das "Hauptprogramm"

class Program 
{ 
    //constants 
    public const int AMOUNT_OF_VALUES = 20; 

    static void Main(string[] args) 
    { 

     Console.WriteLine("How many places will the values be shifted: "); 
     int shiftValueX = int.Parse(Console.ReadLine()); 

     Arrays myArray = new Arrays(); 

     myArray.shiftPos(shiftValueX); 
     Console.WriteLine(myArray); 
    } 
} 
+0

Nun, 'shiftPos (int _shiftValueX)' nimmt einen int als Parameter, aber in der 'shiftPost(). Select()' Aufruf, Sie liefern keine. Gibt es einen besonderen Grund, warum Sie die Überladung "ToString()" verwenden möchten? Sie könnten stattdessen eine Methode erstellen, die den Parameter 'shiftValueX'as verwendet, das alte Array ausgibt, 'shiftPos (shiftValueX)' aufruft und seinen Rückgabewert ausgibt. – Lennart

+0

Ich habe versucht, eine Integer in die ShiftPos() am ToString, aber dann ignoriert es den Wert vom Benutzer vollständig. Für diese Übung wird eine ToString-Überschreibungsmethode benötigt. – kworld

+0

Ihr Aufruf von shiftPos() in der Hauptmethode gibt das neue geordnete Array zurück. aber das ursprüngliche Array bleibt unverändert. Sie könnten entweder das zurückgegebene Array speichern und das oder die Methode shiftPos() so ändern, dass das ursprüngliche Array geändert wird. Ich denke, die letztere Option ist besser, weil Sie erwähnt haben, dass Sie eine ToString() - Überladung verwenden müssen. – MarcoLaser

Antwort

1

Rechts, Tatsache Sie ist BIST-Logik ein wenig ausgeschaltet ist. Wie MarcoLaser schon vorher gesagt hat, wenn Sie in Ihrem main Ihre myArray.shiftPos(shiftValueX); anrufen, verwenden Sie ein separates Array, das Sie dann zurückgeben. Das bedeutet, dass Ihr Array innerhalb Ihrer Arrays Klasse unverändert bleibt.

Was Sie wahrscheinlich tun sollten, ist das Array innerhalb Ihrer Arrays Instanz in der shiftPos Methode zu ändern. Sie können noch Ihre zweite Array zurück, aber Sie sollten auch das Array

this.array = array2; 
    return array2; 

Auf diese Weise stellen Sie die privaten Array in Ihrer Instanz innerhalb der Überschreibung toString() gespeichert verwenden können, anstatt die shiftPos in der toString aufrufen.

Sie haben auch angegeben, dass Sie auch das Original-Array benötigen, also speichern Sie das array2 in einer anderen private Variable.

Eine andere Art, sich diesem Problem zu nähern, ist ein bisschen komisch, auch wenn shiftPos die Logik nicht ausführt, sondern den Benutzerwert in der Klasseninstanz speichert, damit Sie den Benutzerparameter in der toString-Methode verwenden können. Obwohl das eine Art seltsamer Art ist, sich ihr zu nähern, und ich schlage vor, dass Sie die erste Methode machen.

+0

Ja, Sie haben Recht, ich habe ein anderes Array zum Drucken verwendet und das Original wurde mit den ursprünglichen Werten belassen. Ich habe es bearbeitet und es hat perfekt funktioniert. Ich habe in der Methode ein 'tmpArray' verwendet und dann das Ergebnis in' array2' kopiert, so dass 'array' immer noch verwendet werden kann, um die ursprünglichen Werte im toString anzuzeigen. Vielen Dank! – kworld