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



  • Hey Leute, ich brauche eure Hilde für die folgende Aufgabe:

    Implementieren Sie die C-Funktionen:

    int pruefe (int x, int y, int z);
    Die Funktion prüft, ob sich ein Dreieck mit den Seitenlängen x,y,z bilden lässt. Wenn dies der Fall ist, dann wird der Wert 1 zurückgegeben, ansonsten 0.

    Eine Funktion Dreieck , die drei ganze Zahlen als Parameter übergeben bekommt und den Umfang und die Fläche des Dreiecks berevchnet. Die Parameter repräsentieren die Seitenlängen des Dreiecks. Die Ergebnisse dder Berechnung(Umfang und Fläche) sind über über eine Parameterliste zurückzugeben. Der Rückgabewert soll eine Information darüber geben, ob die Berechnung möglich ist(verwenden Sie die Funktion pruefe ).

    Schreiben Sie ein C-Programm, das dem Benutzer erlaubt, wiederholt für verschiedene Dreiecke die Berechnung auszuführen.

    So dann hätte ich da eine Menge an Fragen, da ich nicht wirklivh voran komme.
    Ich habe erst einmal angefangen ein ganz einfaches Programm zu erstellen, dass den Flächeninhalt und Umpfang eines Dreiecks berechnet, dessen 3 Seitenlängen eingegeben werden. Das sieht dann bei mir so aus:

    #include <stdio.h>
    #include <math.h>
    
    void main()
    {
    double a, b, c;    
    double U, A;     
    double s;        
    
    printf("\nBitte drei Seitenlängen für des Dreieck eingeben : ");
    scanf("%lf %lf %lf", &a, &b, &c);
    printf("Ihre Eingabe : a=%.3lf; b=%.3lf; c=%.3lf", a, b, c);
    if()
    printf("\n\nBerechne Umfang & Fläche!\n");
    
    U=a+b+c;                                        printf("\nUmfang : %.3lf", U);
    
    s=U/2;      A=sqrt(s*((s-a)*(s-b)*(s-c)));      printf("\nFläche : %.3lf", A);
    return 0;
    }
    

    Dann stehr ja in der Aufgabenstellung aber, dass ich zwei Funktionen implementieren soll, einmal pruefe und einmal Dreieck .
    Dann müsste mein Programm zu beginnen

    #include <stdio.h>
    #include <math.h> 
    
    int pruefe(int x, int y, int z)
    {
    ???
    }
    
    int Dreieck(int x, int y, int z)
    {   int Umfang; int Flaeche;
        U=x+y+z; 
        s=U/2;
        A=sqrt(s*((s-x)*(s-y)*(s-z)));
        return pruefe(x,y,z;)
    }
    

    was in die erste Funktion reinkommt weiß ich grad überhaupt nicht, wie bestimmt man ob 2 Seiten einen Dreieck bilden oder nicht? und "Rückgabewert heißt doch dann return 0 oder return 1 drunterschreiben nicht wahr?

    Und zu der zweiten Funktion Dreieck: Ist es richtig mit dem return pruefe, weil in der Aufgabenstellung ja steht dass der Rückgabewert angeben soll, ob ein Dreieck möglich ist oder nicht und ich die pruefe funktion verwenden soll??
    Und was heißt die ergebnisse (fläche, umfang)über die parameterliste widergeben?? Ich würde jetzt denken dass ich da mit printf die ergebnisse ausgebe, also dann so

    int Dreieck(int x, int y, int z)
    {   int Umfang; int Flaeche;
        U=x+y+z; 
        s=U/2;
        A=sqrt(s*((s-x)*(s-y)*(s-z)));
        printf("U=%d, A=%d", U, A);
        return pruefe(x,y,z);
    }
    

    aber dass da steht über die Parameterliste, hat mich jetzt bisschen verwirrt.

    Also ist jetzt vllt ein bisschen viel aufeinmal gefragt aber ich hoffe, dass ihr mir da helfen könnt, damit ich überhaupt weiter probieren kann.
    VIEEELEN DANK IM VORAUS



  • Schau mal, da war jemand 14 Tage schneller: http://www.c-plusplus.net/forum/297223

    Überleg mal selber wie lang die Seiten sein dürfen, damit es ein Dreick wird.
    Probier mal ob du mit 1, 1, 10 ein Dreick konstruieren kannst 🙂



  • Ist schon zu lange her das ich so was gemacht hab.

    Aber schon mal vorweg:

    woher hast du:

    #include <stdio.h>
    #include <math.h>
    
    void main()  // void ?
    {
        ...
        scanf("%lf %lf %lf", &a, &b, &c);
        ...
    }
    

    wenn euch euer Lehrer, das nicht ausdrücklich so zeigt ist

    int main()
    {
    

    besser, da vom Normenausschuss so empfohlen.

    Wenn dein scanf(...) so funktioniert ist das okay. Es gibt aber einen Conpiler, der das nicht mag. Wenn du den nicht nutzt, sind die Formatangaben okay.

    Zu siehe Kommentare im Quelltext:

    #include <stdio.h>
    #include <math.h>
    
    int pruefe(int x, int y, int z)
    {
    ???
    }
    
    int Dreieck(int x, int y, int z)
    {
        int Umfang; int Flaeche;  // Wo nutzt du dies?
        U=x+y+z;  // U ?
        s=U/2;    // s?
        A=sqrt(s*((s-x)*(s-y)*(s-z)));
        return pruefe(x,y,z;)  // ????
    }
    


  • prob1 schrieb:

    Ist es richtig mit dem return pruefe, weil in der Aufgabenstellung ja steht dass der Rückgabewert angeben soll, ob ein Dreieck möglich ist oder nicht und ich die pruefe funktion verwenden soll??

    Wenn du erst bei der Rückgabe prüfst, ist es zu spät.

    Wie willst du die Fläche von einem Dreieck berechnen, das nicht möglich ist?
    Ok, gibt eine negative Fläche 🙂



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


Anmelden zum Antworten