Kritik. bitte.



  • - memory.h ist kein Standard
    - my_get_uint scheitert bei simplen Nutzerfehleingaben (für z.B. Kunden/Buchnummer 123a schlägt das 'a' durch auf den folgenden Programmablauf)



  • Viel weniger Code, dafür strikt konform (bis auf eine Stelle, wobei ich bezweifle, dass du sie findest).

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
      struct kunde {int nr;char vname[100],nname[100];} *kartei[100];
      struct buch {int nr;char titel[100],autor[100];struct kunde *ausleih;} *katalog[100];
      int kz,bz;
    } Datenbank;
    
    int eingabe(int *z,int *nr,char *s1,char *s2,const char *text)
    {
      char s[300];
      printf("\n%s: ",text);
      if( fgets(s,300,stdin) && sscanf(s,"%99s%99s",s1,s2)==2 )
        *nr=++*z;
      if(!strchr(s,'\n')){ int c; while( (c=getchar())!='\n' && c!=EOF ); }
      return *nr;
    }
    
    int eingabeNr(char *s)
    {
      int r;
      printf(s);
      if( 1!=scanf("%d",&r) || r<1 ) r=0;
      { int c; while( (c=getchar())!='\n' && c!=EOF ); }
      return r;
    }
    
    void ausgabe(void *liste,int z)
    {
      struct {int i;char str1[100],str2[100];} **l=liste;
      while( z-- )
        printf("%3d%15s%15s\n",l[z]->i,l[z]->str1,l[z]->str2);
    }
    
    void dbfree(Datenbank *db)
    {
      while( db->kz-- ) free(db->kartei[db->kz]);
      while( db->bz-- ) free(db->katalog[db->bz]);
    }
    
    int main()
    {
      Datenbank db={0};
      char str[BUFSIZ];
    
      while(1)
      switch( puts( "\n [1]\tNeuer Kunde\n [2]\tNeues Buch\n [3]\tKundenkartei auflisten\n [4]\tBuecherkatalog auflisten\n [5]\tBuch verleihen\n [6]\tVerliehene Buecher auflisten\n sonst\tProgramm beenden\n" ),
             fgets(str,BUFSIZ,stdin),
             *str ) {
    
      case '1': if( db.kz<100 ) if( db.kartei[db.kz]=calloc(1,sizeof(**db.kartei)),
                    !eingabe(&db.kz,&db.kartei[db.kz]->nr,db.kartei[db.kz]->vname,db.kartei[db.kz]->nname,"Eingabe-Kunde: Vorname Nachname") )
                    puts("Eingabe fehlerhaft"),free(db.kartei[db.kz]);
                break;
      case '2': if( db.bz<100 ) if( db.katalog[db.bz]=calloc(1,sizeof(**db.katalog)),
                    !eingabe(&db.bz,&db.katalog[db.bz]->nr,db.katalog[db.bz]->titel,db.katalog[db.bz]->autor,"Eingabe-Buch: Titel Autor") )
                    puts("Eingabe fehlerhaft"),free(db.katalog[db.bz]);
                break;
      case '3': ausgabe(db.kartei,db.kz);break;
      case '4': ausgabe(db.katalog,db.bz);break;
      case '5': { int kundenr=eingabeNr("KundeNr: ");
                  if( kundenr && kundenr<=db.kz )
                  {
                    int buchnr=eingabeNr("BuchNr: ");
                    if( buchnr && buchnr<=db.bz )
                    {
                      db.katalog[buchnr-1]->ausleih=db.kartei[kundenr-1];
                      break;
                    }
                  }
                  puts("KundeNr oder BuchNr fehlerhaft");
                  break;
                }
      case '6': { int i;
                  for(i=0;i<db.bz;++i)
                    if( db.katalog[i]->ausleih )
                      printf("%3d%15s%15s: %3d%15s%15s\n",db.katalog[i]->nr,db.katalog[i]->titel,db.katalog[i]->autor,
                                                      db.katalog[i]->ausleih->nr,db.katalog[i]->ausleih->vname,db.katalog[i]->ausleih->nname);
                  break;
                }
      default: dbfree(&db);exit(0);
      }
      return 0;
    }
    


  • Wutz schrieb:

    Viel weniger Code, dafür strikt konform (bis auf eine Stelle, wobei ich bezweifle, dass du sie findest).

    Mag' ich garnicht finden. Dein Code verschluckt sich schon am Enter nach der eingabe von 1 zur Auswahl einen neuen Kunden anzulegen.

    @camper: guck' ich mir an, wie auch memory.h vs. stdlib.h.



  • [cpp
    fputs( "Nicht genuegend freier Arbeitsspeicher verfuegbar!", stderr );

    if( result )
    free( result->title );

    free( result );

    return NULL;
    [/cpp]

    fputs( "Nicht genuegend freier Arbeitsspeicher verfuegbar!", stderr );
    
            if( result ) {
                if (result->title)
                     free( result->title );
    
                free( result );
            }
    
            return NULL;
    

    @Wutz: So einen unübersichtlichen Code möchte auch keiner lesen. 😉



  • @Swordfish: Benutze mal indent, um den Code schöner einzurücken, falls du Unix hast.

    EDIT: Hab den Code von Swordfish mit dem vom Wutz verwechselt.^^



  • Was ist an meinen Einrückungen kaputt? 😕



  • Och, so schlimm ist Wutz's code gar nich 😛
    Was ich schon gesehen hab, da is Wutz's seiner harmlos. ^^



  • Hab das gerade mal getestet - theoretisch sah das gut aus.

    Das der Kommentar des Compilers zum 1.Quelltext:
    Zu den Zeileangaben 3 hinzuaddieren.

    >gcc -pedantic -Os -o dbbuc002 dbbuc002.c  -std=c11
    dbbuc002.c: In function 'free_customers':
    dbbuc002.c:100:43: warning: initialization from incompatible pointer type [enabled by default]
    dbbuc002.c:106:9: warning: passing argument 1 of 'free' discards 'const' qualifier from pointer target type [enabled by default]
    In file included from dbbuc002.c:5:0:
    c:\mingw470\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/stdlib.h:358:38: note: expected 'void *' but argument is of type 'const struct customer_t *'
    dbbuc002.c: In function 'free_books':
    dbbuc002.c:175:35: warning: initialization from incompatible pointer type [enabled by default]
    dbbuc002.c:181:9: warning: passing argument 1 of 'free' discards 'const' qualifier from pointer target type [enabled by default]
    In file included from dbbuc002.c:5:0:
    c:\mingw470\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/stdlib.h:358:38: note: expected 'void *' but argument is of type 'const struct book_t *'
    dbbuc002.c: In function 'main':
    dbbuc002.c:241:58: error: 'UINT_MAX' undeclared (first use in this function)
    dbbuc002.c:241:58: note: each undeclared identifier is reported only once for each function it appears in
    dbbuc002.c:263:17: warning: passing argument 1 of 'print_customers' from incompatible pointer type [enabled by default]
    dbbuc002.c:111:6: note: expected 'const struct customer_t **' but argument is of type 'struct customer_t **'
    dbbuc002.c:275:17: warning: passing argument 2 of 'find_customer' from incompatible pointer type [enabled by default]
    dbbuc002.c:122:19: note: expected 'const struct customer_t **' but argument is of type 'struct customer_t **'
    dbbuc002.c:283:17: warning: passing argument 2 of 'find_book' from incompatible pointer type [enabled by default]
    dbbuc002.c:214:9: note: expected 'const struct book_t **' but argument is of type 'struct book_t **'
    

    Das zum 2.Quelltext: Compiler wie oben, war zufrieden.
    Dann hab ich versucht Johann Sebastian Bach als Kunde anzulegen - Ein bekannter Komponist - ist wohl schon zu lange her das der in Leipzig und Umgebung tätig war.

    Und so ein schlechter Roman mit dem Titel: "Das Grauen des Waldes" geschrieben von der "Schreiber BGB Müller, Maier und Companion" lies sich auch nicht speichern, obwohl für die Anzahl der Zeichen genug Platz vorgehalten wurde.
    Ist vielleicht auch ganz gut so, das der nicht ausgeliehen werden kann.



  • Swordfish schrieb:

    Was ist an meinen Einrückungen kaputt? 😕

    Dein Code war nicht gemeint.

    itedvo schrieb:

    Och, so schlimm ist Wutz's code gar nich 😛
    Was ich schon gesehen hab, da is Wutz's seiner harmlos. ^^

    Ich auch, aber:

    Wutz schrieb:

    Viel weniger Code, dafür strikt konform (bis auf eine Stelle, wobei ich bezweifle, dass du sie findest).

    Klingt für mich irgendwie etwas arrogant. Oder täusche ich mich da?
    Zumal er gar keine Funktionsargumente auf Gültigkeit überprüft (z. B. Zeiger).



  • Kritik:
    - bitte keine so langen Aufgabenstellungen posten
    - bitte keinen so langen sourcecode posten
    - bitte die Aufgabe erst selbst angehen
    - bitte nur dann die kritischen Fragen gezielt mit wenig sourcecode stellen
    😞


Anmelden zum Antworten