Sortieren durch Einfügen Programm geschlossen 

Status
Für weitere Antworten geschlossen.

kunks

Registered +
Registriert
Dez. 2003
Beiträge
326
Hey Leute,

habe ein problem mit obigen programm. Und zwar habe ich die Aufgabe bekommen so ein Programm zu schreiben..

Hab den Algorithmus soweit fertig, müsste glaub ich auch so passen. Nur habe ich n problem mit meiner main().
Bin mir auch nicht sicher ob man mit fgets() in ein Integer Array lesen kann?!
Hab alternativ mal mit ner FOR Schleife versucht, die eingabe zu realiesieren....(das auskommentierte)
Steh grad echt aufm Schlauch, und mit C eigentlich eh auf Kreigsfuss :flag: C

Code:
#include  
#include 
#include 

#define ITEMS 8000

void sort(int numbers[], int size){
int index, i, j;
for (i=1; i index = numbers[i]; 
j = i-1;
while ( (index < numbers[j]) && (j >= 0)){ 
numbers[j+1] = numbers[j]; 
j--;
}
numbers[j+1] = index;
}
}

main(){

int i;
int numbers[ITEMS]={0};
/*for(i=0;i while(eingabe != " "){
printf("\nPlease tip in a number: ");
scanf("%d", numbers[i]);
return i;
}
}*/
printf("\nBitte Zahlenkette eingeben: ");
fgets(numbers,ITEMS,stdin);
printf("%d", &numbers[i]);
//sort(int eingabe[n], int n);
//printf("%i", &eingabe);
}

Fehlercode bei der Schleife ist Core dumped. Bei dem Versuch mit fgets kommen halt ganz andere Werte raus, wie die die ich eingetippt habe ;(
Wär euch sehr dankbar, wenn ihr mir n Tip geben könntet ;)
Weiß grad echt nicht wie ich über die tastatur eine beliebige Zeichenkette in mein Integer-Array bekomme :(

MfG kunks
 
Der code bringt nicht wirklich viel den du gepostet hast ^^
Aber vllt hilft dir google dabei, dein Problem zu lösen
Uni Chemnitz ist da ne gute Seite
 
Moin moin.

Sinnvoll wäre es, denn kompletten Code sowie die genaue Fehlermeldung zu posten. Macht das Helfen sicher leichter ;)

Gruß,
Commander Keen
 
so, habs jetzt mal ohne eingabe gemacht und mit clock() funktion.

Bei der clock() Funktion kommt aber immer die gemessene Zeit 0,00 raus. Hab ich da was falsch gemacht??

Wie kann ich das Programm so verändern, dass ich die Zeichenkette nicht direkt in den Coder schreiben muss, sondern von der Tastatur einlesen lassen kann (fgets???)?

Hier noch der aktuelle Code:
Code:
#include  
#include 
#include 

#define ITEMS 8000

void sort(int numbers[], int size){
int index, i, j;
for (i=1; i index = numbers[i]; 
j = i-1;
while ( (index < numbers[j]) && (j >= 0)){ 
numbers[j+1] = numbers[j]; 
j--;
}
numbers[j+1] = index;
}
}

int main(){
int i;
int test_array[]={5,2,9,6,1,8,3,7,4,19,11,18,12,17,13,16,14,15};
int N = sizeof(test_array)/sizeof(int);
clock_t prgstart, prgende;
prgstart=clock();
sort(test_array, N-1); 
for(i=0; i printf("%d", test_array[i]);
}
prgende=clock();
printf("\n\nDie Programmlaufzeit betrug %.2f Sekunden\n",(float)(prgende-prgstart) / CLOCKS_PER_SEC); 
printf("\n");

return 0; 
}

MfG kunks
 
Es kann gut sein das 0,00 rauskommt, da du ja nicht 100000 Zahlen sortieren lässt oder? ^^
Der Rechner macht ja so und so viele Rechenschritte pro Sekunde ;)
Deine frage mit fgets() verseth ich nicht ganz O.o
Und wo ist der Fehler? WElcher Fehler wird angezeigt und was für ein Compiler nutzt du?
 
Ich hab irgendwie nicht ganz verstanden was dein Programm machen soll...

