Anfängerfragen zu einem Projekt mit Klassen
-
So!, jetzt hast du dich bei 95% der registrierten User hier disqualifiziert
[Grund: mangelnde Eigeninitiative]
In deinem ersten Beitrag schien es noch danach auszusehen, dass du C++ lernen willst. Mit diesem Beitrag hier aber nicht mehr:ventilatores schrieb:
Könnten wir die Ausgabe jetzt noch ein wenig, mit DeepCopy's Code, etwas edler machen?
z.Bsp.:
--------------------------------------------------------------------------------
Welches Wort suchen Sie?...eingabe Wort.....Die Anzahl Ihres gesuchten Wortes beträgt: .......Anzahl Wort....
--------------------------------------------------------------------------------
[Newbie] Das ist cin und cout und bissl if und so, das steht in Kapitel 1 vieler Bücher [/Newbie]
Jetzt mal ernst, das sind wirklich Grund-Grundlagen. Ließ dir ein paar Tutorial dazu durch und versuchs selber. Copy&Paste bringt dir 5% Lerneffekt.
-
ja, is ja jut

muss das halt bis Freitag fertig haben und hab ja schon in der Zwischenzeit selber dran rum gebastelt also, passt schon

venti
p.s. 95% an Kumpels verloren die mir nich mehr helfen wollen, puhhh...fett
naja hoffe Deep Copy gehört zu den restlichen 5% die mir nochmal helfen
-
@ ventilatores:
KasF hat völlig Recht, mangelnde Eigeninitiative ist hier wirklich nicht gern gesehen. Es ist auch eine ziemliche Ausnahme, dass sich überhaupt jemand so viel Zeit wie DeepCopy nimmt. Von daher solltest du eher dankbar sein statt weitere Forderungen zu stellen.Wenn du dich etwas mit der Materie auseinandersetzt und versuchst, DeepCopys Code zu verstehen, solltest du auch relativ schnell in der Lage sein, das Programm selbstständig zu erweitern. Aber dazu ist halt C++-Theorie unumgänglich - du kannst schliesslich nicht für jedes kleine Problem im Forum nachfragen.
Nichts für ungut, aber ich hoffe, dir ist das nun etwas verständlicher geworden.

-
KasF schrieb:
1.) Wieso ist der Stream aufm Heap und nicht aufm Stack ?
2.) Wieso reichst du deinen Member m_pfs in der Klasse rum ? Falls das Absicht ist, damit ZaehleWorte() auch mit anderen Quellen benutzt werden kann, stimmt hier was mit der Kohärenz nicht ?
3.) Dein ZaehleWorte() ist nicht unbedingt performant mit den ganzen Stream-Zugriffen.
4.) WortZurMap kann ein Einzeiler sein, siehe mein Code und die Referenz deiner Wahl.
5.) Für die Container-Kopieroperationen gibts es schöne Konstruktoren und std::copy.zu 1)
Ich möchte das Objekt erst initialisieren/instanzieren wenn der Benutzer das Objekt tatsächlich braucht.zu 2)
Das hängt mit der von mir gewählten Richtline für Funktionssignaturen zusammen, ich erarbeite mir gerade eine neue Strategie für die Übergabe vom Elementdaten um Seiteneffekte zu minimieren.zu 3)
Kann ich nicht nachvollziehen, ich möchte nur den Speicher verbrauchen den ich auch benötige, dann bleibt mir nur die Möglichkeit immer das nächste Token aus dem Stream zu holen.zu 4)
Habe ich gesehen, über den operator[] das hat Vorteile und Nachteile. Vorteil die Map legt das Objekt in die Map wenn der Schlüssel nicht vorhanden ist und erhöht den integer, oder einfach nur den integer, dieses Konzept versagt aber bei komplexen Datentypen da es zwar eine Default-Initialisierung gibt aber ich komme so nicht an die "inneren Objekte", und der Code sollte als Anschauungsmaterial dienen wie man auch bei komplexen Datentypen arbeitet.zu 5)
Daran werde ich diese Woche noch arbeiten um das zu verbessern... danke für den Tip

