Klassen Aufgabenstellung
-
Ich würde mein Grundgerüst folgendermaßen konstruieren:
Klasse Kurs
Instanzvariablen:
int alphalen; | Kursnamen inkl Stringlänge bestimmen
char *alpha; |char beta[20] | Teilnehmer inkl Stringlänge bestimmen
int betalen[20] |
int matrikelnummer[20] | jeder Teinehmer erhält eine Matrikelnummer
int index[20] | Indexnummer für jeden Kursteilnehmer
int ergebnisse[20][10] | die jeweiligen Testergebnisse der KursteilnehmerKönnte ich das überhaupt so implementieren? Hab noch nie Felder in Klassen verwendet.
-
Pokerface schrieb:
Könnte ich das überhaupt so implementieren? Hab noch nie Felder in Klassen verwendet.
Ja, man kann Felder in Klassen haben. Das funktioniert genau so wie bei normalen Variablen auch.
ABER:
-Es wurde ja nur verlangt, dass die Zeichenketten als char-Felder dargestellt werden (eigentlich eine sehr dumme Idee, aber das ist eben die Aufgabe
), nicht der Rest.
-Dieser Vorgabe bist du beim Kursnamen aber ohnehin nicht gefolgt. Warum der Bezeichner alpha für eine Kursbezeichnung? Warum die Länge mitschleppen?
-Überhaupt ist ein char ein Buchstabe, keine Zeichenkette. Wende diese Erkenntnis mal auf die Namen der Studenten an.
-Warum ist ein Student kein Objekt für sich?
-Eine Matrikelnummer ist eine Ziffernfolge, keine Zahl
-Was sollen folgende Variablen darstellen? beta, indexDa gibt es noch viel zu verbessern. So wie es jetzt ist, würde ich empfehlen, alles wegzuwerfen und noch einmal von vorne anzufangen. Außerdem solltest du dir dringend angucken, wie Klassen in C++ funktionieren und wie Zeichenketten in C funktionieren.
-
Ich hab mir das folgendermaßen vorgestellt:
int alphalen & char *alpha
sind Instanzvariablen die ich verwende um einen einen gültigen Kursnamen zu konstruieren. Der Benutzer gibt einen Kurskonstruktor an z.b. "Programmieren" und in meinem Konstruktor wird die Länge vom übergegebenen String berechnet. Dieser erstellt nun ein alpha-feld mit dieser Länge und der übergebene Name wird in das alpha Feld übertragen;was char beta[20] angeht, hab ich kompletten Mist geschrieben.
betalen ist somit auch hinfällig.Instanzvariable "Index" sollte die Nummer sein, an der man den Teilnehmer klar erkennen kann.
index[20] & matrikelnummer[20] weil es ja max 20 Studenten sind. (sollten aber wohl index[19] und matrikelnummer[19] sein)
-
Jetzt verschlimmbesserst du alles, weil du meine Kritik nicht verstanden hast.
int alphalen & char *alpha
sind Instanzvariablen die ich verwende um einen einen gültigen Kursnamen zu konstruieren. Der Benutzer gibt einen Kurskonstruktor an z.b. "Programmieren" und in meinem Konstruktor wird die Länge vom übergegebenen String berechnet. Dieser erstellt nun ein alpha-feld mit dieser Länge und der übergebene Name wird in das alpha Feld übertragen;Das entspricht nicht der Aufgabenstellung, würde gar nicht funktionieren und die Länge ist sowieso unnötig. Es ist zwar nicht schön, dass ihr in eurem Kurs C++ vermischt mit C lernt, aber wenn es nun einmal die Aufgabe ist, dann musst du dir eben mal angucken, wie Zeichenketten in C funktionieren. Ohne dieses Wissen, kannst du die ganze Aufgabe sofort vergessen. Dabei ist das gar nicht einmal der Kern der Aufgabe.
Instanzvariable "Index" sollte die Nummer sein, an der man den Teilnehmer klar erkennen kann.
Und wie stellst du dir das vor? Was soll in diesem Index drinstehen? Ich glaube, du hast nicht so recht verstanden, was mit Indexzugriff gemeint ist.
index[20] & matrikelnummer[20] weil es ja max 20 Studenten sind. (sollten aber wohl index[19] und matrikelnummer[19] sein)
Wieder: Es ist zwar nicht schön, dass ihr quasi C mit Klassen lernt (was nicht C++ ist), aber wenn ihr C mit Klassen lernt, dann musst du dir auch mal angucken, was die Grundlagen von Arrays sind. Wie kommst du denn jetzt beispielsweise auf 19?
Meine Kritik an index und matrikelnummer war eine ganz andere:
-Der Index ist sowieso Quatsch, siehe oben.
-Ein einzelner Student sollte ein Objekt für sich sein, dann brauchst du nicht zig verschiedene Felder, die alle konsistent gehalten werden müssen
-Der Datentyp int für Matrikelnummern ist schlicht falsch. Matrikelnummern sind keine Ganzzahlen. Du nimmst ja (hoffentlich) auch keine ints für Postleitzahlen oder Telefonnummern, bloß weil diese aus Ziffern bestehen.
-
Ich hab es folgendermaßen gelöst, passt das so?
#include<iostream> #include"Kurs.h" using namespace std; int main () { Kurs Programmieren[20]; int a=0,c=0,d=0,i=0; double e=0, m=0; bool y; char g[50]; cout << "Bitte geben Sie die Nachnamen & die Matrikelnummern der Studenten ein: " << endl; for(i=0;i<20;++i) { do { cout << "Geben Sie bitte einen Nachnamen ein: "; cin >> g; cout << "Geben Sie bitte die Matrikelnummer ein: "; cin >> e; d += 1; Programmieren[i].eingabe(g,e); cout << "Noch ein Student? Ja(1)/Nein(0) " << endl; cin >> y; }while(y==true); break; } do { cout << "Was wollen Sie nun tun? " << endl; cout << "Studenten bewerten(1) " << endl; cout << "Den Durchschnitt eines bestimmten Studenten einsehen(2) " << endl; cout << "Den Durschnitt des Kurses berechnen(3)" << endl; cout << "Die Ergebnisliste fuer den gesamten Kurs drucken(4)" << endl; cout << "Beenden(0)" << endl; cin >> c; if (c==1) { cout << "Welchen Studenten wollen Sie benoten, geben Sie bitte eine Indexnummer ein: " << endl; cin >> i; if (i<0 || i>d) break; for(int j=0;j<10;++j) { cout << endl << "Geben Sie bitte nun die " << j+1 << ". Benotung ein: " << endl; cin >> a; Programmieren[i].beurteilen(a,j); } } if (c==2) { cout << "Von welchem Studenten wollen Sie den Durchschnitt sehen, geben Sie bitte die Indexnummer ein: " << endl; cin >> i; cout << Programmieren[i].durchschnitts() << endl << endl ; } if (c==3) { for (int j=0;j<d;++j) { m += Programmieren[j].durchschnitts(); } cout << "Der Kursdurchschnitt betraegt: " << (m/d) << endl << endl; } if (c==4) { for (int j=0;j<d;++j) { cout << j+1 << ".Student: " << Programmieren[j].durchschnitts() << " Punkte." << endl << endl; } } if (c<0 || c>4) { cout << "Ungueltige Eingabe!"; } } while(c!=0); return 0; }#include<iostream> #include<cstring> #include"Kurs.h" using namespace std; Kurs::Kurs() { namelen=0; name=0; for(int i=0;i<10;++i) ergebnisse[i]=0; } void Kurs::eingabe(const char *ok, double ak) { mnum=ak; namelen = ok ? strlen(ok) : 0; name = new char[namelen]; for(int i=0;i<namelen;++i) name[i]=ok[i]; } void Kurs::beurteilen(double a, int b) { ergebnisse[b]=a; } double Kurs::durchschnitts() { double a=0; for(int i=0;i<10;++i) a += ergebnisse[i]; return (a/=10); }#include<iostream> using namespace std; class Kurs { int namelen; double mnum; char *name; double ergebnisse[10]; public: Kurs(); void eingabe(const char *ok, double ak); void beurteilen(double a, int b); double durchschnitts(); };
-
Nein, das passt überhaupt nicht. Es sind immer noch so ziemlich alle Dinge falsch, die ich bereits angesprochen habe.
-
Inwiefern? Das meiste wurde ja komplett verändert (im Gegensatz zum Anfangspost). Wäre für konstruktive Kritik und Anregung sehr dankbar.
-
Pokerface schrieb:
Inwiefern? Das meiste wurde ja komplett verändert (im Gegensatz zum Anfangspost).
Das macht Dinge ja nicht unbedingt besser, nur anders.
Wäre für konstruktive Kritik und Anregung sehr dankbar.
Was soll ich noch mehr sagen? Fangen wir mal in ganz kleinen Babyschritten an, wie man so etwas (oder überhaupt irgendetwas) programmiert:
Welche Art von Objekten werden in der Aufgabenstellung beschrieben? Welche Eigenschaften haben diese? Beschreib das mal in Worten! So in der Art: Ein Kurs besteht aus bis zu 20 Studenten und hat einen Namen. Ein Student hat einen Namen und eine Matrikelnummer. Ein Name besteht aus bis zu 123 Zeichen...
-
Es gibt eine Klasse -> Kurs
Objekte -> Studenten max 20
Instanzvariablen (welche Eigenschaften haben die Studenten?) - sie haben einen Namen (x Zeichen lang), eine Matrikelnummer (Ziffernfolge) und haben max 10 Bewertungen. (Ziffernfolgen)
Methoden (was können sie tun?) - sie können bewertet werden; durch ihre Noten kann der Durchschnitt berechnet werden auf der Basis einer Person bzw aller Studenten im Kurs; es kann der Durchschnitt jedes einzelnen Studenten präsentiert werden.
-
Ist das wirklich alles? Da fehlt beispielsweise noch mindestens der Name des Kurses. Geh die Aufgabenstellung doch einmal gründlich durch. Das sollte doch selbstverständlich sein, dass man das machen muss.
Ist eine Note wirklich eine Ziffernfolge? Schließlich kann man damit rechnen.
Welche Methoden und Eigenschaften gehören zu welcher Klasse? Bei deiner Beschreibung herrscht Chaos, in deinem Code daher auch.
-
Die Benotung findet in Punkten statt, (siehe Angabe) -> Ziffernfolge;
Es gibt ja nur eine Klasse und zwar "Kurs" und max 20 Objekte das sind die Studenten. "Programmieren[20]" -> daraus kann man den Kursnamen leiten. Klartext wäre hier angebracht. Hab erst vor nicht allzu langer Zeit programmieren angefangen und bin erst seit über einer knapper Woche bei der objektorientierten Programmierung dabei. Also kann ich vieles noch gar nicht wissen.
-
Klartext im Sinne der fertigen Lösung wird hier nur sehr ungerne zur Verfügung gestellt, da es bei der absolut kein Lerneffekt erzielt.
Ihr werdet doch irgendwelche Unterlagen haben, in denen die Sprache zumindestens syntaktisch mal erklärt wird?
Und wenn ihr sowas wie OOP macht, dann wird der Dozent bestimmt auch darüber ein paar Worte verloren haben.Es gibt nicht nur eine Klasse und ich weiß leider nicht genau, was dich davon abhält, das zu erkennen.
Es gibt, wie du erkannt hast, die Klasse "Kurs", die einen Kurs repräsentiert.
Und jetzt soll dieser Kurz Studenten zugeordnet haben - was genau verstehst du denn jetzt daran nicht, dass es auch eine Klasse Studenten geben muss, die Studenten repräsentiert?
Was du mit "Programmieren[20]" andeutest, ist totaler Stuss.
Wäre "Programmieren" der Variablen-Name für eine Kurs-Instanz, so brauchst du zuerst mal kein Array davon und zweitens leitet sich daraus nicht der Name des Kurses ab ... Zu mindestens nicht für den Benutzer deiner "Software".
Du brauchst zwei Klassen. Beide Klassen müssen was können und gewisse Eigenschaften haben.
Schreib einfach mal beide Klassen hin und schreib dann zu jeder Klasse, was für Eigenschaften sie braucht und welche Methoden sie zur Verfügung stellen muss
Orientiere dich dabei an dem Aufgabentext.Das hat sehr wenig mit Programmieren zu tun sondern viel mehr mit logisch Nachdenken.
-
Vielen Dank für die Antwort.

