do { } while
-
zunächst erst mal der code
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a1=0, b2=0; // schleifen zähler int a[a1], b[b2]; // a = zahl in rechnung || b = ergebnis char c[a1]; printf(" geben sie ihre rechen aufgabe ein\n:"); do { ++a1; /* püfung der einlese zahl printf("Zahl%d:", a1); */ 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]=61); printf("\n ENDE \n"); system("PAUSE"); return 0; }
ich verstehe hier nicht ganz Wiso while nicht das macht was es soll (gut es macht warscheinlich was es soll nur nicht was ich will)
wen in der variable c[a1] ein = gespeichert ist sollte er eigentlich die schleife beenden,
er macht es aber nicht.Wie schreibe ich das er die schleife bei einem = beendet ?
Sollte ich hier etwas grundsätzliches auersacht gelassen haben?
danke im Voraus und ich hoffe ich bin an der richtigen stelle mit dieser frage.
-
Was ist der Unterschied zwischen = und ==?
Stiltip: Wenn Du '=' meinst, solltest Du das auch schreiben, und nicht 61.
-
ah danke dir.
jetzt hab ich es verstanden.
-
Du bist hier im falschen Forum. Dein Code ist C und kein C#
-
ok das tut mir leid
aber es erklärt warum ich bei so mancher Google suche seltsame Ergebnis bekam
ich schreibe natürlich in C und nicht in C#
es war mir aber nicht klar das es da einen unterschied gibt.
kann ich den Beitrag verschieben oder muss das wer anders machen ?
-
Kannst du leider nicht, da mußt du auf einen Moderator warten (ehe du mich ansiehst - ich bin hier nicht zuständig).
Zu deinem Programm: C hat zwar afaik variable Arrays, aber bei denen mußt du auch bei der Deklaration die Endgröße angeben. Deine Konstruktion
int a1=0;int a[a1];
wird garantiert danebengehen (wenn du Glück hast, durch einen SegFault, aber vermutlich bekommst du nur unerklärliches Verhalten im weiteren Programmablauf).
-
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