Problem mit Qsort

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Qsort

    Also ich soll in das teil da unten ne Funktion einbauen womit man die Struct nach jedem x beliebigen Element sortieren kann!
    Mein Problem ich MUSS mit qsort arbeiten und bekomm es zum verrecken nicht ans laufen! Ich weiß das der quellcode recht bescheiden ist und oft rum getrickst wurde aber ich kanns nicht besser. Ich habe mir das ganze WE die Finger wund getipt. Es kommt mir nicht auf verbesserungen jedes details an aber kann mir vlt einer sagen wie ich das qsort ans laufen bekomme. Den text den ich eingebunden hab hab ich ausem internet von irgentwo her weil ich absolut 0 von sortieren weiß.

    Quellcode

    1. // Header Dateien
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <conio.h>
    5. #include <string>
    6. #include <iostream.h>
    7. using namespace std;
    8. // Deklaration der globalen Variablen
    9. // Variablen fuer den Dateizugriff
    10. FILE *fp1;
    11. char filename[30];
    12. FILE *fp2;
    13. char filenamer[3];
    14. // Deklaration der allgemeinen Struktur
    15. struct myStruct
    16. {
    17. //damit der Name nicht verändert wird
    18. char leer[3];
    19. char vorname[100];
    20. //char wegen der 0 bei der vorwahl die führt zu fehlern
    21. char tel[100];
    22. char name[100];
    23. char ort[100];
    24. int nr;
    25. char email[100];
    26. int plz;
    27. char geb[100];
    28. char str[100];
    29. };
    30. // Deklaration der konkrten Struktur
    31. myStruct test[100];
    32. // Prototyping eigener Funktionen
    33. void structload(int &);
    34. void newitems(int &);
    35. void showall(int);
    36. void structsave(int &);
    37. void edit(int);
    38. void delte(int &);
    39. void sorte(char*,int,int);
    40. void read(char);
    41. // Hauptprogramm
    42. void main()
    43. // Dargestellt wird das Hauptmenu
    44. // von hier aus wird in die einzelnen Aktionen verzweigt
    45. {
    46. int ausw,eintrag=0;
    47. char feld[100];
    48. do
    49. {
    50. system("cls");
    51. cout<<"Testprogramm zum Lesen und Schreiben von Strukturen\n\n";
    52. cout<<"1. vorhandene Struktur laden\n";
    53. cout<<"2. neue Eintraege vornehmen\n";
    54. cout<<"3. alle Eintraege anzeigen\n";
    55. cout<<"4. Struktur speichern\n";
    56. cout<<"5. Editieren von Eintraegen\n";
    57. cout<<"6. Eintrag entfernen\n";
    58. cout<<"7. Sortiert nach Alphabet ausgeben\n";
    59. cout<<"8. Programm beenden\n\n";
    60. cout<<"Ihre Auswahl: --> ";
    61. cin >>ausw;
    62. switch(ausw)
    63. {
    64. case 1:
    65. structload(eintrag);
    66. break;
    67. case 2:
    68. newitems(eintrag);
    69. break;
    70. case 3:
    71. showall(eintrag);
    72. break;
    73. case 4:
    74. structsave(eintrag);
    75. break;
    76. case 5:
    77. edit(eintrag);
    78. break;
    79. case 6:
    80. delte(eintrag);
    81. break;
    82. case 7:
    83. read(feld[100]);
    84. sorte(feld,0,eintrag-1);
    85. break;
    86. case 8:
    87. break;
    88. default:
    89. cout<<"Falsche Auswahl! Bitte korrigieren!\n";
    90. cout<<"Weiter mit beliebiger Taste";
    91. getch();
    92. }
    93. }
    94. while(ausw!=8);
    95. }
    96. // eigene Funktion zum Lesen der Struktur (komplett) von einer Datei
    97. void structload(int &eintrag)
    98. {
    99. int i;
    100. cout<<"\n\nBitte geben Sie den Namen einer bestehenden Datei an: --> ";
    101. cin >>filename;
    102. fp1 = fopen(filename,"r");
    103. fp2 = fopen(filename,"r");
    104. if(fp1!=NULL)
    105. {
    106. fscanf(fp2,"%i",&eintrag);
    107. for(i=1;i<=eintrag;i++)
    108. {
    109. fread(&test[i], sizeof(myStruct), 1, fp1);
    110. }
    111. fclose(fp1);
    112. fclose(fp2);
    113. cout<<"Lesen erfolgreich\n\n";
    114. }
    115. else
    116. {
    117. cout<<"Fehler beim Oeffnen von: %s\n\n",filename;
    118. }
    119. cout<<"Weiter mit beliebiger Taste";
    120. getch();
    121. }
    122. // eigene Funktion zum Schreiben der Struktur (komplett) auf eine Datei
    123. void structsave(int &eintrag)
    124. {
    125. int i;
    126. cout<<"\n\nBitte geben Sie den Namen fuer die zu speichernde Datei an: --> ";
    127. cin >>filename;
    128. fp1 = fopen(filename,"w");
    129. fp2 = fopen(filename,"w");
    130. for(i=1;i<=eintrag;i++)
    131. {
    132. fwrite(&test[i], sizeof(myStruct), 1, fp1);
    133. }
    134. fprintf(fp2,"%i",eintrag);
    135. fclose(fp1);
    136. fclose(fp2);
    137. cout<<"Schreiben erfolgreich\n\n";
    138. cout<<"Weiter mit beliebiger Taste";
    139. getch();
    140. }
    141. // eigene Funktion zum Erfassen aller Strukturelemente
    142. void newitems(int &eintrag)
    143. {
    144. int i=eintrag;
    145. char abbruch;
    146. system("cls");
    147. do
    148. {
    149. i=i+1;
    150. eintrag=eintrag+1;
    151. cout<<"\nBitte Eintrag vornehmen fuer Position "<<i<<"\n\n";
    152. cout<<"Bitte Vorname eigeben: --> ";
    153. cin >>test[i].vorname;
    154. cout<<"Bitte Nachname eingeben: --> ";
    155. cin >>test[i].name;
    156. cout<<"Bitte Geburtstag eingeben: --> ";
    157. cin >>test[i].geb;
    158. cout<<"Bitte Postleitzahl: -->";
    159. cin>>test[i].plz;
    160. cout<<"Bitte Wohnort eingeben: -->";
    161. cin>>test[i].ort;
    162. cout<<"Bitte Strasse eingeben: -->";
    163. cin>>test[i].str;
    164. cout<<"Bitte Hausnummer eingeben: -->";
    165. cin>>test[i].nr;
    166. cout<<"Bitte Telefon eingeben: -->";
    167. cin>>test[i].tel;
    168. cout<<"Bitte Email eingeben: -->";
    169. cin>>test[i].email;
    170. cout<<"Wollen sie weitere Einträge machen?(j/n)";
    171. cin>>abbruch;
    172. }
    173. while (abbruch=='j');
    174. }
    175. // eigene Funktion zum Anzeigen aller Strukturelemente
    176. void showall(int eintrag)
    177. {
    178. int i;
    179. system("cls");
    180. for (i=1;i<=eintrag;i++)
    181. {
    182. cout<<"Eintrag-Nr.: "<<i<<"\n";
    183. cout<<"Vorname : "<<test[i].vorname<<"\n";
    184. cout<<"Nachname : "<<test[i].name<<"\n";
    185. cout<<"Plz : "<<test[i].plz<<"\n";
    186. cout<<"Ort : "<<test[i].ort<<"\n";
    187. cout<<"Strasse : "<<test[i].str<<"\n";
    188. cout<<"Hausnummer : "<<test[i].nr<<"\n";
    189. cout<<"Tel. : "<<test[i].tel<<"\n";
    190. cout<<"Geburtstag : "<<test[i].geb<<"\n" ;
    191. cout<<"Email : "<<test[i].email<<"\n\n";
    192. }
    193. cout<<"\n\nWeiter mit Enter";
    194. getch();
    195. }
    196. //Funktion zum editieren
    197. void edit(int eintrag)
    198. {
    199. int wahl,edition;
    200. char best='n';
    201. do
    202. {
    203. cout<<"Geben sie den zu editierenden Eintrag an:";
    204. cin>>wahl;
    205. cout<<"Eintrag-Nr.: "<<wahl<<"\n";
    206. cout<<"Vorname : "<<test[wahl].vorname<<"\n";
    207. cout<<"Nachname : "<<test[wahl].name<<"\n";
    208. cout<<"Plz : "<<test[wahl].plz<<"\n";
    209. cout<<"Ort : "<<test[wahl].ort<<"\n";
    210. cout<<"Strasse : "<<test[wahl].str<<"\n";
    211. cout<<"Hausnummer : "<<test[wahl].nr<<"\n";
    212. cout<<"Tel. : "<<test[wahl].tel<<"\n";
    213. cout<<"Geburtstag : "<<test[wahl].geb<<"\n" ;
    214. cout<<"Email : "<<test[wahl].email<<"\n\n";
    215. cout<<"Wollen sie diesen Eintrag bearbeiten?(j/n)";
    216. cin>>best;
    217. }
    218. while (best=='n');
    219. cout<<"Was möchten sie editieren?\n1.Vorname\n2.Nachname\n3.Plz\n4.Ort\n5.Strasse";
    220. cout<<"\n6.Hausnummer\n7.Tel.\n8.Geburtstag\n9.Email\n10.zurueck ins Menue\nEingabe:";
    221. cin>>edition;
    222. switch(edition)
    223. {
    224. case 1:
    225. cout<<"Vorname: -->";
    226. cin>>test[wahl].vorname;
    227. break;
    228. case 2:
    229. cout<<"Nachname: -->";
    230. cin>>test[wahl].name;
    231. break;
    232. case 3:
    233. cout<<"Plz: -->";
    234. cin>>test[wahl].plz;
    235. break;
    236. case 4:
    237. cout<<"Ort: -->";
    238. cin>>test[wahl].ort;
    239. break;
    240. case 5:
    241. cout<<"Strasse: -->";
    242. cin>>test[wahl].str;
    243. break;
    244. case 6:
    245. cout<<"Hausnummer: -->";
    246. cin>>test[wahl].nr;
    247. break;
    248. case 7:
    249. cout<<"Telefon: -->";
    250. cin>>test[wahl].tel;
    251. break;
    252. case 8:
    253. cout<<"Geburtstag: -->";
    254. cin>>test[wahl].geb;
    255. break;
    256. case 9:
    257. cout<<"Email: -->";
    258. cin>>test[wahl].email;
    259. break;
    260. case 10:
    261. break;
    262. }
    263. cout<<"Weiter mit Eingabe!";
    264. getch();
    265. }
    266. //Löschfunktion
    267. void delte(int &eintrag)
    268. {
    269. int wahl,i;
    270. char best='n';
    271. do
    272. {
    273. cout<<"Geben sie den zu loeschende Eintrag an:";
    274. cin>>wahl;
    275. cout<<"Eintrag-Nr.: "<<wahl<<"\n";
    276. cout<<"Vorname : "<<test[wahl].vorname<<"\n";
    277. cout<<"Nachname : "<<test[wahl].name<<"\n";
    278. cout<<"Plz : "<<test[wahl].plz<<"\n";
    279. cout<<"Ort : "<<test[wahl].ort<<"\n";
    280. cout<<"Strasse : "<<test[wahl].str<<"\n";
    281. cout<<"Hausnummer : "<<test[wahl].nr<<"\n";
    282. cout<<"Tel. : "<<test[wahl].tel<<"\n";
    283. cout<<"Geburtstag : "<<test[wahl].geb<<"\n" ;
    284. cout<<"Email : "<<test[wahl].email<<"\n\n";
    285. cout<<"Wollen sie diesen Eintrag loeschen?(j/n)";
    286. cin>>best;
    287. }
    288. while(best=='n');
    289. for(i=wahl;i<=eintrag;i++)
    290. {
    291. test[i]=test[i+1];
    292. }
    293. eintrag=eintrag-1;
    294. cout<<"Loeschen erfolgreich!\nVergessen sie nicht zu speichern\nWeiter mit Eingabe!";
    295. getch();
    296. }
    297. void read(char *feld[])
    298. {
    299. int i;
    300. char *ptr;
    301. char puffer[151];
    302. i = 0;
    303. do
    304. {
    305. ptr = fgets(puffer,150,stdin);
    306. if (ptr!=NULL)
    307. {
    308. feld[i] = (char *) malloc(strlen(puffer)+1);
    309. strcpy(feld[i],puffer);
    310. i++;
    311. }
    312. }
    313. while(ptr!=NULL);
    314. }
    315. //Sortierfunktion
    316. void sorte(char *feld[],int links, int rechts)
    317. {
    318. int i,j;
    319. char *x,*y;
    320. i = links;
    321. j = rechts;
    322. x = feld[(i+j)/2];
    323. do
    324. {
    325. while (strcmp(feld[i],x) < 0&&i<rechts)i++;
    326. while (strcmp(feld[i],x)>0&&j>links)j--;
    327. if (i <= j)
    328. {
    329. y = feld[i];
    330. feld[i] = feld[j];
    331. feld[j] = y;
    332. i++;
    333. j--;
    334. }
    335. }
    336. while (i<=j);
    337. if (links < j) sorte(feld,links,j);
    338. if (rechts > i) sorte(feld,i,rechts);
    339. }
    Alles anzeigen


    :oops: :oops: :oops:
  • Haste denn auch was eigenes?

    Der Autor des Quelltextes konnte sich wohl nicht entscheiden ob er C++ oder
    doch lieber C nehmen wollte oder gar C++ mit STD-Lib.

    Wenn du hier eine komplette Lösung kriegst haste wahrscheinlich bei der nächsten
    Aufgabe noch grössere Probleme als jetzt.

    Viele Quelltexte im Netz sind mehr oder weniger misslungene Versuche zum
    lösen einer Aufgabe. Es gibt auch einige wenige gute Ansätze.

    Ganz egal wie du es angehst du must das Programmieren lernen entweder um
    selbst die Lösung zu finden oder um die Lösungen anderer zu beurteilen.

    So und jetzt sagt mal konkret wo es klemmt und nicht allgemein ich kann es nicht
    besser.

    MfG Bcc-fan
  • Der Autor konnte sich sehr wohl entscheiden! Er konnte sich entscheiden an die Aufgabe zu halten. Da er nur C teilweise behersche jedoch die Aufgabe mit cin cout lösen musste und sein Lehrer ihm den teil mit std vorgegeben hat, da sie eigentlich strings statt char arrays nutzen sollten (da aufgrund der unbekannten länge strings nicht in dateien geschrieben werden können hat der Autor vorüber gehend char arrays benutzt um erst mal das grobe Gerüst zu bekommen). Ich glaube du hast mich etwas falsch verstanden alles oberhalb der read funktion is aus meiner Feder entsprungen. Ich wollte nur wissen wie ich den ans laufen bekomme keine komplette Lösung.

    Wie dem auch sei mein genaues Problem liegt darin das ich nicht verstehe wie ich ein char array übergeben kann und somit sortieren kann, hinzu kommt das ich ja nicht nur sagen wir die namen sortieren muss sondern auch gleichzeitig alle anderen dazu gehörenden Teile ausgeben muss. Ich hatte hier im Forum bereits eine Lösung über einen Vector bekommen aber diese hat mein Lehrer untersagt und das ganze auf quicksort (was mir nur vom Prinzip bekannt ist) bubblesort (was mir zu langsam ist) beschränkt. Ich habe bisher nur structs über eine Iteration aufgerufen aber noch nie alle vorhandenen Einträge, daher verstehe ich nicht wie das Funktioniert!

    (Entschuldigt bitte die Rechtschreibung aber ich habe mir seit Freitag die Nächte mit meinem Compiler geteilt und leide an Schlafmangel und Schlafstörungen, was dazu führt das ich leich reizbar bin von daher auch sry fals ich mich etwas seltsam ausdrücke und anmaßend bin)

    mfg
    der Autor der C/C++ unentschlossenheit

    Ps.: thx an bcc-fan das du dir um meine Fähigkeiten sorgen machst und es mir verständlich machen willst.
  • Wat denn nu, Zeile 5 und 6: string (ohne .h) und iostream.h (mit .h???)?

    Such mal mit deiner bevorzugten Suchmaschine z.B.: "c++ sort array" und
    wenn du englisch nicht so sattelfest bist, in Deutsch. Treffer gibt es genug
    z.B. Volkards C++-Kurs und auch diverse Tutorials deutschsprachiger Hochschulen.

    Solltest du halbwegs des Englischen mächtig sein ist die Auswahl noch grösser. :)

    Versuch erst mal z.B. die Namen zu sortieren. Dann machste ein 2. Array (File)
    wo du das Ergebnis reinschreibst.

    Die Geschwindigkeit der bekannten Sortieralgorhitmen ist für Übungsaufgaben
    bei den heutigen Rechnern in der Regel zu vernachlässigen. Du wirst ja zur
    Übung keine 10000 Datensätze anlegen oder doch???

    MfG Bcc-fan
  • 10000 Datensätze werden wohl kaum reichen um einen spürbaren Unterschied festzustellen. Außerdem gibt es Algorithmen die zum einen speichereffizienter sind als Quicksort und auch welche die im Durchschnitt schneller sind, weil ihr Laufzeitverhalten im worst case besser ist. Muss also andere Gründe haben, warum ausgerechnet diese Sortiermethode...
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • JA tschuldigung das ich mich damit nicht auskenne ich habe mir nur ein 18 Seitiges Dokument reingezogen in dem stand das bubblesort langsam ist und da ich langsame dinge hasse habe ich das direkt ausgegrenzt, da stand ja nicht drin das es ab x hoch n daten langsam wird -.-. Zudem ist es doch wurscht ob man nu bubble oder quicksort nimmt oder nicht? Weil bei der aufgabe macht es wohl kaum nen Unterschied oder?
    Die suchergebnisse hab ich mir mal rein gezogen und ich bin jetzt .. genau so schlau wie vorher nur das ich keine Lust mehr auf das Programm habe. Vlt im nächsten Jahr mal sehen ich danke erst mal für die ANtworten und hilfe versuche.