PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übungsaufgabe für "Anfänger" [C++]



Thunderstorm
28.12.2008, 21:29
So da wir jetzt bei FH auch so was mit Übungen Starten wollen vllt.
Wollte ich gleich mal los legen .
Also es ist ein Taschenrechner zu coden in (Konsolenanwendung)
1. Er sollte erst mal 2 Zahlen mit einander Addieren,Subtrahieren usw können. Musterlösung Kilck (http://ntg360.nt.ohost.de/C++/c++1.txt)

2. Mann sollte auswählen können was mann rechnen möchte.

3. Dann sollte er an geben wenn man bei der Auswahl eine falsche angabe
gemacht hat das er sagt das, das so nicht geht.
( z.B Wenn es nur eine Auswahl zwischen 1 bis 3 gib aber dann z.B 5 eingegben wird)

So vllt fallen euch ja noch ein paar sachen ein
Fürs erste wars denn von mir

Have fun and good luck

-[RiDER]-
28.12.2008, 22:14
Vermutlich gehts ums Golfen (http://de.wikipedia.org/wiki/Golf_%28Programmierung%29)... :)

Warum nur unter Windows? Die Aufgabe ist nicht gerade so Systemspezifisch, dass man sie auf ein einziges Zielsystem beschränken müsste... ;)
Lösungen hier in den Thread? Oder jeder einfach für sich, still im Kämmerchen?

Und warum sollte man nur mit Zahlen zwischen 1 und 3 rechnen lassen?

Coole Idee übrigens :)
GreetZ RiDER :D :D :D

Swola4
28.12.2008, 22:25
-]
Und warum sollte man nur mit Zahlen zwischen 1 und 3 rechnen lassen?


ich denke eher, dass er mit 1, 2, 3 wähle will ob addiert oder multipliziert oder etc. wird.

Thunderstorm
28.12.2008, 22:28
ja genau das war auf die 3. bezogen
Und ja klar könnt ihr Lösungen auch im Thread posten

ich werde auch noch muster lösungen bis morgen anfertigen die es per PM anfragen gibt. Ansonsten werde ich die Musterlösungen am 10 Januar online stellen.

Swola4
28.12.2008, 22:35
schade, dass es hier im forum keine Spoiler gibt, sonst könnte man die Lösung in den Spoiler packen und diesen nur bei Bedarf öffnen

der Vorteil: Man sieht nicht direkt die Lösung und kann sich erstmal selber überlegen wie man es anstellen könnte...

-[RiDER]-
29.12.2008, 17:23
So, hab jetzt mal völlig entgegen der Aufgabenstellung einen Rechner in ANSI-C unter Linux geschrieben. :P

Bei Interesse: http://nopaste.free-hack.com/index.php?id=1c9319b5db
EDiT: <digit> kann natürlich auch eine Fließkommazahl sein...

GreetZ RiDER :D :D :D

Pekel
01.01.2009, 12:36
So ich habe mich auch mal dran gemacht und versucht einen Taschenrechner zu schreiben. Sieht auch ganz nett aus, aber ihrgendwie haut bei mit "getchar();" nicht hin, wenn ich das Prorgamm solange stoppen will, bis jemand die Eingabetaste drückt, da kann mir vllt. noch einer Helfen :)


Hier der Source-Code:
http://nopaste.free-hack.com/index.php?id=2a144cc1d2

Cr4ckEye
01.01.2009, 13:02
Ich würde getch(); verwenden. Die Zahleneingabe kannst du noch unabhängig von der rechenmethode machen. Da man ja immer außer beim wurzelziehen und Quadrieren 2 zahlen eingeben muss.
Geht bestimmt noch schöner: ;-)

http://nopaste.free-hack.com/index.php?id=f5d79d6f6a

MfG

-[RiDER]-
01.01.2009, 17:03
Cr4ckEye, es war ausgemacht, die Kodes nicht direkt zu posten, sondern einen Link darauf!

Bitte korrigiere doch Deinen Post entsprechend. ;)

GreetZ RiDER :D :D :D

sh4w
05.01.2009, 17:09
So ich habe mich auch mal dran gemacht und versucht einen Taschenrechner zu schreiben. Sieht auch ganz nett aus, aber ihrgendwie haut bei mit "getchar();" nicht hin, wenn ich das Prorgamm solange stoppen will, bis jemand die Eingabetaste drückt, da kann mir vllt. noch einer Helfen :)


