Hilfe bei Sortierung und Zechenfolge

Thaelisin

Mitglied
Hallo Leute,

hier bin ich wieder und quäle mich mit meiner nächsten Übung. Diesmal geht es um die Sortierung und Zechenfolgen.
aufgabesortierung.png


In der Aufgabenstellung steht ja das ich 3 Felder gleicher Größe anlegen soll. Bedeutet das das ich 3 eindimensionale Felder anlegen muss oder ein mehrdimensionales mit 3x3 Feldern? Ein mehrdimensionales Feld kann ich anlegen und vorher definieren, aber ich weiß nicht wie es mit einer Eingabe klappt?
Wenn ich mein Skript richtig verstehe müssen dann die Felder/das Feld als string angelegt werden?

Ich wäre euch wieder wahnsinnig Dankbar wenn ihr mich mit Tipps und Ratschlägen unterstützt.

Viele Grüße
 

cwriter

Erfahrenes Mitglied
In der Aufgabenstellung steht ja das ich 3 Felder gleicher Größe anlegen soll. Bedeutet das das ich 3 eindimensionale Felder anlegen muss oder ein mehrdimensionales mit 3x3 Feldern?
Äh. Um ehrlich zu sein, macht die Aufgabe für mich nicht wirklich Sinn...
Ein effizienter (=fauler) Ansatz wäre folgender:
C:
struct entry
{
char vorname[256];
char nachname[256];
char matnr[256];
};
Diese Struktur hat wahrscheinlich genug Platz für alle Namen, aber verschwendet wahrscheinlich recht viel.
Normalerweise nutzt man hierfür std::string (oder char* mit malloc/new[]) und hat kein Problem mehr...
Ein mehrdimensionales Feld kann ich anlegen und vorher definieren, aber ich weiß nicht wie es mit einer Eingabe klappt?
Entweder mit einem Array von Structs:
C++:
entry* entries = calloc(anzahl, sizeof(entry)); //Calloc ist C/Posix. Hat aber den Vorteil der 0-Initialisierung.
cin >> entries[i].vorname; //usw.
Wenn ich mein Skript richtig verstehe müssen dann die Felder/das Feld als string angelegt werden?
Wenn ihr std::string verwenden dürft: Auf jeden Fall.

/EDIT:
Ok, es scheint einfach ein recht Blödsinniges Konzept zu sein: Scheinbar soll alles Spalten- und nicht Zeilenweise gespeichert werden.
Also kein Struct, sondern sowas wie:
C++:
std::string* vornamen = new std::string[anzahl];
//Dasselbe für nachnamen und MatNr
Und dann wird halt das Sortieren sehr doof: Du wirst die Sortierfunktion selbst schreiben müssen. Mensch, wie ich solche Aufgaben hasse. Nimm sowas Lahmes wie Bubblesort fürs Sortieren, das lässt sich immerhin schnell implemtieren.
Für die Ausgabe bieten sich die Formatspezifizierer von cout / printf an.

Gruss
cwriter
 

zerix

Hausmeister
Moderator
Hallo,

@cwriter
Ich denke, dass hier nicht String sondern eher ein char[] verwendet werden soll, da die Felder ja die gleiche Länge haben sollen.

Ich verstehe die Aufgabe so, dass es für jeden Vornamen, jeden Nachnamen und jede Matrikel jeweils ein char-Array erstellt werden soll und diese sollen alle die gleiche Länge haben.
Wenn ihr schon struct hattet, würde sich hier ein struct anbieten, wie @cwriter das vorgeschlagen hatte und dann ein Array von diesem struct. Falls nicht würden sich mehrere zweidimensionale Arrays anbieten.

Viele Grüße
Sascha
 

cwriter

Erfahrenes Mitglied
Ich verstehe die Aufgabe so, dass es für jeden Vornamen, jeden Nachnamen und jede Matrikel jeweils ein char-Array erstellt werden soll und diese sollen alle die gleiche Länge haben.
Ja, das meinte ich anfangs auch.
Aber semantisch macht es nicht viel Sinn, und der letzte Satz der Aufgabenstellung "Sortieren Sie das Feld der Nachnamen" deutet auf eine Trennung nach Spalte hin.
Aber ich kann mich auch täuschen; wie schon gesagt finde ich die Aufgabenstellung ziemlich verwirrend.

