Array sortieren in c

xisisx

Grünschnabel
Hallo, bin neu hier, hoff also das ich alles richtig mach :).
Ich habe ein Problem bei meinem C Programm.
Und zwar soll dieses Programm Zahlen einlesen bis man eine 0 eingibt, nach welcher die Eingabe dann beendet wird. Diese zahlen sollen dann in einem Array der Größe nach sortiert werden, beginnend mit der kleinsten Zahl.
So weit so gut, es klappt auch alles prima, nur wenn ich negative Zahlen einlese terminiert bubble sort die negative Zahl. Das heißt die Zahl wird erst richtig ganz an den Anfang gesetzt. Bei der Ausgabe der Zahlen jedoch wird aus der negativen Zahl eine null. Wenn ich jedoch 2 negative Zahlen einlese wird die kleinere der beiden negativen Zahlen korrekt angezeigt, die andere jedoch wird an den Anfang gesetzt und wieder zu 0.
Bin leider ziemlich ratlos warum das array die negativen Zahlen zu 0 macht.
Hier mein Code, vllt könnt ihr mir sagen wieso negative zahlen zu 0 werden?

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

int main () {
    int i=0,n, j, x=0, k, zahl=0;
   double zahlen[1000], temp;
    
printf("Bitte geben sie nun maximal 20 Zahlen zum sortieren ein:\n");
printf("Nach der terminierenden 0 wird die Eingabe beendet.\n");



for (n=1; n<1000; n++) {
    scanf("%lf", &zahlen[n]);
    zahl=zahl+1;
        if(zahlen[n]==0) {
                     break;
                    }
   

}
printf("Anzahl der eingelesenen Werte =%i\n", zahl);
printf("Ausgabe der unsortierten Zahlenfolge\n");
for (n=1; n<=zahl; n++) {
    printf("%6.0lf\n", zahlen[n]);}
    
    for(i=1; i<n; i++)
    {
             for (j=n-1; j >=i; j--)
             {
                 if (zahlen[j]<zahlen[j-1])
                 {
                                           temp=(-1)*zahlen[j];
                                           zahlen[j]=(-1)*zahlen[j-1]*(-1);
                                           zahlen[j-1]=(-1)*temp;
                                           x=x+1;
                                           for(n=1; n<=zahl; n++)
                                           
            {        printf("%2.i. Durchlauf %6.0lf\n", x, zahlen[n]);
            
                     
            }
                     printf("\n");                              }}}
    
   
            
           
            return 0;}
Danke :)
 
Zuletzt bearbeitet:
Hallo,

es wäre schön, wenn du Code-Tags benutzen könntest. Editier doch bitte deinen Text nochmnal. Ist dann einfacher zu lesen :)
Gruß
 
Hi.

Warum multiplizierst du denn da wie wild mit -1? Was sollte das für einen Sinn haben?

Es gibt kein %lf Format für printf, nur für scanf!

Übrigens startet ein Array immer bei 0. Du liest das Array ab Postition 1 ein und gibst es auch nur ab Position 1 aus. Allerdings bewegst du beim Sortieren das kleinste Element des Arrays auf Position 0. Deshalb ist es dann "verschwunden".

Du solltest besser jede } auf eine eigene Zeile setzen. Das macht den Code übersichtlicher.

Gruß
 
Also, das mitm *(-1) hab ich gemacht weil ich dacht das er das -irgendwie wegschmeißt oder beim einlesen nicht richtig erkennt.

Das ich im array bei der 1ten und nicht 0ten Stelle anfange habe ich irgendwie gemacht weil ich dann mitm zählen besser klar kam, weiß nicht mehr warum. Jedoch kann das nicht der Grund sein das die negative Zahl verschwindet, denn auch beim ausgeben etc fange ich immer bei 1 an und nicht bei 0.
Mein Problem ist:
ich geb die Zahlenfolge:
25
3
-4
8
0
ein. Er gibt die Zahlen alle unsortiert richtig aus, auch die negative Zahl.
Dann beim sortieren zeige ich mir ja jeden Durchlauf an, den er braucht um die zahlen vom kleinsten zum größten zu sortieren.
Das heißt:
1. Durchlauf: 25 3 -4 0 8
2. Durchlauf: 25 -4 3 0 8
3. Durchlauf: -4 25 3 0 8
4. Durchlauf: 0 25 3 0 8

Also er macht aus der -4 in dem Durchlauf ne 0 und ich hab leider keine Ahnung warum. Positive Zahlen sortiert er nach x durchläufen richtig, von der kleinsten zur größten.

BTW: Ich benutze den Bloodshed Dev CC Compiler.
 
Ok, hattest doch Recht^^, liegt daran das er nicht bei 0 anfängt sondern bei 1, Jetzt sortiert er auch die negative zahl und zeigt sie weiterhin an.
Danke für den Tipp :)
 
Zurück