Hier der Source-Code:
http://nopaste.free-hack.com/index.php?id=2a144cc1d2


würde 2 mal cin.get(); benutzen da du dafür nur iostream brauchst x.x

]=-antr4xx-=[
06.01.2009, 16:54
@-[RiDER]-:
Es scheint mir als ob dir ein Flüchtigkeitsfehler in deinem Source unterlaufen ist:


# char isoperator(const char o)
# {
# if(o == '+' || o == '-' || o == '*' || o == '/')
# return o;
# else
# return 0;
# }

-[RiDER]-
06.01.2009, 19:38
=-antr4xx-=[]Es scheint mir als ob dir ein Flüchtigkeitsfehler in deinem Source unterlaufen ist:


# char isoperator(const char o)
# {
# if(o == '+' || o == '-' || o == '*' || o == '/')
# return o;
# else
# return 0;
# }
Ich kann keinen finden :shock:

Vielleicht verwirrt es Dich, dass o und 0 sich so sehr ähneln. Is mir beim Schreiben auch aufgefallen und es wäre vielleicht besser gewesen, o einen klareren Namen zu geben, z.B. operator oder so... ;)

Oder übersehe ich da tatsächlich noch etwas?

GreetZ RiDER :D :D :D

]=-antr4xx-=[
08.01.2009, 19:15
Genau, 0 und o haben mich verwirrt.
Ich verwende für solche Funtionen meistens c als char.

Das ist auch mal eine gute Idee für source-code Obfuskation.

-[RiDER]-
08.01.2009, 19:44
=-antr4xx-=[]Genau, 0 und o haben mich verwirrt.
Ich verwende für solche Funtionen meistens c als char.
Also in Richtung ungarische Notation?
Z.B. cOperator oder c_operator? Ich hatte mir letzteren Stil mal angewöhnt gehabt.
Doch ich fand, dass das die Lesbarkeit des Kodes nicht wirklich erhöht hat, eher das Gegenteil war der Fall... ;)

Aber hier wäre es vielleicht angebracht gewesen...

GreetZ RiDER :D :D :D

Cr4ckEye
09.01.2009, 10:22
Hier nochmal eine klassische Lösung: http://nopaste.free-hack.com/index.php?id=d15cf33dd6

~.~ Diese Aus- und Eingaben fressen immer so viel Übersichtlichkeit :-D

MfG

-[RiDER]-
09.01.2009, 15:43
Hi :D

Vor allem Dein Mix aus C und C++ frisst da die Übersicht.

Fällt Dir eigentlich in beiden Deiner Kodes nicht das auf:
int main(void)
[...]
main();
[...]
Rekursive Funktion ohne unbedingtes Ende. Sicherheitsexperten dieser Welt werden Dich gnadenlos jagen. ;)


int TextLength = (sizeof(SplashText)/sizeof(char))-1;
strlen()???

GreetZ RiDER :D :D :D

Cr4ckEye
09.01.2009, 16:48
Wieso mix? Gut die zwei Header... naja

Jo, das is rekursiv ohne unbedingtes Ende, der User darf solange rechnen wie er will ;-) :-D

Die func SplashScreen is schon etwas älter^^ Aber wenns dich so stört ersetz ichs natürlich gleich :-D

MfG

-[RiDER]-
09.01.2009, 18:23
Hi :D

Wieso mix? Gut die zwei Header... naja
Na ich dachte, C++ wäre doch die ach so tollste Sprache der Welt (bezieht sich auf keine Deiner Aussagen), mit deren Templates und Überladen von Operatoren und Objekten und Strings alles so einfach sei und keine oder kaum noch sequenziell-prozedurale Programmierung nötig sei.
Für die Ein- und Ausgabe benutzt Du Klassen (oder Methoden oder weiß der Geier was) der STL, der großartigsten Verschlimmbesserung von C, einer schön umständliche Reimplementierung von stdio.h.


Jo, das is rekursiv ohne unbedingtes Ende, der User darf solange rechnen wie er will ;-) :-D
Nein, solange, bis der Stack voll ist ;)
Bei zweckmäßiger Verwendung des Programms wird das quasi nie, aber es lässt sich provozieren.

Wenn Du sowas z.B. in der Spiele- oder Roboterprogrammierung machst, wirst Du keine Freude haben ;)

GreetZ RiDER :D :D :D