Natürlich will ich keine fertige Lösung präsentiert bekommen, aber manchmal steht man einfach auf der Leitung und kommt keinen cm weiter ohne den kleinen Schubser.Unsere Lernunterlagen sind leider sehr mager ausgestattet. (Vererbung wird nicht vorgenommen).
Wahrlich hab ich wahrscheinlich den Text falsch interpretiert und mich auf die falschen Kernpunkte konzentriert.
Implementieren Sie eine Klasse Kurs zur Verwaltung der Teilnehmer (maximal 20) einer Lehrveranstaltung. Realisieren Sie einen Konstruktor, mit dem der Titel der Lehrveranstaltung festgelegt werden kann und weiters Methoden zur Eingabe von Namen und Matrikelnummern
-
Pokerface schrieb:
Unsere Lernunterlagen sind leider sehr mager ausgestattet. (Vererbung wird nicht vorgenommen).
Vererbung ist hier auch nicht notwendig oder sinnvoll.
Pokerface schrieb:
Implementieren Sie eine Klasse Kurs zur Verwaltung der Teilnehmer (maximal 20) einer Lehrveranstaltung. Realisieren Sie einen Konstruktor, mit dem der Titel der Lehrveranstaltung festgelegt werden kann und weiters Methoden zur Eingabe von Namen und Matrikelnummern
Zugegeben spricht die Aufgabenstellung nicht davon eine Klasse für Studenten anzulegen. Es wird aber auch nicht verboten und ist eigentlich ein logischer Schritt. Das dort eine Klasse steht hat meiner Meinung nach nichts zu bedeutet. Die Aufgabenstellung hätte ja auch lauten können "Implementieren sie eine Klasse Kurs zur ... und eine Klasse Studenten für ...".
-
wird gerade bearbeitet.
-
sebi707 schrieb:
Es wird aber auch nicht verboten und ist eigentlich ein logischer Schritt.
Bei einer Aufgabenstellung, die extrem in Richtung "C mit Klassen" geht, wäre ich sehr vorsichtig, was "logische Schritte" angeht
