Datenstrukturen richtig 'ansprechen'?



  • Hallo,

    ich habe eine Aufgabe und folgende Lösung hierzu angefertigt:
    Aufgabe: Datenstrukturen
    Für eine Bibliothek soll ein Programm zur Verwaltung von Zeitschriften geschrieben werden. Jede Zeitschrift besteht aus mehreren Artikeln.
    Zur Speicherung eines Artikels (Datenstruktur ARTIKEL) werden folgende Daten benötigt:
    ---
    titel des Artikels (50 Zeichen)
    autor Verfasser des Artikels (20 Zeichen)
    seite_anf erste Seite (Seitennummer) des Artikels in der Zeitschrift
    seite_end letzte Seite (Seitennummer) des Artikels in der Zeitschrift
    ---
    Die Datenstruktur Zeitschrift (Datenstruktur ZEITSCHRIFT) benötigt die folgenden
    Komponenten:
    ---
    titel Titel der Zeitschrift (50 Zeichen)
    jahr Jahrgang der Zeitschrift
    nummer Nummer der Ausgabe innerhalb des Jahres
    artikel alle Artikel in der Zeitschrift (maximal 50)
    anzahl Anzahl der Artikel
    ---
    a) Entwerfen Sie auf der folgenden Seite Datenstrukturen namens ARTIKEL und
    ZEITSCHRIFT zur Speicherung von Zeitschriften, und deklarieren Sie eine hinreichend
    groß dimensionierte Variable bibliothek, die Daten für 1000 Zeitschriften aufnehmen
    kann.
    b) Schreiben Sie auf der folgenden Seite eine Funktion, die für die gesamte Bibliothek die
    durchschnittliche Länge eines Artikels in Seiten berechnet und zurückgibt.

    meine Lösung:

    /* DATENSTRUKTUR */
    struct ARTIKEL	{
    	char titel[50+1];
    	char autor[20+1];
    	int seite_anf;
    	int seite_end;	};
    
    struct ZEITSCHRIFT	{
    	char titel[50+1];
    	int jahr;
    	int nummer;
    	struct ARTIKEL artikel[50+1];
    	int anzahl;	};
    
    struct ZEITSCHRIFT biboliothek[1000];
    
    /* FUNKTION */
    double Seitendurchschnitt(struct ZEITSCHRIFT * bibo, int n)
    {
    	int i,j;
    	int anzseiten = 0, anzartikel = 0, a, s;
    
    	for (i = 0; i < n ;i++)
    	{
    		a = bibo[i]artikel;
    		anzartikel = anzartikel + a;
    		for (j = 0; j<a ; j++)
    		{
    			s = 1 + bibo[i]artikel[j]seiten_end - bibo[i]artikel[j]seiten_anf;
    			anzseiten = anzseiten + s;
    		}
    	}
    	return (double) anzseiten / anzartikel;
    }
    

    Nun meine Frage:
    - stimmt das soweit ? (gibt es irgendwelche fehler?)
    - ich wollte das Programm testen, doch das ganze hat (leider) nicht geklappt. Könntet ihr mir vielleicht hierbei behilflich sein (ein Testprogramm mit z.B. zwei oder drei Zeitschriften)?

    Meins (Testprogramm) sah so aus:

    int main (void)
    {
    	struct ZEITSCHRIFT zeits1, zeits2, zeits3;
    	struct ZEITSCHRIFT * ptr1, *ptr2, *ptr3;
    	ptr1 = &zeits1;
    	ptr2 = &zeits2;
    	ptr3 = &zeits3;
    	/* Anzahl Artikel */
    	zeits1.anzahl = 10;
    	zeits2.anzahl = 11;
    	zeits3.anzahl = 45;
    	/* Seitenzahlen der Artikel */
    	ptr1 ->artikel->seite_anf = 1 ;
    	ptr2 ->artikel->seite_anf = 1 ;
    	ptr3 ->artikel->seite_anf = 1 ;
    	/* ende */
    	ptr1 ->artikel->seite_end = 10 ;
    	ptr2 ->artikel->seite_end = 11 ;
    	ptr3 ->artikel->seite_end = 12 ;
    	printf("%lf\n\n\n", Seitendurchschnitt(ptr1, 5) );
    }
    

    Aber das funktioniert leider nicht - und ich weiß auch nicht so recht - weshalb es nicht funktioniert 😞 ?

    Grüße
    aspton



  • Also ich schau mal inwiefern ich das verstanden habe, hab grad selbst n bischen rumprobiert.
    Wenn du eine Variable vom Typ deines structs erstellen willst kannste das struct weglassen, ein einfaches ZEITSCHRIFT a; genügt.
    Warum du wenn die aufgabe ist 50 Zeichen Platz, 50+1 in die Eckige Klammer schreibst versteh ich nicht.
    Dein Testprogramm versteh ich leider nur so halb. Allerdings trägst du damit nichts ein, du erstellst lediglich 3 Zeitschriften in die du dann Werte packst die aber nichts mit der Bibliothek zu tun haben.
    Um mit der Bibliothek richtig zu Arbeiten must du dir noch ne Variable anlegen die für dich mitzählt bei den Artikeln, die sollte Idialerweise in der Zeitschrift stecken, und eine die für dich bei den Datensätzen die bereits eingetragen sind mitzählt. Dir fehlt auch ne Funktion die die Einträge für dich übernimmt.
    D.h. im Idealfall kannst du dir unter deine Bibliothek noch eine Variable vom Typ int packen die du mit 0 initialisierst.
    Der rest könnte so aussehen (ist nur Schematisch)

    struct ARTIKEL
    {};
    struct ZEITSCHRIFT
    {
        int zaehlwerk;
        ARTIKEL artikel[50];
    };
    ZEITSCHRIFT bibliothek[1000];
    int size=0;
    void eintragen()
    {
        // hier die einträge für die Zeitschrift abfangen
        cout/cin usw
        //hier eintragen
        bibliothek[size].variable;
        bibliothek[size].zaehlwerk=0;//hier wird der zaehler für dein ARTIKELarray mit 0 initialisiert
        while(bibliothel[size].zaehlwerk<artikelzahl)//Endlosschleife um die Artikeldaten einzutragen, läuft soweit wieviele artikel vorher angegeben wurden
        {
            //hier alle Daten für den Artikel abfragen
            cin//cout usw
            //hier alle Daten eintragen
            bibliothek[size].artikel[zaehlwerk].variable;
            //den zaehler eins weiterstellen
            bibliothek[size].zaehlwerk+=1;
        };
        //size um eisn erhöhen
        ++size;
    };
    

    soweit zum wesentlichen in deinem void main() must du nun noch ne Schleife packen die abfragt obs noch nen eintrag gibt und ggf eintragen() aufruft.
    Deine Durschnittliche Seiten errechnung kannst du einfach mit int surchschnitt() ohne Variablen zu übergeben erstellen, da deine bibliothek eine globale Variable ist kann die Funktion direkt drauf zugreifen. Dort must du dann eig nur die einzellnen Bibliothekseinträge abklappern und dir dann aus dem inneren Array die Seitenzahlen holen und mit zaehlen.
    Ggf must du noch abfrage Schleifen ob die bibliothek schon voll ist oder ne ausgabe Funktion Programmieren, falls dies noch Teil der Aufgabenstellung ist.

    Hoffe das Hilft dir erstmal weiter.



  • Hallo,

    hier noch eine kleine Antwort auf diese Frage:
    "Warum du wenn die aufgabe ist 50 Zeichen Platz, 50+1 in die Eckige Klammer schreibst versteh ich nicht."

    Das 51-ste Zeichen ist für das '\0' Zeichen. Damit kann man das ganze dann als String ausgeben.

    Gruß und Vielen Dank für deine Antwort
    aspton



  • Was hat deine Überschrift mit deinem Problem zu tun?
    Was ist überhaupt dein Problem?
    Ist der Code original?
    Bist du richtig im C++ Forum? Gibt auch eins für ANSI C...



  • Was hat deine Überschrift mit deinem Problem zu tun?
    steht im Text - kurz gesagt: wie kann ich meine definierten Strukturen benutzen?
    Was ist überhaupt dein Problem?
    steht ebenfalls im Text (s.o.)
    Ist der Code original?
    Was ist mit original gemeint - es ist meine Lösung zu der Aufgabe.
    Bist du richtig im C++ Forum? Gibt auch eins für ANSI C...
    Das weiß ich nicht, aber die meisten die C++ programmieren, kennen sich auch mit C aus.



  • aspton schrieb:

    Was hat deine Überschrift mit deinem Problem zu tun?
    steht im Text - kurz gesagt: wie kann ich meine definierten Strukturen benutzen?

    Schau in deinem Buch/Script/Tutorial nach wie man die Operatoren "." und "->" verwendet.

    aspton schrieb:

    Was ist überhaupt dein Problem?
    steht ebenfalls im Text (s.o.)

    Nicht wirklich, sonst würde ich nicht fragen.

    aspton schrieb:

    Ist der Code original?
    Was ist mit original gemeint - es ist meine Lösung zu der Aufgabe.

    C&P oder getippt?

    aspton schrieb:

    Bist du richtig im C++ Forum? Gibt auch eins für ANSI C...
    Das weiß ich nicht, aber die meisten die C++ programmieren, kennen sich auch mit C aus.

    Du weißt nicht ob du in C oder C++ programmierst?



  • Hallo,

    ich möchte dich nicht provozieren und auch nicht aufregen. Ich habe genügend Erfahrung mit Foren / Boards. Es gibt immer wieder diese Art von Antworten 'Schau doch in einem Buch...'. Wenn ich es gewusst hätte, hätte ich wohl nicht gefragt. Sonst könnte man auch diese Art von Foren abschaffen.

    Ich habe klar meine Aufgabenstellung formuliert. Habe den Teil, den ich gewusst habe, hinzugefügt. Anschließend habe ich klar gemacht, dass ich zwar von nächsten Teil (Programm testen) probiert habe, aber nicht ganz zurechte gekommmen bin.
    Worin steckt bei meiner Vorgehensweise mein Fehler?

    In meinem Text ganz oben steht:

    Nun meine Frage:
    - stimmt das soweit ? (gibt es irgendwelche fehler?)
    - ich wollte das Programm testen, doch das ganze hat (leider) nicht geklappt. Könntet ihr mir vielleicht hierbei behilflich sein (ein Testprogramm mit z.B. zwei oder drei Zeitschriften)?

    Was ist hieran nicht verständlich?

    C&P oder getippt?
    der Code ist getippt und nicht c/p.

    Du weißt nicht ob du in C oder C++ programmierst?
    Doch, ich programmiere C. Da ich noch anfänder bin, war mir der Begriff ANSI C nicht klar. Habe es jetzt in Wiki nachgelesen.

    Gruß



  • aspton schrieb:

    ich möchte dich nicht provozieren und auch nicht aufregen. Ich habe genügend Erfahrung mit Foren / Boards. Es gibt immer wieder diese Art von Antworten 'Schau doch in einem Buch...'. Wenn ich es gewusst hätte, hätte ich wohl nicht gefragt. Sonst könnte man auch diese Art von Foren abschaffen.

    Wenn ich gewusst hätte dass du dein Problem gar nicht lösen willst, hätte ich dir nicht geantwortet.

    aspton schrieb:

    Ich habe klar meine Aufgabenstellung formuliert. Habe den Teil, den ich gewusst habe, hinzugefügt. Anschließend habe ich klar gemacht, dass ich zwar von nächsten Teil (Programm testen) probiert habe, aber nicht ganz zurechte gekommmen bin.
    Worin steckt bei meiner Vorgehensweise mein Fehler?

    Vergleiche noch mal deine Antwort mit meiner Frage.

    aspton schrieb:

    In meinem Text ganz oben steht:

    Nun meine Frage:
    - stimmt das soweit ? (gibt es irgendwelche fehler?)
    - ich wollte das Programm testen, doch das ganze hat (leider) nicht geklappt. Könntet ihr mir vielleicht hierbei behilflich sein (ein Testprogramm mit z.B. zwei oder drei Zeitschriften)?

    Was ist hieran nicht verständlich?

    Das Problem ist nicht dass es nicht verständlich wäre, es ist schlicht nutzlos.

    aspton schrieb:

    C&P oder getippt?
    der Code ist getippt und nicht c/p.

    Tja, ohne deinen Code zu kennen kann man dir schlecht helfen.


Anmelden zum Antworten