Teilnehmerliste erstellen mit Sortierung
-
Es gibt natürlich unterschiedliche Ansätze wie du die Vergleiche anstellst.
Du kannst es wie in meinem Beispiel machen und benachbarte Elemente immer miteinander vergleichen und die Elemente so "durchreichen". Der zeitliche Aufwand ist allerdings nicht besonders gering. Relativ zumindest.
Oder du vergleichst das Element an Position x immer mit allen Elementen die an den Positionen > x stehen und tauscht die jeweils aus, wenn sie geringer sind. Geht alles.
Gibt auch noch viel komplexere aber schnellere Methoden, hattet ihr denn keine in der Vorlesung?
-
In einer einfachen for()-Schleife kommst du da nicht weit (durch das Vertauschen kann es passieren, daß das i-te Element nicht mehr zu seinem Vorgänger passt) - die meisten Sortieralgorithmen verwenden zumindest doppelt verschachtelte Schleifen oder sogar noch kompliziertere Zuordnungen, um zu bestimmen, welche Werte sie vergleichen und austauschen müssen.
(nein, ich werde hier nicht alle bekannten Verfahren ausbreiten - ich verweise nur (zum wiederholten Mal) auf die Wikipedia)
-
Eine einfache Schleife funktioniert. Man muss nur entsprechend weit zurückgehen. So das man das zurückgeschobene Element wieder mit dem davor vergleicht. Wie in meinem Beispiel oben.
Mit zwei Schleifen geht es natürlich auch.
Andere Daten, gleiche Sache:for(int i = 0; i < 3; i++){ for(int j = i+1; j < 4; j++){ if (te[i] < te[j]){ swap(te[i], te[j]); swap(kn[i], kn[j]); } } }
-
Fellhuhn schrieb:
Du kannst es wie in meinem Beispiel machen und benachbarte Elemente immer miteinander vergleichen und die Elemente so "durchreichen". Der zeitliche Aufwand ist allerdings nicht besonders gering. Relativ zumindest.
Für dies Methode habe ich mich entschieden des war ja des mit dem Swap und so. Nein hatten leider nix in der Vorlesung oder zumindest nicht woran ich mich erinnern kann und ich war in jeder Vorlesung bisher da
Komm aber nit so weiter:
if(nachname[i]>nachname[j]) { swap(vorname[i],vorname[j]); swap(nachname[i],nachname[j]); swap(nummer[i],nummer[j]); } for(int i=0;i<n;i++) {cout<<nachname[i]<<vorname[i]<<nummer[i]<<endl; } }
-
Fellhuhn schrieb:
Eine einfache Schleife funktioniert. Man muss nur entsprechend weit zurückgehen. So das man das zurückgeschobene Element wieder mit dem davor vergleicht. Wie in meinem Beispiel oben.
Mit zwei Schleifen geht es natürlich auch.
Andere Daten, gleiche Sache:for(int i = 0; i < 3; i++){ for(int j = i+1; j < 4; j++){ if (te[i] < te[j]){ swap(te[i], te[j]); swap(kn[i], kn[j]); } } }Ist da die 3 und 4 entscheident oder was bedeutet das denn?
-
In dem Beispiel habe ich andere Daten verwendet. 3 wäre hier n-1 und 4 wäre n. te wäre nachname, kn vorname und für die Matrikelnummern bräuchtest du eine extra Zeile.
-
4 ist in dem Fall die Anzahl der Elemente - und 3 ist "Anzahl-1".
-
Fellhuhn schrieb:
In dem Beispiel habe ich andere Daten verwendet. 3 wäre hier n-1 und 4 wäre n. te wäre nachname, kn vorname und für die Matrikelnummern bräuchtest du eine extra Zeile.
Richtig soweit habe ichs auch verstandne nur die 3 und 4 haben mich irritiert. wenn ich aber nun das z nicht am Anfang haben will und A am anfang dann muss ich nur < und < vertauschen denke ich mal
-
OK DANKE es funktioniert ihr seit echt super und ich lerne hier im Forum sehr viel dazu.
Ein kleines Problem habe ich noch. Ich will dass alle Anfangsbuchstaben des Nachnamen dann untereinander stehen auch wenn die vornamen unterschiedlich lang sindbsp
otto müller 234
h scherf 234234so solls nicht sein. ich kanns wies gewollt ist leider hier nicht schreiben es verrutscht immer automatisch hier
-
Du kannst bei der Ausgabe festlegen, wieviel Platz die Daten beanspruchen sollen - das wird bei Bedarf mit Leerzeichen aufgefüllt -, indem du die Stream-Methode width() oder den Manipulator setw() benutzt:
cout.width(10);cout<<vorname[i]; cout.width(15);cout<<nachname[i]; //oder cout<<setw(10)<<vorname[i]<<setw(15)<<nachname[i];(für letzteres brauchst du noch den Header <iomanip> - und die benötigten Größenangaben mußt du selber kennen)
-
cout.width(10);cout<<vorname[i]; cout.width(15);cout<<nachname[i];Kann mann das auch linksbündig machen an den stellen 10 und 15 oder nur rechtsbündig?
-
Kannst du auch - da mußt du nur noch die richtigen Flags setzen (entweder mit "cin.setf(ios::left,ios::adjustfield);" oder mit "cin<<left;").
-
Mit cout weiß ich das gerade nicht. Aber es geht mit printf.
Dazu #include <stdio.h> dazu und dann folgendes:printf("%-20s %-20s %-20s\n", vorname[i].c_str(), nachname[i].c_str(), matrikelnummer[i].c_str());
%s bedeutet dabei den nächsten Parameter als String zu interpretieren. 20 ist die minimale zu reservierende Länge und das - zeigt an das es linksbündig sein soll.
-
CStoll schrieb:
Kannst du auch - da mußt du nur noch die richtigen Flags setzen (entweder mit "cin.setf(ios::left,ios::adjustfield);" oder mit "cin<<left;").
verstehe ich nit so ganz statt cin.width cin.left??
-
std::cout << std::left << std::width(15) << vorname[i] ...
<iomanip>
<iostream>@Fellhuhn: Wenn dann <cstdio> und std::printf ...
-
cout.width(20);
cout << left << vorname[i] ...
-
(D)Evil schrieb:
std::cout << std::left << std::width(15) << vorname[i] ...
<iomanip>
<iostream>@Fellhuhn: Wenn dann <cstdio> und std::printf ...
<stdio.h> geht genausogut. Und da er den Namespace eh used, braucht er std:: nicht.
-
Fellhuhn schrieb:
Mit cout weiß ich das gerade nicht. Aber es geht mit printf.
Dazu #include <stdio.h> dazu und dann folgendes:printf("%-20s %-20s %-20s\n", vorname[i].c_str(), nachname[i].c_str(), matrikelnummer[i].c_str());
%s bedeutet dabei den nächsten Parameter als String zu interpretieren. 20 ist die minimale zu reservierende Länge und das - zeigt an das es linksbündig sein soll.
habs so gemacht aber konnte es sogar ohne header änderung machen.DANKE FÜR ALLES Glaub das wars erst mal:)
-
wog schrieb:
verstehe ich nit so ganz statt cin.width cin.left??
cin.width() setzt die Breite für die nächste Ausgabe, cin.setf() setzt einige interne Flags (u.a. Ausrichtung, Zahlenbasis und Darstellung von Gleitkomma-Werten). setw() und left sind sog. Manipluatoren - die kannst du an dne normalen operator<< übergeben, um die Breite bzw. die Flags des Streams zu beeinflussen.
(für's erste reicht es vermutlich zu wissen, daß es das gibt - was du alles damit machen kannst, erfährst du z.B. in meinem Magazin-Artikel über IO-Streams)
@Fellhuhn: Da haben wir schonmal jemanden, der gleich mit vernünftigem C++ begonnen hat - den mußt du nicht durch C Basteleien aus dem Konzept bringen

-
Und vor allem geht <stdio.h> nicht genauso gut. Das ist mal wieder Quatsch. stdio.h ist im C-Standard und hat in einer C++-Anwendung NICHTS zu suchen. Müsste sogar im C++-Standard stehen, dass aus kompatibilitätsgründen die alten C-Header übernommen wurden, diese aber durch ein vorrangehendes c im namen gekennzeichnet werden.