myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

C Sortierschleife

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 11.11.12, 21:04   #1
HagenTronje
Erfahrener Newbie
 
Registriert seit: Dec 2010
Beiträge: 162
Bedankt: 18
HagenTronje gewöhnt sich langsam dran | 28 Respekt Punkte
Standard C Sortierschleife

Hab aus Langeweile ein kleines Programm geschrieben, in welches man ein paar Zahlen eingibt, und diese Sortiert angezeigt bekommt. Zumindest in der Theorie.
In der Praxis kommt bei Zeile 45(hier nun gekenntzeichnet mit --->) "C_Projekt funktioniert nicht mehr" und ich weiß nicht wieso.

Code:
#include<stdio.h>
#include<conio.h>

int main()
{

    double x[1000];//Einlesen aller Zahlen
    double y[1000];//Sortierte Zahlen
    int i=0;//zähler für for-Schleifen
    int i2=0;//weiterer zähler für for-schleifen
    int abbruch=1;//bei 0: Abbruch der Einleseschleife
    int akt_hoechste=0;//Speicher für die höchste zahl im aktuellen Sortierdurchlauf.

    for(i=0; i<1000; i++)
    {
        x[i]=0;    //Alle Elemente in x=0
    }
    for(i=0; i<1000; i++)
    {
        y[i]=0;    //Alle Elemente in y=0
    }

    printf("Zahlen sortieren\n"
           "Geben sie beliebig viele Zahlen ein(außer 0).\n"
           "Druecken sie nach jeder Zahl Enter.\n"
           "Beenden der Eingabe: Tippen sie statt einer Zahl einen beliebigen Buchstaben.\n");

//Einlesen:
    for(i=0; i>=0; i++)
    {
        abbruch=scanf("%lf",&x[i]);
        if(abbruch==0)
        {
            break;
        }
    }
    //ließt nacheinander Werte in x ein. Bei erfolglosem Lesen wird abgebrochen.


//Sortieren
    for(i=0; i>=0; i++)//i entspricht dem Element in y
    {
        for(i2=0; i2>=0; i2++) //i2 entspricht dem Element in x
        {
--->            if(x[i2]>y[i])
            {
                y[i]=x[i2];//Wert aus x wird in y geschrieben
                akt_hoechste=i2;
            }
        }
        x[akt_hoechste]=0;//Der Wert der in y verbleibt, wird gelöscht/auf 0 gesetzt
    }


//Ausgeben
    for(i=0; i>=0; i++)
    {
        printf("%lf\n",x[i]);
    }

//Beenden
    printf("Druecken sie eine beliebige Taste zum beenden.\n");
    char ende=getch();
    return 0;
}
Für Kommentare bezüglich Codestrukturierung, Kommentierung, etc. bin ich ebenfalls dankbar.
__________________
Blödsinnige Beiträge, bitte einfach löschen!
HagenTronje ist offline   Mit Zitat antworten
Ungelesen 11.11.12, 21:14   #2
ProgMaster
Banned
 
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
ProgMaster ist noch neu hier! | 0 Respekt Punkte
Standard

1. Benutz einen Debugger!
Der sagt Dir was falsch gelaufen ist. Du wirst noch auf 1000 weitere Fehler treffen und willst bestimmt nicht für jeden einzelnen einen Thread hier aufmachen.

2. Deine Schleifen sind nicht eingegrenzt, d.h. irgendwann wird nach dem 1001ten Element gefragt, welches eben aus dem "Rahmen" des Arrays springt.

3. Es gibt auch Arrays mit dynamischer Größe.
Es ist einfach inneffizient Speicher für 2x1000 Zellen bereit zu stellen, wenn Du nur 10 Zahlen sortieren willst.

4. Refactoring!
Jeder Codeabschnitt hat einen Sinn bzw. eine Funktion (Initialisieren,Einlesen, Sortieren, Ausgeben usw.). Entsprechend sollte diese Abschnitte auch Methoden ausgegliedert werden.
ProgMaster ist offline   Mit Zitat antworten
Ungelesen 11.11.12, 21:19   #3
HagenTronje
Erfahrener Newbie
 
Registriert seit: Dec 2010
Beiträge: 162
Bedankt: 18
HagenTronje gewöhnt sich langsam dran | 28 Respekt Punkte
Standard

1. ich programmier mit code blocks, beim compelieren wird auf fehler geprüft, da gibts keine.
mittels debugger habe ich eben festgestellt, das der fehler in der einen Zeile da auftritt. angezeigt wieso da ein fehler is, wird mir nicht.

2.bei der einlese schleife hats funktioniert, das sie bei 1000 endet, also dachte ich das brauch ich bei den anderen auch nicht^^
aber stimmt, das funzts ja nur, wegen dem abbruch, oder?

3. werd ich mir mal anschaun

4. Methoden=Funktionen?

edit:
ich hab die schleifen eingegrenzt(i<1000 statt i>=0) jetzt läuft das programm eiwandfrei durch, die ausgabe enthält allerdings nur 1000 mal '0.00000'

edit2:
Was wäre Programmieren ohne Flüchtigkeitsfehler?
ich hab richtig sortiert, nur am Ende das falsche Array ausgegeben :P

Danke nochmal.

~close~
__________________
Blödsinnige Beiträge, bitte einfach löschen!
HagenTronje ist offline   Mit Zitat antworten
Ungelesen 12.11.12, 22:42   #4
Quabla
Mitglied
 
Registriert seit: Oct 2010
Beiträge: 299
Bedankt: 151
Quabla ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von HagenTronje Beitrag anzeigen
1. ich programmier mit code blocks, beim compelieren wird auf fehler geprüft, da gibts keine.
mittels debugger habe ich eben festgestellt, das der fehler in der einen Zeile da auftritt. angezeigt wieso da ein fehler is, wird mir nicht.
du hast auch keine syntaktischen fehler sondern logische fehler. die erkennt der compiler (in den allermeiten fällen) nicht. bsp: du deklarierst dir ein array mit 10 eiträgen und willst auf den 11. zu greifen, oder auf den -1.
im günstisten fall schmiert dir das programm mit ner segmentation violation ab.

Zitat:
Zitat von HagenTronje Beitrag anzeigen
2.bei der einlese schleife hats funktioniert, das sie bei 1000 endet, also dachte ich das brauch ich bei den anderen auch nicht^^
aber stimmt, das funzts ja nur, wegen dem abbruch, oder?
genau hier kommt der debugger ins spiel. damit kannst du breakpoints setzen und dir zur laufzeit angucken, welche variable welchen wert hat. somit weist du genau wie weit die schleifen laufen und welche arrayelemente sie ansprechen. da du codeblock benutzt, geh ich davon aus, dass du gcc benutzt. hol dir mal den gdb dazu.


Zitat:
Zitat von HagenTronje Beitrag anzeigen
4. Methoden=Funktionen?
jops
Quabla ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 Uhr.


Sitemap

().