Forum
Tipps
News
Menu-Icon

Bubblesort in C macht Probleme

Hallo,

versuche mich gerade ein wenig in C und wollte jetzt einmal einfach nur hergehen und nach Eingabe von ein paar Monatslöhnen diese der Reihe nach sortieren lassen, was jedoch nicht so ganz gelingt und ich den Fehler als Anfänger nicht finden kann. Würde mich freuen, wenn mir da jemand helfen, bzw. einen kleinen Tipp geben würde, falls ich einen gedanklichen Fehler mache.

Hier der Quellcode:


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int MN[7];   //Monatseinkommen
int i;       //Variable für den ersten Druchlauf     
int j;       //Variable für den zweiten Durchlauf      int ZWS;     //Zwischenspeicher                                       

     for(i=0; i<7; i++)                //Werte eingeben
        {
               printf("\n Bitte geben Sie Ihr Monatseinkommen im  %d. MN ein:",i);
               scanf("%d",&MN);
               
               for(j=0; j<7; j++)
                   {
                        if(MN[j]>MN[j+1])
                          {
                          ZWS = MN[j];
                          MN[j]=MN[j+1];
                          MN[j+1]=ZWS;
                          }                 
                    }
        }     
   
              for(i=0; i<7; i++)                // Werte ausgeben
        {
              printf("\n\n Im %d Monat hatten Sie ein Einkommen von %d" ,i, MN);
             
        }
     printf("\n\n");   // Damit die "Bitte eine Taste drücken" etwas Abstand hat
  system("PAUSE");   
  return 0;
}


Antworten zu Bubblesort in C macht Probleme:

Der Array den du sortierst musst du vor sortieren mit allen elementen füllen sonst KANN da nur bockmist rauskommen ;)
du liest gehalt 1 und sortierst es gegen zufallszahlen, dann gehalt 2 und so weiter, die gehälter können sich so gegenseitig überschreiben oder... ach das ist allgemein bockmist. lager die einlesen funktion in ne eigene for-schleife aus und dann sollte es gehn ;) 
außerdem sind deine grenzen daneben. du vergleichst im letzten durchgang MN[6] (letztes element) mit MN[7] (out of bound)

Hallo Klischeepunk,

danke dir erstmal für dein schnelles Feedback,hat mir im ersten Moment sehr weitergeholfen. Hatte auch dauerhaft das Problem, das er sich die Zahlen nach Lust und Laune generiert hatte. Hin und wieder hat es mal gepasst, aber ansonsten: zum verrückt werden.
Aus der 2. Aussage werde ich jedoch nicht ganz schlau, "Deine Grenzen sind daneben". Sorry, aber ich bin wirklich blutiger Anfänger, da freut man sich über jede etwas grundlegendere Erklärung um ein wenig weiterzukommen.
Danke im voraus.

 

Kein thema, darum kannst du antworten und meine Antwort gilt nie als allgemeingültig ;)

Pass auf, folgendes:
Du legst ja mit
typ name[anzahl]; deinen Array an, in deinem Fall wäre das
int MN[7];
Sprachlich: 7 Elemente des Typs Int, ansprechbar über den Namen "M(onats)N(etto)" (an der stelle ganz knapp: ich würd mir gleich ne vernünftige benennung der Variablen angewöhnen. Ungarische Notation mal googlen ;P)
im Prinzip das gleiche Gebilde wie
int MN1;
int MN2;
...
int MN7;
Nun ist es allerdings so: Der Index (das in den [] eckigen Klammern) deines Arrays ist bei n Elementen von einer Laufweite von 0 bis n-1 - In deinem konkreten beispiel wäre gültig:
MN[0], MN[1], ..., MN[6]
Und dabei machst du einen Fehler, deine innere for Schleife bewegt sich von 0 bis 6(soweit so gut)
deine if(MN[j] > MN[j+1]) nimmt als j die werte 0 bis 7 je nach standpunkt deiner Schleife. also if(MN[0] > MN[0+1]) etc. wenn j jetzt den wert 6 erreicht würde das folgendermaßen aussehen:
if(MN[6] > MN[6+1]), was if(MN[6] > MN[7]) entspricht.
MN[7] ist allerdings ungütlig da dieser Index nicht belegt ist (der höchste Index bei n Elementen ist immer n-1(!), du bewegst dich hier aber beim Index n: Auf Deutsch: j darf nie größer als 6 werden (n-1, n = 7, jmax = 7-1 = 6). Du würdest hier über die sog. Grenze deines Arrays hinausschießen und in einem Speicherbereich wühlen, von dem du keine Ahnung hast was sich in ihm befindet, das kann tierisch böse ins Auge gehen. Darum Arraygrenzen immer berücksichtigen.

Kleiner Hinweis noch zur Optimierung deines Bubblesorts:
Du machst viele unnötige vergleiche ;), nimm dir mal ein Blatt und führe auf ihm deinen Bubblesort aus, eigentlich sollte dir was auffallen ;) Wenn du nicht drauf kommst sag bescheid, aber ist erstmal nicht so wichtig, allerdings ne nette fingerübung :) 

