C# Array Index Sortierung fehlerhaft bei Eingabe des Wertes 0

Flashnox

Cadet 1st Year
Registriert
März 2016
Beiträge
12
Hallo erstmal, zur Erklärung ich beschäftige mich noch nicht all zu lange mit der Sprache C#,und habe jetzt auch schon etwas Zeit und mühen investiert eine Passende Lösung zu finden habe aber anscheinend das klassische Brett vor dem Kopf.

Habe auch Analytisch versucht dem Problem auf den Grund zu gehen was man dann auch an den dutzenden Kommentaren sehen wird,bin mir allerdings hierbei schon leicht unsicher ob ich nicht eben hierbei einen Denkfehler habe.

Nun zum eigentlichen Problem:

Ich habe einen Sortier-Algorythmus für ein Array geschrieben das 8 Elemente beinhalten soll, und das mittels Benutzer-Eingabe befüllt wird. Dieser Algorythmus bedient sich mehrerer Funktionen, und funktioniert soweit eigentlich wie er soll.,
solange der Benutzer einen Wert > 0 eintippt wird jeder der verschiedenen Werte an den richtigen Index sortiert.

Aber sobald die Eingabe einer 0 im verlauf der Abfrage auftritt entstehen Probleme in der Sortierung.
Ich hoffe sehr das mir weiter geholfen werden kann( mögliche Denkfehler aufzeigen und wenn möglich deren Lösung)

Vielen Dank im vorraus!

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        //GlobaleVariable : Das Array "numbers" erzeugt ein neues Array.
        static int[] numbers = new int[8];
                                  
        //BEGINN HAUPTFUNKTIONEN !!
        static void Main(string[] args)                               
        {
            //Das neue Array hat maximal 8 Elemente.
            for (int i = 0; i < 8; i++)                               
            {
                //Der Wert number wird in die HauptFunktion
                //GetNumberFromUser(); übergeben.
                int number = GetNumberFromUser();                     
                AddNumberToArray(number);
                PrintNumbers();
            }
            //Konsole wartet auf Eingabe des Benutzers,um das Programm zu beenden.
            Console.ReadLine();
            //ENDE HAUPTFUNKTIONEN !!                                      
        }
        //Deklaration der HauptFunktion AddNumberToArray() die den Wert "number" 
        //in das Array "numbers" sortiert übergibt.
        static void AddNumberToArray(int number)                      
             {
            //Der Wert "index" wird in die HilfsFunktion GetIndexToInsert(number)
            //übergeben.
            int index = GetIndexToInsert(number);

            //Die HilfsFunktion MoveNumbers(index) wird aufgerufen            
            MoveNumbers(index);

            //Der index des Arrays "numbers" wird dem Wert "number" Gleich gesetzt.                                
            numbers[index] = number;                              
             }

        //HilfsFunktion zum erfassen der korrekten index Position
        //des Arrays "numbers" mit hilfe des Wertes "number".

        static int GetIndexToInsert(int number)                       
            {
            #region//Erzeugt eine Lokale Variable i deren Wert 0 zugewiesen bekommt.
            //Es wird geschaut ob die Variable i noch in das Array "numbers" passt.
            //Und wenn dem so ist wird die Variable i solange erhöht
            #endregion//bis das Array voll ist.

            for (int i = 0; i < numbers.Length; i++)              
                {
                //Es wird überprüft ob die Variable i aus dem Array "numbers"
                //den Wert 0 hat.
                if (numbers [i] == 0)

                    #region//Falls ja wird es an die HauptFunktion "AddNumberToArray(number)"
                    //zurückgegeben das der index-0 momentan besetzt ist.
                    //Sollte einer der Folgenden Eingabewert 0 sein wird der index-Wert
                    //0 erneut vergeben,von hier an kann nur unter berückstichtigung
                    //der maximalen Element-möglichkeiten weiter aufsteigend Sortiert werden
                    //bis das Array voll ist. Allerdings wird nicht mehr vom
                    #endregion//kleinesten zum größten Wert Sortiert da der index-0 öfters vergeben wurde.
                    return i;

                #region//Falls die Variable i nicht den Kleinsten Wert im Array "numbers" hat.
                //Wird überprüft ob die Variable i größer ist als die 
                #endregion//vorhandene/n Zahl/en.
                if (numbers[i] >= number)

                    #region//Des weiteren wird die Variable i intern an die HauptFunktion
                    //AddNumberToArray(number) zurückgegeben und an entsprechender
                    #endregion//index-Position einsortiert.
                    return i;                                                               
                }
            #region//Nach der Überprüfung wird dem Array "numbers" 1 Element abgezogen.
            //Und es Überprüft die nächsten freien Elemente im Array,um die Zahlen
            #endregion//des Benutzers je nach ihrer größe dem index entsprechend zu sortieren.
            return numbers.Length - 1;                            
            }

        #region//HilfsFunktion zum korrekten einsetzen des Wertes "fromIndex"
        //in das Array "numbers", unter berücksichtigung der freien Elemente
        #endregion//und des index Wertes.
        static void MoveNumbers(int fromIndex)                        
                                                                      
        {
            #region//Die Variable i bekommt den maximalen Wert der Elemente im
            //Array "numbers" zugewiesen,und wird solange um 1 verringert,
            #endregion//bis alle Elemente des Arrays aufgefüllt sind.

            for (int i = numbers.Length -1; i > fromIndex; i--)       
                {
                    numbers[i] = numbers[i - 1];
                }
                numbers[fromIndex] = 0;
             }
        static int GetNumberFromUser()
        #region//Deklaration der Hauptfunktion GetNumberFromUser() die,
        //die Eingabewerte des Benutzers einliest,
        //und speichert diese Werte im Wert "num" ab.
        #endregion
        {
            //Fordert den Benutzer zur Eingabe eines Wertes auf.
            Console.WriteLine("Bitte gib eine Zahl ein : ");
            //Die Konsole liest den Eingabewert des Benutzers.   
            int num = int.Parse(Console.ReadLine());

            //Der eingegebene Wert des Benutzers wird in die HauptFunktion
            //"PrintNumbers()" bearbeitet übergeben.
            return num;                                               
        }

        //Die HauptFunktion "PrintNumbers()", die den Eingabewert "num" 
        //des Benutzers in das Array "numbers" sortiert und überarbeitet übergibt.
        static void PrintNumbers()                                    
             {
            //Für jeden Wert "num" im Array "numbers".
            foreach (int num in numbers)
                //Ausgabe des sortierten Wertes "num" mit einem
                //Beistrich in das Array "numbers"          
                Console.Write(num + ", ");
            //Erzeugt einen Zeilenumbruch, um den CW-Befehl aus der
            //HauptFunktion GetNumberFromUser() besser und lesbar darzustellen.          
            Console.WriteLine("\n");                          
             }
    }
}
 
