Witzprogramm schreiben ( Anfänger )
-
Mit rand ()%ArraySize oder rand ()%vector.size () kannst du zufällig Witze raussuchen. Ich schlage vor, die Witze in einem vector von strings zu speichern, wo logischerweise jeder string ein Witz ist.
Denkbar einfach.Edit: Und bevor einer kommt mit "% zerstört die bits" - Für so einen einfachen Zweck ist es egal.
-
MrFryze schrieb:
Also <iostream> und int main() sind jetzt im Trend. Ok. Cool
Mit *im Trend liegen* hat das nix zu tun. So wird es einfach vom aktuellen Standard definiert. Punkt.
@ky_fr34k
Die ...printf und ...scanf Funktionen verwendet man in C++ nicht mehr, das ist C. Sie sind zwar aus Gründen der Kompatibilität noch vorhanden, haben aber deutliche NachteileTypsicherheit, Bufferoverflows
enno-tyrant schrieb:
ich würde keine arrays nutzen. wer weiß schon wie lang sein witz wird? und im vorfeld 'char array[9999999]' zu nutzen wäre auch blödsinn.
mein vorschlag, die strings (witze) in eine datei umleiten
Hast du dir mal meinen ersten Beitrag angeschaut? Da werden keine rohen char-Arrays verwendet. Du kannst dort auch beliebig lange Texte eingeben ohne irgendwelche Dateiumleitungen.
-
Danke für die vielen Antworten.
Ok also ich habe folgendes gemacht.../* Dies ist ein Programm um einen Text einzulesen */ #include <iostream> #include <string> #include <conio.h> // Windowskonform using namespace std; // Unbekannt... int main() { string text, moin; // Variablendeklaration cout << "Gib einen Text ein: "; getline(cin, text); // Befehl zur Texteingabe cout << "\n" << text << "\n" << endl; //Ausgabe getline(cin, moin); cout << "\n" << moin; getch(); // Windowskonform }
Dort wo unbekannt steht da weiß ich noch nicht was dieses using namespaces std bedeutet, dass kam in meinem Lehrgang noch nicht vor.
Die Variablendeklaration habe ich an den Anfang gesetzt, damit man da besser durchblickt.. mich verwirrt das total, wenn die irgendwo mittendrin stehen.
Dafür bin ich noch zu weit am Anfang
-
Zum namespace std:
stell dir mal vor, du würdest eine tolle Bibliothek der, sagen wir, uvzGMBH benutzen. Diese hat eine tolle Funktion string& print(int), was auch immer die macht. Außerdem gibt es eine Funktion int sum(int,int), die du nicht brauchst. Dir fehlt nun die eine andere Funktion, die du in der Bibliothek der, sagen wir, abc-Gesellschaft gefunden hast. Dummerweise haben die aber auch eine Funktion int sum(int,int). Nun regt sich dein compiler auf, das die Funktion 2* definiert wird, klar. Eine übliche Möglichkeik wäre, das die Funktionen alle uvz_print, uvz_sum, abc_sum... heißen. Und genau das machen namespaces. Z.B. schreibt die uvzGMBH in der Bibliothek jetzt:namespace uvz { std::string& print(int) { //*mach_was_tolles* }; int sum(uínt,int) { //*mach_noch_was_tolles* }; };
Nun kannst du sowas machen:
#include "uvz.h" //da ist print drin, sowie sum #include "abc.h" //da ist sum drin. int main() { //sum(4,5); //Fehler, gibts nicht abc::sum(4,5); //korrekt uvz::sum(4,5); //korrekt //using uvz::sum //sum(4,5); //auch korrekt; using namespace abc; //wir wollen alle Funktionen aus abc benutzen sum(4,5); //auch korrekt };
Ich hoffe dir ist das klarer geworden...
-
oder kurz gesagt:
deine befehle die DU (in deinem sc) nutzt liegen im std-namensraum der include-dateien.
du kannst nach dem includen 'using namespace std;' schreiben (was allerdings ziemlich prozessorlastig ist, da du ja nicht alle befehel brauchst) oder du schreibst die befehle an die du brauchst: using std::cout, std::endl; usw...
oder vor jedem befhelseinsatz (macht sinn wenn du einen befehl nur einmal nutzt, dann brauchst du diesen auch nicht gleich angeben),
#include...
using std::cout;
int main(){
cout << "hallo ";
cout << "welt" << std::endl;}
-
Ok das habe ich soweit verstanden.
Nun muss ich erstmal nach der ersten Eingabe eine Fallentscheidung machen. Jenachdem was eingegeben wird soll er dann aus einer zweiten DAtei oder aber derselben etwas rausgeben.Korrekt ?
-
Ich würde ja Vorschlagen, das du den gegebenen Ansatz weiterspinnst. Du hast eine Datei, so nach dem Stil:
#\ERKENNUNGSMERKMAL\:\WITZ\ ...
Eine richtige Datei könnte also so aussehen:
#\ganztoll\:\Hier steht ein ganz tolter Witz.\ #\nochbesser\:\Hier steht ein noch besserer Witz\ ...
Diese Witze lädst du dann in eine map, z.B.:
map<string,string> die_witze; ifstream& einlesen(ifstream& i) { while(*es_sind_moch_witze_vorhanden*){ char c=i.get(); while(c!='#') c=i.get(); c=i.get(); while(c='\\') c=i.get(); string erkennung; c=i.get(); while(c!='\\') { erkennung.push_back(c); c=i.get(); }; string witz; c=i.get(); while(c!=':') ... die_witze[erkennung]=witz;}; return i; };
Jetzt hast due die Witze in einer map. Wenn nun der Benutzer eine witz sehen möchte, schreibst du sowas wie:
string eingabe; cin>>eingabe; try{cout<<die_witze.at(eingabe);} catch(exception&){cout<<"Fehlerhafte Eingabe!";};
-
Mis2com schrieb:
Arrays sind zwar syntaktisch korrekt, aber werden heute vielfach durch die STL ersetzt etc.
was sind den STL??
-
ky_fr34k schrieb:
Mis2com schrieb:
Arrays sind zwar syntaktisch korrekt, aber werden heute vielfach durch die STL ersetzt etc.
was sind den STL??
Standard Template Library.
http://www.sgi.com/tech/stl/
-
Hmm also das verstehe ich nicht so ganz...
Ich habe mir ein C++ Buch gekauft "Grundkurs Softwareentwicklung mit C++" von Dietrich May.
Habe leider noch nichts entsprechendes gefunden.
Ich bin dabei das Buch komplett zu lesen würde aber gerne als kleine Auflockerung erst dieses Mini Programm schreiben.Der ganze Code ist für mich unschlüssig
Kann ich nich einfach eine Abfrage machen, die dann im programm per Zufall nen Witz rausliest Aufgrund der Kategorie die jemand eingegeben hat ?Gruß
-
devil81 schrieb:
MrFryze schrieb:
Entschuldigung ich kann immer nicht folgen. Was ist an meinem Vorschlag so falsch? Ich finde es gut das AlternativEnde so viele Vorschläge bekommt.
Man verwendet bei STL headern kein .h mehr, da diese als deprecated
d.h. veraltet eingestuft sind, und sie gibt es nur noch aus Kompitabilitätsgründen.
Also statt <iostream.h> dann <iostream>.Und laut Standard gibt Main einen Wert (int) zurück, man schreibt also
auch kein void main() mehr.Devil
Das sind dann wohl die zwei Kommentare, von denen mata gesprochen hat
-
Hallo zusammen !
Nicht das ihr noch denkt ich hätte das programm aufgegeben.
Mir kam eine andere Idee Hier der COde/* Dies ist ein Programm um einen Text einzulesen */ #include <iostream> #include <string> #include <conio.h> // Windowskonform using namespace std; // Unbekannt... int main() { string text; // Variablendeklaration cout << "Witzkategorie eingeben: \n"; getline(cin, text); // Befehl zur Texteingabe if (text == witz ) cout <<" Hier der witz "; if (text != witz) cout <<"Fehleingabe"; getch(); // Windowskonform return 0; }
Das Problem ist nur, dass es nicht funktioniert.. ALso die Abgleichung funktioniert nicht.. Oben kann man dann wenn das Programm fertig ist die Kategorie eingeben und er geht dann einfach in die Schleife und sucht dann per zufall ( ma schaun wie das geht ) einen Witz raus.
So in der Art könnte das doch laufen oder ??
Weiß nur nicht warum er da immer die Fehleingabe nimmt.Gruß
-
Ach eine kleine Sache noch.
ich hatte "witz" auch erst als String angegeben, aber da das ja nicht ging hab ich es wieder entfernt, also das war mir schon klar
-
Erstmal
if (text == witz ) cout <<" Hier der witz "; if (text != witz) cout <<"Fehleingabe";
schreibt man eher so
if (text == witz) cout <<" Hier der witz "; else cout <<"Fehleingabe";
Und wie initialisierst du 'witz'? Und hast du auf Gross-/Kleinschreibung geachtet. Der == Operator von std::string vergleicht afaik case-sensitive.
-
Die Variante funktioniert in Windows mit DEVC++ nicht sowohl, als auch nicht mit BeIDE.
Ich meine, aber das die dieselben Compiler verwenden.
Egal ich bekomme folgenden FehlerError : /boot/home/c/witz/witz.cpp: In function
int main()': parse error before
<'
witz.cpp line 26 cout <<"Fehleingabe";Ich dachte ich mache die Witzkategorieen alle als string und dann die ganzen if´s hintereinander nach denen er dann auswählt.
Gibts eine bessere Lösung ?
Also quasi immer text == beamte oder ähnlich ... ?gruß
-
AlternativEnde schrieb:
Error : /boot/home/c/witz/witz.cpp: In function
int main()': parse error before
<'
witz.cpp line 26 cout <<"Fehleingabe";Keine Ahnung was dein Compiler hat, der Code ist jedenfalls korrekt. Bist du dir sicher, dass das der ist, welchen du compilierst?
-
Hi
also ich würde das mit einem Switch Lösen:#include <iostream> #include <string> #include <conio.h> using namespace std; int main() { char eingabe = 0; cout << "1: Mantawitz\n"; cout << "2: Blondienwitz\n"; cout << "3: Beamtenwitz\n"; cout << "\nWitzkategorie eingeben oder <ESC> fuer Exit:"; while (eingabe !=27) // ESC als einzige Abbruchbedingung { eingabe = getch(); // Warte auf Taste switch (eingabe) { case '1': cout << "\nDies ist ein Mantawitz.\n"; break; case '2': cout << "\nDies ist ein Blondienwitz.\n"; break; case '3': cout << "\nDies ist ein Beamtenwitz.\n"; } } return 0; }
In dem case rufst du eine Funktion auf der dir Zufällige einen witz in der Kategorie raussucht.
Für besser Ausgabe empfehle ich dir "Improved Console" bei der du
"GotoXY", "ClearScr", und Farben benutzen kannst.
siehe hier -> http://www.c-plusplus.net/forum/viewtopic.php?t=86429(Weiß zwar nicht ob "conio.h" c++ konform ist, aber es ist die einzige Möglichkeit ein einzelens Zeichen zu bekommen glaub ich)
-
Hi !
ja daran dachte ich auch schon, aber getch(); bekomme ich nicht in BeIDE oder ich weiß jedenfalls noch nicht wie.Was bedeutet eingabe != 27 .. ? Warum 27 ? Ist das das ASCII zeichen für ESC ?
-
Ich würde hier nicht mit Arrays arbeiten. Am besten du arbeitest mit doppelverketteten Listen weil du ja nie weiss wieviel Witze kommen
-
Mit Listen habe ich noch nie etwas gemacht...
Ich habe jetzt aber den Zufallsgenerator eingebaut und das ganze sieht nun wie folgt aus...#include <iostream> #include <string> #include <conio.h> #include <ctime> #include<stdio.h> using namespace std; int main() { char eingabe = 0; cout << "1: Mantawitz\n"; cout << "2: Blondienwitz\n"; cout << "3: Beamtenwitz\n"; cout << "\nWitzkategorie eingeben oder <ESC> fuer Exit:"; while (eingabe !=27) // ESC als einzige Abbruchbedingung { eingabe = getch(); // Warte auf Taste switch (eingabe) { case '1': cout << "\nDies ist ein Mantawitz.\n"; srand(time(NULL)); cout << rand()% 11 << endl; break; case '2': cout << "\nDies ist ein Blondienwitz.\n"; break; case '3': cout << "\nDies ist ein Beamtenwitz.\n"; } }
Derzeit bin ich noch am grübeln, wie ich den Witzen, die ich über cout ausgeben lassen kann eine Erkennungsnummer geben kann dann wäre das Problem gelöst.
Das mit der Ausgabe der Zahl ist nur zu Vorführungszwecken gemacht..gruß