tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von 3Cyb3r
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
781
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    jenny1106 jenny1106 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    14
    Hallo zusammen!

    ich haben einen Teil eines C-Programms vorgegeben:

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>

    /*Daten von erbrachten sportlichen Leistungen*/
    typedef struct {
    double laufen_100m; /*in Sekunden*/
    double weitsprung; /*in Metern*/
    } Leistungen;

    /*Daten eines Schuelers*/
    typedef enum {M,F} Geschlecht;

    typedef struct {
    char name[50];
    char gruppe;
    Geschlecht g;
    Leistungen l;
    } Schueler;

    int main (void)
    {
    int num;
    Schueler* f;

    printf("Bitte geben Sie die Anzahl der Schueler ein!\n"); /*1. Anweisung (siehe unten)*/
    scanf("%d", &num);

    /*hier sollen weitere C-Anweisungen eingefügt werden*/

    return 0;
    }

    Ich soll nun weitere C-Anweisungen in das Programm integrieren.
    1. Die Anzahl der Schüler soll von der Standardeingabe eingelesen und in der Variablen num gespeichert werden
    2. Die Zeigervariable f soll mit der Startadresse eines dynamisch angelegten Feldes belegt werden, welches die Daten für num Schüler aufnehmen kann.
    3. Der Schüler Lukas aus Gruppe H hat für 100 Meter 20.21 Sekunden gebraucht und ist nur 1.45 Meter weit gesprungen. Seine Daten sollen im letzten Eintrag des Feldes f abgespeichert werden.
    4. Die besten Leistungen erbrachte die Schülerin Margarete aus Gruppe A: Sie ist 7.55 Meter weit gesprungen und hat die 100 Meter in 9.5 Sekunden absolviert. Ihre Daten sollen im ersten Eintrag des Feldes f abgelegt werden.

    Die erste Anweisung habe ich bereits integriert aber bei den anderen dreien komme ich absolut nicht weiter.
    Wie lege ich ein dynamisches Feld an? Wie kann ich die Daten der Schüler in den Feldern abspeichern und wie genau schaffe ich es, dass die Daten bestimmten Felder zugeordnet werden?

    Ich hoffe, dass ich mir weiterhelfen könnt. Das Thema ist absolut klausurrelevant für mich.
    Danke.
     

  2. #2
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Hi, nun was du hier brauchst ist, wie du uch in der Überschrift geschrieben hast, ein dynamisches Array.

    Es gäbe zwei varianten dein Problem zu realisieren. Die eine komplexer, aber schöner, die andere, ich sage mal spartanisch, aber einfacher

    Erst die "spartanische"

    Du brauchst ja ein Array, du darfst dem Kompiler aber keine feste Größe sagen, da du diese ja als nutzer während der Laufzeit eingeben willst.
    Also musst du erst einen Zeiger auf ein Array deklarieren, damit der Kompiler schonmal weis dass du ein Array haben willst.

    das siht dan etwa so aus:
    Code cpp:
    1
    
    int *myarray;

    hier hast du dann einen Zeiger auf den Datentyp integer festgelegt (noch kein array, und auch keine Variable!!).
    als nächstes brauchst du deine variable, die der user eingibt.
    Mit dieser variable setz du dan dein Array, und kannst dan ganz normal darauf zugreifen.
    etwa so:
    Code cpp:
    1
    2
    3
    4
    5
    
    int size;
     
        cin>>size;
     
        myarray = new int[size];
    in der dritten wenn der nutzer jetz 10 eingibt, wir d erst in der dritten Zeile (während der Laufzeit) ein Array mit 10 Elementen angelegt.

    Richtig dynamisch ist dieses jedoch nicht (deswegen meinte ich oben auch spartanisch).

    Um ein voll dynamisches array hinzubekommen, müsstes du das Programm quasi selbst bestimmen lassen, zum Beispiel anhand der Anzahl der Werte, die man eingibt, dass dieses selbst die Array größe festlegt.

    Oder du nutzt eine Liste, dort kannst du so viele Elemente hinzufügen und löschen wie du willst, doch das ist ein anderes Thema

    Ich hoffe ich konnte helfen

    EDIT:
    Oh, tut mir leid, ich bin garnicht auf das beschreiben und ausgeben des Array eingegangen
    beschreiben:
    Code cpp:
    1
    2
    3
    4
    
    for(int i=0; i<size;i++)
        {
            myarray[i]=i*2;
        }

    ausgeben:
    Code cpp:
    1
    2
    3
    4
    
    for(int i=0; i<size;i++)
        {
            cout<<"\t"<<myarray[i]<<endl;
        }

    Ps.: Das funktioniert auch mit mehr dimensionalen Arrays, falls du damit auch arbeiten musst, dann kann ich dazu auch hilfe leisten
    Geändert von Marschal (04.03.10 um 16:07 Uhr)
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  3. #3
    jenny1106 jenny1106 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    14
    Ich danke dir für deine schnelle Antwort.
    Aber leider verstehe ich immer noch Bahnhof.

    Könntest du das vielleicht konkreter auf meine Aufgabenstellung beziehen? So ist mir deine Erklärung zu abstrakt. Sorry
     

  4. #4
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Hier, bitte

    Habe den Quelltext auf dein Problem zugeschnitten und kommentiert, frag ruhig, wenn du noch was wissen willst

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    
    #include <stdafx.h>
    #include <iostream>
    #include <windows.h>
     
    using namespace std;
     
    /*Daten von erbrachten sportlichen Leistungen*/
    typedef struct {
    double laufen_100m; /*in Sekunden*/
    double weitsprung; /*in Metern*/
    } Leistungen;
     
    /*Daten eines Schuelers*/
    typedef enum {M,F} Geschlecht;
     
    typedef struct {
    string name;
    string gruppe;
    Geschlecht g;
    Leistungen l;
    } Schueler;
     
     
    int main()
    {
        WinMain(NULL,NULL,NULL,SW_SHOW);
    }
     
    int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )
    {
        int num;//variable num, für die Nutzereingabe
     
        Schueler *s;//zeiger auf schüler, um auch dynamisch schüler anzulegen
     
        cin>>num;//Die Anzahl der Schüler soll von der Standardeingabe eingelesen und in der Variablen num gespeichert werden
     
        s = new Schueler[num];//ein "dynamisch" angelegtes Array für unsere schueler
     
        //schüler Lukas an letzter stelle
        s[1].name="Lukas";
        //s[1].g=M;
        s[1].l.weitsprung=1.45;
        s[1].l.laufen_100m=20.21;
        s[1].gruppe="H";
     
        //schüler Margarete an erster stelle
        s[0].name="Margarete ";
        //s[0].g=W;
        s[0].l.weitsprung=7.55;
        s[0].l.laufen_100m=9.5;
        s[0].gruppe="A";
     
        for(int i=0; i < num ; i++ )//schleife zur Ausgabe
        {
            cout<<s[i].name.c_str()<<endl;
            cout<<s[i].g<<endl;
            cout<<s[i].l.laufen_100m<<endl;
            cout<<s[i].l.weitsprung<<endl;
            cout<<s[i].gruppe.c_str()<<endl;
            cout<<"\n"<<endl;
        }
     
        system("PAUSE");
     
        return 0;
    }

    EDIT: übrigends habe ich char zu string geändert, ist komfortabler, und deine Struktur "Geschlecht", wie genau soll diese benuzt werden?
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  5. #5
    jenny1106 jenny1106 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    14
    Das hilft mir schon sehr weiter. Danke.

    Wie ich sehe programmierst du mit C++? Wir benutzen an der Uni in dem Informatikkurs lediglich C.
    In der Klausur haben wir keinen Computer und müssen die Anweisungen einfach nur zu Papier bringen. So ist beispielsweise die Ausgabe der Daten überhaupt nicht relevant.

    Wie genau die Geschlecht Struktur verwendent wird kann ich dir auch nicht genau sagen. Ich habe nicht mehr Informationen dazu, als das was ich schon gepostet habe.

    Noch eine weitere Frage zu deinem Quelltext.
    Du hast die Daten von Lukas auf s[1] gepackt und die Daten von Margerete auf s[0]. Damit gehst du doch davon aus, dass wir nur zwei Schüler haben. Wie sieht es denn jetzt aus, wenn ich zB. 25 Schüler in einer Klasse habe und Felder für die Daten aller Schüler brauche und ich erstmal nur zwei Datensätze habe. Hier im Beispiel die von Lukas und Margarete. Kann ich dann sagen s[0] für Margarete und s[num-1] für den letzten Platz, wobei num die Anzahl aller Schüler ist?
     

  6. #6
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    wenn es so steht in der Aufgabe, dass Lukas letzter sein soll, bei egal wie vielen Schueler, dan kannst du das so machen jop
    Code cpp:
    1
    
    s[num-1] //ist das letzte element des Arrays

    alle anderen elemente sind dan halt unbelegt.
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  7. #7
    3Cyb3r 3Cyb3r ist offline Mitglied Brokat
    Registriert seit
    May 2008
    Ort
    Baunatal (Hessen)
    Beiträge
    413
    Hier: // ist nicht getestet // müsste C Standart sein
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
     
    /*Daten von erbrachten sportlichen Leistungen*/
    typedef struct 
    {
        double laufen_100m; /*in Sekunden*/
        double weitsprung; /*in Metern*/
    } Leistungen;
     
    /*Daten eines Schuelers*/
    typedef enum {M,F} Geschlecht;
     
    typedef struct 
    {
        char name[50];
        char gruppe;
        Geschlecht g;
        Leistungen l;
    } Schueler;
     
    int main (void)
    {
        int num;
        Schueler* f;
     
        printf("Bitte geben Sie die Anzahl der Schueler ein!\n"); /*1. Anweisung (siehe unten)*/
        scanf("%d", &num);
     
        f = (Schueler *)malloc(num*sizeof(Schueler));
        if(f == NULL) 
        {
            printf("Fehler beim allozieren des Speichers\n");
            return EXIT_FAILURE;
        }
     
        int i = 0;
        while( i < num ) 
        {
            printf("Wert für Schüler[%d] eingeben : \n
                    Name: ", i);
            scanf("%s", &f[i]name);
            printf("Gruppe: ");
            scanf("%s", &f[i]gruppe);
            printf("Geschlecht [M/F]: ");
            scanf("%c", &f[i]g);
            printf("100m laufen: ");
            scanf("%lf", &f[i].laufen_100m);
            printf("Weitsprung: ");
            scanf("%lf", &f[i].weitsprung);
            i++;
       }
        
        // Daten ausgeben bli bla blub ... SINEP
     
        free(f);
     
        return 0;
    }

    Das ist keine Struktur Geschlecht das ist eine Enumeration ( Aufzählung)
    ohne Zuweisung wird bei 0 angefangen zu zählen, also:
    M = 0 und dann F = 1

    Due könntest z.B. auch schreiben
    Code cpp:
    1
    
    typedef enum {M=3,F} Geschlecht;
    dann wär F = 4
    Man kann das ganze mit nem "string" dann ansprechen. Im Prinzip wie eine #define Anweisung, nur das automatisch hochgezählt wird.
    Ist oft ganz praktisch z.B. wenn man sich Tastten definiert ASCII-Code...

    EDIT:
    statt malloc kannst du dir ja auch mal realloc und calloc ansehen.

    MFG
    Geändert von 3Cyb3r (04.03.10 um 19:25 Uhr)
    Marschal bedankt sich. 
    Bei der Geburt ist ein Mensch so unfertig, wie ein an einem schönen blauen Montag in Taiwan hergestellter Computer vor der Programmierung.
    - Wolfgang Körner

  8. #8
    jenny1106 jenny1106 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    14
    Danke für eure Beiträge!
     

  9. #9
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    Bitte bitte Die, die dir helfen konnten, werden sich über einen gedankten Beitrag freuen (Danke-Button)

    MfG
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

Ähnliche Themen

  1. Dynamische Felder zusammen rechnen
    Von hoctar im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 13.01.09, 16:18
  2. Dynamische Felder Kopiern
    Von XeoX im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 27.05.08, 11:30
  3. Dynamische DropDown Felder
    Von Kranetierli im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 17.09.07, 13:51
  4. [VBS] dynamische Formular-Felder ausfüllen
    Von MiLa im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 18.03.05, 19:14
  5. Dynamische Felder in C
    Von Radhad im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 25.05.03, 19:54