Zufallsausgabe in Liste

Noctuh

Cadet 2nd Year
Registriert
Jan. 2020
Beiträge
28
Hallo,
ich habe folgendes Problem ich soll in eine Methode mit dem Übergabeparameter (int Anzahl) der zu erstellende PKWs enthält erstellen.
Die Methode soll auf Zufallsbasis eine Liste<Pkw> mit der Anzahl von Pkws die per Parameter gewünscht wird erstellen.

Dafür gibt es Marken: VW, Mercedes, Audi, Opel

Modelle:Bei VW: Golf, Polo, Passat
Bei Audi: A1, A2, A3, A4
Bei Mercedes: A, B, C
Bei Opel: Adam, Astra

Die Description setzt sich zusammen aus Marke + Modell + Zahl die pro Marke hochgezählt wird
Bsp.:
VW-Passat-1
VW-Golf-2
Audi-A1-1

Nun ich habe leider nicht so richtig Ahnung wie das gehen soll ich wollte es mit einer Schleife und Arrays probieren weis aber nicht so richtig wie. Wäre nett wenn mir jemand helfen könnte.

Und nein es ist keine Hausaufgabe oder ähnliches das ist eine Übung für zu Hause und ich komme einfach nicht weiter.

Danke

Mit freundlichen Grüßen

Noctuh
 
Es wäre noch hilfreich, wenn du die Sprache erwähnst, in der du entwickelst. Auf diese Weise bekommst du sicherlich eher Hinweise, mit welchen Strukturen du am sinnvollsten arbeiten könntest/solltest.

Ganz banal sehe ich da eine Liste mit Automarken, wobei jedes Element (also jede Automarke) der Liste wiederum eine Liste mit Modellen beinhaltet. Vorgehen ist dann einfach und klar: Zufällig einen Index aus der Automarkenliste auswählen und anschließend zufällig einen Index aus der Liste der Modelle dieser Marke auswählen und fertig. Einen Zähler pro Automarke einbauen, dürfte auch nicht weiter wild sein ;)

Geht auf jeden Fall eleganter, schöner, bunter, schneller, cooler usw., aber dürfte dich zum Ziel führen.

Viel Erfolg.
 
Sprache ist C#
Ergänzung ()

KillerCow schrieb:
Es wäre noch hilfreich, wenn du die Sprache erwähnst, in der du entwickelst. Auf diese Weise bekommst du sicherlich eher Hinweise, mit welchen Strukturen du am sinnvollsten arbeiten könntest/solltest.

Ganz banal sehe ich da eine Liste mit Automarken, wobei jedes Element (also jede Automarke) der Liste wiederum eine Liste mit Modellen beinhaltet. Vorgehen ist dann einfach und klar: Zufällig einen Index aus der Automarkenliste auswählen und anschließend zufällig einen Index aus der Liste der Modelle dieser Marke auswählen und fertig. Einen Zähler pro Automarke einbauen, dürfte auch nicht weiter wild sein ;)

Geht auf jeden Fall eleganter, schöner, bunter, schneller, cooler usw., aber dürfte dich zum Ziel führen.

Viel Erfolg.
Danke leider weis ich nicht wie ich dies anstellen soll könntest du mir Code teil zeigen wie ich anfangen soll oder ähnliches wäre dir sehr hilfreich
 
Zuletzt bearbeitet:
Noctuh schrieb:
Code teil zeigen wie ich anfangen soll
In C# bin ich leider überhaupt nicht zuhause und habe keinen Überblick, welche Sprachkonstrukte für Listen etc. vorhanden sind. Tut mir leid.
 
Wenn du programmieren lernen willst, ist deine Einstellung schon mal falsch.
80% der Arbeit besteht meist daraus, sich irgendwoher Quellcode zu suchen, ob aus alten Projekten oder online.

Wie @KillerCow bereits erwähnte, wäre der Ansatz mit einer Liste in einer Liste da sicherlich machbar.
Ich verwende solche "Multi-Listen" selbst so, auch wenn das natürlich immer irgendwie eleganter geht.

In C# wäre das dann:
List<List<string>> mulstPKW = new List<List<string>>();

In dem Falle ist das aber eine String-Liste, Zahlen müssen also umgewandelt werden.
Das ist aber wahrscheinlich noch der einfache Part.
Schwierig wirds mit dem Außereinanderhalten der Marken, aber man könnte als erstes Feld der inneren Listen immer die Marke schreiben.
[VW, Golf, 2]
[VW, Polo, 1]
...