Zuletzt bearbeitet:
Du benutzt numbers == 0 zum Finden der ersten freien Stelle, wenn das Array noch wenig gefüllt ist, d.h. 0 markiert bei dir einen unbelegten Array-Eintrag. Gleichzeitig soll 0 aber auch ein gültiger, belegter Eintrag sein.

Lösungsvorschlag: freie Einträge mit -1 markieren
 
Was soll passieren wenn ein Nutzer Null eingibt ?
ist die Null ein zulässiger Eintrag in das Array numbers?
 
Könntest du mir netter Weise die Stelle(Zeile) angeben in der ich das versuchen soll.
Ergänzung ()

HOF23 schrieb:
Was soll passieren wenn ein Nutzer Null eingibt ?
ist die Null ein zulässiger Eintrag in das Array numbers?
Ja die 0 sollte ein zulässiger Eintrag für numbers[] sein.
Ich befürchte allerdings das es mehrerer Umabuten im Code benötigt, oder zumindest noch einer genaueren Deklaration im Code dafür.
Und da steige ich eben gerade noch Gedanklich aus :/.
 
falls deine frage ist wann du die freien Einträge des Arrays als -1 markieren sollt lautet die antwort:
direkt am anfang der main funktion (zeile 16)
Wenn du weitere fragen hast oder sonst hilfe brauchst kannst du gerne weiter fragen.
Ich nehme an du hast noch keine große Erfahrung im programmieren.
Die kannst du mit der zeit aber bekommen.
Du musst nicht viel am programm ändern um zum gewünschten Ergebnis zu kommen.
(natürlich etwas mehr als eine kurze for- schleife am anfang der main methode die alle 8 Werte des Arrays auf - 1 setzt);)
 
