Programm: prüfen ob Dreieck möglich, Umfang und Fläche ausgeben
-
#include <stdio.h> #include <stdlib.h> #include <math.h> int pruefe(double x, double y, double z){ if((x + y > z) && (x + z > y) && (y + z > x)) return 1; else return 0; } double Dreieck(double x, double y, double z, double *u2, double *a2){ double s, a, u; int d = pruefe(x, y, z); if(d != 0){ u = x + y + z; s = u / 2; a = sqrt(s * ((s - x) * (s - y) * (s - z))); *u2 = u; *a2 = a; } return d; } int main(){ double x, y, z, a, u; int d; printf("Drei Seitenlängen angeben:\n1. "); scanf("%f", &x); printf("2."); scanf("%f", &y); printf("3."); scanf("%f", &z); d = Dreieck(x, y, z, &u, &a); if(d != 1){ printf("Mit diesen Seitenlängen ist die Konstruktion eines Dreiecks nicht möglich!\n"); } else{ printf("Umfang: %f\nFlaeche: %f\n", a, u); } return EXIT_SUCCESS; }
Versuch das hier mal.
-
#include <stdio.h> #include <math.h> int pruefe(double x, double y, double z) // Rückgabewert ist ein int { int d; // da ja auch d ein int ist if ((x+y<=z) || (x+z<=y) || (y+z<=x)) { d=0; } else { d=1; } return d; // und zurück gegeben wird } int Dreieck(double x, double y, double z, double *u2, double *a2){ // s. bei pruefe double s, a, u; int d= pruefe(x, y, z); if(d != 0){ u = x + y + z; s = u / 2; a = sqrt(s * ((s - x) * (s - y) * (s - z))); *u2 = u; *a2 = a; } return d; } int main() // auch main gibt ein int zurück { double u, a, s; double x, y, z; int d; printf("\nBitte drei Seitenlängen fuer des Dreieck eingeben : "); scanf("%lf%lf%lf", &x, &y, &z); printf("Ihre Eingabe : x=%lf; y=%lf; z=%lf", x, y, z); d=pruefe(x,y,z); if(d==0) { printf("\nMit diesen Seitenlängen kann kein Dreieck konstruiert werden"); } else { printf("\n\nBerechne Umfang & Flaeche!\n"); //double d = Dreieck(x, y, z, &u, &a); // hier hast du ein neues d. Warum? d = Dreieck(x, y, z, &u, &a); printf("%d;%f;%f\n", d, u, a); // ^ das d bedeutet Dezimal Integer. Dein d war da aber ein double } return 0; }
-
einfach suuuuuper nettt von euch vieeeelen DANK
ich muss jetzt zum Schluss noch abfragen, ob es wiederholt werden soll, das habe ich gemacht, aber wenn ich dann j für ja eingebe, schließt das programm einfach :S woran kann das liegen? ich habe den Teil der wiederholt werden soll in klammern gesetzt und mit do while schleife gearbeitet..???#include <stdio.h> #include <math.h> int pruefe(double x, double y, double z) { int d; if ((x+y<=z) || (x+z<=y) || (y+z<=x)) { d=0; } else { d=1; } return d; } int Dreieck(double x, double y, double z, double *u2, double *a2){ double s, a, u; int d= pruefe(x, y, z); if(d != 0){ u = x + y + z; s = u / 2; a = sqrt(s * ((s - x) * (s - y) * (s - z))); *u2 = u; *a2 = a; } return d; } int main() { double u, a, s; double x, y, z; int d; int wahl=0; int j; do { printf("\nBitte drei Seitenlaengen fuer des Dreieck eingeben : "); scanf("%lf%lf%lf", &x, &y, &z); printf("Ihre Eingabe : x=%lf; y=%lf; z=%lf", x, y, z); d=pruefe(x,y,z); if(d==0) { printf("\nMit diesen Seitenlängen kann kein Dreieck konstruiert werden"); } else { printf("\n\nBerechne Umfang & Flaeche!\n"); d = Dreieck(x, y, z, &u, &a); printf("%d;%f;%f\n", d, u, a); printf("Nochmal? Drücken Sie j fuer Ja und n fuer nein"); scanf("&d", &wahl); } } while (wahl==j); return 0; }
-
Bei
while (wahl==j);
vergleichst du zwei Variablen. Die eine heißtwahl
und die anderej
.
Das ist nichts anderes als beiif ((x+y<=z) || (x+z<=y) || (y+z<=x))
Nurj
hat noch gar keinen Wert bekommen (ist nicht initialisiert).Bei
if(d==0)
vergleichst du die Variabled
mit der Konstanten 0.Bei
scanf("&d", &wahl);
ist &d eine normaler Text für scanf(). Da gehört ein %d hin.
Allerdings steht %d für dezimal Integer, nimmt also keine anderen Zeichen als '0' bis '9' an.
Dazu passt deine Aufforderung nicht "Nochmal? Drücken Sie j fuer Ja und n fuer nein"Zudem kommt die Abfrage nur, wenn das Dreieck berechenbar war.
-
Also das mit dem % und & war leider ein tippfehler, habe ich verbessert und statt int habe ich jetzt char genommen aber es schließt wieder wenn ich j eingebe..
char wahl=0; char j; do { ......... scanf("%c", &wahl); } while (wahl==j);
-
Du willst auch nicht mit der Variablen j vergleichen, sondern mit dem Zeichen 'j'.
Und damit du dann auch weiter Eingaben machen kannst, muss erstmal das '\n' (die Enter Taste) aus dem Eingabepuffer entfernt werden.
Wie das Standardgemäß geht, kannst du hier sehen: http://www.c-plusplus.net/forum/p1146014#1146014
-
dankesehr aber auch wenn ich mit 'j' vergleiche, beendet das programm bei der eingabe von j.....und das mit dem eingabepuffer \n habe ich nicht verstehen können :((
-
prob1 schrieb:
dankesehr aber auch wenn ich mit 'j' vergleiche, beendet das programm bei der eingabe von j.....und das mit dem eingabepuffer \n habe ich nicht verstehen können :((
Dein Programm erwartet an der Stelle
scanf("%lf%lf%lf", &x, &y, &z);
die Eingabe von drei Fließkommazahlen.
Die Eingabe bestätigst du mit der Enter-Taste.
Das ist der Zeilenvorschub (Newline oder als Zeichen '\n').
Der gehört aber nicht zu den Zahlen, also bleibt der im Tastaturpuffer stehen.
Wenn du jetzt ein Zeichen einlesen willst, steht erstmal noch das Newline im Puffer.
Und das liest du beimscanf("&d", &wahl);
dann ein.Darum musst du erstmal den Tastaturpuffer leeren.
Dazu dienen dient diese while-Schleife aus dem Link.Das '\n' ist ein sog. Whitespace (wie auch Leerzeichen ' ', Tabulator '\t' und Linefeed '\r').
Die werden normalerweise von scanf überlesen. Es sei denn, du willst ein Zeichen "%c" haben.
-
DirkB schrieb:
... Whitespace ... Die werden normalerweise von scanf überlesen.
Das ist auch der Grund warum du beim
scanf("%lf%lf%lf",
den Formatstring ohne Leerzeichen angibst, dann bei der Eingabe aber mit Leerzeichen arbeitest.
Das Leerzeichen gehört nicht zur Zahl, wird also überlesen.
-
danke für die ausführliche erklärung, aber wie ich das umsetze weiß ich immernoch nicht
int c; // int c, nicht char c.
while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so soll ich das einfach in mein programm so einfügen???
-
int c; // int c, nicht char c.
brauchst du einmal in jeder Funktion, in der du die untere while-Schleife benutzt. Bei dir ist das nur in der main()
while ((c = getchar()) != EOF && c != '\n'); // kein {} block,
hinter jedes scanf.
-
Jetzt funktioniert alles einwandfrei, tauuuuuusend DANK!!!!!!!!!!!!!!
-
wenn das noch einer liest hab ich mal noch ne frage bei mir funktioniert an sich auch alles außer das, das programm auch bei der eingabe von n wiederholt wird...
wie kann ich das lösen?hier mein code:
int main() { double u, a, s; double x, y, z; int d,c; char wahl; do { printf("\nBitte drei Seitenl\x84ngen f\x81r des Dreieck eingeben \n"); printf("\n 1. Seitenl\x84nge: "); scanf("%lf", &x); while ((c = getchar()) != EOF && c != '\n'); printf("\n 2. Seitenl\x84nge: "); scanf("%lf", &y); while ((c = getchar()) != EOF && c != '\n'); printf("\n 3. Seitenl\x84nge: "); scanf("%lf", &z); while ((c = getchar()) != EOF && c != '\n'); printf("\nIhre Eingabe : x=%.2lf; y=%.2lf; z=%.2lf\n", x, y, z); d=pruefe(x,y,z); if(d==0) { printf("\nMit diesen Seitenl\x84ngen kann kein Dreieck konstruiert werden\n"); printf("\nNochmal? Dr\x81 \bcken Sie j f\x81r Ja und n f\x81r Nein "); scanf("&c", &wahl); while ((c = getchar()) != EOF && c != '\n'); } else { printf("\n\nBerechne Umfang & Fl\x84 \bche!\n"); d = Dreieck(x, y, z, &u, &a); printf("\nUmfang: %.2f \nFl\x84 \bche: %.2f\n", u, a); printf("\nNochmal? Dr\x81 \bcken Sie [Y] f\x81r Ja und [N] f\x81r Nein "); scanf("&c", &wahl); while ((c = getchar()) != EOF && c != '\n'); } } while (wahl = 'Y'); return 0; }
-
Das
(wahl = 'Y')
ist eine Zuweisung, kein Vergleich.
Beachte die Compiler-Warnungen
-
DirkB schrieb:
Das
(wahl = 'Y')
ist eine Zuweisung, kein Vergleich.
Beachte die Compiler-Warnungen
bei meinem compiler kommt keine warnung (codeblocks)...
meinst du das ich (wahl = 'Y') in (wahl == 'Y') ändern soll damit es ein vergleich ist?
wenn ich das mache wird das programm gar nicht mehr wiederholt...
-
test89 schrieb:
meinst du das ich (wahl = 'Y') in (wahl == 'Y') ändern soll damit es ein vergleich ist?
C Grundlagen.
Gibst du denn ein 'Y' ein oder ein 'y'?
Versuchs mal mit der Shift-Tast und y.
-
ich gebe ein 'Y' ein...aber das programm wird beendet...
-
ich komm auf keine lösung bin grad echt am verzweifeln...
bitte kann mir jemand helfen...
-
test89 schrieb:
scanf("&c", &wahl); ... scanf("&c", &wahl);
Das möchte wohl "%c" heißen.
Und ersetze mal
while (wahl = 'Y');
durch
while ('Y' = wahl);
und du wirst schon sehen.
-
Wutz schrieb:
test89 schrieb:
scanf("&c", &wahl); ... scanf("&c", &wahl);
Das möchte wohl "%c" heißen.
Und ersetze mal
while (wahl = 'Y');
durch
while ('Y' = wahl);
und du wirst schon sehen.
ah danke der schreibfehler ist mir die ganze zeit nicht aufegefallen...
jetzt funktionierts mit der wiederholung...ist es jetzt auch noch möglich das die auswahl nur bei 'Y' und 'N' funktioniert?
also das programm nur beendet wird wenn man 'N' eingibt, da es im moment auch bei jedem anderen buchstaben beendet wird...