Probleme mit Programmieraufgabe:
-
gleich kommt hacker mit seinen c arrays

-
Guckst du, da isser.
So, das ist der Fehler: nach dem ersten durchgang wird j inkrementiert (siehe zeile 76). Dann wird j natürlich positiv, also kann nur noch die zweite abfrage richtig sein (zeile 65).
Und @Praktisc...: Das, worum boolsche algebra geht nennt man 't' 'h' 'e' 'o' 'r' 'e' 't' 'i' 's' 'c' 'h' 'e' Informatik

-
#include <iostream> #include <vector> #include <string> using namespace std; vector<string> ExtrahiereSaetze(string text, bool satzzeichen = true); int main() { string eingabe = "Hey, dies ist ein Satz. Und dies ist gleich noch ein Satz. Test! 1, 2, 3. Na ja, so geht das dann weiter, denke ich. Oder auch nicht?"; vector<string> saetze = ExtrahiereSaetze(eingabe, true); // true bzw. false für mit bzw. ohne Satzzeichen for (vector<string>::iterator it = saetze.begin(); it != saetze.end(); ++it) { std::cout << *it << std::endl; } return 0; } vector<string> ExtrahiereSaetze(string text, bool satzzeichen) { vector<string> saetze; size_t pos = 0, last = 0; while ((pos = text.find_first_of("!?.", pos + 1)) != string::npos) { saetze.push_back(text.substr(last, pos - last + (satzzeichen ? 1 : 0))); last = pos + 1; } return saetze; }Man könnte noch die Leerzeichen am Satzanfang löschen lassen, aber dazu hatte ich jetzt keine Lust mehr

-
Hacker schrieb:
Und @Praktisc...: Das, worum boolsche algebra geht nennt man 't' 'h' 'e' 'o' 'r' 'e' 't' 'i' 's' 'c' 'h' 'e' Informatik