Zuletzt bearbeitet:
hmmm War eine Gute Idee funktioniert aber weiterhin nicht wie gewünscht ;S

Bsp:
wird die 0 am Anfang eingegebn sortiert er die restlichen werte alle vor der 0 ein

1.Eingabe : 0
Ausgabe: 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
2. Eingabe: 500
Ausgabe: 500 ,0 ,0 ,0 ,0 ,0 ,0 ,0
3.Eingabe: 350
Ausgabe: 350 ,500, 0 ,0 ,0 ,0 ,0 ,0

Er vergibt den Index 0 also anscheinend neu deswegen wird davor richtig Sortiert,aber Zeitgleich belegt er trotzdem 1 Element im Array und verschwindet bei der restlichen Ausgabe einfach bis an die letzte Stelle im Array.

Daher auch meine Vermutung es fehlt noch etwas im Code :/
 
Hast du überhaupt etwas verändert? Es müsste so aussehen:

1.Eingabe : 0
Ausgabe: 0 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1
2. Eingabe: 500
Ausgabe: 0, 500 ,-1 ,-1 ,-1 ,-1 ,-1 ,-1
3.Eingabe: 350
Ausgabe: 0, 350 ,500, -1 ,-1 ,-1 ,-1 ,-1

-1 markiert ein freies Feld.
Beim Start das Array an jeder Position mit -1 initialisieren.
Ein freies Feld mit numbers == -1 suchen, nicht mehr mit numbers == 0.
 
Ok dann bin ich definitiv zu blöd um es um zu setzen,und habe es an falscher stelle mit einer -1 statt der 0 versucht.
Was das Problem natürlich nicht weg macht.(in der Konsole waren ja immer noch die 0-en dargestellt und nicht wie Vorgeschlagene -1)
Sei gütig und schreib mir bitte den Code der in zeile 16 definitiv stehen soll auf ,damit ich danach meinen Kopf gegen die Wand hauen kann und mich über meine Unfähigkeit ärgern kann :/.
 
Hey Flashnox, ich denke wir könnten dir einfach den Code hinklatschen. Die Frage ist allerdings wem das etwas bringt.
Uns definitiv nichts da es keine Herausforderung für uns ist und dir auch nur etwas wenn du nur den code brauchst und nichts dabei lernen willst. ich. wenn du nur den code willst kannst du ihn gerne haben. mir persönlich wäre es lieber wenn du erst einmal eine for- Schleife schreiben würdest die nach dem aufruf der Main methode den 8 Elementen im Array numbers ( numbers[0],numbers[1],..) den Wert -1 zuweist.
danach sollte das Ergebnis wie von fhtagn aussehen. dann können wir dir auch gerne weiterhelfen.

(aber wie gesagt wenn du nur den Code willst kannst du den auch bekommen.)
 
keine sorge ich mach mir meine gedanken schon dazu, ich hänge allerdings gerade beim übertragen in eine for-schleife.
die schleife soll ja sonst nix anderes machen als das hier:
numbers[0] = -1;
numbers[1] = -1;
numbers[2] = -1;
numbers[3] = -1;
numbers[4] = -1;
numbers[5] = -1;
numbers[6] = -1;
numbers[7] = -1;

vllt stell ich mich wirklich gerade etwas dumm an aber soweit wäre ich dann bei der schleife:
for (i = -1; i < numbers.Lenght;i++)
das entspricht aber ganz und gar nicht dem oberen :D
 
ja ganz genau wie oben soll es aussehen.
deine Schleife stimmt jedoch nur 90 %

for (i=Anfangswert der Zählvariable ;Abbruchbedingung;Veränderung der Zählvariable (+/-)) -> fettgedruckt die initalisierung der Zählvariable

nun musst du nur überlegen was du tun willst:
du willst das gesamte Array mit -1 füllen

das heisst du musst nur eine kleinigkeit ändern

(kleiner tipp du beginnst nicht bei - 1 )
 
Zuletzt bearbeitet:
Die variable i in deiner Schleife soll nur zum iterieren durch die Elemente von numbers dienen. Also wenn du i = -1 setzt und dann number innerhalb der schleife aufrufen würdest, würdest du auf das Element an der Stelle -1 in dem Array numbers zugreifen.

Code:
for (i = 0; i < numbers.Length; i++)
    numbers[i] = -1;

