home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------ */
- /* VOK.C */
- /* */
- /* Steuerung des Vokabelprogramms. SFS mitlinken ! */
- /* (c) 1988 by Joachim Eckart & PASCAL International */
- /* Parameter: vokabeldatei anzahl [r] */
- /* r vertauscht die Abfrage */
- /* ------------------------------------------------------ */
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include "sfs.h"
- #include "rand.h"
-
- #define Rand_ab(x,y) ((int)(rand()*((y)-(x)))+(x))
- #define get_hidden() getch() /* Zeichen ohne Echo */
- #define FALSE 0
- #define TRUE !FALSE
- #define AVG_LENGTH 25 /* durch. Satzlänge */
- #define TRENN ',' /* Feldtrennzeichen */
- #define RICHTIG 95 /* Noch richtig */
- #define FAST 80 /* Fast richtig */
- #define MIN 4 /* Minimale Vokabelanzahl */
- #define TRIES 3 /* erlaubte Versuche */
-
- /* Funktions-Prototypen */
- void show_file(void), read_voc(void);
- void statistik(int,int), usage(char *);
- void free_all(void);
-
- typedef struct voc {
- char *fremd, *deutsch, *beispiel;
- } VOC;
-
- /*** Fehlermeldungen ***/
- char *err[] = {
- "Usage: VOKABELDATEI anr [r] ", /* 0 */
- "Öffnen Vokabeldatei nicht möglich !", /* 1 */
- "Fehler beim Lesen aus Vokabeldatei!", /* 2 */
- "Falsche Struktur der Vokabeldatei !", /* 3 */
- "Speichermangel !", /* 4 */
- "Mindestens vier Vokabeln nötig !" /* 5 */
- };
- VOC *voc_pool; /* Zeiger Vokabelzeiger */
- char *voc_end; /* Zeiger nach letzten Eintrag */
- char *str_pool; /* Zeiger Stringpool */
- char *str_end; /* Zeiger nach letzten Eintrag */
- char infile[64]; /* Pfadname Eingabedatei */
- int count; /* Anzahl records */
- int rev = FALSE; /* Abfrage fremd --> deutsch */
-
- /*** main() ***/
- void main(argc,argv)
- int argc; /* Anzahl der beim Aufruf überge- */
- /* benen Argumente */
- char *argv[]; /* Vektor mit Zeigern auf Argumente*/
-
- {
- int anzahl;
- int richtig;
-
- /* Puffern ausschalten, Benutzer ist kein stream */
- setbuf(stdin,(char *) 0); setbuf(stdout, (char *) 0);
- printf("********* VOKABELLERNPROGRAMM *********\n");
- printf("\n(c) 1988 J.Eckart & PASCAL International");
- printf("\n\n\n");
- switch(argc)
- {
- case 1:
- case 2: usage(err[0]);
- break;
- case 4: rev = TRUE; /* TRICK: geht bis zum */
- /* nächsten break */
- case 3: if(!(anzahl=atoi(argv[2]))) usage(err[0]);
- strcpy(infile,argv[1]);
- printf("VOKABELDATEI: %s\n",infile);
- read_voc(); /* Eingabedatei öffnen */
- break;
- default: usage(err[0]);
- }
- richtig = ask(anzahl); statistik(anzahl,richtig);
- free_all();
- }
-
- /*** read_voc() ***/
- void read_voc() /* Einlesen der Vokabeldatei */
- {
- int fildes;
- long size;
- FILE *fp;
- /* Dateigröße feststellen - portabel */
- if ((fildes = open(infile,O_RDONLY)) == -1)
- usage(err[1]);
- if ((size = lseek(fildes,0L,2)) == -1)
- { close(fildes); usage(err[2]); }
- close(fildes);
- /* nun gepuffert mit fopen */
- if (!(fp = fopen(infile,"r"))) usage(err[1]);
- /* allocate memory */
- if ((str_pool = malloc((unsigned)size)) == (char *) 0)
- usage(err[4]);
- str_end = str_pool + size;
- if ((voc_pool = (VOC *) malloc((unsigned)
- (size/AVG_LENGTH * sizeof(VOC)))) == (VOC *) 0)
- usage(err[4]);
- voc_end = (char *)voc_pool + size/AVG_LENGTH
- * sizeof(VOC);
- if(!(count = process(fp))) {
- free_all(); usage(err[3]); }
- fclose(fp);
- }
-
- /*** process() ***/
- int process(fp)
- FILE *fp;
- {
- char *sp_temp;
- register long *vocp;
- register char *sp;
- int wc, c;
- sp_temp = sp = str_pool; vocp = (long *)voc_pool;
- wc = 0;
- while ((c = fgetc(fp)) != EOF && sp < str_end &&
- (char *)vocp < voc_end) {
- switch(c) {
- case '\n':
- case TRENN : wc++; *sp = '\0';
- *vocp = (long)sp_temp; vocp++;
- sp_temp = ++sp;
- break;
- default : *sp++ = c;
- }
- }
- return(wc/3);
- }
-
- /*** ask() ***/
- int ask(anz)
- int anz;
- {
- char answer[80];
- int rec, korr, try, init, richtig = 0;
- /* Dummies für vorigen und vor-vorigen Record */
- int last = -1, llast = -1;
-
- /* Init für Zufallszahlengenerator erfragen */
- printf("\n\nBitte ganze Zahl eingeben: ");
- scanf("%d",&init); printf("\n\n");
- randomize(init);
- do {
- printf("------------------------------------\n\n");
- try = 0;
- do
- rec = Rand_ab(0,count);
- while(rec == last || rec ==llast);
- llast = last; last = rec;
- nochmal:
- if(rev) printf("%s <=> ",voc_pool[rec].deutsch);
- else printf("%s <=> ",voc_pool[rec].fremd);
- scanf("%s",answer);
- if (rev) korr = sfs(answer,voc_pool[rec].fremd,CASE);
- else korr = sfs(answer,voc_pool[rec].deutsch,CASE);
- printf("\n\nKorrelastion: %d\n",korr);
- if (korr >= RICHTIG) {
- printf("RICHTIG\n");
- richtig++;
- }
- else if (korr >= FAST && ++try < TRIES) {
- /* einen weiteren Versuch */
- printf("FAST RICHTIG - NOCHMAL\n\n");
- goto nochmal;
- }
- else {
- printf("FALSSCH\n");
- printf("\nRichtig wäre: ");
- if(rev) printf("%s\n",voc_pool[rec].fremd);
- else printf("%s\n",voc_pool[rec].deutsch);
- printf("Beispiel: %s\n",voc_pool[rec].beispiel);
- }
- get_hidden();
- } while(--anz);
- return(richtig);
- }
-
- /*** statistik() ***/
- void statistik(total,ok)
- int total, ok;
- {
- int c;
-
- printf("\n\n\n***** S T A T I S T I K *****\n");
- printf("Abfragen : %3d\n",total);
- printf("Richtig : %3d %3d%%\n",
- ok,ok*100/total);
- printf("Falsch : %3d %3d%%\n",
- total-ok,(total-ok)*100/total);
- printf("\n\n\n ENDE mit 'E' ! \n");
- while( (c = get_hidden()) != 'e' && c != 'E');
- }
-
- /*** usage() ***/
- void usage(message) /* Fehlermeldung und Abbruch */
- char *message;
- {
- printf("\n\n\n #### %s ####",message); get_hidden();
- exit(1);
- }
-
- /*** free_all() ***/
- void free_all()
- { free((char *)voc_pool); free(str_pool);}
- /* ------------------------------------------------------ */
- /* Ende von VOK.C */
-