Zum Inhalt springen

Ich komme in C# nicht weiter, Arrayelemente auf doppelte elemente überprüfen


mstel

Empfohlene Beiträge

Hallo, wie in meinem Betreff kurz erwähnt stecke ich in der Programmierung eines kleinen Programmes fest.

Ich bin in der ausbildung aus FIAE aber habe erst meinen Sek II abschluss und bin 17 jahre alt und hatte vorher keinerlei erfahrung im Programmieren. Seid dem August bin ich am programmieren und die Basic's gehen auch schon

aber jetzt ist meine aufgabe :

Ich soll in einem Array 10 Zufallszahlen generieren und der größe nach sortieren.

Das generieren funktioniert auch schon. allerdings muss ich nun überprüfen ob im array eine zahl doppelt generiert wurde und stattdessen eine neue generieren. aber ich habe keine ahnung wie ich die array elemente miteinander vergleiche, würde 1 mit 2,3,4 etc vergleichen dann 2 mit 1,3,4 etc aber da das programm erweiterbar sein soll ist dies eine lösung mit der der arbeitgeber nicht einverstanden ist, daher nun meine frage :

Wie kann ich verallgemeinert in einer schleife die array elemente aufeinander überprüfen ?

mein code sieht momentan so aus :

private void zahlen_generieren()