MSDN definiert for so:
Code:
for (initializer; condition; iterator)
    body

body (sprich der Code), wird so lange von der Schleife ausgeführt, bis condition false zurück gibt. In deinem Beispiel also wenn "numbers = -1;" (hierbei hat i den Wert 7) aufgerufen wurde und i vom iterator mit i++ um 1 erhöht wurde, also i jetzt den Wert 8 hat. Dadurch ist i < numbers.Length nicht mehr true, denn 8 ist nicht < 8. Die Schleife endet und versucht nicht "numbers = -1;" (also "numbers[8] = -1;") aufzurufen.
 
Zuletzt bearbeitet:
Das ganze geht nur solange gut, wie du keine negativen Zahlen zulässt. Dann müsstest du dich auch von der -1 trennen, und stattdessen ein int?[]-Array verwenden. Da kannst du die leeren Felder mit null füllen.
Nur als Anregung.
 
das heißt dann ich schreibe einfach
for (i =0; i < numbers.Lenght; i--)
numbers= -1;

und es sollte passen bin ich da soweit richtig?
 
jein das ist fast richtig

falls du mehrere anweisungen in der schleife ausführen willst brauchst du noch {} diese klammern

for (i =0; i < numbers.Lenght; i++)
{
//weitere anweisung;
numbers= -1;
}

außerdem musst du den iterator hochzählen
 
Zuletzt bearbeitet:
Physikbuddha schrieb:
Das ganze geht nur solange gut, wie du keine negativen Zahlen zulässt. Dann müsstest du dich auch von der -1 trennen, und stattdessen ein int?[]-Array verwenden. Da kannst du die leeren Felder mit null füllen.
Nur als Anregung.

Das stimmt schon auf diese Weise verlagere ich das 0er Problem indem ich den referenz-wert(korriegiert mich falls ich mich irre) der 8 Elemente -1 setze.

Sollte ich aber wollen das egal welcher wert eingetippt wird,und alle 8 Elemente vom kleinsten bis zum größten wert sortiert werden
sollen. Die Option einbauen wenn der Wert doppelt vor kommt mache Dieses und Jenes...

Im Momentanen fall so wie der Code oben ist schaut das dann so aus:
Benutzer gibt 8 Zahlen ein zB.

500,300,0,67,300,0,-12,-15
Und die Ausgabe sieht dann so Aus:
-15,-12,0,67,300,0,300,500
Und was die Index Fnktion momentan wiederspiegelt ist folgendes auf die obere Ausgabe bezogen:
Index 0,Index 1,Index 2 und/oder 0,Index 1,Index2,dann wieder Index 2und/oder0,index 1, Index 2
Es besteht aber kein durchgängiger verlauf des Index von 0-7 :(

Was müsste ich aber Konkret in die Funktion dazu tun damit der Index in disem Sinne nicht verschoben wird.
Und Wieder mit Index 0 beginnt zu sortieren.
 
lösch mal einfach zeile 59 - 68 und schau ob das gewünschte ergebniss erzielt wird
 
Das habe ich auch schon versucht, dann fügt er die 1 eingegebene Zahl aber Automatisch an letzter stelle ein.
Und die Folge Zahlen werden auch an letzter Stelle ausgegeben, und überschreiben die vorhergehende Zahl.

Mir würde ja eine Idee im Kopf herum schwirren aber da hänge ich an der ausführung.
Das würde dann in richtung Flexibler 0 Index gehen mit Beschränkung auf die Angegebenen Elemente in dem Fall 8.

und je nachdem welche Zahlen doppelt vor kommen wird nach links oder rechts verschoben um sie richtig und aufsteigend zu Sortieren.
 
dann nimm die zeilen wieder rein und lege ein int?[]-Array an wie es Physikbuddha in #13 vorschlägt und statt -1 prüfst du auf "null"
 
Ich leg mich für heute mal ins Bett,und versuche es Morgen weiter, aber danke für die bereits gelieferten Ideen.
Und sorry das ich teilweise lange gebraucht habe um einiges zu verstehen was ihr an Vorschlägen gemacht habt.
Aber wenn man bei manch kleineren Dingen die noch so banal sein mögen ansteht,und lange braucht bis man auf die Lösung kommt,
sowas prägt man sich nur um so mehr ein :)
 

Ähnliche Themen

Zurück
Oben