Cr4ckEye
09.01.2009, 18:35
Jo gut, nur weil ich es als CPP und nich als C kompiliere und statt printf , cout verwende muss ich ja nich gleich für ein rechner die OOP Klassen, die Templates und superüberladungen auffahren^^
Da tunas auch 2 Funktionen von mir aus auch im C Style :-D
is das mit den Aussagen der Wundersprache Ironie?^^
Ja, ich denke C++ ist eine mächtige Sprache, da sie die perfekte Zwischenebene von VB und ASM darstellt :-D Aber das gilt nicht weniger für C. ;-)

Wenn ich dann WoW2 schreibe werd ich mich immer dran erinnern nie rekursiv ohne unbedingte beendigung zu benutzen :-D
Ne lol, ich werds in Zukunft vermeiden ;-)

MfG

blackberry
09.01.2009, 21:17
-]
int TextLength = (sizeof(SplashText)/sizeof(char))-1;
strlen()???

"SplashText" ist doch eine Konstante Zeichenkette (ich kann den Code gerade nicht finden - keine Ahnung wieso - wegeditiert?)?
Wenn ja, dann spart diese Berechnung (die wahrscheinlich vom Compiler wegoptimiert wird) besser als ein Aufruf einer Funktion, bei der man den Rückgabetyp ja eigentlich schon kennt.
In dem Sinne ist strlen() vielleicht übersichtlicher, aber aus optimationstechnischer Sicht sicher auch durch die sizeof-Methode ersetzbar.


Jo gut, nur weil ich es als CPP und nich als C kompiliere und statt printf , cout verwende muss ich ja nich gleich für ein rechner die OOP Klassen, die Templates und superüberladungen auffahren^^


extern istream cin; ///< Linked to standard input
extern ostream cout; ///< Linked to standard output
extern ostream cerr; ///< Linked to standard error (unbuffered)
extern ostream clog; ///< Linked to standard error (buffered)

Also ich, für meinen Teil, halte cout, cerr, clog, ... für Objekte der Klasse ostream... Eine Benutzung dieser Objekte fällt demnach sehr wohl unter "OOP Klassen auffahren" :)

PS: ich habe noch von Klassen, in der Programmierung, gehört, die nicht Teil der OOP waren ^^


Ja, ich denke C++ ist eine mächtige Sprache, da sie die perfekte Zwischenebene von VB und ASM darstellt :-D

Seit wann ist VB eine Ebene? Ich dachte das fällt mehr unter simple Hobbyprogrammierung...


mfG. BlackBerry

Cr4ckEye
09.01.2009, 22:15
Die Zeichenkette ist nur bestimmt konstant, ich hätte auch die Stringlänge direkt in die Schleife schreiben können, ich wollte sie aber so implementieren dass ich jederzeit den Stringinhalt editieren kann ohne weitere Änderungen an der Funktion.
Nagut, da in C++ das ganze Ein und Ausgabesystem auf Klassen basiert... naja, man will ja nich so erbsenzählerisch sein^^
Ich wollte damit ja nursagen dass ich nur weil ich C++ verwende nicht gleich jede Funktion und Variable als Methode und Instanzvariable in ne Klasse haun muss^^.

Mit Ebene meinte ich nicht die Ebene im Sinne von High und Lowlevel sondern eher von der optimierung aber auch Freiheit her.
In ASM z.b. bin ich ziemlich unbeschränkt, allerdings ist die Sprache sehr "Umständlich" (ja, für Leute die das schon jahre machen natürlich nicht ^^). Wer will den von euch mal eine WinGUI in ASM schreiben?
VB ist viel simpler aber eben auch viel eingeschränkter. Eine GUI ist z.B. kein Problem mehr, allerdings hat man mit kompatibilitäts Problemen zu kämpfen.
C/C++ ist sehr frei, aber doch komfortabel, portabel und dynamisch erweiterbar. Zwar ist der Code nicht bis zur Perfektion getrieben wie in ASM, aber doch schnell und lesbar.

Ich hoffe ihr habt meine Idee verstanden.

MfG

blackberry
09.01.2009, 22:36
Die Zeichenkette ist nur bestimmt konstant, ich hätte auch die Stringlänge direkt in die Schleife schreiben können

Mit konstant habe ich mich auf das Laufzeitverhalten bezogen was soweit ich das verstanden habe auch so zutrifft (sprich: man muss den Code erst neu schreiben und neu Compilieren, damit sich die Zeichenkette ändert).