@ventilatores
Vielen dank für Blumen, vielen Dank, wie lieb von Dir!
ventilatores schrieb:
Ich habe doch mit meinen Projekt ganz anders Angefangen als DeepCopy und für mich
als super Anfänger ist das echt nicht leicht, dieses wie-was-wozu u.s.w.
...
p.s. 95% an Kumpels verloren die mir nich mehr helfen wollen, puhhh...fett
naja hoffe Deep Copy gehört zu den restlichen 5% die mir nochmal helfen
Soweit es meine Zeit zulässt werde ich dir gerne Helfen, wenn du fragen zum Code hast stell sie einfach ich habe mir leider nicht die Mühe gemacht den Code zu Dokumentieren.

Für dein restliches Problem solltest du eigentlich nur absolute Grundlagen benötigen, so wie ventilatores und Nexus es gesagt haben, wirklich. Ist nicht mehr als ein paar If's und ein bisschen cin und cout. Versuche den Code von mir oder KasF zu verstehen, dann solltest du dein Prob. mit links hinkriegen. Und wenn du nich weiter kommst, dein Stück fehlerhaften Code posten und hoffen das einer hilft.

Grüssle DC!
-
hi,
warum wird nach dem zugelassenen Zugang die Schleife nicht weiter geführt und die Datei nicht durchsucht?
Habe jetzt einiges probiert und komme nicht weiter.greetz
Venti#include <iostream> #include "wc.hpp" using namespace std; int pnummer, code; int personalnummer = 1999; int geheimcode = 1212; int main() { string datei = "collection.txt"; CWortCount wc; cout << "Geben Sie Ihre Personalnummer ein: "; cin >> pnummer; cout << "\nGeben Sie Ihren Zugangscode ein: "; cin >> code; if (!wc.OeffneDatei(datei), (pnummer == personalnummer) && (code == geheimcode)) { cout << "\nZutritt gewaehrt!\n"; return 0; } if ((pnummer == personalnummer) && !(code == geheimcode)) { cout << "\nFalscher Zugangscode!\n"; return 0; } if (!(pnummer == personalnummer) && (code == geheimcode)) { cout << "\nFalsche Personalnummer!\n"; return 0; } if (!(pnummer == personalnummer) && !(code == geheimcode)) { cout << "\nFalsche Zugangsdaten!\n"; return 0; } cout << "Kann die Datei nicht oeffnen : " << datei << endl; cout << "Bitte Warten, analysiere die Datei " << endl; wc.SortWord(); cout << "Alle gefunden Wörter in: " << datei << endl; for(int i = 0; i < wc.WortAnzahl(); i++) cout << "Anzahl von " << wc[i].Name << " betraegt : " << wc[i].Anzahl << endl; return 0; }
-
if (!wc.OeffneDatei(datei), (pnummer == personalnummer) && (code == geheimcode)) // <- hier darf kein , stehen { cout << "\nZutritt gewaehrt!\n"; return 0; <- damit wird dein Programm beendet! Das ist falsch }Diese Anweisung macht nicht viel Sinn, du must das Öffnen separat ausführen und überprüfen!
Besser:
if (!wc.OeffneDatei(datei)) { cout << "Kann die Datei nicht oeffnen : " << datei << endl; return 0; } // ab hier alle if (...) aber ohne !wc.OeffneDatei(datei) if (!(pnummer == personalnummer) && (code == geheimcode)) { cout << "\nFalscher Zugangscode!\n"; return 0; // <-- Beenden ok, die personalnummer war falsch } // ... usw. // diese zeile ganz nach oben... // cout << "Kann die Datei nicht oeffnen : " << datei << endl; cout << "Bitte Warten, analysiere die Datei " << endl; // ab hier weiter wie bisher.. wc.SortWord(); cout << "Alle gefunden Wörter in: " << datei << endl; // ... usw.
-
ahhh, alles klar thanx DC gut erklärt.
ups... palim palim, da is'n ERROR!
--->jetzt geht die PW Abfrage nicht mehr,
also man kommt auch mit falsche Zugangsdaten rein.um gottes Willen!

