Teilnehmerliste erstellen mit Sortierung



  • Hast du mal etwas eingegeben, was nicht mit einem Großbuchstaben beginnt? Wenn die Eingabe schon "korrekt" ist, sieht man nicht sehr viel von der Berichtigung 😃



  • CStoll schrieb:

    Hast du mal etwas eingegeben, was nicht mit einem Großbuchstaben beginnt? Wenn die Eingabe schon "korrekt" ist, sieht man nicht sehr viel von der Berichtigung 😃

    Oh da war wohl noch ein kleiner Fehler drin habe ihn jetzt gefunden und das geht.

    So nun das nächste Problem. Ich kann ja jetzt nicht tolower genauso hinschreiben weil ich ja nie weiß wie lange das wort ist gibt es einen Befehl der ab der 2.stelle alles klein macht?

    DANKE. ich seit übrigens echt super



  • Einen Befehl, um "alles" klein zu machen, gibt es nicht - aber wozu haben wir Schleifen? Und wenn du unauffällig auf meinen Beitrag dort oben schielst, siehst du die Lösung.



  • vorname[i][0]=toupper(vorname[i][0]);//der erste Buchstabe groß
    for(int j=1;i<vorname[i].length();++j)
      vorname[i][j]=tolower(vorname[i][j]);//alle übrigen Buchstaben klein
    

    geht doch auf die Zeilenlänge ein?

    #include <algorithm> // std::transform
    #include <cctype> // std::toupper, std::tolower
    #include <string> // std::string
    
    if (vorname.at(i).length() > 1)
    {
        vorname.at(i).at(0) = std::toupper(vorname.at(i).at(0));
        std::transform(vorname.at(i).begin() + 1, vorname.at(i).end(), vorname.at(i).begin() + 1, std::tolower);
    }
    

    ... so sollte das JEDENFALLS gehen und ist mehr Standard-c++-benutzung 😛



  • CStoll schrieb:

    Einen Befehl, um "alles" klein zu machen, gibt es nicht - aber wozu haben wir Schleifen? Und wenn du unauffällig auf meinen Beitrag dort oben schielst, siehst du die Lösung.

    Oh entschuldigung diesen Beitrag habe ich übersehen da ware ich gerade essen. Danke ich komm mir echt doof vor dass ihr mir alles vorkauen müsst. Aber ich verspreche euch ich guck mir des so lange an bis ich des auch verstehe was ihr mir schreibt und kopiere nit nur dumm rein.

    😞

    [cpp]
    #include <iostream>
    #include <cmath>
    #include <string>
    using namespace std;

    void main ()
    {
    std::string vorname[1000],nachname[1000],nummer[1000];
    int n;
    cout<<"Bitte die Anzahl der Personen eingeben:";
    cin>>n;
    cout<<"Bitte nun Vorname,Vorname und Martikelnummer eingeben"<<endl;
    for(int i=0;i<n;i++)
    {
    cout<<"Vorname"<<"["<<i+1<<"]"<<"=";
    cin>>vorname[i];
    vorname[i][0] = toupper(vorname[i][0]);
    for(int j=1;i<vorname[i].length();++j)
    {
    vorname[i][j]=tolower(vorname[i][j]);
    }
    cout<<"Nachname"<<"["<<i+1<<"]"<<"=";
    cin>>nachname[i];
    nachname[i][0] = toupper(nachname[i][0]);
    for(int j=1;i<nachname[i].length();++j)
    {
    nachname[i][j]=tolower(vorname[i][j]);
    }
    cout<<"Martikelnummer"<<"["<<i+1<<"]"<<"=";
    cin>>nummer[i];
    }
    cout<<nachname[0]<<endl;//nur zum Testen
    }
    [cpp]

    EDIT:1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_06\teilnehmerliste.cpp(25) : warning C4018: '<': Konflikt zwischen 'signed' und 'unsigned'



  • Die Warnung kommt, weil du in deiner Schleife als Zähler einen int hast und den mit der Länge des Strings vergleicht, der vom Typ unsigned int ist. Negative Länge macht ja keinen Sinn. Daher einfach den Zähler als unsigned int deklarieren und die Warnung ist weg.

    @(D)Evil
    Das transform dürfte nicht funktionieren, weil toupper und tolower als Parameter einen int bekommen und die Iteratoren einen char liefern. Der Gnu-Compiler meckert da.



  • Fellhuhn schrieb:

    Die Warnung kommt, weil du in deiner Schleife als Zähler einen int hast und den mit der Länge des Strings vergleicht, der vom Typ unsigned int ist. Negative Länge macht ja keinen Sinn. Daher einfach den Zähler als unsigned int deklarieren und die Warnung ist weg.

    Ich weiß zwar nit was unsigned ist aber ich machs mal und werde mich dann mal infomieren

    for(unsigned int j=1;i<nachname[i].length();++j)
    {
    	nachname[i][j]=tolower(vorname[i][j]);
    }
    

    so z.b oder?
    Leider gehen die Warnungen nicht weg und es kommt dann auch noch eine Fehlermeldung beim starten



  • Normale ints gehen sowohl in den negativen als auch in den positiven Bereich. unsigned ints können lediglich positiv sein und bieten im positiven Bereich entsprechend mehr als die doppelte Reichweite. Man muss nur aufpassen das man nicht in den negativen Bereich kommt, denn dann fängt er "oben" im positiven Bereich wieder an. Hoffe das ist verständlich ausgedrückt. 😉



  • Fellhuhn schrieb:

    Normale ints gehen sowohl in den negativen als auch in den positiven Bereich. unsigned ints können lediglich positiv sein und bieten im positiven Bereich entsprechend mehr als die doppelte Reichweite. Man muss nur aufpassen das man nicht in den negativen Bereich kommt, denn dann fängt er "oben" im positiven Bereich wieder an. Hoffe das ist verständlich ausgedrückt. 😉

    Ja ok das habe ich jetzt verstanden. Also ich bekomme folgende Fehlermedlung: www.wog-sen.de/x.jpg



  • Hmm @Fellhuhn: Korintenkackerei nennt sich das ... dann caste halt! Ist in dem Fall i.o. ...



  • Die Meldung besagt das du auf einen Bereich des Strings zugegriffen hast, die nicht definiert ist. Also zum Beispiel auf die siebte Stelle eines Strings mit nur drei Zeichen.

    Du hast da auch noch nachname[i][j]=tolower(vorname[i][j]); stehen. Sollte am Ende wohl auch nachname heißen.



  • Tja, auch "Veteranen" passieren gelegentlich Tipfehler - das muß natürlich "j<vorname[i].length()" heißen, sonst bekommst du eine Endlosschleife - und letztlich deinen SegFault.



  • GEIL DAnke. 2/3 sind nun geschafft von dem Programm. Jeztt fehlt "nur" noch die Sortierung nach Nachnamen. Wird wohl wieder in ner For schleife gemacht oder?



  • (D)Evil schrieb:

    Hmm @Fellhuhn: Korintenkackerei nennt sich das ... dann caste halt! Ist in dem Fall i.o. ...

    Wie willst du in dem Fall casten ohne eine Funktion dazwischenzuschieben oder es noch schwieriger zu verstehen machen indem du Funktionspointer castest? Wenn du Neulingen das empfiehlst dann wäre es gut wenn es auch funktioniert, sonst setzt die komplette Frustration ein. 😉



  • Eine einfache for-Schleife wird dafür wohl nicht ausreichen, aber schau dich mal im Netz nach brauchbaren Sortier-Algorithmen um (BubbleSort, InsertSort - oder auch QuickSort).

    PS: Ich hätte ja lieber EIN Array mit struct's verwendet und einmal durch std::sort() gejagt, aber das steht bei der Aufgabenstellung nicht zur Debatte.



  • Also es erste was ich jetzt denke ich machen würde ist die Vornamen,nachnamen und Nummer miteinander zu verketten. Müsste mit dem getline() gehen oder? Aber dann ist halt doof. Mal überlegen?!?! Habt ihr Tipss??



  • Überleg dir erst einmal wie du das machen würdest.

    Vermutlich indem du dir von vorne an jedes Element des Nachnamen-Arrays anschaust und guckst ob es "kleiner" als das vorherige ist. Ist das der Fall vertauscht du die beiden und auch die beiden Einträge im Vornamen- und Matrikelnummer-Array. Dann gehst du wieder einen Schritt zurück und schaust von da an.



  • Fellhuhn schrieb:

    Überleg dir erst einmal wie du das machen würdest.

    Vermutlich indem du dir von vorne an jedes Element des Nachnamen-Arrays anschaust und guckst ob es "kleiner" als das vorherige ist. Ist das der Fall vertauscht du die beiden und auch die beiden Einträge im Vornamen- und Matrikelnummer-Array. Dann gehst du wieder einen Schritt zurück und schaust von da an.

    Das hört sich aber einfach an:) Verwirklichen lassen wirds dann schon "bissl" schwerer. Ich überlege gerade!!



  • Verketten ist gut - getline() ist hierfür aber Unsinn.

    Ich hätte es so gelöst:

    struct eintrag
    {
      string vorname,nachname;
      int nummer;
    };
    
    bool operator<(const eintrag& r,const eintrag& l)
    {
      return r.nachname<l.nachname;
    }
    
    int main()
    {
      eintrag liste[1000];
    
      ...//Namen in die Liste einlesen (statt 'vorname[i]' verwendest du 'liste[i].vorname'
    
      sort(liste,liste+n);
    }
    

    (oder noch besser - gleich einen sortierenden Container (set<>/multiset<>) zum Speichern der Datensätze verwenden)

    Wenn die Aufgabe wirklich vorschreibt, drei Arrays zu verwenden, mußt du selber ein Sortierverfahren umsetzen - und dabei alle drei Arrays simultan sortieren:

    ...
      if(nachname[i]>nachname[j])
      {
        swap(vorname[i],vorname[j]);
        swap(nachname[i],nachname[j]);
        swap(nummer[i],nummer[j]));
      }
    


  • Hmm es Problem ist nur, dass ich ja nur was programmieren kann, was ich auch verstehe.:) Ausserdem haben wir das ja noch nicht im Script durchgearbeitet, weiß auch gar nicht ob da sowas drin steht. Gibts denn da keine andere Lösung?

    was ist denn sie swap funktion??

    so vom denkansatz habe ich erst mal gedacht
    if
    nachname[i]<nachname[i+1]
    hmm ja und dann gehts auch schon los


Anmelden zum Antworten