Wer will den von euch mal eine WinGUI in ASM schreiben?

An dem Punkt kann ich nur lächelnd auf das Buch "Assembler - Grundlagen der Programmierung" von Joachim Rohde und Marcus Roming (ISBN: 978-3-8266-1469-9) verweisen, in dem sich der gesammte zweite Teil mit Windows-Programmierung in ASM (Intel-Style Syntax, MASN bzw. TASM als Compiler), also uA. auch mit der Erstellung von Fenstern und Co., beschäftigt.

Und ich gehe davon aus, dass Windowsprogrammierung in ASM letztendlich fast so wie in C/C++ ist (sofern man nicht "cheatet" und Visual Doof++ benutzt);

invoke CreateWindowEx, ...
mov handle, eax
und

handle = CreateWindowEx(...);
kommen doch auf's Selbe hinaus :)


mfG. BlackBerry

Cr4ckEye
19.01.2009, 14:05
Ich glaub das Buch zieh ich mir mal :) Danke für die Hinweise!

MfG

-[RiDER]-
19.01.2009, 14:59
Hi :)

Ich wollte damit ja nursagen dass ich nur weil ich C++ verwende nicht gleich jede Funktion und Variable als Methode und Instanzvariable in ne Klasse haun muss^^.
Dann frage ich mich, für was C++ eigentlich taugt...

GreetZ RiDER :D

ch3rrY
19.01.2009, 22:36
hier mal meine lösung :D mein erster versuch... kritik sehr willkommen...

und ich suche übrigens eine lösung für nen fehler, wenn der user anstatt zahlen... buchstaben eingibt(man muss ja alles beachten :D)
ansonsten hab ich so ziemlich jeden fehler beachtet... denke ich zumindest

edit: link vergessen :D
http://nopaste.free-hack.com/index.php?id=49c699cdde

blackberry
19.01.2009, 23:21
hier mal meine lösung :D mein erster versuch... kritik sehr willkommen...

Der Code ist ein bisschen unaufgeräumt (TABs nach einem geregelten Schema wären angebracht).
Für eine simple Addition braucht man doch keine extra Funktion, oder? (wie zwei Autoren in ihrem "Java 5"-Buch vim Markt+Technik-Verlag bewiesen haben, kann man für eine division auch drei Klassen für eine Division schreiben, aber ich halte das eher für unnötig).
Das ganze "if ( art == 1 ) [...] else if ( art == 2 ) [...]" könnte man durch eine switch-Verzeigung ersetzen.
"for ( art = 1; art <= 4;) " erscheint mir ein wenig überflüssig, da art nieeinen anderen Wert, zur Zeit dieser Überprüfung, als {1, 2, 3, 4} annehmen wird, wie durch "while ( art < 1 || art > 4 ) " sichergestellt ist.


und ich suche übrigens eine lösung für nen fehler, wenn der user anstatt zahlen... buchstaben eingibt(man muss ja alles beachten :D)

Wie RiDER bereits erklärt hat (eventuell sogar in diesem Thread, bin mir aber nicht sicher - zu faul um nachzusehen ^^) neigen Funktionen/Methoden wie scanf bzw. cin >> zu Fehlern, im Fall einer "unerwarteten" Eingabe des Benutzers.
Bei solchen Problemen bietet sich in der Regel das Einlesen der Benutzereingabe über fgets, in Kombination mit atoi (bzw. einer ähnlichen Funktion), an.
Hier mal ein kleines Beispiel:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int getnum(void)
{
char buffer[10];
int i;

memset(buffer, 0, sizeof(buffer));
if (!fgets(buffer, sizeof(buffer) - 1, stdin))
{
/* Fehler beim Lesen von stdin */
puts("error 1\n");
exit(0);
}
else if (buffer[strlen(buffer) - 1] != '\n')
{
/* der String wurde nicht durch einen Zeilenumbruch beendet
-> der eingegebene String war zu lang -> Fehler! */
puts("error 2\n");
exit(0);
}

for(i = 0; buffer[i] != '\n'; i++)
{
if (buffer[i] < '0' || buffer[i] > '9')
{
/* die Eingabe enthällt ungültige Zeichen */
puts("error 3\n");
exit(0);
}
}

/* die Eingabe sieht "OK" aus */
return atoi(buffer);
}
( ist zwar kein PHP-Skript, aber die PHP-Tags geben dem ganzen eine "gesunde Farbe" ;) )


mfG. BlackBerry