Programm: prüfen ob Dreieck möglich, Umfang und Fläche ausgeben
-
hmm okay stimmt, zwei Seiten dürfen insgesamt nicht kleiner sein als die 3.seite...
und die U/2 was dann bei mir s heißt, brauche ich doch für die heronsche Flächenformel, oder ist die falsch???
-
also ich habe nochmal gegoogelt und die formel müsste eigentlich richtig sein?
void main, wurde uns so beigebracht wird auch im unterricht immer nur so benutzt, trotzdem danke für den tipp, ich werde bei meinem übungsleiter mal nachfragen..
Also vieelen Dank, mit eurer Hilfe sieht der Teil jetzt so aus:
{ if ((x+y<=z) || (x+z<=y) || (y+z<=x)) { d=0; } else { d=1; } return d; } int Dreieck(int x, int y, int z) { int d=pruefe(x,y,z); if (d==0) { return d; } else { u=x+y+z; s=U/2; a=sqrt(s*((s-x)*(s-y)*(s-z))); return u,a;} }
soweit alles richtig? ich weiß immernoch nicht was mit "die Ergebnisse über die PArameterliste zurückgeben" gemeint ist :S könnte mir das auch jmd bitte erklären???
-
Du solltest bei dem Prüfen ersteinmal die Hypotenuse und die zwei Katheten bestimmen. Ein Dreieck ist möglich, falls Hypotenuse < Kathete + Kathete. Ein rechtwinkliges Dreieck ist möglich, falls Hypotenuse² = Kathete² + Kathete².
Mit dem Ergebnisse über die Parameterliste zurückgeben könnte gemeint sein, dass sich unter den Parametern ein Zeiger auf einen Wert befindet, der im Ablauf der Funktion gesetzt wird.
So etwas, zum Beispiel:#include <stdio.h> #include <stdlib.h> void setze(int *x){ *x = 1; } int main(){ int i = 0; printf("%d\n", i); setze(&i); printf("%d\n", i); return EXIT_SUCCESS; }
Ich hoffe mal, dass ich mit dieser Vermutung nicht falsch liege.
-
#include <stdio.h> #include <math.h> int u, a, s, d, x, y, z; int pruefe(int x, int y, int z) { if ((x+y<=z) || (x+z<=y) || (y+z<=x)) { d=0; } else { d=1; } return d; } double Dreieck(int x, int y, int z) { int d=pruefe(x,y,z); if (d==0) { return d; } else { u=x+y+z; s=u/2; double a=sqrt(s*((s-x)*(s-y)*(s-z))); return u,a;} } void main() { printf("\nBitte drei Seitenlängen fuer des Dreieck eingeben : "); scanf("%d %d %d", &x, &y, &z); printf("Ihre Eingabe : x=%d; y=%d; z=%d", x, y, z); d=pruefe(x,y,z); if(d==0) { printf("Mit diesen Seitenlängen kann kein Dreieck konstruiert werden"); } else{ printf("\n\nBerechne Umfang & Flaeche!\n"); printf("%d", Dreieck(x,y,z)); [b]//hier müssten u und a ausgegeben werden?[/b] return 0; } }
so sieht mein Programm jetzt aus...
das mit dem zeiger verstehe ich leider immernoch nicht, wie es gemeint ist, und was ich da in meinem fall machen muss :(.
und das mit der kathede, kann ich nachvollziehen, aber so müsste es doch auch gehen oder nicht? Denn wenn keines der beiden Seitenlängen addiert kleiner als die übrige Seitenlänge ist, ist das Dreieck ja konstruierbar, also wäre da ja nichts falsch?? und vieleeen Dank für die Hilfe!!!!
-
Das mit der Prüfung stimmt, ich hätte lieber mehr darüber nachdenken sollen.
Du kannst in C nicht mehrere Werte per return zurückgeben, dazu braucht man Zeiger.
int Dreieck(double x, double y, double z, double *u2, double *a2){ double s, a, u; int check = pruefe(x, y, z); if(check != 0){ u = x + y + z; s = u / 2; a = sqrt(s * ((s - x) * (s - y) * (s - z))); *u2 = u; *a2 = a; } return check; } // int d = Dreieck(x, y, z, &u, &a); // printf("%d;%f;%f\n", d, u, a);
(Du kannst natürlich auch int nehmen, doch double ist genauer, auch wenn es(auf den meisten Systemen mit den meisten Compilern) mehr Speicher braucht.)
Versuch weniger globale Variablen zu verwenden, sie könnten für Verwirrung sorgen(ist zumindest bei mir so). Außerdem ist dein Code schlecht lesbar, arbeite etwas an deinem Programmierstil.
Edit:
Code zu dem angepasst, was DirkB schrieb.
-
prob1 schrieb:
Eine Funktion Dreieck, .... Der Rückgabewert soll eine Information darüber geben, ob die Berechnung möglich ist(verwenden Sie die Funktion pruefe).
Demnach sollte Dreieck doch diesen Prototyp haben:
int Dreieck(double x, double y, double z, double *u2, double *a2);
Und wenn man das Dreieck nicht berechnen kann, sollte man *u2 und *a2 auch nicht verändern.
-
vielen Dank, aber was ich immernoch nicht verstehe ist, was jetzt diese *u2 und *a2 sind??
-
u2 und a2 sind Zeiger auf double Variable
*u2 ist der double Wert auf den u2 zeigt.
*a2 ist der double Wert auf den a2 zeigt.Beim Aufruf der Funktion
d = Dreieck(x, y, z, &u, &a);
Übergibst du die Adressen von u und a aus main (durch das &).
Dadurch kann dann Dreieck() an die Stellen einen Wert schreiben (durch den& ist der Adressoperator
* ist der DereferenzierungsoperatorKapitel nochmal durchlesen
-
Zeiger habe ich jetzt vor diesene beiträgen noch nie gehört oder gelesen gehabt und, dass was du mir da seeehr netterweise geschrieben und erläutert hast habe ich auch nie davor gehört, und im Unterricht war ich immer.
Ich verstehe nicht, warum wir jetzt etwas benutzen sollen, was wir noch garnicht hatten, dann können wir doch alles zu hause selber lernen und garnicht mehr zur uni gehen :S
aber ihr seit sicher, dass das damit gemeint ist?
naja dann google ich nochmal und versuche das genau zu verstehen, vielen Dank! Wenn ich dann bisschen weiter bin, frage ich euch nochmal ob es richtig geworden ist.
-
Yasday schrieb:
// int d = Dreieck(x, y, z, &u, &a); // printf("%d;%f;%f\n", d, u, a);
das gehört dann in die main funktion oder??
was bewirkt denn jetzt dieser Teil genau.
Was wird hier für d wiedergegeben?? also für u der umfang und für a die fläche, aber für d??
-
Die gestellte Aufgabe erscheint unvollständig. Für ein Dreieck braucht man drei Punkte (x,y). Wenn nur die Seitenlängen angegeben sind, fehlt mindestens noch eine weitere Vorgabe.
-
berniebutt schrieb:
Die gestellte Aufgabe erscheint unvollständig. Für ein Dreieck braucht man drei Punkte (x,y). Wenn nur die Seitenlängen angegeben sind, fehlt mindestens noch eine weitere Vorgabe.
Ein Dreieck ist in seiner Form durch drei Seiten vollständig beschrieben. Stichwort: Kongruenzsätze.
-
vielen Dank, es sind nicht zwei sondern 3 Seitenlängen gegeben, deshalb könnte schon ein Dreieck konstruiert werden aber trotzdem danke für die Hilfe.
#include <stdio.h> #include <math.h> double u, a, s, d, dr; double x, y, z; int pruefe(int x, int y, int z) { if ((x+y<=z) || (x+z<=y) || (y+z<=x)) { d=0; } else { d=1; } return d; } 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; } void main() { printf("\nBitte drei Seitenlängen fuer des Dreieck eingeben : "); scanf("%d %d %d", &x, &y, &z); printf("Ihre Eingabe : x=%d; y=%d; z=%d", 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"); int d = Dreieck(x, y, z, &u, &a); printf("%d;%f;%f\n", d, u, a); return 0; } }
so sieht es jetzt aus bei mir. wenn ich dieses programm jetzt ausführe und für alle seitenlöngen jeweils eine 3 eingebe, sagt das programm:
Mit den gegebenen Seitenlängen kann kein Dreieck konstruiert werden.
Woran kann das liegen? Ich prüfe doch ob die funktion pruefe den wert 0 annimmt, und nur dann soll das doch so ausgegeben werden, was aber nicht der fall sein darf wenn ich für alle seiten 3 eingebe, oder mache ich ein Denkfehler??
-
Die Variablen
double u, a, s, d, dr; double x, y, z;
werden in main definiert.
Globale Variablen sindDein Seitenlängen sollten alle vom gleichen Typ sein und nicht einmal int und dann wieder double. Das geht gerade bei Zeigern schief.
In Dreieck(), in prufe() und auch in main() alle x y z auf double.Oder besser benenne die Seiten in a, b und c um (Standardbezeichnung im Dreieck, x, y, z sind i.A. Koordinaten). Die Fläche ist dann A.
Dann kannst du noch d in ok umbenennen oder in Dreieck_gueltig. Das bleibt dann ein int.
Und schon brauchst du nicht mehr rätseln wofür die Variablen stehen.Und an der Uni ist nicht mehr mit Händchen halten. Selber machen ist angesagt.
-
Gerade noch gesehen:
Schau mal wie ich den Rückgabetyp von Dreieck angegeben habe.
Dreick gibt einint
zurück da auch pruefe einint
zurück gibt und double für einen boolsche Wert (Gültig/Ungültig) total daneben ist.Und wenn du den C/C++ Button anklickst (statt Code) wird das Ganze auch farbig und bunt.
-
danke, aber dass das Thema nichtmal erwähnt wurde ist schon komisch.
#include <stdio.h> #include <math.h> double 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; } 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; } void main() { double u, a, s, d; double x, y, z; 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); printf("%d;%f;%f\n", d, u, a); return 0; } }
nun bin ich soweit aber die ergebnisse die mein programm dann wiedergibt sind immernoch nicht richtig...
-
#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.