{

Random Rnd = new Random(); // initialisiert die Zufallsklasse

long[] lngVar = new long[10];

int indexwerte = lngVar.Length;

for (int zaehlwert = 0; zaehlwert < 10; zaehlwert++)

{

lngVar[zaehlwert] = Rnd.Next(1, 100);

}

generatedLabel1.Text = lngVar[0].ToString();

generatedLabel2.Text = lngVar[1].ToString();

generatedLabel3.Text = lngVar[2].ToString();

generatedLabel4.Text = lngVar[3].ToString();

generatedLabel5.Text = lngVar[4].ToString();

generatedLabel6.Text = lngVar[5].ToString();

generatedLabel7.Text = lngVar[6].ToString();

generatedLabel8.Text = lngVar[7].ToString();

generatedLabel9.Text = lngVar[8].ToString();

generatedLabel10.Text = lngVar[9].ToString();

danke für hilfe, gruß mstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie kann ich verallgemeinert in einer schleife die array elemente aufeinander überprüfen ?
Du schreibst es doch schon selbst: In einer Schleife. Vielleicht ist es für dich gedanklich einfacher, wenn du den neuen Wert nicht direkt im Array ablegst, sondern zunächst in einer zusätzlichen Variablen, die du mit jedem existierenden Array-Element vergleichst.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Du schreibst es doch schon selbst: In einer Schleife. Vielleicht ist es für dich gedanklich einfacher, wenn du den neuen Wert nicht direkt im Array ablegst, sondern zunächst in einer zusätzlichen Variablen, die du mit jedem existierenden Array-Element vergleichst.

Das kannst Du bequem erweitern: Wert in einer Variablen ablegen und anschließend http://msdn.microsoft.com/de-de/library/d9hy2xwa(v=vs.80).aspx benutzen

Bearbeitet von lilith2k3
Link zu diesem Kommentar
Auf anderen Seiten teilen

Contains ist auch nur für Zeichenketten (Strings) bestimmt. Ich würde es einfach so machen:

variable;

for (int zaehlwert = 0; zaehlwert < 10; zaehlwert++)

{

variable = Rnd.Next(1, 100);

foreach (var item in ingVar)

{

if (item != variable)

{

lngVar[zaehlwert] = variable;

}

}

}

Habe jetzt nicht getestet ob meine Logik da hinkt... :old

Link zu diesem Kommentar
Auf anderen Seiten teilen

du hast mein problem schon verstanden, ich habe keine strings.. die funktion ist leider nicht verwendbar..

ich habe jetzt eine methode gebaut :

private void zahlen_generieren()

{

Random Rnd = new Random();

long[] lngVar = new long[10];

int indexwerte = lngVar.Length;

for (int zaehlwert = 0; zaehlwert < indexwerte ; zaehlwert ++)

{

lngVar[zaehlwert] = Rnd.Next(1, 15);

zaehlwert = zaehlwert + 1;

auf_gleiche_werte_ueberpruefen(lngVar, indexwerte, zaehlwert);

}

}

private bool auf_gleiche_werte_ueberpruefen(long[] array, int indexer, int zaehler)

{

bool zahlen_einmalig = true;

return zahlen_einmalig;

}

allerdings brauche ich jetzt noch eine schleife die überprüft ob eine zahl mehr als einmal vorkam und ich weiß nicht wie ich die Bedingungen setze beziehungsweise welche verarbeitungen sinnvoll sind..

einen wert auf alle folgenden zu überprüfen stellt kein so großes problem dar, aber jeden wert untereinander zu überprüfen ist wirklich schwer.. ich komme nicht so ganz voran.

aber großes dankeschön für die antworten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

einen wert auf alle folgenden zu überprüfen stellt kein so großes problem dar, aber jeden wert untereinander zu überprüfen ist wirklich schwer..
Vor allem ist es unnötig. Du brauchst nicht jeden gegen jeden zu prüfen, wenn du die Information verwendest, dass nur die zuletzt hinzugekommene Zahl überhaupt für ein Duplikat in Frage kommt.
Link zu diesem Kommentar
Auf anderen Seiten teilen

kommt sie ja nicht, angenommen es wurden schon 5 werte generiert.

dann muss ich den 6. wert nicht nur auf den 5. überprüfen sondern auch auf 4,3,2 und 1.

und das programm muss erweiterbar sein ich kann mich nicht auf 10 einigen, es muss so allgemein gültig sein das ich einfach aus der 10 eine 20 machen könnte und dort wieder kein wert doppelt vorkommt..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Muss es nen Array sein? Ich persönlich nutze viel lieber List<T>. Grade was das nachträgliche Hinzufügen von Objekten angeht, ist das doch "etwas" komfortabler. Da gibt es übrigens auch ein "Contains".

Sonst kann man, wie Klotzkopp glaube ich schon andeutete, vor jedem Array.Add(Element) ein if(!Array.Contains(Element)) zur Prüfung laufen lassen und gut is.

Bearbeitet von Goulasz
Klammer vergessen, grober Unfug!
Link zu diesem Kommentar
Auf anderen Seiten teilen

kommt sie ja nicht, angenommen es wurden schon 5 werte generiert.

dann muss ich den 6. wert nicht nur auf den 5. überprüfen sondern auch auf 4,3,2 und 1.

Eben. Du musst aber beispielsweise nicht prüfen, ob 4 und die 2 gleich sind. Genau das scheint aber die Absicht deiner Funktion auf_gleiche_werte_ueberpruefen zu sein.
Link zu diesem Kommentar
Auf anderen Seiten teilen

richtig..

aber ich verstehe nicht ganz wie ich einer schleife als bedingung und verarbeitung sagen kann, dass sie bei element [3] nur die 2 und die 1 überprüft und bei element [5] zusätzlich noch 3 und 4..

mit der obig genannten foreach schleife komme ich auch zu keinem ergebnis..

private void zahlen_generieren()

{

Random Rnd = new Random();

long[] lngVar = new long[10];

int indexwerte = lngVar.Length;

int variable;

for (int zaehlwert = 0; zaehlwert < indexwerte; zaehlwert++)

{

variable = Rnd.Next(1, 15);

foreach (var item in lngVar)

{

if (item != variable)

{

lngVar[zaehlwert] = variable;

}

}

}

anschließend habe ich nur die ausgabe, aber die werte die generiert werden kommen dennoch mehrmals vor..

Link zu diesem Kommentar
Auf anderen Seiten teilen

mit der obig genannten foreach schleife komme ich auch zu keinem ergebnis..
Das ist ja auch Unsinn, was du da machst.

Überleg dir mal folgendes genau:

- Wann kannst du sagen: "Der neue Wert ist schon drin", und wie musst du darauf reagieren?

- Wann kannst du sagen: "Der neue Wert ist noch nicht drin", und wie musst du darauf reagieren?

Link zu diesem Kommentar
Auf anderen Seiten teilen

dankeschön :) das klingt schonmal gut die methode .contain hab ich noch nicht gekannt

Da hat sich was überschnitten. Ich habe den Link erneuert, weil ich mich in der Methode geirrt habe :]

http://msdn.microsoft.com/de-de/library/d9hy2xwa(v=vs.80).aspx <- war der neue Link. Du hast den Thread wohl schon gelesen, bevor ich aktualisiert habe *g* C# Array.Find Method

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist mein aktueller stand.. ich finde den fehler aber nicht der debugger haut mir mal keine fehlermeldungen mehr raus allerdings wird momentan noch in jeden wert null geschrieben..

private void zahlen_generieren()

{

Random Rnd = new Random();

long[] lngVar = new long[3];

int indexwerte = lngVar.Length;

bool true_or_false = false;

for (int zaehlwert = 0; zaehlwert < indexwerte; zaehlwert++)

{

int neuer_Wert = Rnd.Next(1, 15);

true_or_false = auf_gleiche_werte_ueberpruefen(lngVar, zaehlwert, neuer_Wert);

}

generatedLabel1.Text = lngVar[0].ToString();

generatedLabel2.Text = lngVar[1].ToString();

generatedLabel3.Text = lngVar[2].ToString();

}

private bool auf_gleiche_werte_ueberpruefen(long[] array, int indexPosition, int generierter_Wert)