gruß
Venti
-
DeepCopy schrieb:
zu 1)
Ich möchte das Objekt erst initialisieren/instanzieren wenn der Benutzer das Objekt tatsächlich braucht.Ok, da aber dein m_pfs nur lokal in OeffneDatei, hättest du es dort auch aufm Stack erzeugen können. Würde dann auch erst bei Benutzung der Funktion generiert werde. Desweiterhin tust du zwei Sachen bzw. eine Sache in OeffneDatei ohne das es der Funkionsname andeutet, nämlich ZaehleWorte aufrufen. Wieder etwas, was in Richtung Orthogonalität/Kohärenz geht.
DeepCopy schrieb:
zu 3)
Kann ich nicht nachvollziehen, ich möchte nur den Speicher verbrauchen den ich auch benötige, dann bleibt mir nur die Möglichkeit immer das nächste Token aus dem Stream zu holen.Letzendlich holst du doch ehe alles raus, insofern wäre es performanter mehrere Bytes auszulesen, statt jedes mal 1-Byte aus dem Stream zu lesen. Alles in einem Rutsch einlesen und dann im Hauptspeicher byteweise arbeiten sollte schneller sein.
DeepCopy schrieb:
zu 4)
Habe ich gesehen, über den operator[] das hat Vorteile und Nachteile. Vorteil die Map legt das Objekt in die Map wenn der Schlüssel nicht vorhanden ist und erhöht den integer, oder einfach nur den integer, dieses Konzept versagt aber bei komplexen Datentypen da es zwar eine Default-Initialisierung gibt aber ich komme so nicht an die "inneren Objekte", und der Code sollte als Anschauungsmaterial dienen wie man auch bei komplexen Datentypen arbeitet.Naja, wir habens hier aber mit primitiven Typen zu tun

DeepCopy schrieb:
zu 5)
Daran werde ich diese Woche noch arbeiten um das zu verbessern... danke für den Tip

Jop, habe mal irgendwo aufgeschnappt das du anfängst STL-Luft zu schnuppern

-
@DeepCopy...hi
ich habe jetzt ein wenig rumprobiert und den kleinen Fehler gefunden.
[cpp]// Alt: if (!(pnummer == personalnummer) && (code == geheimcode)) // Neu: if ((pnummer [b]!=[/b] personalnummer) [b]|| [/b](code [b]!=[/b] geheimcode)) ! <--- entfällt gänzlich [/cpp]gruß
Ventip.s. Ich möchte mich nochmals für die großartige Hilfe von DC bedanken, der mir durch sein gezeigtes Beispiel C++ näher gebracht hat.
.
-
die beiden sollten eigentlich identische ergebnisse liefern...
!( A && B ) == !A || !B
-
KasF schrieb:
Wieder etwas, was in Richtung Orthogonalität/Kohärenz geht.
Wenn Orthogonalität/Kohärenz für ungewollte Abhängigkeit oder unerwünschte Seiteneffekte steht, dann muss ich dir wirklich recht geben, das ist mir bei der Entwicklung der Klassen-Schnittstelle auch aufgefallen, aber... mal ehrlich... nach all der Arbeit hatte ich einfach keine Lust mehr da noch etwas zu ändern und den Aufruf zu ändern, zumal es sich hierbei eher um ein Beispiel handelt, trotzdem Danke für deinen Hinweis.

It0101 schrieb:
!( A && B ) == !A || !B
@ventilatores Das was It0101 hier aufzeigt ist der Satz von De Morgan der besagt, wenn ich einen Ausdruck wie '(A && B)' negiere, also '!(A && B)' dann kann ich den Ausdruck immer so umformen das die Aussagen 'A', 'B' negiert werden also '!A', '!B' und der Operator des Ausdrucks && umgekehrt wird, also aus '&&' wird '||' und umgekehrt, das für dann zu '(!A || !B)'.