C Programm Stundenplan mehrdimensionales Array



  • Hallo,
    bin neu hier und versuch mal mein Glück hier, weil ich komm bei dieser ehemaligen Klausuraufgabe irgendwie nicht weiter.
    Mein Kenntnisstand:
    Programmiersprache C ^^ (ob gut oder schlecht kann ich leider erst nach der Klausur sagen^^)

    Aufgabenstellung:
    Es soll ein Studenplan ausgegeben werden. Der Benutzer soll vorher für jeden Tag die Fächer eingeben dürfen. Anschließend soll die Tabelle ausgegeben werden.

    An sich ja zuerst einmal kein Problem.
    Ich benötige ein zweidimensionales Array(Matrix) als Datenstruktur,
    und die Elemente sind vom Typ String

    Nur mein Problem:
    Ein ganzes Wort ist ja selbst ein Char-Array. z.b. "Mathe" soll eingegeben werden und dann z.b.
    in Zeile 0 Spalte 0 (also Montag,1.Schulstunde) eingespeichert werden.

    Mein erster Gedanke war wie folgt:
    (wobei natürlich kann das so nicht funktionniernen)

    #include <stdio.h>
    #define STUNDEN 6
    #define TAGE 5
    
    int main() {
        char* array[7][6];  
    
        enum tag{Mo,Di,Mi,Do,Fr};  // um es einfacher zu lesen
        int i,j;
    
        for(j=0;i<TAGE;i++){
            for(i=0;i<STUNDEN;i++){
                scanf("%s",array[i][j]);
            }
            printf("\n");
        }
    
    printf("\n\n\n");
    system("Pause");
    return 0;        
    }
    

    *Nur mein Problem:
    1. soll ich char oder char
    schreiben?

    2. Wie kann ich ein Wort an stelle array[0][0] schreiben? wenn es geht, ohne besondere Funktionen
    (weil in der Klausur dürfen wir(soweit ich weiß) nur die <stdio.h> Library verwenden?**

    Hat jemand eine Idee dazu?



  • hi,

    so, wie du das array z.zt. definiert hast, hast du nur ein array von (nicht initialisierten) pointern definiert, was so nicht ausreicht. du muesstest dann fuer jedes fach erst noch speicher reservieren ( malloc/free ).

    einfach ist es, wenn du das array gleich mit fester groesse fuer das Fach definierst:

    char arr[TAGE][STUNDEN] [30];
    

    dann kannst du deinen code fuer die eingabe so wie vorgesehen benutzen:

    scanf("%29s",arr[t][s]);
    

    die Längenangabe (29) sollte man sicherheitshalber bei scanf immer verwenden.
    ach ja, deine indizes (i,j) musst du noch richtig setzen, dann sollte es schon so funktionieren...



  • danke...
    jetzt funktionniert alles 🙂



  • Und wozu machst du enum, wenn du es dann nicht benutzt?

    Mach:

    enum tag {Mo, Di, Mi, Do, Fr};  // um es einfacher zu lesen
        enum tag i;
        int j;
    
        for (i = Mo; i <= Fr; i++) {
            for (j = 0; j < STUNDEN; j++) {
                scanf("%s", array[i][j]);
            }
            printf("\n");
        }
    

    Deine Indizes waren übrigens total durcheinander!



  • Ja hab ich bemerkt...
    danke nocheinmal für die alternative Lösung 🙂
    hatte das dann nachher auch wieder entfernt^^ finde es irgendwie ohne enum... besser lesbar...

    vielleicht noch eine Verständnisfrage zum Array:

    nämlich
    z.b.
    int Array[3]

    Der Ausdruck Array ist ja jetzt identisch mit dem Ausdruck &Array[0].
    So Array-Basisadressen verhalten sie wie Zeiger(auf das erste Array-Element)
    daher könnte ich ja auch einen Zeiger erstellen mit

    int *p;
    p=&Array[0]
    oder
    p=Array;
    

    dieser Zeiger, dieser hat ja selbst eine Adresse im Speicher(weil er ja selbst ein Objekt ist)!
    nun meine Fragen,
    hat jetzt "Array" auch einen Speicherplatz und zeigt quasi auf einen Anfang eines Speicherblocks von 3 Feldern (vereinfacht ausgedrückt)
    weil Array[0]=*(Array+0)=*Array



  • Für ein Array

    typ a[n];
    

    bedeutet

    a[k]
    

    praktisch dasselbe wie

    *(a + i)
    

    Da a den Typ "typ *" hat, findet die Addition in sizeof(typ)-Schritten statt.

    Also für "int *i" ist (i + 1) 4 Bytes höher.



  • #include <stdio.h> 
      char *str = "Hello World!\n"; 
       int main () { 
          int Laenge = 0; 
              while ( *str++ != '\0' ) 
          {++Laenge; }
           str=str-Laenge-1;
          printf("%d: %s", Laenge,str); 
          system("Pause");
          return 0; 
       }
    

    Hab noch eine Frage.
    Das Prog. errechnet mir die Länge des Strings aus.

    so wieso muss ich nicht bei
    printf("%d: %s",Laenge,*str) schreiben, weil ich will doch wissen, was hinter der Adresse steckt, die str eingespeichert hat? oder?

    weil bei einem Array schreib ich ja
    noch
    char A[i]={"Hallo";...}
    und dann printf("%s %s...",A[i],...);
    A[i]=
    (A+i) ? hier verwenden wir den Stern ja quasi

    wäre nett, wenn jemand das noch beantworten könnte. Dann könnte ich das Programm von oben ruhigen Gewissens in dem Stundenplan Programm verwenden^^.



  • Mit *str würdest du nur das eine char an der Stelle übergeben, wo der Zeiger ist.

    Wenn du willst, dass printf() den ganzen String printed, musst du ihm sagen, wo der ganze String steht.



  • printf("%s ",pstr) erwartet als parameter die Adresse eines Strings. A[i] ist eine Adresse, ebenso wie (der pointer) str.

    Mit *str wuerdest du auf den Inhalt (=char) an der Adresse str zugreifen, das geht nicht ( bzw. gibt einen Fehler)


Anmelden zum Antworten