Programm: prüfen ob Dreieck möglich, Umfang und Fläche ausgeben



  • 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 Dereferenzierungsoperator

    Kapitel 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.


  • Mod

    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 sind 😡

    Dein 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 ein int zurück da auch pruefe ein int 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ßt wahl und die andere j .
    Das ist nichts anderes als bei if ((x+y<=z) || (x+z<=y) || (y+z<=x))
    Nur j hat noch gar keinen Wert bekommen (ist nicht initialisiert).

    Bei if(d==0) vergleichst du die Variable d 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 beim scanf("&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.


Anmelden zum Antworten