Es ging ihm wohl eher um die falsche Rechtschreibung.
Also:
Theoretischer Informatik
und
Boolesche algebra
-
Danke für die vielen Beiträge.
Also darf man so keine string arrays bilden?
Das problem ist, ich habe noch nicht viel programmierkenntnisse und wir müssen schon recht anspruchsvolle programmieraufgaben lösen. Ich sollte aber die Aufgabe mit meinem Wissen lösen können, wurde uns gesagt. Bisher weiss ich etwas zu allgemeiner boolescher Alegbra, if else switch Anweisungen, structs enums unions arrays, ein bisschen über in und output und ein wenig pointer.
Waren meine Ansätze überhaupt richtig?
mfg
-
Guck mal...
Es gibt die Programmiersprache C++, und den Programmierstil dazu.
Ohne Magic Constants (die auch nicht empfehlenswert sind) oder Konstanten werden C-Arrays gefährlich, google mal Buffer-Overflow... und das ist UB.
-
fghfgh schrieb:
#include <iostream> #include <vector> #include <string> std::vector<std::string> ExtrahiereSaetze(std::string text, bool satzzeichen = true); int main() { std::string eingabe = "Hey, dies ist ein Satz. Und dies ist gleich noch ein Satz. Test! 1, 2, 3. Na ja, so geht das dann weiter, denke ich. Oder auch nicht?"; std::vector<std::string> saetze(ExtrahiereSaetze(eingabe, true)); // Per Konstruktor übergeben for (const std::string &ref: saetze)// Range-based-for std::cout << ref << '\n'; // Endl unnötig }// Kein return std::vector<std::string> ExtrahiereSaetze(std::string text, bool satzzeichen) { std::vector<std::string> saetze; std::size_t pos = 0, last = 0; while ((pos = text.find_first_of("!?.", pos + 1)) != std::string::npos) { saetze.push_back(text.substr(last, pos - last + satzzeichen ));// Ternärer Operator unnötig last = pos + 1; } return saetze; }Hast du bei JW gelernt?
P.S.: Für das entfernen der Leerzeichen wäre nicht viel Arbeit von Nöten gewesen:
std::vector<std::string> ExtrahiereSaetze(std::string text, bool satzzeichen) std::vector<std::string> ExtrahiereSaetze(std::string text, bool satzzeichen = true) { std::vector<std::string> saetze; size_t pos = 0, last = 0; while ((pos = text.find_first_of("!?.", pos + 1)) != std::string::npos) { saetze.push_back(text.substr(last, ((text.length()-1 > pos && text.at(pos+1) == ' ') ? ++pos : pos) - last + satzzeichen )); // Mit dem Ternären Operator abfragen: Sind wir am Ende des Satzes? Wenn nicht, ist das nächste Zeichen ein White-Space? last = pos + 1; } return saetze; }
-
Hacker kriegt heute den preis für den lesbarsten Code des jahrhunderts

-
otze schrieb:
Hacker kriegt heute den preis für den lesbarsten Code des jahrhunderts

Schon von Malbolge gehört?
-
Hacker schrieb:
Schon von Malbolge gehört?
definitiv besser lesbar.
-
Nein, ich habe nicht bei JW gelernt. Tatsächlich habe ich das Buch nicht mal ansatzweise berührt.
Das Nutzen des Konstruktos von std::vector ist hier vollkommen irrelevant. Das Ergebnis ist das selbe. Einzig die Lesbarkeit leidet unter der zusätzlichen Klammerung.
Das der Ternäre Operator überflüssig ist, war mir klar: Ich habe das nur zum besseren Verständnis hinzugefügt.
Deine For-Schleife ist C++0x und hier nicht gefragt. Wenn es danach geht hätte ich die Ausgabe auch mit std::copy in einer Zeile lösen können. Aber auch hier war mir das Verständnis wichtiger.
Das std::endl unnötig ist, würde ich so nicht sagen. Es gibt Konsolen (insbesondere unter Linux), die einen einmaligen Impuls brauchen. Und da das Programm keine performancekritischen Operationen ausführt, sehe ich diesen Kritikpunkt ohnehin nicht ein.
Das return schreibe ich hier im Forum grundsätzlich immer aus Gründen der Kompatibilität, da viele Anfänger alte Compiler benutzen müssen.
Und das Entfernen des Leerzeichens: Auch hier war mir das Verständnis wichtiger, weshalb ich einen Einzeiler gemeiden habe.
Interessant finde ich aber, dass du alles mögliche kritisierst, was nicht von Bedeutung ist, aber Dinge außen vor lässt, die tatsächlich Sinn gehabt hätten.
Ich kritisiere mich hier mal selber und sage z.B., dass ich den std::string hätte als konstante Referenz übergeben sollen. Hab ich aber aus Gründen des Verständnisses auch nicht getan.
Wie dem auch sei, auf solche Schwanzvergleiche lege ich keinen Wert. Du hast hier aber definitiv den kürzeren gezogen

-
fghfgh schrieb:
Nein, ich habe nicht bei JW gelernt. Tatsächlich habe ich das Buch nicht mal ansatzweise berührt.
Sieht aber ein wenig so aus... egal.
fghfgh schrieb:
Das Nutzen des Konstruktos von std::vector ist hier vollkommen irrelevant. Das Ergebnis ist das selbe. Einzig die Lesbarkeit leidet unter der zusätzlichen Klammerung.
Findest du
es wahr, zugegebenermaßen, ein sehr stilistischer Kommentar.
Den werd' ich mir künftig verkneifen.

fghfgh schrieb:
Das std::endl unnötig ist, würde ich so nicht sagen. Es gibt Konsolen (insbesondere unter Linux), die einen einmaligen Impuls brauchen. Und da das Programm keine performancekritischen Operationen ausführt, sehe ich diesen Kritikpunkt ohnehin nicht ein.
Also, ich umformuliere meine Aussage bezüglich endl: Willst du, dass der Ausgabepuffer geleert wird?
fghfgh schrieb:
Das return schreibe ich hier im Forum grundsätzlich immer aus Gründen der Kompatibilität, da viele Anfänger alte Compiler benutzen müssen.
Kein Anfänger kann diesen Code verstehen, also wird er auch nicht in der Lage sein, dir zu Helfen und ist damit irrelevant.
fghfgh schrieb:
Interessant finde ich aber, dass du alles mögliche kritisierst, was nicht von Bedeutung ist, aber Dinge außen vor lässt, die tatsächlich Sinn gehabt hätten.
Ich kritisiere mich hier mal selber und sage z.B., dass ich den std::string hätte als konstante Referenz übergeben sollen. Hab ich aber aus Gründen des Verständnisses auch nicht getan.
Du hast Recht, das hätte wirklich Sinn gemacht. Wieso hast du so eine Faustregel ignoriert (ich auch, hab aber den Code nicht geschrieben sondern nur überflogen)? Und hier ist garantiert auch Schluss mit Verständnis! Es ist doch (auch jedem Anfänger) sehr klar, was eine Konstante Referenz ist!?!
fghfgh schrieb:
Wie dem auch sei, auf solche Schwanzvergleiche lege ich keinen Wert. Du hast hier aber definitiv den kürzeren gezogen

Aber definitiv nicht den kürzeren Schwanz

-
Kacker... ich meine Hacker, denkst du, dein Code wäre verständlicher und lesbarer?? Und nein, nicht jedem Anfänger ist klar, was eine konstante Referenz ist, weil Parameterübergabe per Referenz und andere performance-kritische Dinge üblicherweise nicht im ersten Buchkapitel behandelt werden. Dann kritisierst du noch die Rechtschreibung von anderen, obwohl du selber nicht besser schreibst..?
Wann hörst du auf zu klugscheißern?Ab auf die Wiese.
-
1. Wie bereits gesagt: Ein Anfänger hat hier nix zu suchen.
2. Und wo hab ich bitteschön Rechtschreibung kritisiert?
3. Nein, behind.. ich mein rewind, ich glaub nicht, dass mein Code besser ist, kein Grund dass das so sein muss.Edit: wo ist meine Rechtschreibung denn falsch?
-
Hacker ist halt in der Pubertät. Schwierige Phase.
-
Unpxre vfg fryorea Abbo! schrieb:
Hacker ist halt in der Pubertät. Schwierige Phase.
Tja, hast du ein Glück! Du bist noch nicht dadrin.
-
Wow. Ich musste nicht ein einziges mal etwas sagen und Hacker Raged. Das ist ein neuer persönlicher Rekord.