Bei den Zufallszahlen kann ich nicht helfen, da ich da selbst dran gescheitert bin unter C# "echte" Zufallszahlen zu erzeugen. Ich hab am Ende immer ein "Pattern" gehabt, was ich auch sehen konnte, weil es in einem Grid zu sehen war (Nachbau von Minesweeper).
 
Da wir ja bei C# sind kann man auch ein PKW Objekt erstellen und dann eine Liste mit PKW Objekten
 
Wie wäre es sich das ganze mal konzeptionell aufzuzeigen wie es gehen kann. Programmieren zu lernen heißt nicht C++, oder C# oder Java zu beherrschen, sondern sich zu überlegen die Probleme systematisch gelöst werden können :).
 
  • Gefällt mir
Reaktionen: Raijin und RalphS
Zunächst: Das ist OO. Grundsätzlich erstmal weg von der Idee mit Schleifen und Arrays und goto und was weiß ich. OO ist die Realität (in diesem Sinn).

Wenn Du PKWs hast, dann wäre an der Stelle ein vergleichsweise einfacher Ansatz:

  • Klasse PKW erstellen:
    C#:
    class PKW {}
  • Klasse "Hersteller" ableiten:
    C#:
    class Audi : PKW {}
  • Überlegen, was für Eigenschaften PKWs haben (und alle Hersteller damit auch). Diese Eigenschaften kommen in den "PKW".
  • Überlegen ob (falls) es weitere Eigenschaften gibt, die nur die Hersteller selber haben. Falls ja, kommen die in die abgeleiteten Klassen.

- Konstruktor basteln:
C#:
public Audi() {}
. Hier drin wird Code angelegt (und ausgeführt) welcher das neue "Objekt" anlegt. Sprich,
C#:
new Audi()
erstellt ein neues Fahrzeug aus dem großen Pool der Audis - also mußt Du dem Konstruktor noch paar Infos mitgeben, damit sich Audi1 von Audi2 unterscheidet.
Wie Du das machst ist erstmal Deine Sache. Der saubere Weg sind Klassen für jedes Fahrzeugmodell - class A1 : Audi --- aber Du kannst genausogut auch einfach eine Eigenschaft Modell in der Klasse Audi haben und Du kannst sogar ganz flach rangehen und NUR class PKW haben und dort dann Eigenschaften Marke und Modell verwenden. Nicht schön, aber geht.

- Jetzt hast Du einen Haufen von Fahrzeugen (bzw erstmal die Möglichkeit, diesen anzulegen).

- Als nächstes hast Du für eine Anwendung eine statische Main() Methode mit oder ohne Übergabeparameter. Die wird mit Programmstart ausgeführt, aber man sollte sie halt sauber halten.

- Deshalb baust Du idealerweise eine zusätzliche statische Klasse (hinweis, die sind gerne verpönt, aber nur von Leuten ohne Ahnung von OO) welche die Methode(n) enthält, die vom ganzen Rest unabhängig sind. Zum Beispiel
C#:
static List<PKW> RandomizePKW(uint anzahl)
. Was Du übergibst bleibt Dir überlassen, aber die Methode muß zumindest erfahren, was sie braucht und nicht selber beschaffen kann.

Option A: Generics und eine Signatur wie
C#:
static List<TInput> RandomizePKW<TInput>(uint Anzahl) where TInput: PKW

Vorteil: Ermöglicht es, den generischen Typen TInput in der Methode zu verwenden als Platzhalter für alles, was der Benutzer später mal angibt. Der sagt dann
C#:
List<PKW> meinePKWs = RandomizePKW<Audi>(5)
Nachteil: Generika sind sehr abstrakt, sie stehen der Klassenhierarchie diametrisch gegenüber, man muß ggfs um die Ecke denken, und wenn es was zu konvertieren oder zu instantiieren gibt, dann wird es interessant. Für den Neuling nur bedingt empfehlenswert.


Option B: Enums und eine Signatur wie
C#:
static List<PKW> RandomizePKW(Fahrzeugtyp typ, uint anzahl) {}
.
Dann
C#:
public enum Fahrzeugtyp {}
deklarieren und da drin die möglichen Fahrzeugtypen einfach auflisten.