Gruss
cwriter
 

Thaelisin

Mitglied
Danke schon mal für die Hilfe. Also struct kommt im Skript, welches wir benutzen nicht vor.
So wie ich es verstehe soll die Sortierung einfach per Escape Sequenz z.B mit \t gemacht werden und mit tolower toupper die groß und klein-Schreibung korrigiert werden, wo ich aber noch nicht ganz kapiere wie die Befehle funktionieren.

Also lege ich jetzt 3 Felder an, für Vorname, Nachname und Matrikelnummer. Die Felder müssen vom Typ Char sein und die Feldgröße beliebig aber gleich groß sein? Dann brauche ich eine Eingabe in welcher ich die Anzahl festlege wie viele Vor- und Nachnamen, Matrikelnummern ich eingeben will. Wäre das für den Anfang richtig?

Hier mein Anfangscode aber da stimmt schon was nicht.

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

using namespace std;

void main(void)

{

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

    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];
    }

    //cout << Vornamen;
    //cout << Nachnamen;
    //cout << Matrikelnummern;


}
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
So wie ich es verstehe soll die Sortierung einfach per Escape Sequenz z.B mit \t gemacht werden
Nein, das ist keine Sortierung.

tolower toupper die groß und klein-Schreibung korrigiert werden, wo ich aber noch nicht ganz kapiere wie die Befehle funktionieren.
*Funktionen.
klein = tolower(any), sofern isalnum(any) != 0, sonst undef.
toupper ist analog.

Die Felder müssen vom Typ Char sein und die Feldgröße beliebig aber gleich groß sein?
Nein, die Grösse ist die erste Eingabe (siehe Beispiel).
Und nein, es muss ein Feld vom Typ char[] oder char* sein. (char[anzahl][grösseProName])
Wäre das für den Anfang richtig?
Nach Korrektur: Ja.

Gruss
cwriter
 

cwriter

Erfahrenes Mitglied
Hier mein Anfangscode aber da stimmt schon was nicht.
Ein C-String ist ein Array von chars, also char str[länge].
Ein Array von C-Strings ist somit ein Array von Arrays von chars, also char arr[anzahlStrings][länge]
Daher ist dein cin >> Vornamen[i] ein cin >> char, was nur ein einziges Zeichen einliest.
Um das zu beheben, musst du die Arrays wie oben zu 2d erweitern.

Gruss
cwriter
 

Thaelisin

Mitglied
Nein, die Grösse ist die erste Eingabe (siehe Beispiel).
Und nein, es muss ein Feld vom Typ char[] oder char* sein. (char[anzahl][grösseProName])
cwriter

Das verstehe ich gerade nicht? Ich habe doch ein ein Feld vom Typ Char[] angelegt? Wie definiere ich denn da die Größe pro Name? Oder sieht die Definition so aus wie du geschrieben hast? char[anzahl][grösseProName]

Oh ich war zu langsam und habe deinen Post nicht gesehen, entschuldige.
Aber selbst mit deinem zweiten Hinweis verstehe ich es gerade nicht.
 
Zuletzt bearbeitet:

Thaelisin

Mitglied
Ah so funktioniert die Eingabe, aber die Ausgabe ist einfach eine Reihe aus dem Hex-System?

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

using namespace std;

void main(void)

{
   
    int  anzahl,i = 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];
    }

    cout << Vornamen;
    cout << Nachnamen;
    cout << Matrikelnummern;


}
 

cwriter

Erfahrenes Mitglied
Ah so funktioniert die Eingabe, aber die Ausgabe ist einfach eine Reihe aus dem Hex-System?
Du müsstest sowas wie
C:
for(size_t i = 0; i < 100; i++) std::cout << Vornamen[i] << std::endl;
daraus machen.
Das verstehe ich gerade nicht? Ich habe doch ein ein Feld vom Typ Char[] angelegt? Wie definiere ich denn da die Größe pro Name? Oder sieht die Definition so aus wie du geschrieben hast? char[anzahl][grösseProName]
Verstehst du das mittlerweile?
Ja, die Definition ist so wie angegeben.

Gruss
cwriter