Array of structure



  • Ich weiß leider um die Defizite, aber genau aus dem Grund bin ich hier 🙂 dies ist der letzte Informatik-Kurs in meinem Studium und die Aufgaben sind auch nicht zum Erledigen des Kurses notwendig, allerdings würde ich es dennoch gerne verstehen und dachte, ich komme hierhin 🙂

    Ich tüftel gerade noch am Code, habe etwas umdispuniert. Danke Dirk für die zahlreichen Anmerkungen 🙂



  • DirkB schrieb:

    Andromeda schrieb:

    Nimm statt gets() besser fgets(), denn das hat eine Längenbegrenzung.

    Aber gets und fgets kann man nicht 1:1 austauschen, da fgets noch das '\n' von der Entertaste abspeichert.

    Stimmt, scanf ("%6s" ...) finde ich auch besser. 🙂



  • Aktuell sieht es so aus:

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char Display(char,char,float);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark[]; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list *database;
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        struct list exams[n];
    
        for(n=0; n<i; n++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&exams[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&exams[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&exams[n].mark);
        }
    
        result=Display(Matr,ExamID,mark);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char Display(char x,char y, float z)
    {
        if(exams[n].mark<=4.0)
    
        return 0;
    }
    

    Wenn ich mir den Code ansehe, ist es eigentlich schon eher das, wo ich hin wollte. Eine Frage habe ich allerdings bezüglich der Display-Funktion? Wie schaffe ich es, gewisse Daten einer Struktur in dieser Funktion auf ihre Wertigkeit zu testen? Dass es wie oben falsch ist, sehe ich ein 😃



  • Tergo schrieb:

    Wenn ich mir den Code ansehe, ist es eigentlich schon eher das, wo ich hin wollte.

    Kannst du das denn überhaupt beurteilen?

    Tergo schrieb:

    Eine Frage habe ich allerdings bezüglich der Display-Funktion? Wie schaffe ich es, gewisse Daten einer Struktur in dieser Funktion auf ihre Wertigkeit zu testen? Dass es wie oben falsch ist, sehe ich ein 😃

    Der Test ist richtig. Nur solltest du auch in der Funktion Zugriff auf das Array haben.

    %c bei scanf mit einem char-Array ist selten sinnvoll.
    Wozu dient database und wozu ist exam da?

    Was hat der Begriff 'Display' mit dem Test auf bestandene Tests zu tun?
    - scheint der falsche Name für die Funktion zu sein.



  • 1. Die Funktion heißt nun 'passedTest'.
    2. Database, so dachte ich, gehört zur Deklarierung von malloc.
    3. Exams hatte ich eingeführt, um die gescannten Daten auf die Struktur zu katalogisieren.
    4. Wie kann ich in der Funktion denn auf ein Array zugreifen? Kommt dann in die Klammer, einfach dasselbe wie in Zeile 37?

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char passedTest(char,char,float);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark[]; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list *database;
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        struct list exams[n];
    
        for(n=0; n<i; n++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&exams[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&exams[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&exams[n].mark);
        }
    
        result=passedTest(exams[n].Matr,exams[n].ExamID,exams[n].mark);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char passedTest(exams[n].Matr,exams[n].ExamID,exams[n].mark)
    {
        if(exams[n].mark<=4.0)
    
        return 0;
    }
    


  • Wozu dient malloc und warum benutzt du es?

    Lies, Nein, arbeite dein Vorlesungsscripz nochmal, besser mehrmals, durch.

    Wenn das nicht reicht, hol dir ein Buch über C. Gibt es auch in der Bibliothek.

    Du hast so große Defizite, dass du eine Privatvorlesung brauchst.
    Diese Zeit haben hier die Allerwenigsten.



  • Danke für den Tipp, werde ich definitiv machen! Allerdings benötige ich bis Dienstag die Lösung zu der Aufgabe 😞



  • Tergo schrieb:

    Allerdings benötige ich bis Dienstag die Lösung zu der Aufgabe 😞

    Die wird hier aber keiner machen.
    Das ist deine Aufgabe.

    Ihr müßt ja irgendwann mal Arrays behandelt haben. Möglicherweise als es um C-Strings ging.
    Auch Funktionen, die Arrays als Paramter haben, werden da i.A. behandelt.
    Schau da doch mal nach.

    Im übrigen übergibst du einzelne Elemente der struct an die Funktion.



  • Ich glaube ich verstehe jetzt, wieso 'exams' falsch gewählt war. Database war ja schließlich bereits deklariert, richtig?

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char passedTest(struct list database);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark[]; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list *database;
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        for(n=0; n<i; n++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&database[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&database[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&database[n].mark);
        }
    
        result=passedTest(database);
    
        printf("The number of passed exams is: %d", result);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char passedTest(struct list database)
    {
        int num;
        if(exams[n].mark<=4.0)
    
        return 0;
    }
    

    Den einzigen Error, den ich jetzt noch AUßERHALB der unteren Funktion erhalte, ist, dass der Typ von passedTest Konflikte bereitet. Dieser ist aber, wie oben, char.

    Edit: habe schon mal angefangen, das Endergebnis letztendlich abzudrucken. Das einzige, was nun noch fehlt, ist der Test in der Funktion 😞



  • Du hast jetzt zweimal database definiert.
    Einmal als Pointer und einmal als Array.
    Das mag der Compiler nicht.

    Du übergibst auch dieses database an die Funktion passedTest. Die erwartet aber ein struct und keine Adresse (Zeiger) darauf. Großer Unterschied!



  • Tergo schrieb:

    Ich glaube ich verstehe jetzt, wieso 'exams' falsch gewählt war. Database war ja schließlich bereits deklariert, richtig?

    Und deshalb benennst du das exams-Array einfach um, noch dazu in "database", was bereits weiter oben als Pointer existiert. In C gibt es zwar keine One-Definition-Rule, aber 2 verschiedene Objekte gleichen Namens, in einer Übersetzungseinheit, sind auch in C nicht erlaubt.



  • Das heißt, es wäre eigentlich so:?

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char passedTest(struct list database);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark[]; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list database;
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        for(n=0; n<i; n++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&database[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&database[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&database[n].mark);
        }
    
        result=passedTest(list);
    
        printf("The number of passed exams is: %d", result);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char passedTest(struct list database)
    {
        int num;
        if(database[n].mark<=4.0)
    
        return 0;
    }
    

    Hier wird jetzt die ganze 'list' an die Funktion weitergegeben. Desweiteren ist database kein Pointer mehr.



  • Tergo schrieb:

    Das heißt, es wäre eigentlich so:?

    Nein, auch nicht. 😞
    Wieso hast du das Sternchen vor database weggelöscht?
    Weißt du denn, wieso es überhaupt da war?



  • Das Sternchen hat 'Database' als Pointer deklariert, das Löschen war ein Irrtum. Hier die korrigierte Version:

    Edit: ich verstehe schon, wieso Database als Pointer deklariert wurde, allerdings mache ich offenbar kurz darauf etwas falsch: ich scanne die Eingaben in database rein und sage dort, dass es sich dabei um ein Array handelt. Tut es aber nicht. Ich dachte jedoch, dass database ein Array sein muss, schließlich, davon bin ich ausgegangen, brauchen wir für die Aufgabe ein Array of structures?

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char passedTest(struct list database);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark[]; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list *database;
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        for(n=0; n<i; n++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&database[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&database[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&database[n].mark);
        }
    
        result=passedTest(list);
    
        printf("The number of passed exams is: %d", result);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char passedTest(struct list database)
    {
        int num;
        if(database[n].mark<=4.0)
    
        return 0;
    }
    


  • Hör auf hier rumzunerven, melde dich erst wieder, wenn du Code hast, der compilierbar und ohne Warnungen ist.



  • Tergo schrieb:

    Edit: ich verstehe schon, wieso Database als Pointer deklariert wurde, allerdings mache ich offenbar kurz darauf etwas falsch: ich scanne die Eingaben in database rein und sage dort, dass es sich dabei um ein Array handelt. Tut es aber nicht.

    Das ist egal. Einen Pointer kann man wie ein Array ansprechen.

    int *pointer = ...;
    *(pointer+a) = b; // ist das selbe ...
    pointer[a] = b;    // ... wie das
    

    🙂



  • Das heißt, bis dorthin sollte es eigentlich fehlerfrei laufen?
    Der Compiler spuckt nämlich tatsächlich keine Fehler mehr aus, die sich auf die main-Funktion beziehen. In der passedTest-Funktion hingegen wird's schwieriger, aber da ist es ja klar, der Code ist dort auch noch nicht fertig.
    Habe ja die Struktur jetzt in die passed-Test-Funktion gegeben und möchte jetzt gerne die float-Werte abrufen und diese gegentesten. Die passed-Test-Funktion würde dann nun so aussehen:

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char passedTest(struct list database);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark[]; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list *database;
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        for(n=0; n<i; n++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&database[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&database[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&database[n].mark);
        }
    
        result=passedTest(struct database);
    
        printf("The number of passed exams is: %d", result);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char passedTest(struct list database)
    {
        int num=0,n,i;
    
        for(n=0;n<i;n++)
        {
        if(database[n].mark<=4.0)
        num++;
        else
        continue;
        }
    
        return num;
    }
    


  • Der Auruf und die Deklaration von passedTest sind Müll.

    database in main ist ein Zeiger und so sollte der auch an die Funktion weiter gegeben werden.
    Dann muss die Funktion aber auch einen Zeiger erwarten.
    Und du musst der Funktion auch noch die Anzahl der Elemente im Array mitgeben. Als extra Parameter.

    Deine scanf in der Schleife sind immer noch falsch.

    Und dein else continue ist sehr sinnfrei.



  • DirkB schrieb:

    Der Auruf und die Deklaration von passedTest sind Müll.

    database in main ist ein Zeiger und so sollte der auch an die Funktion weiter gegeben werden.
    Dann muss die Funktion aber auch einen Zeiger erwarten.
    Und du musst der Funktion auch noch die Anzahl der Elemente im Array mitgeben. Als extra Parameter.

    Deine scanf in der Schleife sind immer noch falsch.

    Und dein else continue ist sehr sinnfrei.

    In der main: "for(n=0; n<i; n++)", - n und i hat er wohl vertauscht, denn n enthält die Anzahl der Datensätze und i ist bis dahin uninitialisiert.

    Und "mark" in der Struct hat Array-Klammern. Das ist sicher auch nicht gewollt. 😃



  • Habe jetzt nochmal einige Anmerkungen von euch berücksichtigt und diese hier hinterlegt 🙂

    #include <stdio.h> 
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    char passedTest(struct list *database);
    
    struct list
    {                                   
        char Matr[MAXMATRNUM+1]; 
        char ExamID[MAXEXAMIDNUM+1]; 
        float mark; 
    }; 
    
    int main() 
    { 
        int n,result,i;
        struct list *database[int];
        printf("Please enter the number of exams: ");
        scanf("%d", &n);
        database = malloc (n * sizeof(struct list));
        if (database == 0)
            return EXIT_FAILURE;
    
        for(i=0; i<n; i++)
        {
            printf("Please enter the Matriculation Number %d",i);
            scanf("%c",&*database[n].Matr);
            printf("Please enter the Exam-ID %d",i);
            scanf("%c",&*database[n].ExamID);
            printf("Please enter the Mark %d",i);
            scanf("%f",&*database[n].mark);
        }
    
        result=passedTest(*database);
    
        printf("The number of passed exams is: %d", result);
    
        free (database);
        return EXIT_SUCCESS;
    } 
    
    char passedTest(struct list database)
    {
        int num=0,n,i;
    
        for(i=0;i<n;i++)
        {
        if(*database[n].mark<=4.0)
        num++;
        }
        return num;
    }
    

    Erhalte jetzt so gut wie keine Fehlermeldungen mehr, die letzten beiden beziehen sich auf Zeile 18 und 50. Dass Zeile 50 falsch ist sehe ich ein, bei Zeile 18 grübel ich weiterhin...


Anmelden zum Antworten