Teilnehmerliste erstellen mit Sortierung



  • Hmm naja ich habs hier im Script doch gefunden mit dem string einbinden. Naja mehr kann ja nit an alles denken. Schande über mein Haupt. Das mit dem Heade so lassen gilt wohl nicht mehr für diese Aufgabe.



  • Muss ich denn die Umwandlung von Groß und Kleinschreibung schon in die for Schleife reintun oder erst danach anwenden ich hatte nämlich so geschrieben

    vorname[0]=toupper(vorname[0]); aber des hat ja keine einwirkung auf das Programm

    das ham wir als bps bekommen aber ich habe ja hier ja jetzt nit nur ein string sondern gleich ein ganzes string feld

    #include <iostream>						
    #include <string>						
    using namespace std;
    void main (void)									
    {
    	string s1 = "abc", s2 = "XYZ";
    	s1[0] = tolower(s2[0]);
    	s2[1] = toupper(s1[1]);
    	cout << s1 << endl << s2 << endl;
    }
    /*
    Ausgabe:
    xbc
    XBZ 
    */
    


  • Dir ist klar, daß tolower() nur ein einzelnes Zeichen umwandelt und nicht einen kompletten String? Du mußt es schon auf jedes Zeichen des String loslassen, damit etwas sinnvolles herauskommt (eventuell ausgelagert in eine eigene Funktion):

    void adjust(string& wert)
    {
      wert[0]=toupper(wert[0]);
      for(int i=1;i<wert.length();++i)
        wert[i]=tolower(wert[i]);
    }
    
    ...
    for(..)
    {
      cin>>vorname[i];adjust(vorname[i]);
      ...
    }
    


  • Na super wie will ich das denn machen:( Wir lernen eigene Funktionen erst nächstes Semester ich weiß nit wie der sich des vorstellt:) ich meinte übrigens toupper und nit tolower soll ja groß werden der erst buchstabe und nit klein



  • Also nur der erste Buchstabe??

    Dann in der Schleife...

    ...
    
    std::cout << "Vorname" << "[" << i + 1 << "]" << " = ";
    std::cin >> name[i];
    name[i][0] = toupper(name[i][0]);
    
    std::cout << "Nachname" << "[" << i + 1 << "]" << " = ";
    std::cin >> surname[i];
    surname[i][0] = toupper(surname[i][0]);
    
    ...
    

    MfG



  • Hmm, du kannst auch diese Schleifenkonstruktion direkt in deine Eingabe einarbeiten:

    cin>>vorname[i];
    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
    

    LordJaxom schrieb:

    Ah super, also wieder so ein Professor der einem erst beibringt wie ein Motor funktioniert, bevor er einem zeigt, wie man das Auto bewegt.

    Dem kann ich mich nur anschließen 😃



  • ceplusplus@loggedoff schrieb:

    Also nur der erste Buchstabe??

    Dann in der Schleife...

    ...
    
    std::cout << "Vorname" << "[" << i + 1 << "]" << " = ";
    std::cin >> name[i];
    name[i][0] = toupper(name[i][0]);
    
    std::cout << "Nachname" << "[" << i + 1 << "]" << " = ";
    std::cin >> surname[i];
    surname[i][0] = toupper(surname[i][0]);
    
    ...
    

    MfG

    ja der erst groß und die andern halt alle klein.
    was ist denn immer das std:: davor? kann man das denn nicht weglasen? sowas habe ich noch nie gesehen



  • Dann das letzte Beispiel von CStoll.

    Mit std:: sprichst du den Namensbereich an, in dem die C++-Standardfunktionen liegen. Stattdessen kannst du, wie du auch schon gemacht hast, using namespace std; schreiben, dann wird der std-Namensbereich automatisch verwendet, ohne ihn vorher mit dem Bereichsoperator :: ansprechen zu müssen.

    MfG



  • CStoll schrieb:

    LordJaxom schrieb:

    Ah super, also wieder so ein Professor der einem erst beibringt wie ein Motor funktioniert, bevor er einem zeigt, wie man das Auto bewegt.

    Dem kann ich mich nur anschließen 😃

    Oder mit dem Bus fahren. Ist auch umweldfreundlicher und nicht so stressig. Man muss auch keinen Führerschein haben. Wer eine Metapher findet darf sie behalten. 😉

    Man muss das aber auch mal aus der Sicht des Lehrenden sehen. Es ist nicht gerade einfach bei Wissensdingen (gilt besonders fürs Programmieren) Gänge herunterzuschalten (juhu, wieder die Auto-Metapher) und alles aber auch wirklich alles aus der Sicht eines Neulings zu sehen. Alleine die Einbindung eines weiteren Headers geschieht bei geübten Programmierern dermaßen automatisch, daß da gar kein Gedanke mehr dran verloren wird.

    Mein Tipp: Nimm dir eine gute Referenz (zB www.cppreference.com) und schau dir einfach mal an was für Typen und Funktionen es in C und C++ gibt. Dort steht auch der jeweils benötigte Header. Spiel etwas mit herum, auch wenn es die Aufgabe nicht erfordert. Da lernt man schon einiges bei. Gerade bei der Programmierung reichen die gestellten Aufgaben nie aus, um ein gutes Verständnis zu bekommen. Ausufernde Eigeninitiative ist unabdingbar.



  • Fellhuhn schrieb:

    CStoll schrieb:

    LordJaxom schrieb:

    Ah super, also wieder so ein Professor der einem erst beibringt wie ein Motor funktioniert, bevor er einem zeigt, wie man das Auto bewegt.

    Dem kann ich mich nur anschließen 😃

    Oder mit dem Bus fahren. Ist auch umweldfreundlicher und nicht so stressig. Man muss auch keinen Führerschein haben. Wer eine Metapher findet darf sie behalten. 😉

    Man muss das aber auch mal aus der Sicht des Lehrenden sehen. Es ist nicht gerade einfach bei Wissensdingen (gilt besonders fürs Programmieren) Gänge herunterzuschalten (juhu, wieder die Auto-Metapher) und alles aber auch wirklich alles aus der Sicht eines Neulings zu sehen. Alleine die Einbindung eines weiteren Headers geschieht bei geübten Programmierern dermaßen automatisch, daß da gar kein Gedanke mehr dran verloren wird.

    Mein Tipp: Nimm dir eine gute Referenz (zB www.cppreference.com) und schau dir einfach mal an was für Typen und Funktionen es in C und C++ gibt. Dort steht auch der jeweils benötigte Header. Spiel etwas mit herum, auch wenn es die Aufgabe nicht erfordert. Da lernt man schon einiges bei. Gerade bei der Programmierung reichen die gestellten Aufgaben nie aus, um ein gutes Verständnis zu bekommen. Ausufernde Eigeninitiative ist unabdingbar.

    richtig da stimme ich dir voll ein. Ich würde an den nix rankommen lassen er ist echt gut. Denk link werde ich mir mal angucken.Leider bin ich immer noch dran wegen groß und kleinschreibung. Hab des wie oben gemacht aber er ändert die buchstaben nicht ab

    cout<<"Vorname"<<"["<<i+1<<"]"<<"=";
    cin>>vorname[i];
    vorname[i][0] = toupper(vorname[i][0]); 
    cout<<"Nachname"<<"["<<i+1<<"]"<<"=";
    cin>>nachname[i];
    nachname[i][0] = toupper(nachname[i][0]); 
    cout<<"Martikelnummer"<<"["<<i+1<<"]"<<"=";
    cin>>nummer[i];
    

    so des ist meine vor schleife in der von 0- n läuft. Sollte doch gehen oder?



  • 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. ...


Anmelden zum Antworten