Vorteil: Einfach.
Nachteil: Man braucht eine Switch-Anweisung, um alle möglichen Felder des enum typ auf die tatsächliche Klasse abzubilden. Das gibt ordentlich Codezeilen. Andererseits kann man enums zu int konvertieren... das ist an der Stelle vermutlich für die Randomisierung gar nicht mal so schlecht.

Da es einen fixen Pool gibt an Fahrzeugen, kann man auch einen fixen Pool an Fahrzeugen in die Anwendung aufnehmen. Das kann ein Array oder ein Dictionary oder auch eine List sein - auch wieder statisch.
Wenn man dann "anzahl" oft sowas wie Math.Random() aufruft, dann kann man über den erhaltenen Index notfalls mit ein bißchen Transformation einfach eines der Fahrzeuge aus diesem statischen Pool greifen und zurückgeben.

Beispiel: public Audi hat die Signatur (string name, uint Türen) sodaß man 2,3,4 und 5-Türer Varianten eines Modells erstellen kann.

Dann wäre ein statischer Pool sowas wie
C#:
static List<PKW> = new List<PKW>()
{ new Audi("A3", 3), new Audi("A3", 5 }
hier also ein Pool aus zwei Fahrzeugen, nämlich einem drei- und einem fünftürigen Audi A3.


Hinweise: statische Methoden werden mit Klassenname aufgerufen, wenn also eine statische Klasse da ist
C#:
static class PKWsAndStuff
{
 static List<PKW> RandomizePKW(Fahrzeugtyp typ, uint anzahl)
 {
 // Implementierung
 }
}
dann ruft man das mit
C#:
PKWsAndStuff.RandomizePKW(Fahrzeugtyp.Audi, 5)
auf.
 
  • Gefällt mir
Reaktionen: Nase
Hmm ok das hilft mir aber auch nicht weiter tut mir leid aber danke an alle die helfen wollten
 
Noctuh schrieb:
Hallo,
ich habe folgendes Problem ich soll in eine Methode mit dem Übergabeparameter (int Anzahl) der zu erstellende PKWs enthält erstellen.
Die Methode soll auf Zufallsbasis eine Liste<Pkw> mit der Anzahl von Pkws die per Parameter gewünscht wird erstellen.

Dafür gibt es Marken: VW, Mercedes, Audi, Opel

Modelle:Bei VW: Golf, Polo, Passat
Bei Audi: A1, A2, A3, A4
Bei Mercedes: A, B, C
Bei Opel: Adam, Astra

Die Description setzt sich zusammen aus Marke + Modell + Zahl die pro Marke hochgezählt wird
Bsp.:
VW-Passat-1
VW-Golf-2
Audi-A1-1

Nun ich habe leider nicht so richtig Ahnung wie das gehen soll ich wollte es mit einer Schleife und Arrays probieren weis aber nicht so richtig wie. Wäre nett wenn mir jemand helfen könnte.

Und nein es ist keine Hausaufgabe oder ähnliches das ist eine Übung für zu Hause und ich komme einfach nicht weiter.

Danke

Mit freundlichen Grüßen

Noctuh
Liste<Pkw> impliziert zumindest schon mal eine Pkw-Klasse, was sich auch mit deinem anderen Thread deckt. In der von dir gewünschten Methode, die ich zur Verdeutlichung mal GeneratePKWList(int Anzahl) nenne, brauchst du dann einfach nur eine Schleife, die Anzahl-Mal durchläuft und bei jeder Iteration ein neues Pkw-Objekt erzeugt bzw. zur List<Pkw> hinzufügt. Die Eigenschaften des Pkw-Objekts generierst du dabei einfach aus einer Zufallszahl (Stichwort: Random-Klasse), die beispielsweise bei der Marke einen Wert von 0-3 annimmt und somit die 4 Automarken repräsentiert. Ist die Zufallszahl eine 2, wird's eben ein Audi. Beim Modell machst du das genauso. Hierbei musst du jedoch aufpassen, da ein Opel nur 2 Modelle hat, während Audi derer ganze 4 bietet. Ergo muss die Zufallszahl für das Modell je nach Marke Werte von zB 0-1 oder eben 0-3 ausgeben (Stichwort: if).
Das fertige Pkw-Objekt fügst du dann deiner List<Pkw> hinzu und fertig ist deine Methode.
 
  • Gefällt mir
Reaktionen: abcddcba
Zurück
Oben