| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: Taschenrechner programmieren?! Komme nicht weiter!!! im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Grüßt euch leute, ich sollte in der übung ein taschenrechner programmieren! also die aufgabe war, das man die ganze ...
![]() |
| | #1 (permalink) |
| Registriert seit: 14.08.07 ![]() Likes: 0 | Anzeige Grüßt euch leute, ich sollte in der übung ein taschenrechner programmieren! also die aufgabe war, das man die ganze rechen aufgabe schreibt, und das program rechnet es halt dann aus. die aufgabe kann man so schreiben wie man möchte, also zwischen den zahlen können auch buchstaben sein, das program filtert nur die zahlen und das operanten aus! Ich habe es mir so überlegt das ich die einzelnen zahlen und operanten mit ne scheife rauspicke!! das rauspicken hat geklappt nur jetzt weiß ich nicht wie ich mit den zahlen rechnen könnte. ::::hier ist der code:::: Code: #include <stdio.h>
#include <stdlib.h>
int main(void)
{
char aufgabe[100];
char zeichen[100];
int i,z;
int ziffer[100];
i=0;
z=0;
//rechenaufgabe einscannen
printf("\n\t\tTaschenrechner! \n\n");
printf("\tbitte rechenaufgabe eingeben: "); gets(aufgabe);
//zahlen werden entsprechenden zugewiesen
while(aufgabe[i] != '\0')
{
if(aufgabe[i] < 48 || aufgabe[i] > 57)
{
printf("");
i++;
}
else
{
ziffer[i] = aufgabe[i];
i++;
}
if(aufgabe[i]==42 || aufgabe[i]==43 || aufgabe[i]==45 || aufgabe[i]==47)
{
zeichen[z]=aufgabe[i];
i++;
}
}
//... ab hier komm ich nicht weiter
printf("\n");
return EXIT_SUCCESS;
} Gruß |
| | |
| | #2 (permalink) |
| Registriert seit: 17.04.06 ![]() Likes: 3 | Ich würde den eingelesenen String splitten mit z.B. strtok(). Also Tokens auslesen die operatorgetrennt sind. z.B 3+4. Operator ist hier +. Dann bleibt 3 und 4 über. Diese Tokens kannst du anschließend mit atof() zu double casten.
__________________ http://chm0815.blogspot.com |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Registriert seit: 13.12.07 ![]() Likes: 0 | So wie du das gemacht hast bekommst du nur einstellige Zahlen, ich weiß nicht ob du das so möchtest. Außerdem musst du bedenken, dass du von den Werten der Zahlen jeweils 48 oder '0' abziehen musst, sonst sind die Zahlen um 48 größer als der Anwender eingegeben hat. ( Wobei '0' schöner ist, weil man im Quellcode leichter nachvollziehen kann was du damit bezweckst) |
| | |
| | #4 (permalink) |
| Themenstarter Registriert seit: 14.08.07 ![]() Likes: 0 | @mauralix könntest du mir vieleicht ein kleines beispielcode zeigen @vv4yn3 ja es muss auch drei stellen rechnen können. Genau da ist mein problem, gibt es nicht irgendwie eine funktion z.b die 2 variablen zur einer varibale miteinander verbindet???? |
| | |
| | #5 (permalink) |
| Registriert seit: 17.04.06 ![]() Likes: 3 | Ich helfe ja immer gern :-) So kannst du die Tokens in Zahlen konvertieren. Code: char str[100]={"12+4*3+1/5+100%2"};
char *op={"+-/*%"};
char *tok;
double number;
tok = strtok(str,op);
while(tok){
number = atof(tok);
printf("token=%f\n",number);
tok = strtok(NULL,op); /* Jetzt mit NULL aufrufen !!! */
}
__________________ http://chm0815.blogspot.com |
| | |
| | #6 (permalink) |
| Registriert seit: 13.12.07 ![]() Likes: 0 | Du kannst es eigentlich ganz einfach selbst lösen. Wenn wir zum beispiel den String "343+465" hernehmen und jetzt die beiden Zahlen auslesen wollen, müssen wir einmal an der ersten Stelle beginnen. Wenn mehrere Ziffern hintereinander stehen, dann ist das eine Zahl, wenn wir eine Ziffer finden müssen wir also einfach prüfen, ob die nächste Stelle ebenfalls eine Ziffer ist. Wir nehmen eine Integer Variable, der wir, wenn wir die erste Ziffer einer Zahl finden den Wert dieser Ziffer zuweisen. Wenn das nächste Zeichen keine Ziffer ist, dann rechnen wir mit dieser Variable. Andernfalls multiplizieren wir die Variable mit 10, dadurch rückt die Ziffer eine Stelle weiter, bei unserem Beispiel hätten wir also zuerst den Wert 3, das nächste Zeichen ist eine Ziffer also multiplizieren wir mit 10, dann haben wir 30, nun addieren wir die nächste Ziffer dazu, das ergibt 34, das nächste Zeichen ist wieder eine Ziffer, also machen wir das ganze nochmal und erhalten 343 danach kommt keine Ziffer also verwenden wir die Variable für die Berechnung. Die nächste Zahl können wir auf die gleiche Weise lesen. Und mit dieser Methode können die Zahlen beliebig lang sein. |
| | |
| | #7 (permalink) |
| Senior Member Registriert seit: 07.01.03 ![]() Likes: 19 | Oder du merkst dir einfach die Anfangs- und End-Position im String, die eine Zahl eingrenzen (bei "343+465" die Positionen 0,2 und 4,6) und parst dann die Sub-Strings. Um zu schauen, ob ein Character eine Zahl ist, kann man z.b. schauen, ob der ASCII-Wert im richtigen Bereich ist. |
| | |
| | #8 (permalink) |
| Registriert seit: 17.04.06 ![]() Likes: 3 | Ich hab doch schon gezeigt wie es geht. Das kostet normalerweise mindestens ein Bier, wenn ich das ausserhalb meiner Arbeitszeit mache
__________________ http://chm0815.blogspot.com |
| | |
| | #9 (permalink) |
| Registriert seit: 15.01.08 ![]() Likes: 0 | ma son blöder tipp von einem blöden batcher: lern batch dauert mit dem richtigen tut 1-2 tage bis des drauf hast un mit batch is das ganze voll einfach. |
| | |
| | #10 (permalink) |
| Themenstarter Registriert seit: 14.08.07 ![]() Likes: 0 | leutz danke für die tipps!!!! @mauralix thx für den code @vv4yn3 ![]() bor, darauf wäre ich niemals gekommen!! das war ne große hilfe. danke danke!! aber ich habe sie als char deklariert, weil ich sonst nicht an den operanten komme. wenn ich sie als integer deklarieren würde, würde ich doch probleme bekommen. Wie könnte ich das eigentlich lösen??? aber ich versuchs mal zu proggen könnten jederzeit weiter fragen auftauchen |
| | |
| | #11 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | das gabs schon mal als Aufgabenreihe: "Aus klein mach groß": Teil2 - Zahlen und Satzzeichen "Aus klein mach groß": Teil3 - Rechnen mit Zahlen "Aus klein mach groß": Teil4- Zahlen anordnen Am Ende entsteht ein vollständiger Infixrechner (kann Eingaben wie (12*(13+14)-16/17) Verarbeiten) Enthält eventuell den einen oder anderen nützlichen Tipp
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #12 (permalink) |
| Senior Member Registriert seit: 07.01.03 ![]() Likes: 19 | Ich frag mich nur, warum vv4yn3 das parsen selbst machen will, da bietet doch jede Standard-Lib was an (in Java z.b. Integer.parseInt(String s))? Damit erfindet ihr gerade das Rad neu, und auch eher ungeschickt: was passiert, wenn deine Zahl zu groß und überläuft? Da muss man sich um die Grenzen kümmern usw. Außerdem kann es evtl. mal erwünscht sein, die eingelesene Zahl als base2 oder base16 oder sowas zu interpretieren, somit multipliziert man nimmer mit 10, sondern eben mit 2 oder 16 usw. --> das muss parametrisiert werden. All das nimmt einem jeder Standard-Parser ab. |
| | |
| | #13 (permalink) |
| Themenstarter Registriert seit: 14.08.07 ![]() Likes: 0 | sinn der sache ist ja, das wir das ohne zusätzlichen libs machen sollen!!! |
| | |
| | #14 (permalink) |
| Senior Member Registriert seit: 07.01.03 ![]() Likes: 19 | Ich sagte nicht umsonst *Standard*-Lib. Ich habe jetzt keine Ahnung von dieser Sprache, aber Google spuckt mir auf die schneller sowas aus: System::Int32: arse(System::String);Vielleicht wird damit klar, was ich meine. |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| komme nicht weiter | sommerkatze | Windows | 2 | 22.08.08 11:18 |
| Komme mit Linux nicht ins internet | RedEagle | Internet Allgemein | 8 | 02.09.07 23:39 |
| Komme nicht ins BIOS | Black_Box_91 | Die Problemzone | 8 | 29.11.05 14:34 |
| Komme nicht mehr als Root ins Kde | HighTower | Linux/UNIX | 12 | 09.08.04 16:30 |
| Komme nicht weiter | resign | Windows | 1 | 22.03.04 15:27 |