Hilfe bei Sortierung und Zechenfolge

Thaelisin

Mitglied
Danke dir, ja das habe ich jetzt noch gemacht, aber das eigentliche Problem ist, dass wenn ich mehrere "Datensätze eingebe, nur beim ersten Vor, sowie Nachname der erste Buchstabe groß geschrieben wird. Er verändert die kleinzuschreibenden Wörter gar nicht und bei den folgenden Vor und Nachnamen gar nichts.
 

Thaelisin

Mitglied
Entschuldigung, hier folgt der aktuelle Code:

C++:
#include <iomanip>
#include <iostream>
#include <string>

using namespace std;

void main(void)

{
   
    int  anzahl,i = 0,j=0 ;
    char Vornamen[100][10];
    char Nachnamen[100][10];
    char Matrikelnummern[100][10];

    cout << "Bitte geben sie die Anzahl der anzulegenden Daten fest: " << endl;
    cin >> anzahl;

    for ( i = 0; i < anzahl; i++)
    {
        cout << "Geben sie die Vornamen ein: " << endl;
        cin >> Vornamen[i];
        cout << "Geben sie die Nachnamen ein: " << endl;
        cin >> Nachnamen[i];
        cout << "Geben sie die Matrikelnummern ein: " << endl;
        cin >> Matrikelnummern[i];

       
    }

    for (size_t i = 0; i < 100; i++)
    {
        for (size_t j=0; j<10; j++)
        {
            char& ref = Vornamen[i][j];
            if (j == 0) ref = toupper(ref);
            else ref = tolower(ref);
        }
    }

    for (size_t i = 0; i < 100; i++)
    {
        for (size_t j = 0; j < 10; j++)
        {
            char& ref = Nachnamen[i][j];
            if (i == 0) ref = toupper(ref);
            else ref = tolower(ref);
        }
    }
    cout << anzahl<<endl;
    for (size_t i = 0; i < anzahl; i++)
    {
        cout << Vornamen[i]<<"\t";
        cout << Nachnamen[i]<<"\t";
        cout << Matrikelnummern[i] << "\t" << endl;;
    }

}
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

hmm - ich sehe immer noch keine Bearbeitung von Nachnamen ..... :(
(ist das nicht Gleiche wie oben ??) :confused:

VG Klaus
 

cwriter

Erfahrenes Mitglied
Danke dir, ja das habe ich jetzt noch gemacht, aber das eigentliche Problem ist, dass wenn ich mehrere "Datensätze eingebe, nur beim ersten Vor, sowie Nachname der erste Buchstabe groß geschrieben wird. Er verändert die kleinzuschreibenden Wörter gar nicht und bei den folgenden Vor und Nachnamen gar nichts.
Ich sehe das Problem.
Es fehlt dir an grundlegendem Verständnis von Feldern, weshalb es nicht sehr sinnvoll ist, dir die Lösung direkt zu geben.

"Felder" oder Arrays sind schlicht eine andere Schreibweise für viele Variablen.
C:
char a[2];
//dasselbe wie (aber natürlich nur semantisch, du kannst einen Array nicht mit '_' indizieren.
char a_0;
char a_1;
Was du nun brauchst sind "2-dimensionale Arrays". Diese sind eigentlich Beschiss: Denn wenn man es sich genau überlegt, sind Arrays ja so aufgebaut:
C:
char a[2][3]; //Ich würde hier von aussen nach innen gehen: char[3] in einem Array der Grösse 2:
/*    0 1 2
a[0]: * * *
a[1]: * * *

Man sieht: Das könnte man auch als char[6] schreiben:
a[0]: *
a[1]: *
a[2]: *
a[3]: *
a[4]: *
a[5]: *

Und der Zugriff a[1][2] ist somit semantisch nichts anderes als a[1*3 + 2] (syntaktisch ist das aber falsch für char[][]!)

*/
Es ist nun so, dass aus Optimierungsgründen der rechteste Index am häufigsten, der linkeste am seltensten geändert/benutzt werden sollte. Siehe dazu Cachelines / Pages. Umgekehrt ist zwar semantisch auch korrekt, aber sehr viel langsamer.
In deinem Beispiel hat du schon richtig den rechteren Index für die Strings, den linken Index für die einzelnen Namenseinträge verwendet. In deinem Code jedoch verwechselst du die Indizes, nicht beim Indizieren selbst, sondern beim Prüfen, ob es der erste Buchstabe (vgl. mit "erster Eintrag") ist.
(Daher sollte man Code nicht einfach direkt kopieren... :-])
C:
    for (size_t i = 0; i < 100; i++)
    {
        for (size_t j=0; j<10; j++)
        {
            char& ref = Vornamen[i][j];
            if (i == 0) ref = toupper(ref);
            else ref = tolower(ref);
        }
    }

