do { } while
-
hm
also ich bin jetzt so weit fertig damit und das program macht das was es soll.
unerklärlicher weise *G*bin mir also nicht ganz sicher was du mit unerklärlichem Programm verlauf meinst
wobei ich jetzt ne weile gekämpft hab das er das macht, weil ich nicht den richtigen Ansatz hatte.
ah jo mathematisch gesehen rechnet er aber noch nicht richtig (Punkt- vor Strichrechnung).
ps.
ich studier das nicht ich bringe es mir selber bei.
also bin ich für jeden Ratschlag offen und schau mir alles noch mal an.Eingabe bsp:
5+4+1*2=pps.
ok ich hab mir mal durchgelesen was SegFault bedeutet.
Also wen du damit zu deutsch Schutzverletzung meinst,
hab ich wahrscheinlich Glück da ich Windows 7 verwende und dort zumindest theoretische so-etwas nicht passieren sollte.oder ich hab einfach keinen plan was du meinst.
hm wobei ich nach 6 stunden testen und versuchen irgend wie 500 Mb arbeitsreicher belegt habe, grüble nicht gut.
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a1=0, b1=1; // schleifen zähler int a[a1], i; // a[] = einlese Zahl char c[a1], temp; printf(" geben sie ihre rechen aufgabe ein\n:"); do { ++a1; // erhöung des schleifen zählers scanf("%d", &a[a1]); // einlesen der Zahl Speichern unter dem aktuellen zähler scanf("%c", &c[a1]); // einlesen des operators //Püfung was eingelesen wurde printf("Zaehler a1: %d \n Gespeicherte Zahl: %d \nOperation:%c\n", a1, a[a1], c[a1]); } while(c[a1] != '='); scanf("%c", &temp); // enter filter printf("Temp:%d\n", temp); // enter test // testet was operator alles ist if (c[b1]== '*') i = a[b1] * a[++b1]; if (c[b1]== '/') i = a[b1] / a[++b1]; if (c[b1]== '+') i = a[b1] + a[++b1]; if (c[b1]== '-') i = a[b1] - a[++b1]; //variable b1 ist 2 in ersten runde while( a1 != b1 ) { printf("b1=%d a1=%d\n", b1, a1); // testet was operator alles ist if (c[b1]== '*') i = i * a[++b1]; if (c[b1]== '/') i = i / a[++b1]; if (c[b1]== '+') i = i + a[++b1]; if (c[b1]== '-') i = i - a[++b1]; //variable b1 ist 3 in ersten runde } printf(" Ergebnis: %d \n", i); // ergebnis ausgabe printf("\n ENDE danke fuers testen \n"); system("PAUSE"); return 0; }
-
Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C (C89 und C99) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Modus1984 schrieb:
hm
also ich bin jetzt so weit fertig damit und das program macht das was es soll.
unerklärlicher weise *G*bin mir also nicht ganz sicher was du mit unerklärlichem Programm verlauf meinst
Ein Array hat eine feste Größe, die bei der Definition klar ist. Und selbst wenn du die Array-Größe aus einer Variablen holst, wird sie nach der Definition nicht an diese Variable gekoppelt sein. Das bedeutet für dich, daß du zwei Arrays für jeweils 0 Elemente angelegt hast und in deiner Einleseschleife über die Arraygrenzen hinaus in Speicherbereiche schreibst, in denen andere Daten liegen. Je nach Aufbau des Programmstacks sind das entweder andere lokale Variablen, die Rücksprungadresse deiner Funktion oder offiziell leere Bereiche, die beim nächsten Funktionsaufruf für Rücksprungadresse, Parameter und lokale Variablen verwendet werden. Das heißt, entweder du machst selbder etwas kaputt oder andere Funktionen werden dir früher oder später die Daten überschreiben.
PS: Bei deiner Berechnungsroutine blicke ich leider auch nicht durch, was du mit der Konstruktion zu erreichen versuchst.
-
Modus1984 schrieb:
ok ich hab mir mal durchgelesen was SegFault bedeutet.
Also wen du damit zu deutsch Schutzverletzung meinst,
hab ich wahrscheinlich Glück da ich Windows 7 verwende und dort zumindest theoretische so-etwas nicht passieren sollte.Ein Segmentation Fault tritt dann auf, wenn ein Programm versucht Speicherbereiche zu verwenden die ihm nicht zugewiesen wurden.
Dieser Fehler liegt beim Programm. Wenn das Betriebssystem so einen Fehler feststellt beendet es das Programm.Warum fängst du bei deinen Arrays mit dem Index 1 an?
In C fangen die Indizes von Arrays bei 0 an.int a[10]; // geht von a[0] bis a[9] char c[200]; // geht von c[0] bis c[199] int b[1]; // besteht nur aus b[0] int a[0]; // ??? ; das hast du.
-
Falls du das noch nicht gewusst hast:
int a = 5; int b[a]; a++; //b geht immer noch nur von 0 bis 4!
-
Du willst einen Formelinterpreter bauen, der Ansatz ist erstmal richtig, es hapert sehr an der Umsetzung.
Einfacher als Einzel-scanf zu benutzen ist es, zuerst den gesamt String einzulesen und dann auf diesem zu arbeiten, z.B. mit sscanf.#define MAXLAENGE 100 char op[MAXLAENGE]; int werte[MAXLAENGE+1], zaehler=0, x=0,n=0; char formel[MAXLAENGE]; fgets( formel,MAXLAENGE,stdin ); while( 2==sscanf(formel+x,"%d%1[+-*/=]%n", &werte[zaehler],&op[zaehler],&n) ) { /* liest ein int gefolgt von genau 1 Zeichen aus "+-* /=" ein */ printf("\n %d [%c]", werte[zaehler],op[zaehler]); ++zaehler; x+=n; }
-
Hi Modus1984
C/C++ sich selbst beizubringen ist ein steiniger Weg. Du solltest daher kleinere Schritte machen und deine Programme erst erweitern, wenn die Fehler aus der alten Version entfernt wurden. Sonst suchst du dich eines Tages zu Tode um alle Fehler zu entdecken.
Dein zweites Programm konnte genauso wenig laufen wie dein erstes.
Kleine Schritte sind öfter von Erfolg gekrönt, man fühlt sich besser und gibt später nicht so leicht auf, wenn mal gar nix will.
Happy hacking
-
forenseeker schrieb:
C/C++ sich selbst beizubringen ist ein steiniger Weg.
Ja, vor allem, weil man dann weder C noch C++ gut kann, und noch Jahre braucht, um das Kuddelmuddel zu ordnen.
-
CStoll schrieb:
Modus1984 schrieb:
hm
also ich bin jetzt so weit fertig damit und das program macht das was es soll.
unerklärlicher weise *G*bin mir also nicht ganz sicher was du mit unerklärlichem Programm verlauf meinst
Ein Array hat eine feste Größe, die bei der Definition klar ist. Und selbst wenn du die Array-Größe aus einer Variablen holst, wird sie nach der Definition nicht an diese Variable gekoppelt sein. Das bedeutet für dich, daß du zwei Arrays für jeweils 0 Elemente angelegt hast und in deiner Einleseschleife über die Arraygrenzen hinaus in Speicherbereiche schreibst, in denen andere Daten liegen. Je nach Aufbau des Programmstacks sind das entweder andere lokale Variablen, die Rücksprungadresse deiner Funktion oder offiziell leere Bereiche, die beim nächsten Funktionsaufruf für Rücksprungadresse, Parameter und lokale Variablen verwendet werden. Das heißt, entweder du machst selbder etwas kaputt oder andere Funktionen werden dir früher oder später die Daten überschreiben.
PS: Bei deiner Berechnungsroutine blicke ich leider auch nicht durch, was du mit der Konstruktion zu erreichen versuchst.
ok danke ich denke ich kan das problem beheben wen ich den ersten teil von
int a1=0, b1=1; // schleifen zähler int a[a1]; int i; // a[] = einlese Zahl char c[b1], temp, klam[a1]; // operator || enter filter || klammer
auf
int a1=0, b1=1; // schleifen zähler int a[100]; int i; // a[] = einlese Zahl char c[100], temp, klam[100]; // operator || enter filter || klammer
ändere.
ach ja sollte ichs vergessen haben das soll ein Taschen Rechner werden.ok ich weis es gibt einen Taschenrechner bei Windows. (aber hey zum üben find Ichs klasse)
und das was ich bis jetzt geschrieben habe klappt auch schon.
DirkB schrieb:
Modus1984 schrieb:
ok ich hab mir mal durchgelesen was SegFault bedeutet.
Also wen du damit zu deutsch Schutzverletzung meinst,
hab ich wahrscheinlich Glück da ich Windows 7 verwende und dort zumindest theoretische so-etwas nicht passieren sollte.Ein Segmentation Fault tritt dann auf, wenn ein Programm versucht Speicherbereiche zu verwenden die ihm nicht zugewiesen wurden.
Dieser Fehler liegt beim Programm. Wenn das Betriebssystem so einen Fehler feststellt beendet es das Programm.Warum fängst du bei deinen Arrays mit dem Index 1 an?
In C fangen die Indizes von Arrays bei 0 an.int a[10]; // geht von a[0] bis a[9] char c[200]; // geht von c[0] bis c[199] int b[1]; // besteht nur aus b[0] int a[0]; // ??? ; das hast du.
ich denke mal das du die beiden zähl variablen meinst
alsoint a1=0, b1=1; // schleifen zähler
ich muss sie unterschiedlich anfangen weil ich beim einlesen eine schleife mehr brauche als beim auslesen der daten
da ich die Sachen immer so scanne zb
5+52=
5+ (a=1)
5 (a=2)
2= (a=3)verarbeitet wird es dann aber so
5+5=10 (b=2) (i=10)
ende der ersten schleife jetzt wird nur noch drauf gerechnet
i*2= (b=3) (i=20)
a=b=3 daher wird die variable i als Ergebnis erkanntEOutOfResources schrieb:
Falls du das noch nicht gewusst hast:
int a = 5; int b[a]; a++; //b geht immer noch nur von 0 bis 4!
ok danke
ich denke dann so würde es richtig sein,
wen es bis 100 gehen soll.#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a=1; int b[100]; while(a!=100) { b[a]=0; printf("Zahl:%d\n", a); printf("Hmmm:%d\n\n", b[a]); a++; } system("PAUSE"); return 0; }
@Wutz
ok deinen Beitrag schaffe ich heute nicht mehr, da ich dazu erst mal bisschen was rausfinden muss.und die letzten beiden ja aber das steht ja so ziemlich bei jedem guten how to c ganz oben drüber.
danke an alle hat mir erst mal sehr geholfen.
-
Modus1984 schrieb:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a=1; int b[100]; while(a!=100) { b[a]=0; printf("Zahl:%d\n", a); printf("Hmmm:%d\n\n", b[a]); a++; } system("PAUSE"); return 0; }
Hier geht die Schleife von 1 bis 99. Sie sollte jedoch von 0 bis 99 gehen. deshalb solltest du a mit 0 initialisieren.
-
hm ja ok stimmt