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


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



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


Anmelden zum Antworten