struct Datensätze aufrufen



  • Also ich sollte ne Bibliothek schreiben, in der man zurLaufzeit 3 Datensätze auffinden kann und diese Anschließend

    auffinden kann indem man die ISBN oder den Nachnamen des Autors eingibt.

    Problem ist ich bekomme da keinen Kompakten Vergleich hin,
    mein prof meinte ich soll das in ne Schleife packen, so das man das auch theoretisch für 100 datensätze machen könnte....

    Nur irgendwie tue ich mich bei schleifen mit struct ziemlich schwer

    Hier mal mein code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    struct buchbestand
    {
    	char nameautor[20];
    	char vnameautor[20];
    	char buchtitel[20];
        unsigned int erscheinungsjahr;
        unsigned int isbn;
    }titel1,titel2,titel3;
    
    int menue,name;
    unsigned int isbn1;
    
    int main()
    {   
    //Kann man das auch als Schleife machen ?
    	printf("Bitte ersten Datensatz eingeben:\n");
    	printf("Nachname des Autors:");
    	scanf("%s",titel1.nameautor);
    	printf("\nVorname des Autors:");
    	scanf("%s",titel1.vnameautor);
    	printf("\nBuchtitel:");
    	scanf("%s",titel1.buchtitel);
    	printf("\nErscheinungsjahr:");
    	scanf("%i",&titel1.erscheinungsjahr);
    	printf("\nISBN (ohne Bindestrich):");
    	scanf("%i",&titel1.isbn);
    
    	printf("\nBitte zweiten Datensatz eingeben:\n");
    	printf("Nachname des Autors:");
    	scanf("%s",titel2.nameautor);
    	printf("\nVorname des Autors:");
    	scanf("%s",titel2.vnameautor);
    	printf("\nBuchtitel:");
    	scanf("%s",titel2.buchtitel);
    	printf("\nErscheinungsjahr:");
    	scanf("%i",&titel2.erscheinungsjahr);
    	printf("\nISBN (ohne Bindestrich):");
    	scanf("%i",&titel2.isbn);
    
    	printf("\nBitte dritten Datensatz eingeben:\n");
    	printf("Nachname des Autors:");
    	scanf("%s",titel3.nameautor);
    	printf("\nVorname des Autors:");
    	scanf("%s",titel3.vnameautor);
    	printf("\nBuchtitel:");
    	scanf("%s",titel3.buchtitel);
    	printf("\nErscheinungsjahr:");
    	scanf("%i",&titel3.erscheinungsjahr);
    	printf("\nISBN (ohne Bindestrich):");
    	scanf("%i",&titel3.isbn);
    //Kann man das auch als Schleife machen ?
    	do
    	{	
    	   printf("\n\tBitte waehlen sie aus wie sie in der Datenbank suchen möchten:\n");
           printf("1.Nachname des Autors\n");
    	   printf("2.ISBN-Nummer\n");
    	   printf("0.Programm Beenden\n");
           scanf("%i",&menue);
    	 }while (menue >2  || menue <0);
    
    	 if (menue=2)
    	 {
    
    		printf("Bitte ISBN-Nummer (ohne Bindestrich) eingeben:\n");
    		scanf("%i",&isbn1);
    
    //Hier müsste die Schleife hin 
    
               if(isbn1 != titel1.isbn && isbn1 != titel2.isbn && isbn1 != titel3.isbn)
    
    		   {
    		   printf("Keine gleichwertige ISBN in der Datenbank vorhanden\n");		 
    		   }
    
    	 }
    
    	 else if (menue=1)
    	 {
    
            printf("Bitte Nachname des Autors eingeben:");
    		scanf("%i",name);
    
    		   if(isbn1 != titel1.isbn && isbn1 != titel2.isbn && isbn1 != titel3.isbn)
    
    		   {
    		   printf("Kein gleichwertiger Nachname des Autors in der Datenbank vorhanden\n");		 
    		   }
    
    	 }
    
         else
    
    return 0;
    }
    


  • Bau dir statt der einzelnen Variablen titel* lieber ein entsprechend großes Array - da kannst du auch in einer for()-Schleife mit dem Index auf die einzelnen Bücher zugreifen.

    PS: Und ich glaube, ich hab' dir schonmal gesagt, daß int nicht geeignet ist, um eine ISBN zu speichern.



  • ich weis das int nicht geignet ist normalerweise, da wir die ISBN aber ohne Bindestrich betrachten geht das sehr wohl..

    wei meinst du das mit dem Zugriff kannst du da mal nen Beispiel geben?



  • struct buchbestand
    {
        char nameautor[20];
        char vnameautor[20];
        char buchtitel[20];
        unsigned int erscheinungsjahr;
        unsigned int isbn;
    }titel[3];
    
    int main(void){
        titel[0].isbn = 0xAFFEDU;
    }
    


  • Ah daran hab ich auch schon gedacht.

    Nur welchen Zweck erfüllt diese Zeile?
    Ne feste Zuweisung an den Speicher oder was genau soll das sein?

    Und muß der int main
    nen void enthalten?

    TactX schrieb:

    int main(void){
        titel[0].isbn = 0xAFFEDU;
    }
    

    Kann ich jetzt beim einlesen einfach sagen:

    for(n=0; n<2; n++)
    {
    scanf("%s",titel[n].nameautor);
    scanf("%s",titel[n].vnameautor);
    
    scanf("%s",titel[n].erscheinungsjahr);
    scanf("%i",titel[n].isbn);
    scanf("%i",titel[n].nameautor);
    }
    ...
    

    und beim vergleich

    ...
    n=0
    for(n=0; n<2; n++)
    {
    if(isbn1 == titel[n].isbn)
    {
    printf("%s",titel[n].nameautor);
    printf("%s",titel[n].vnameautor);
    
    printf("%s",titel[n].erscheinungsjahr);
    printf("%i",titel[n].isbn);
    printf("%i",titel[n].nameautor);
    }
    else if (isbn1 != titel[n].isbn && n=2) 
    {
    printf("kein Datensatz in der Datenbank gefunden!");
    }
    }
    ...
    

    Werd ich nachher mal testen wenn ich wieder an meinem Schlepptop sitze

    }

    oder denke ich da zu einfach



  • Dragonslayer schrieb:

    ich weis das int nicht geignet ist normalerweise, da wir die ISBN aber ohne Bindestrich betrachten geht das sehr wohl..

    Ich hab' jetzt keine Lust, meine Erklärung zu wiederholen, deshalb verweise ich mal direkt auf deinen letzten Thread - dort stehen ein paar Gründe, warum du int nicht für ISBN's nehmen solltest.
    (als nächstes versuchst du sicher, Telefonnummern als int abzulegen :D)

    Zu deiner neuen Frage: Ja, das geht. Allerdings solltest du darauf achten, daß die Arraygröße und die Endebedingungen der Schleifen zusammenpassen (deine Beispielschleifen unterschlagen das Element titel[2]).



  • Also mal getestet das einlesen oben ist kein >Problem.

    Nur Bei Der Schleife mit der Ausgabe hab ich eins.

    Wenn er ne Gleichwertige ISBN findet,
    gibt er den gespeicherten daten satz aus, aber leider auch die Nachfolgenden Datensätze.
    Mit break will ich da auch nicht rausspringen, weil man könnte ja zweimal den selben datensatz auffinden, dann müsste er die Beiden ausgeben.

    Was muß sich also noch ändern?



  • CStoll schrieb:

    PS: Und ich glaube, ich hab' dir schonmal gesagt, daß int nicht geeignet ist, um eine ISBN zu speichern.

    int ist auch nicht dafür geeignet, um Nachnamen zu speichern. o.O

    CStoll schrieb:

    (als nächstes versuchst du sicher, Telefonnummern als int abzulegen :D)

    Dank des Endes der DDR ist es auch eine schlechte Idee, Postleitzahlen in int zu speichern. 🙂

    Dragonslayer schrieb:

    Also mal getestet das einlesen oben ist kein >Problem.

    Nur Bei Der Schleife mit der Ausgabe hab ich eins.

    Wenn er ne Gleichwertige ISBN findet,
    gibt er den gespeicherten daten satz aus, aber leider auch die Nachfolgenden Datensätze.
    Mit break will ich da auch nicht rausspringen, weil man könnte ja zweimal den selben datensatz auffinden, dann müsste er die Beiden ausgeben.

    Was muß sich also noch ändern?

    Du kennst den Unterschied zwischen dem = (Zuweisungsoperator) und dem == (Vergleichsoperator)?
    Denn du benutzt eben öfters in Kontrollstrukturen den Zuweisungsoperator, z.B:

    else if (isbn1 != titel[n].isbn && [u]n=2[/u])
    

    Da könnte dein Fehler liegen, falls nicht Poste mal den gesamten Quelltext wie er nun aussieht. Sonst kann man das nicht wirklich Nachverfolgen.



  • also der Quell textsieht jetzt so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    struct buchbestand
    {
    	char nameautor[20];
    	char vnameautor[20];
    	char buchtitel[20];
        unsigned int erscheinungsjahr;
        unsigned int isbn;
    }titel[3];
    
    unsigned int isbn1,menue,n; 
    char name[20];
    
    int main()
    {   
        for(n=0; n<3; n++)
    	{
    	printf("Bitte ersten Datensatz eingeben:\n");
    	fflush(stdout);
    	printf("Nachname des Autors:");
    	fflush(stdout);
    	scanf("%s",titel[n].nameautor);
    	fflush(stdin);
    	printf("\nVorname des Autors:");
    	fflush(stdout);
    	scanf("%s",titel[n].vnameautor);
    	fflush(stdin);
    	printf("\nBuchtitel:");
    	fflush(stdout);
    	scanf("%s",titel[n].buchtitel);
    	fflush(stdin);
    	printf("\nErscheinungsjahr:");	
    	fflush(stdout);
    	scanf("%i",&titel[n].erscheinungsjahr);
    	fflush(stdin);
    	printf("\nISBN (ohne Bindestrich):");
    	fflush(stdout);
    	scanf("%i",&titel[n].isbn);
    	fflush(stdin);
    	}
    
    	do
    	{	
    	   printf("\n\tBitte waehlen sie aus wie sie in der Datenbank suchen möchten:\n");
    	   fflush(stdout);
           printf("1.Nachname des Autors\n");
    	   fflush(stdout);
    	   printf("2.ISBN-Nummer\n");
    	   fflush(stdout);
    	   printf("0.Programm Beenden\n");
    	   fflush(stdout);
           scanf("%i",&menue);
    	 }while (menue >2  || menue <0);
    
    	 if (menue=2 && menue != 1)
    	 {
    
    		printf("Bitte ISBN-Nummer (ohne Bindestrich) eingeben:\n");
    		fflush(stdout);
    		scanf("%i",&isbn1);
    		fflush(stdin);
            n=0;
    
    		   for(n=0; n<3; n++)
               {
    			   if(isbn1 == titel[n].isbn)
    			   {
    			       printf("Suche erfolgreich.\n");
    				   fflush(stdout);
    			       printf("%s\n",titel[n].nameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].vnameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].buchtitel);
    				   fflush(stdout);
    			       printf("%i\n",titel[n].erscheinungsjahr);
    				   fflush(stdout);
    			       printf("%i\n",titel[n].isbn);
                   }
    
    			   else if (isbn1 != titel[n].isbn && n==3)
    			   {
    				   printf("Keine gleichwertige ISBN in der Datenbank vorhanden\n");
    				   fflush(stdout);
    			   }
    		   }               
    
    	 }
    
    	 else if (menue==1)
    	 {
    
            printf("Bitte Nachname des Autors eingeben:");
    		fflush(stdout);
    		scanf("%i",name);
    		fflush(stdin);
    		n=0;
               for(n=0; n<3; n++)
               {
    			   if(name == titel[n].nameautor)
    			   {
    			       printf("Suche erfolgreich.\n");
    				   fflush(stdout);
    			       printf("%s\n",titel[n].nameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].vnameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].buchtitel);
    				   fflush(stdout);
    			       printf("%i\n",titel[n].erscheinungsjahr);
    				   fflush(stdout);
    			       printf("%i\n",titel[n].isbn);
    				   fflush(stdout);
                   }
    
    			   else if (name != titel[n].nameautor && n==3)
    			   {
    				   printf("Kein gleichwertiger Vorname eines Autors in der Datenbank vorhanden\n");
    				   fflush(stdout);
    			   }
    		   }    
    
    	 }
    
         else
    	 {
    	 }
    
    return 0;
    }
    


  • Erstens: "fflush(stdin);" ist Müll, und "fflush(stdout);" mußt du auch nicht nach jeder Ausgabe aufrufen (afair sind stdin und stdout soweit synchronisiert, daß vor jeder Eingabe der Bildschirm aktualisiert wird).

    Zweitens: = ist eine Zuweisung, Werte vergleichen kannst du mit ==. Und statt der if-else-Kaskade könntest du hier auch switch() verwenden.

    Drittens: die 'n=0;' Befehle vor den Schleifen sind auch unnötig - das erste, was for() macht, ist die Initialisierungsoperation und die setzt n bereits auf 0.

    Viertens:

    _goto schrieb:

    CStoll schrieb:

    PS: Und ich glaube, ich hab' dir schonmal gesagt, daß int nicht geeignet ist, um eine ISBN zu speichern.

    int ist auch nicht dafür geeignet, um Nachnamen zu speichern. o.O

    CStoll schrieb:

    (als nächstes versuchst du sicher, Telefonnummern als int abzulegen :D)

    Dank des Endes der DDR ist es auch eine schlechte Idee, Postleitzahlen in int zu speichern. 🙂

    Habe ich etwas anderes behauptet?

    Nochmal langsam: Nur weil eine bestimmte Eingabe aus Ziffern besteht, muß sie noch lange nicht als int gespeichert werden. int's sind dazu gedacht, um damit zu rechnen; ISBN-Nummer, Postleitzahlen oder EAN-Codes bestehen zwar auch aus Ziffern, benötigen aber eine völlig andere Verarbeitung (normalerweise mit Zugriff auf die einzelnen Dezimalstellen)- also ist int dafür nicht der richtige Datentyp.
    Für solche Daten ist es am besten, sie in Strings abzulegen (und notfalls manuell zu kontrollieren, ob sich keine ungültigen Zeichen dazwischengemogelt haben).



  • CStoll schrieb:

    _goto schrieb:

    CStoll schrieb:

    (als nächstes versuchst du sicher, Telefonnummern als int abzulegen :D)

    Dank des Endes der DDR ist es auch eine schlechte Idee, Postleitzahlen in int zu speichern. 🙂

    Habe ich etwas anderes behauptet?

    Ich wollte es nur erwähnen. 🙄

    @Dragonslayer: Du solltest sauberer Coden, nur weil der Compiler keinen Fehler oder Warnmeldungen ausgibt, heißt das noch lange nicht da der Code richtig ist.

    1. Warum bindest du die Datei <conio.h> ein, obwohl man sie überhaupt nicht benötigt (oder hab ich was übersehen)?
    2. Beim Einlesen (scanf()) hast du manchmal den Adressoperator angegeben, manchmal aber auch nicht.
    printf("\nBuchtitel:");
        fflush(stdout);
        scanf("%s",[u]titel[n].buchtitel[/u]);
        fflush(stdin);
        printf("\nErscheinungsjahr:");    
        fflush(stdout);
        scanf("%i",[u]&titel[n].erscheinungsjahr[/u]);
    


  • _goto schrieb:

    1. Beim Einlesen (scanf()) hast du manchmal den Adressoperator angegeben, manchmal aber auch nicht.
    printf("\nBuchtitel:");
        fflush(stdout);
        scanf("%s",[u]titel[n].buchtitel[/u]);
        fflush(stdin);
        printf("\nErscheinungsjahr:");    
        fflush(stdout);
        scanf("%i",[u]&titel[n].erscheinungsjahr[/u]);
    

    DAS ist kein Fehler des Programm(ierer)s, sondern (wenn überhaupt) ein Problem der C Bibliothek - scanf() benötigt die Adresse des Ziels, in das es schreiben soll, die holst du mit & (außer bei char-Arrays, die automatisch in die Adresse des Array-Anfangs konvertiert werden).



  • Warum bindest du die Datei <conio.h> ein, obwohl man sie überhaupt nicht benötigt (oder hab ich was übersehen)?

    weil mein professor das so will^^

    trotzdem bekomm ich die schleife nicht gebacken mit chars.



  • ich habs jetzt mal auf char geändert nur stürtzt er beim vergleich, ab bzw springt nicht in die if abfragen rein.

    if (menue==2 && menue != 1)
    	 {
    
    		printf("Bitte ISBN-Nummer (ohne Bindestrich) eingeben:\n");
    		fflush(stdout);
    		scanf("%s",&isbn1);
    		fflush(stdin);
    
    		   for(n=0; n<3; n++)
               {
    			   if(isbn1 == titel[n].isbn)
    			   {
    			       printf("Suche erfolgreich.\n");
    				   fflush(stdout);
    			       printf("%s\n",titel[n].nameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].vnameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].buchtitel);
    				   fflush(stdout);
    			       printf("%i\n",titel[n].erscheinungsjahr);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].isbn);
                   }
    
    			   else if (isbn1 != titel[n].isbn && n==3)
    			   {
    				   printf("Keine gleichwertige ISBN in der Datenbank vorhanden\n");
    				   fflush(stdout);
    			   }
    		   }               
    
    	 }
    
    	 else if (menue==1)
    	 {
    
            printf("Bitte Nachname des Autors eingeben:");
    		fflush(stdout);
    		scanf("%s",name);
    		fflush(stdin);
               for(n=0; n<3; n++)
               {
    			   if(name == titel[n].nameautor)
    			   {
    			       printf("Suche erfolgreich.\n");
    				   fflush(stdout);
    			       printf("%s\n",titel[n].nameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].vnameautor);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].buchtitel);
    				   fflush(stdout);
    			       printf("%i\n",titel[n].erscheinungsjahr);
    				   fflush(stdout);
    			       printf("%s\n",titel[n].isbn);
    				   fflush(stdout);
                   }
    
    			   else if (name != titel[n].nameautor && n==3)
    			   {
    				   printf("Kein gleichwertiger Vorname eines Autors in der Datenbank vorhanden\n");
    				   fflush(stdout);
    			   }
    		   }
    


  • if(menu==2 && menu!=1)
      ...
    else if(menu==1)
      ...
    else
      ...
    

    Da hast du wohl deine Bedingungen etwas durcheinandergeworfen - das oberste if() greift, wenn menu den Wert 2 (nach deinen Angaben steht das für "Ende") hat. Hat es einen bestimmten Grund, daß du dort nicht if(menu==0) geschrieben hast?

    PS: Deine fflush()-Sammlung solltest du schleunigst ausmisten - da wird der Code gleich halb so lang und doppelt so übersichtlich.



  • Also ich hab das Programm soweit zum laufenbekommen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    struct buchbestand
    {
    	char nameautor[20];
    	char vnameautor[20];
    	char buchtitel[20];
        char erscheinungsjahr[20];
        char isbn[20];
    }titel[3];
    
    int vergleich;
    unsigned int menue,n; 
    char isbn1[20]; 
    char name[20];
    
    int main()
    {   
        printf("\n\tBitte drei Datensätze eingeben:\n\n");
        for(n=0; n<3; n++)
    	{
    	printf("Nachname des Autors:");
    	scanf("%s",&titel[n].nameautor);
    	printf("\nVorname des Autors:");
    	scanf("%s",&titel[n].vnameautor);
    	printf("\nBuchtitel:");
    	scanf("%s",&titel[n].buchtitel);
    	printf("\nErscheinungsjahr:");	
    	scanf("%s",&titel[n].erscheinungsjahr);
    	printf("\nISBN (ohne Bindestrich):");
    	scanf("%s",&titel[n].isbn);
    	}
    
    	do
    	{	
    	   printf("\n\tBitte waehlen sie aus wie sie in der Datenbank suchen möchten:\n");
           printf("1.Nachname des Autors\n");
    	   printf("2.ISBN-Nummer\n");
    	   printf("0.Programm Beenden\n");
           scanf("%i",&menue);
    	 }while (menue >2  || menue <0);
    
    	 if (menue==2)
    	 {
    
    		printf("Bitte ISBN-Nummer (ohne Bindestrich) eingeben:\n");
    		scanf("%s",&isbn1);
    
    		   for(n=0; n<3; n++)
               {   
                   vergleich = strcmp (isbn1,titel[n].isbn);
    			   if(vergleich == 0)
    			   {
    		           printf("Suche erfolgreich.\n");
    			       printf("%s\n",titel[n].nameautor);
    			       printf("%s\n",titel[n].vnameautor);
    			       printf("%s\n",titel[n].buchtitel);
    			       printf("%s\n",titel[n].erscheinungsjahr);
    			       printf("%s\n",titel[n].isbn);
                   }
    
    		   }               
    
    	 }
    
    	 else if (menue==1)
    	 {
    
            printf("Bitte Nachname des Autors eingeben:");
    		scanf("%s",name);
               for(n=0; n<3; n++)
               {
    			   vergleich = strcmp (name,titel[n].nameautor);
    			   if(vergleich == 0)
    			   {
    			       printf("Suche erfolgreich.\n");
    			       printf("%s\n",titel[n].nameautor);
    			       printf("%s\n",titel[n].vnameautor);
    			       printf("%s\n",titel[n].buchtitel);
    			       printf("%s\n",titel[n].erscheinungsjahr);
    			       printf("%s\n",titel[n].isbn);
                   }
    
    		   }    
    
    	 }		
    
    	 if (vergleich != 0 )
    	 {
    		 printf("Keinen gleichwertiger Datensatz in der Datenbank gefunden!\n");
    	 }
    
    return 0;
    }
    

    Einzigstes Problem hab ich noch bei der letzten if bedingung.
    Die wird leider auch ausgelöst wenn er die ersten beiden datensätze findet und den dritten nicht.
    Wie muß ich das um formulieren, das er diese meldung wirklich nur ausgibt wenn er wirklich keinen der Datensätze aufgefunden hat?


Log in to reply