Strukturen unter C



  • Dann bekommst du es halt noch mit Übergabe:

    #include<stdio.h> 
    
    //Deklaration von Punkt 
    typedef struct StructPunkt{ 
        double x; 
        double y; 
    }Punkt; 
    
    //Deklaration von Dreieck 
    typedef struct StructDreieck{ 
        Punkt pt[3]; 
    }Dreieck; 
    
    void eingabe(Dreieck *dreieck)
    {
    	Punkt tmp;
    	char c = 'A'; 
    	int i;
    
    	for(i = 0; i < 3; ++i) 
        { 
            printf("Geben Sie Punkt %c an:\n", c++); 
            scanf("%lf %lf", &tmp.x, &tmp.y); 
    
            dreieck->pt[i] = tmp; 
        }
    }
    
    void ausgabe(Dreieck *dreieck)
    {
    	char c = 'A'; 
    	int i;
    
    	printf("\nDreieck hat folgende Punkte: \n"); 
    
        for(i = 0; i < 3; ++i) 
        { 
            printf("Punkt %c x: %lf\nPunkt %c y: %lf\n", c, dreieck->pt[i].x, c, dreieck->pt[i].y); 
            ++c; 
        } 
    }
    
    int main() 
    { 
        Dreieck dreieck; 
    
    	eingabe(&dreieck);
    	ausgabe(&dreieck);
    
        return 0; 
    }
    


  • HighLigerBiMBam schrieb:

    Ich hoffe das hilft dir...

    Glaube ich kaum, solchen Code sollte man sich nicht als Beispiel nehmen:

    c = 'A';
        i = 0;
        printf("\n\nDreieck hat folgende Punkte: \n");
    
        for(i = 0; i < 3; ++i)
        {
            printf("Punkt %c x: %lf\nPunkt %c y: %lf\n", c, dreieck.pt[i].x, c, dreieck.pt[i].y);
            c++;
        }
    

    Klarer wäre so etwas:

    printf("\n\nDreieck hat folgende Punkte:\n");
        for (i = 0, c = 'A'; i < 3; ++i, ++c) {
            printf ("Punkt %c x: %lf\nPunkt %1$c y: %lf\n", c, dreieck.pt[i].x, dreieck.pt[i].y);
        }
    

    Anderer Ausschnitt:

    char c = 'A';
        ...
        for(i = 0; i < 3; ++i)
        {
            printf("Geben Sie Punkt %c an:\n", c++);
            scanf("%lf %lf", &tmp.x, &tmp.y);
    
            dreieck.pt[i] = tmp;
        }
    

    Klarer:

    for (i = 0, c = 'A'; i < 3; ++i, ++c) {
            printf ("Geben Sie Punkt %c an:\n", c);
            scanf ("%lf %lf", &dreieck.pt[i].x, &dreieck.pt[i].y);
        }
    

    Beäuge lieber misstrauisch vorgelöste Aufgaben,
    es gibt sie doch, diejen'gen Knaben,
    die nur glauben, dass sie haben,
    wunderbare Dichtergaben.



  • Sehr weltbewegend... Danke für nichts. @ ihdhd

    Du bist der Beste.



  • Hallo,

    Ich bin eifrig am probieren und habe auch so einiges verstehen können..
    Dank den Programmcodes, die ihr mir gegeben habt, wird mir einiges deutlicher. Danke euch...

    Nur habe ich eine Frage. In dem untrigen Code habe ich in der Funktion ein Einlesevorgang(wie gesagt, ich bin noch am probieren).

    Obwohl ich bei der Funktion scanf nur einmal %lf stehen habe, muss ich 2 Werte eingeben, damit der restliche Teil des Programmcodes abgearbeitet wird. Aber es wird nichts in die nächste Variable gespeichert, nur eingegeben. Wenn ich zwei %lf mache, kann ich plötzlich 3 Eingaben machen.

    Woran liegt das?

    #include<stdio.h>
    #include<stdlib.h>
    
    //Deklaration von Punkt
    typedef struct StructPunkt{
        double x;
        double y;
    }Punkt;
    
    //Deklaration von Dreieck
    typedef struct StructDreieck{
        Punkt A;
        Punkt B;
        Punkt C;
    }Dreieck;
    
    void DreieckEinlesen(Dreieck*);
    
    int main(){
      Dreieck Eingabe;
      DreieckEinlesen(&Eingabe);
    
        printf("A(x) = %lf; A(y) = %lf\n",Eingabe.A.x, Eingabe.A.y);
        printf("B(x) = %lf; B(y) = %lf\n",Eingabe.B.x, Eingabe.B.y);
        printf("C(x) = %lf; C(y) = %lf\n",Eingabe.C.x, Eingabe.C.y);
    }
    
    void DreieckEinlesen(Dreieck *Eingabe){
    
    	printf("Bitte Punkt A(x) und A(y) eingeben:\n");
    	scanf("%lf%lf\n", &(Eingabe->A.x), &(Eingabe->A.y));
    
    	printf("Bitte Punkt B(x) und B(y) eingeben:\n");
    	scanf("%lf%lf\n", &(Eingabe->B.x), &(Eingabe->B.y));
    
    	printf("Bitte Punkt C(x) und C(y) eingeben:\n");
    	scanf("%lf%lf\n", &(Eingabe->C.x), &(Eingabe->C.y));
    
    }
    

    EDIT:

    Ich habe den obrigen Code auf mehrere Eingaben bzw. Ausgaben erweitert. Es geschehen sehr komische Dinge. Unzwar ist die erste Eingabe 3 mal, obwohl nur 2 vorgesehen sind. Die zweite und dritte Eingabe sind hingegen nur 2.

    Nun wird aber der dritte Wert von der ersten Eingabe in B(x) gespeichert und der Wert, der für B(x) eingegeben wird, wird in B(y) gespeichert usw..

    woran liegt das?



  • Da ist wohl noch das '\n' im Buffer, das scanf nicht ausliest.

    Viel beheben das mit fflush(stdin); was undefiniertes Verhalten zeigen kann.
    Dazu gibt es hier viiiiiele Beiträge.

    Schau mal hier: http://www.c-plusplus.net/forum/viewtopic.php?t=39349
    Nach jedem scanf diese while-Schleife



  • Hey,

    mit der while-Schleife kann ich plötzlich bei allen scanf-Aufrufen 3 Eingaben machen.



  • Ein Leerzeichen zwischen deinen %lf wäre nicht schlecht, damit scanf weiß wann die 1. Zahl aufhört.

    scanf("%lf %lf\n", &(Eingabe->A.x), &(Eingabe->A.y));
    


  • Hey,

    das Problem besteht dennoch.



  • Nimm doch mal das \n bei scanf raus

    scanf("%lf %lf", &(Eingabe->A.x), &(Eingabe->A.y));



  • DirkB schrieb:

    Ein Leerzeichen zwischen deinen %lf wäre nicht schlecht, damit scanf weiß wann die 1. Zahl aufhört.

    scanf("%lf %lf\n", &(Eingabe->A.x), &(Eingabe->A.y));
    

    Unsinn. *scanf weiß allein, wo ein double aufhört. Das Leerzeichen in redundant.

    if( 2==scanf("%lf%lf",&Eingabe->A.x,&Eingabe->A.y) )
      printf("%lf %lf",Eingabe->A.x,Eingabe->A.y);
    else
      puts("fehlerhafte Eingabe");
    while( getchar()!='\n' );
    


  • DirkB schrieb:

    Nimm doch mal das \n bei scanf raus

    scanf("%lf %lf", &(Eingabe->A.x), &(Eingabe->A.y));

    daran lags! Wie dumm von mir..


Anmelden zum Antworten