home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 08_09 / vok.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-05-07  |  7.0 KB  |  214 lines

  1. /* ------------------------------------------------------ */
  2. /*                       VOK.C                     */
  3. /*                                                        */
  4. /*    Steuerung des Vokabelprogramms.   SFS mitlinken !   */
  5. /*    (c) 1988 by Joachim Eckart & PASCAL International   */
  6. /*    Parameter: vokabeldatei anzahl [r]                  */
  7. /*               r  vertauscht die Abfrage                */
  8. /* ------------------------------------------------------ */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <fcntl.h>
  12. #include "sfs.h"
  13. #include "rand.h"
  14.  
  15. #define Rand_ab(x,y)  ((int)(rand()*((y)-(x)))+(x))
  16. #define get_hidden()  getch()        /* Zeichen ohne Echo */
  17. #define FALSE 0
  18. #define TRUE !FALSE
  19. #define AVG_LENGTH 25           /* durch. Satzlänge       */
  20. #define TRENN ','               /* Feldtrennzeichen       */
  21. #define RICHTIG    95           /* Noch richtig           */
  22. #define FAST       80           /* Fast richtig           */
  23. #define MIN         4           /* Minimale Vokabelanzahl */
  24. #define TRIES       3           /* erlaubte Versuche      */
  25.  
  26. /* Funktions-Prototypen */
  27. void show_file(void), read_voc(void);
  28. void statistik(int,int), usage(char *);
  29. void free_all(void);
  30.  
  31. typedef struct voc {
  32.                 char *fremd, *deutsch, *beispiel;
  33.            } VOC;
  34.  
  35. /***              Fehlermeldungen                       ***/
  36. char *err[] = {
  37.    "Usage:    VOKABELDATEI anr [r]   ",      /*    0      */
  38.    "Öffnen Vokabeldatei nicht möglich !",    /*    1      */
  39.    "Fehler beim Lesen aus Vokabeldatei!",    /*    2      */
  40.    "Falsche Struktur der Vokabeldatei !",    /*    3      */
  41.    "Speichermangel !",                       /*    4      */
  42.    "Mindestens vier Vokabeln nötig !"        /*    5      */
  43.           };
  44. VOC  *voc_pool;        /* Zeiger Vokabelzeiger            */
  45. char *voc_end;         /* Zeiger nach letzten Eintrag     */
  46. char *str_pool;        /* Zeiger Stringpool               */
  47. char *str_end;         /* Zeiger nach letzten Eintrag     */
  48. char infile[64];       /* Pfadname Eingabedatei           */
  49. int  count;            /* Anzahl records                  */
  50. int  rev = FALSE;      /* Abfrage fremd --> deutsch       */
  51.  
  52. /***        main()                                      ***/
  53. void main(argc,argv)
  54. int argc;              /* Anzahl der beim Aufruf überge-  */
  55.                /* benen Argumente                 */
  56. char *argv[];          /* Vektor mit Zeigern auf Argumente*/
  57.  
  58. {
  59. int anzahl;
  60. int richtig;
  61.  
  62.   /* Puffern ausschalten, Benutzer ist kein stream        */
  63.   setbuf(stdin,(char *) 0); setbuf(stdout, (char *) 0);
  64.   printf("********* VOKABELLERNPROGRAMM *********\n");
  65.   printf("\n(c)  1988 J.Eckart & PASCAL International");
  66.   printf("\n\n\n");
  67.   switch(argc)
  68.     {
  69.       case 1:
  70.       case 2:  usage(err[0]);
  71.                break;
  72.       case 4:  rev = TRUE;         /* TRICK: geht bis zum */
  73.                    /*      nächsten break */
  74.       case 3:  if(!(anzahl=atoi(argv[2]))) usage(err[0]);
  75.            strcpy(infile,argv[1]);
  76.            printf("VOKABELDATEI: %s\n",infile);
  77.            read_voc();         /* Eingabedatei öffnen */
  78.            break;
  79.       default: usage(err[0]);
  80.     }
  81.   richtig = ask(anzahl); statistik(anzahl,richtig);
  82.   free_all();
  83. }
  84.  
  85. /***   read_voc()                                       ***/
  86. void read_voc()              /* Einlesen der Vokabeldatei */
  87. {
  88. int fildes;
  89. long size;
  90. FILE *fp;
  91.                      /* Dateigröße feststellen - portabel */
  92.   if ((fildes = open(infile,O_RDONLY)) == -1)
  93.     usage(err[1]);
  94.   if ((size = lseek(fildes,0L,2)) == -1)
  95.     { close(fildes); usage(err[2]);  }
  96.   close(fildes);
  97.                                /* nun gepuffert mit fopen */
  98.   if (!(fp = fopen(infile,"r"))) usage(err[1]);
  99.                                        /* allocate memory */
  100.   if ((str_pool = malloc((unsigned)size)) == (char *) 0)
  101.     usage(err[4]);
  102.   str_end = str_pool + size;
  103.   if ((voc_pool = (VOC *) malloc((unsigned)
  104.              (size/AVG_LENGTH * sizeof(VOC)))) == (VOC *) 0)
  105.     usage(err[4]);
  106.   voc_end = (char *)voc_pool + size/AVG_LENGTH
  107.         * sizeof(VOC);
  108.   if(!(count = process(fp))) {
  109.     free_all();  usage(err[3]); }
  110.   fclose(fp);
  111. }
  112.  
  113. /***       process()                                    ***/
  114. int process(fp)
  115. FILE *fp;
  116. {
  117. char *sp_temp;
  118. register long *vocp;
  119. register char *sp;
  120. int wc, c;
  121.   sp_temp = sp = str_pool;  vocp = (long *)voc_pool;
  122.   wc = 0;
  123.   while ((c = fgetc(fp)) != EOF && sp < str_end &&
  124.      (char *)vocp < voc_end)  {
  125.     switch(c)  {
  126.       case   '\n':
  127.       case TRENN : wc++; *sp = '\0';
  128.            *vocp = (long)sp_temp; vocp++;
  129.            sp_temp = ++sp;
  130.            break;
  131.       default    : *sp++ = c;
  132.     }
  133.   }
  134.   return(wc/3);
  135. }
  136.  
  137. /***                  ask()                             ***/
  138. int ask(anz)
  139. int anz;
  140. {
  141. char answer[80];
  142. int rec, korr, try, init, richtig = 0;
  143.             /* Dummies für vorigen und vor-vorigen Record */
  144. int last = -1, llast = -1;
  145.  
  146.               /* Init für Zufallszahlengenerator erfragen */
  147.   printf("\n\nBitte ganze Zahl eingeben: ");
  148.   scanf("%d",&init);  printf("\n\n");
  149.   randomize(init);
  150.   do  {
  151.     printf("------------------------------------\n\n");
  152.     try = 0;
  153.     do
  154.       rec = Rand_ab(0,count);
  155.     while(rec == last || rec ==llast);
  156.     llast = last;  last = rec;
  157. nochmal:
  158.     if(rev) printf("%s  <=>  ",voc_pool[rec].deutsch);
  159.     else printf("%s  <=>  ",voc_pool[rec].fremd);
  160.     scanf("%s",answer);
  161.     if (rev) korr = sfs(answer,voc_pool[rec].fremd,CASE);
  162.     else korr = sfs(answer,voc_pool[rec].deutsch,CASE);
  163.     printf("\n\nKorrelastion: %d\n",korr);
  164.     if (korr >= RICHTIG) {
  165.       printf("RICHTIG\n");
  166.       richtig++;
  167.     }
  168.     else if (korr >= FAST && ++try < TRIES) {
  169.                                 /* einen weiteren Versuch */
  170.       printf("FAST RICHTIG - NOCHMAL\n\n");
  171.       goto nochmal;
  172.       }
  173.       else {
  174.     printf("FALSSCH\n");
  175.         printf("\nRichtig wäre: ");
  176.     if(rev) printf("%s\n",voc_pool[rec].fremd);
  177.     else printf("%s\n",voc_pool[rec].deutsch);
  178.     printf("Beispiel: %s\n",voc_pool[rec].beispiel);
  179.       }
  180.       get_hidden();
  181.     } while(--anz);
  182.     return(richtig);
  183. }
  184.  
  185. /***                    statistik()                     ***/
  186. void statistik(total,ok)
  187. int total, ok;
  188. {
  189. int c;
  190.  
  191.   printf("\n\n\n***** S T A T I S T I K *****\n");
  192.   printf("Abfragen  : %3d\n",total);
  193.   printf("Richtig   : %3d        %3d%%\n",
  194.       ok,ok*100/total);
  195.   printf("Falsch    : %3d        %3d%%\n",
  196.      total-ok,(total-ok)*100/total);
  197.   printf("\n\n\n ENDE mit 'E' !  \n");
  198.   while( (c = get_hidden()) != 'e' && c != 'E');
  199. }
  200.  
  201. /***                     usage()                        ***/
  202. void usage(message)          /* Fehlermeldung und Abbruch */
  203. char *message;
  204. {
  205.   printf("\n\n\n #### %s ####",message); get_hidden();
  206.   exit(1);
  207. }
  208.  
  209. /***                      free_all()                    ***/
  210. void free_all()
  211. { free((char *)voc_pool); free(str_pool);}
  212. /* ------------------------------------------------------ */
  213. /*                 Ende von VOK.C                         */
  214.