naja, wie auch immer... für die Eingabe von integer werten ist scanf() dein Freund... (du solltest davor noch fflush(stdin); aufrufen sonst kann es vorkommen das scanf die eingabe vom vorherigen schleifendurchlauf übernimmt)
 
Das Programm soll siene Testreihe
int test_array[]={5,2,9,6,1,8,3,7,4,19,11,18,12,17,13,16,14,15};
sortieren.
 
genau, das Programm soll die Zeichenkette (Zahlen) sortieren, also in die richtige reihenfolge bringen.

Also das Prog in meinem ersten Post spuckt fehler aus, das zweite läuft soweit ganz gut. Ich denke das erste kann eh vergessen werden, versuche jetzt lieber das zweite zu erweitern ;)

Als Compiler benutz ich den GCC Compiler unter Ubuntu..

gut dann setz ich mich später nochmal an das Programm und bau ne scanf funktion mit ein.

Danke erstmal für eure antworten, wenn ich nochmal ne frage habe, melde ich mich nochmal..

MfG kunks

Edit:
So hab nun schon wieder ein Problem. Habe nun ne scanf mit eingebaut, wenn ich nun aber zum Beispiel als Testgröße 9 eintippe und dann die Zahlen 987654321 dann passiert weiter nichts. Muss dann immer mit Strg C abbrechen. Habe ich schon wieder was falsch gemacht? Bin am verzweifeln..

Hier der Code:
Code:
#include  
#include 
#include 

void sort(int numbers[], int size){
int index, i, j;
for (i=1; i index = numbers[i]; 
j = i-1;
while ( (index < numbers[j]) && (j >= 0)){ 
numbers[j+1] = numbers[j]; 
j--;
}
numbers[j+1] = index;
}
}

int main(){
int i;
int n = 0;
int test_array[n];
int N = sizeof(test_array)/sizeof(int);
clock_t prgstart, prgende;

printf("\nBitte geben Sie die Anzahl zu testender Zahlen ein: ");
scanf("%i", &n); 
printf("\nBitte tippen Sie eine Zahlenkette mit %i Zahlen ein: ", n);
for (i = 0; i < n; i++){
scanf("%i", &test_array[i]);
}
prgstart=clock();
sort(test_array, N-1); 
for(i=0; i printf("%d", test_array[i]);
}
prgende=clock();
printf("\n\nDie Programmlaufzeit betrug %.2f Sekunden\n",(float)(prgende-prgstart) / CLOCKS_PER_SEC); 
printf("\n");

return 0; 
}

Hier noch n screenshot
 
Hey leute. Bin fast am verzweifeln. Nun habe ich zum dritten mal neu angefangen und mich nochmal an das Programm gesetzt. Und war auch richtig glücklich, weil es endlich funktioniert ;)

Aber...nun habe ich in meiner Aufgabenübersicht gelesen, dass ich die Zeit nach dem BestCase Prinzip (Array ist schon sortiert), dem WorstCase(Array is falsch herum sortiert) und dem zufallsprinzip (zufällig sortierrtes array) messen muss.
Problem nun: Ich habe die rand() Funktion in C benutzt und einen Zufallszahlengenerator (, da die eingabe von 250000 Testwerten einfach zu umfangreich wäre :rolleyes:

Blöderweise kann ich jetzt halt nur Zufallswerte und keine sortierten bzw. rückwarts sortierten Werte testen. Gibts da vllt. eine Funktion oder einen Generator etc. der mir ein bereits sortiertes bzw. rückwärts sortiertes array ausspuckt???

Hier nochmals der nun dritte und hoffentlich letzte "Grund"Code.
Code:
#include 
#include 
#include 

#define NUM_ITEMS 150000

void insertionSort(int numbers[], int array_size);

int numbers[NUM_ITEMS];


int main()
{
int i;
clock_t prgstart, prgende;

srand(getpid()); //srand = seed random number generator

for (i = 0; i < NUM_ITEMS; i++) //array wird mit zufallswerten gefüllt
numbers[i] = rand();

prgstart=clock(); //Zeitmessung started
insertionSort(numbers, NUM_ITEMS); //Algorithmus arbeitet 
prgende=clock(); //Zeitmessung stoppt

printf("Sortiert!\n");

for (i = 0; i < NUM_ITEMS; i++) //sortiertes array wird gedruckt
printf("%i\n", numbers[i]);

printf("\n\nDie Programmlaufzeit betrug %.2f Sekunden\n",(float)(prgende-prgstart) / CLOCKS_PER_SEC); 
printf("\n");

}


void insertionSort(int numbers[], int array_size) //sortieralgorithmus
{
int i, j, index;

for (i=1; i < array_size; i++)
{
index = numbers[i];
j = i;
while ((j > 0) && (numbers[j-1] > index))
{
numbers[j] = numbers[j-1];
j = j - 1;
}
numbers[j] = index;
}
}

MfG kunks
 
Blöderweise kann ich jetzt halt nur Zufallswerte und keine sortierten bzw. rückwarts sortierten Werte testen. Gibts da vllt. eine Funktion oder einen Generator etc. der mir ein bereits sortiertes bzw. rückwärts sortiertes array ausspuckt???

Ja, nennt sich for schleife ;)
 