Gruss
cwriter

/EDIT: Ah, du hast es schon gefunden :) (aber nur bei den Vor- nicht aber bei den Nachnamen)
 
Zuletzt bearbeitet:

Thaelisin

Mitglied
Danke die Erklärung war hervorragend, da kann sich mein Dozent ne Scheibe abschneiden :D

Jetzt sieht mein Code so aus und ich glaube es passt!

C++:
#include <iomanip>
#include <iostream>
#include <string>

using namespace std;

void main(void)

{
   
    int  anzahl,i = 0,j=0 ;
    char Vornamen[100][10];
    char Nachnamen[100][10];
    char Matrikelnummern[100][10];

    cout << "Bitte geben sie die Anzahl der anzulegenden Daten fest: " << endl;
    cin >> anzahl;

    for ( i = 0; i < anzahl; i++)
    {
        cout << "Geben sie die Vornamen ein: " << endl;
        cin >> Vornamen[i];
        cout << "Geben sie die Nachnamen ein: " << endl;
        cin >> Nachnamen[i];
        cout << "Geben sie die Matrikelnummern ein: " << endl;
        cin >> Matrikelnummern[i];

       
    }

    for (size_t i = 0; i < 100; i++)
    {
        for (size_t j=0; j<10; j++)
        {
            char& ref = Vornamen[i][j];
            if (j == 0) ref = toupper(ref);
            else ref = tolower(ref);
        }
    }

    for (size_t i = 0; i < 100; i++)
    {
        for (size_t j = 0; j < 10; j++)
        {
            char& ref = Nachnamen[i][j];
            if (j == 0) ref = toupper(ref);
            else ref = tolower(ref);
        }
    }
    cout << anzahl<<endl;
    for (size_t i = 0; i < anzahl; i++)
    {
        cout << Vornamen[i]<<"\t";
        cout << Nachnamen[i]<<"\t";
        cout << Matrikelnummern[i] << "\t" << endl;;
    }

}
 

vfl_freak

Premium-User
Moin,

doch, sieht weitgehend schon sehr gut aus :)

Zwei Anmerkungen:
Du brauchst IMHO keine zwei for-Schleifen, sondern kannst es auch in einer abarbeiten!
Java:
for (size_t i = 0; i < 100; i++)
{
    for (size_t j=0; j<10; j++)
    {
        char& ref = Vornamen[i][j];
        if( j == 0 )
        {
            ref = toupper(ref);
        }
        else
        {
              ref = tolower(ref);
        }

       char& ref = Nachnamen[i][j];
       if( j == 0 )
       {
            ref = toupper(ref);
       }
       else
       {
            ref = tolower(ref);
       }
    }
}
Zudem würde ich immer klammern, auch wenn es hiernicht zwigend erforderlich ist
Aber bei Erweiterungen verliert man schnell den Überblick ;)

Dann frage ich mich aber noch, warum die Arrays eigentlich, fix bis 100 gehen.
Was ist, wenn Du als Anzahl nur 10 eingibst ??

VG Klaus
 

vfl_freak

Premium-User
ach so .... was ist für Dich i ??
Code:
for ( i = 0; i < anzahl; i++)
{
        cout << "Geben sie die Vornamen ein: " << endl;
        cin >> Vornamen[i];
// ...      
}

Da Deine Arraylänge ja fix ist, wird eine Eingabe der Anzahl > der Fixlänge problematisch!!

VG Klaus
 

Thaelisin

Mitglied
Ah ja, das mit den Klammern sieht wirklich etwas übersichtlicher aus, danke. i verstehe ich in dem Fall als Zähler, oder verstehe ich da etwas falsch?