{

bool zahlen_einmalig = false;

if (indexPosition > 0)

{

for (int zaehler = 0; zaehler != array.Length ; zaehler ++)

{

if ( generierter_Wert == array[zaehler] )

{

zahlen_einmalig = true;

}

}

}

return zahlen_einmalig;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

okay habe die lösung endlich gefunden.. der thread kann von mir aus geschlossen werden oder für andere user die selbige probleme haben weiterverwendet..( sortierfunktion noch nicht eingebaut, lediglich das generieren und abfangen von mehrfachem auftreten der generierten zahlen )

der programmcode lautet wie folgt :

namespace Sortieren_Von_Zahlen

{

public partial class Form1 : Form

{

long[] lngVar = new long[10];

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void buttonGenerate_Click(object sender, EventArgs e)

{

zahlen_generieren();

}

private void buttonSort_Click(object sender, EventArgs e)

{

ausgabe_Sorted(lngVar);

}

private void zahlen_generieren()

{

Random Rnd = new Random();

int indexwerte = lngVar.Length;

bool true_or_false = false;

for (int zaehlwert = 0; zaehlwert < indexwerte; zaehlwert++)

{

int neuer_Wert = Rnd.Next(1, 15);

true_or_false = auf_gleiche_werte_ueberpruefen(lngVar, zaehlwert, neuer_Wert);

while (true_or_false == true)

{

neuer_Wert = Rnd.Next(1, 15);

true_or_false = auf_gleiche_werte_ueberpruefen(lngVar, zaehlwert, neuer_Wert);

}

lngVar[zaehlwert] = neuer_Wert;

}

ausgabe_Generated(lngVar);

}

private bool auf_gleiche_werte_ueberpruefen(long[] array, int indexPosition, int generierter_Wert)

{

bool zahlen_einmalig = false;

if (indexPosition > 0)

{

for (int zaehler = 0; zaehler != array.Length ; zaehler ++)

{

if ( generierter_Wert == array[zaehler] )

{

zahlen_einmalig = true;

}

}

}

return zahlen_einmalig;

}

private void ausgabe_Generated(long[] test)

{

generatedLabel1.Text = test[0].ToString();

generatedLabel2.Text = test[1].ToString();

generatedLabel3.Text = test[2].ToString();

generatedLabel4.Text = test[3].ToString();

generatedLabel5.Text = test[4].ToString();

generatedLabel6.Text = test[5].ToString();

generatedLabel7.Text = test[6].ToString();

generatedLabel8.Text = test[7].ToString();

generatedLabel9.Text = test[8].ToString();

generatedLabel10.Text = test[9].ToString();

}

private void ausgabe_Sorted(long[] test2)

{

sortedLabel1.Text = test2[0].ToString();

sortedLabel2.Text = test2[1].ToString();

sortedLabel3.Text = test2[2].ToString();

sortedLabel4.Text = test2[3].ToString();

sortedLabel5.Text = test2[4].ToString();

sortedLabel6.Text = test2[5].ToString();

sortedLabel7.Text = test2[6].ToString();

sortedLabel8.Text = test2[7].ToString();

sortedLabel9.Text = test2[8].ToString();

sortedLabel10.Text = test2[9].ToString();

}

}

}

danke für alle helfenden

Link zu diesem Kommentar
Auf anderen Seiten teilen

So aus Langeweile habe ich das Ganze jetzt auch mal gemacht :beagolisc:


class Program

    {

        static Random rnd = new Random();


        static void Main(string[] args)

        {             

            int[] myArray = new int[10];

            int rndCount = 0;            


            for (int i = 0; i < myArray.Length; i++)

            {

                FillNextItem(myArray, i);

                Console.WriteLine(myArray[i]);

            }

            Console.ReadLine();            

        }



        private static bool FindContains(int[] myArray, int rndCound)

        {

            foreach (int item in myArray)

            {

                if (item == rndCound)

                {

                    return true;

                }

            }

            return false; 

        }



        private static void FillNextItem(int[] myArray, int i)

        {            

            int rndCount = 0;

            rndCount = rnd.Next(1, 11);


            if (FindContains(myArray, rndCount))

            {

                FillNextItem(myArray, i);

            }

            else

            {

                myArray[i] = rndCount;

            }

        }


    }

Link zu diesem Kommentar
Auf anderen Seiten teilen

kannst du einfach machen mit

Random rnd = new Random();

int[] zahlen = new int[10];

for (int i = 0; i < 10; i++)

{

int next = rnd.Next(1, 100);

foreach (int zahl in zahlen)

{

if (zahl == next)

{

i--;

return;

}

}

zahlen = next;

Console.WriteLine(zahlen.ToString());

}

Console.ReadKey();

Damit gehst du sicher das immer ein neuer Wert eingetragen wird und wenn der Wert im Array vorhanden ist wird der zähler zurückgesetzt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...