Hallo Kliescheepunk,

vielen Dank für die Info, hat mir einen großen Schritt weitergeholfen. Wenn bei einem das grundlegende nicht Klick gemacht hat, dann versucht und probiert man und meint die Lösung nicht zu finden.
Danke nochmals, hat mir wirklich weitergeholfen.

 

you're welcome.
Mach dir nichts draus, sind die üblichen "Starterschwierigkeiten", das gibt sich und irgendwann löst du sowas ausm ff. 

Hallo Klischeepunk,

Wollte dich um eine kleine Gedankenstütze bitten. Bin da in einem Lehrbuch „C  für Amateure“ auf eine Aufgabe gestoßen die mich ein wenig ins grübeln versetzt hat. Wollte mir ein wenig Hilfe aus dem Netz holen, was mich aber ein wenig irritiert hat, da die Antworten und Quellcode für einen blutigen Laien nicht immer nachvollziehbar und verständlich sind.

Zur Aufgabe: ??? ???
Erstelle ein Array 5x5 groß, setze ein Schiff hinein und beschieße es.
Es soll keine Abfrage über die Position des Schiffes gemacht werden, da es in der Programmierung einen festen Platz bekommt.
Sobald das Schiff versenkt ist, soll über eine Ausgabe informiert werden wieviele Schüsse nötig waren um das Schiff zu versenken.


Würde mich freuen wenn du mir Richtung aus der Sackgasse geben könntest was z.B. das beschießen des Schiffes anbetrifft. Die Position des Schiffes könnte ich ja über 2 verschachtelte for – schleifen erfahren, aber das beschießen ist mir momentan ein Rätsel, oder liege ich schon grundlegend in der Überlegung falsch ???????????
 

Hi, werd ich nun schon persönlich angeblubbert? ;)

Zur Frage:
Du brauchst keine for schleifen, nur eine Codierung in der du die Position eingibst:
bspw: A1 für x = 1, y = 1
noch einfacher wäre natürlich wenn du den Nutzer einfach eine X und eine Y koordinate eingeben lässt.

Dann prüfst du einfach ob an Array

  • [y] deine "Schiffsmarkierung" ist und gibst die anzahl der versuche aus.


Falls das ganze auotmatisiert werden soll überleg dir wie du möglichst effektiv das gitter verkleinerst, um mit möglichst wenig schüßen ans ziel zu kommen. Du kannst antürlich auch mit zufallszahlen arbeiten, dann emfpiehlt es sich noch eine "bereits beschoßen" markierung einzufügen um zu kennzeichnen, dass an die errechnete stelle nicht nochmal geschoßen werden muss.

Du hast nach der aufgabe nahezu unbegrenzt viele möglichkeiten, das problem zu lösen. Such dir den für dich am angenehmsten erscheinenden aus und versuchs, wenns probleme gibt - Klischeepunk ist hier :P - und ein paar andere vermutlich auch. Hat beim Bubblesort btw. nichts verloren.

 Ich denke darauf baut ein klassisches "Schiffe versenken" auf. 

« Pet-Spiel machen?Jar Datei nicht extrahierbar machen »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Eingabefelder
Als Eingabefelder werden in einem Programm oder in Online-Formularen die Stellen bezeichnet, an denen Informationen eingetippt werden können. Die Beschriftung neben ...

Eingabeaufforderung
Die Eingabeaufforderung ist ein Begriff aus dem IT-Bereich und bezeichnet eine Markierung auf der Kommandozeile, welche auf die Stelle verweist, an der man Kommandozeilen...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...