Ich glaub echt ich bin blöd :(

Bekomm nicht mal mehr ne vernünftige For Schleife hin, die aufsteigend sortierte Integer werte in ein Int-Array schreiben kann :depp:

Bin jetzt mal soweit:
Code:
#include 

#define NUM_ITEMS 1000

main(){
int numbers[NUM_ITEMS];
int i;
int j=2;

for(i=0; i j++;
numbers[i] = j;
}

printf("%i", numbers[i]);
}

Dieser Code führt aber nur dazu, dass dann 1000 im array steht :o

Oh je, bin halt Programmiertechnisch wenig begabt ..

Wie muss ich den denn verändern, dass die for schleife das macht was ich gern hätte ?
MfG kunks
 
Code:
#include 

#define NUM_ITEMS 1000

main(){
int numbers[NUM_ITEMS];
int i;

for(i=0; i numbers[i] = i;
}
So speicherst du werte von 0-999 in dem array.

Dieser Code führt aber nur dazu, dass dann 1000 im array steht :o
Ja das war auch richtig... du gibst doch mit deinem code nur den wert mit dem index aus was in dem fall der Index 999 ist (weil i nach der for schleife den wert 999 hat). So wie du es gemacht hast initialisierst du dein array mit aufsteigenden werten...
 
Erstmal Danke zerd für deine Hilfe,

hab jetzt alles soweit fertig bis auf das array, das sozusagen invers, also mit Werten von n,..,..,......,0.
Konkretes Beispiel wäre zb. array[0]=10, array[1]=9, array[2]=8,....,array[10]=0.

Ich wollte das so lösen:
Code:
for(i = 10; i >= 0; i --)
array[i] = i;

Wenn ich das aber so implmentiere, kommen bei der Ausgabe total falsche Werte raus, die so aussehen, als wäre nichts ins array geschrieben worden (z.B. -1507896, dann mal wieder ne 0 usw.)

Muss ich das anders lösen?
Habe eigentlich nicht vor mit einem tmp[] array zu arbeiten etc.
Möchte das mit nur einem array lösen..

MfG kunks
 
Der typische Fehler ;)

wenn du ein array mit der Größe 10 definierst:
Code:
 int zahlen[10];

Darfst du auch nur 10 Zahlen darin speichern, was bedeutet vom index 0 bis index 9 (nicht 10)

Also so:
Code:
for(int i = 9; i >=0; i--)
zahl[i] = i;

Das wäre allerdings wieder aufsteigend von 0 - 9

wenn du von 9 - 0 haben willst brauchst du nen zweiten zähler:
Code:
for(int i=0, j=9; i < 10; i++, j--)
zahlen[i] = j;

Greetz Zerd

P.S. der code da oben ist ungetestet, sollte aber gehen ;)
 
Jo :thx:, funzt einwandfrei.

Dann bedank ich mich bei allen die mir geholfen haben, insbesondere bei Zerd für seine schnellen und top Antworten.

Somit habe ich keine weiteren Fragen mehr.

Thread can geclosed werden

MfG kunks
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten