⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 katest.c

📁 一个可以索引和排序的文件系统
💻 C
字号:
/***************************************************************************
 * KATEST.C - Test for the key access System
 *
 * THIS PROGRAM REQUIRES THE USE OF THE SORT MODULE.
 * ALL KAFS (KEYED ACCESS FILE SYSTEM) LINES ARE DENOTED BY
 *   A COMMENT BEGINNING WITH: $$KAFS$$
 *
 ***************************************************************************/
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <stdlib.h>

#include "KATEST.H"

#define SOF -1

extern long rec;
extern char key[];


struct courserec course;  /* Define the Course File Structure */

char password[]="password";

void main();
void pgmxit();
void mcourse();
int rf_course();
void courselist();
void w_putp(int row, int col, char *str);
void w_pc(int row, int col);
int w_penter(int row, int col, char *str, int len);
int w_enter(char str[], int len);
void error(char *es);

void main()
{
   int sel;
   int recsize;

   recsize = sizeof(course);   /* $$KAFS$$ Find out Record Sizes */

   if(ka_open(COURSEFILE,"COURSE")!=OK)  /* $$KAFS$$ Open the course file */
      {
      putchar(7); 
      printf("\n$$$ CANNOT OPEN COURSE FILE $$$\n");
      getch();
      return;
      }

   
while(TRUE)
   {
 clrscr();

  printf("                           KAFS - Keyed Access File System\n\n");
  printf("                                    TEST APPLICATION\n\n\n\n\n");
  printf("                                1 - (C)ourse Maintenance\n\n");
  printf("                                2 - (L)ist Courses\n\n");
  printf("                                3 - (Q)uit to DOS\n");

  w_pc(24,2);
  printf("Course Record Size is %d\n",recsize);

   sel=toupper(getch());
   switch(sel)
      {
      case '1':
      case 'C':
        mcourse();
        break;
      case '2':
      case 'L':
         courselist();
         break;
      case '3':
      case 'Q':
      case 27:
         pgmxit();
         break;
      }
   }
}
/*********************************
 * PGMXIT - End Progrm
 *********************************/
void pgmxit()
{
   ka_close_all();  /* $$KAFS$$ Close all Open KAFS Files */
   clrscr();
   exit(0);
}

/****************************************************
 * MCOURSE
 ******************************************************/
void mcourse()
{
   int wcc, eflag;
   char resp[250];
   char ans;
   float tf;   /* Temp float */


while(TRUE)
{
cedit:
clrscr();
memset(&course, 0, sizeof(course));
gotoxy(1,2);
puts(" Course Number:\n");
puts("   Course Name:");
puts("    Instructor:");
puts("         Units:");
puts(" Per Unit Cost:");
puts("         Notes:");
puts("    Commission:\n");
puts("   Total Course Cost:            $$ to MJM:");
puts(" Worksheet Only Cost:            $$ to MJM:");


strcpy(course.cnum,"");
if(w_penter(2,17,course.cnum,9)==ESC) break;

if(rf_course())  /* Read for Course, if found display Values */
   {
   w_putp(4,17,course.cname);
   w_putp(5,17,course.inst);
   w_putp(8,17,course.note);
   sprintf(resp,"%5d",course.units);
   w_putp(6,17,resp);
   sprintf(resp,"%4.2f",course.pucost);
   w_putp(7,17,resp);
   w_pc(9,17);
   putch(course.comm);

   sprintf(resp,"%5.2f",course.pucost * course.units);
   w_putp(11,23,resp);
   sprintf(resp,"%5.2f",course.mjmamt);
   w_putp(11,45,resp);

   sprintf(resp,"%5.2f",course.wsonly);
   w_putp(12,23,resp);
   sprintf(resp,"%5.2f",course.mjmwso);
   w_putp(12,45,resp);

   eflag=TRUE;
   }
else
  {
   if(strlen(course.cnum)==0) goto cedit;
   putchar(7);
   w_putp(15,4,"COURSE Not Found, Create COURSE (Y/N)?");
   do{ans=tolower(getch());} while(ans != 'y' && ans !='n' && ans !=ESC);
   w_pc(15,1);
   printf("                                           ");
   if(ans != 'y') goto cedit;
   eflag = FALSE;
   }

w_pc(4,17);
if(w_enter(course.cname,30)==ESC) goto cedit;
if(eflag && !strcmpi(course.cname,"delete"))
  {
   putchar(7);
   w_putp(15,4,"ENTER PASSWORD TO DELETE:");
   strcpy(resp,"");
   w_enter(resp,10);
   w_pc(15,1);
   printf("                                      ");
   if(strcmpi(resp,password))
      {
      error("INVALID PASSWORD");
      goto cedit;
      }
   rdelete(COURSEFILE, rec); /* $$KAFS$$ DELETE This Record */
   error("RECORD DELETED");
   goto cedit;
  }


w_pc(5,17);
if(w_enter(course.inst,20)==ESC) goto cedit;

sprintf(resp,"%5d",course.units);
w_pc(6,17);
if(w_enter(resp,33)==ESC) goto cedit;
course.units = atoi(resp);

sprintf(resp,"%4.2f",course.pucost);
w_pc(7,17);
if(w_enter(resp,4)==ESC) goto cedit;
course.pucost = atof(resp);

w_pc(8,17);
if(w_enter(course.note,35)==ESC) goto cedit;

gcflg:
if(!eflag) course.comm='N';
sprintf(resp,"%c",course.comm);
w_pc(9,17);
printf("     ");
if(w_enter(resp,1)==ESC) goto cedit;
if(resp[0]!='Y' && resp[0]!='N')
{
   error(" Y or N only");
   goto gcflg;
}
course.comm = resp[0];

sprintf(resp,"%5.2f",course.pucost * course.units);
w_putp(11,23,resp);

/* Allow Editing the Course Amounts to MJM */
w_pc(11,45);
sprintf(resp,"%5.2f",course.mjmamt);
if(w_enter(resp, 6)==ESC) goto cedit;  /* Edit the mjm Amt */
course.mjmamt = atof(resp);

w_pc(12,23);
if(!eflag) course.wsonly = (course.pucost * course.units) - 25;
sprintf(resp,"%5.2f",course.wsonly);
if(w_enter(resp,6)==ESC) goto cedit;
course.wsonly = atof(resp);

w_pc(12,45);
sprintf(resp,"%5.2f",course.mjmwso);
if(w_enter(resp, 6)==ESC) goto cedit; /* Edit mjm wso amt */
course.mjmwso = atof(resp);


if(eflag)
 {
  if(write_upd(COURSEFILE, &course)!=OK)  /* $$KAFS$$ Update the Record */
      error("ERROR UPDATING RECORD");  /* UPDATE */
 }
 else
   {
   if(write_key(COURSEFILE, course.cnum, &course)!=OK) /* $$KAFS$$ Create NEW Record */
       error("ERROR WRITING RECORD"); /* NEW REC */
   }
}
}

/*******************************************************************
 * rf_course - record find a course
 *    returns TRUE if found else FALSE
 **************************************************************************/
int rf_course()
{
  rec = SOF;  /* $$KAFS$$ Set for read to begin at beginning of file */
  if(read_key(COURSEFILE, course.cnum, &course)==OK) /* $$KAFS$$ Read by key */
       return(TRUE);

  else return(FALSE);
}
/***********************************************************************
 * COURSELIST - Course List Sorted by coursenumber
 ***********************************************************************/
void courselist()
{
    int ccode, sortsize, sortcount;
    int noteflag, invflag;
    int soption;
    char ans;
    char ts[20]; /* Temp String */
    char rptline[133];
    float value;

      clrscr();
    invflag=FALSE;
    w_putp(5,2,"DO YOU WANT INVOICING INFORMATION (Y/N)? ");
    do{ans=tolower(getch());} while(ans != 'y' && ans !='n' && ans !=ESC);
    if(ans==ESC) goto crxit;
    if(ans=='y') invflag = TRUE;
    putch(toupper(ans));

    noteflag=FALSE;
    if(invflag==FALSE)
       {
       w_putp(7,2,"DO YOU WANT COURSE NOTES PRINTED (Y/N)? ");
       do{ans=tolower(getch());} while(ans != 'y' && ans !='n' && ans !=ESC);
       if(ans==ESC) goto crxit;
       if(ans=='y') noteflag = TRUE;
       putch(toupper(ans));
       }

     sortsize = sizeof(course.cnum);

     if(initsort(sortsize) != OK)
       {
       error("NO SORT SPACE");
       goto crxit;
       }
 
    w_putp(9,25,"SORT IN PROGRESS\n");

 
 
  rec=SOF;  /* $$KAFS$$ Set for read to begin at beginning of file */
  while(read_seq(COURSEFILE, &course)==OK)  /* $$KAFS$$ Read Sequentially */
    {
       sort(course.cnum,rec);
      }

   if(sortcount < 1)
    {
    error("NO RECORDS TO SORT");
    goto crxit;
     }
 
   if(merge()!=OK)
    {
    error("MERGE ERROR");
    goto crxit;
    }
 
    clrscr();
    printf("COURSE LIST\n\n");
    if(invflag)
     printf("COURSE #   COURSE NAME                    UNITS COST   WSONLY  MJMAMT  WSOAMT\n");
    else
     printf("COURSE #   COURSE NAME                     INSTRUCTOR            UNITS  COST\n");
    printf("-----------------------------------------------------------------------------\n");

      while(TRUE)
       {
       rec = fetch();  /* $$KAFS$$ Set Rec to value from fetch */
       if(rec == SORTERR || rec == FETCHEND) break; /* $$KAFS$$ check rec value */
       read_rec(COURSEFILE, &course);  /* $$KAFS$$ Read by value in rec */
       if(invflag)
	sprintf(rptline,"%-9s  %-31s%3d  %6.2f  %6.2f  %6.2f  %6.2f\n",
	       course.cnum,course.cname,course.units,course.pucost * course.units,
             course.wsonly, course.mjmamt, course.mjmwso);
       else
         sprintf(rptline,"%-9s  %-31s %-21s %3d   %6.2f\n",
 	       course.cnum,course.cname,course.inst,course.units,
 	          course.pucost * course.units);
       printf("%s",rptline);
       if(noteflag)
 	    {
 	    if(strlen(course.note)> 0)
 	     {
	     sprintf(rptline,"          NOTES: %s\n",course.note);
	     printf("%s",rptline);
	     }
	printf("\n");
	    }
     }
   printf("************* REPORT END ************");
   getch();

 crxit:
 endsort();   /* Free the Sort buffer */
}

/***************************************************************************
 * Screen Postioning and keyboard entry routines
 ***************************************************************************/
void w_putp(int row, int col, char *str)
{
   gotoxy(col, row);
   printf("%s",str);
}

void w_pc(int row, int col)
{
   gotoxy(col, row);
}

int w_penter(int row, int col, char *str, int len)
{
   w_pc(row, col);
  return(w_enter(str, len));
}

int w_enter(char str[], int count)
{
   int c, pos, x;

   if(str[0]!=0) pos = strlen(str);
     else pos = 0;
   str[pos] = '\0';  /* Terminate the string just in case */

   if(pos>0)
      {
      printf("%s",str);  /* we're in edit mode */
      x=1;        /* Set Xout mode */
      }
    else x=0;   /* NO Xout if not editing */

   do {
      c = getch();   /* get a character from stdin */

      if (c ==0)   /* Got a Screen Control indicator */
	 {
	  c = getch();	/* waste the control code */
	  if (c == DELETE)
	   {
		while(pos) {putch(BKSP);putch(SPACE);putch(BKSP);pos--;} /* Delete The Field */
		 }
	      c=255;  /* Invalidate, it was a control code */
	 }

      if (c == ESC || c == ENTER) break;   /* We're done !! */

     if(x)
      {
      if(c>=SPACE) while(pos)
	 {
	 putch(BKSP);
	 putch(SPACE);
	 putch(BKSP);
	 pos--;
	 }
      x=0; /* Cancel it now that we've done it */
      }
 /** See if the character is a backspace **/
      if (c == BKSP)
	 {
	 if(pos == 0)
		putch(BELL);  /* If nothing entered, can't backspace */
	    else
	       {
	       putch(BKSP);    /* Do a Backspace */
	       putch(SPACE);
	       putch(BKSP);
	       pos--;
	       }
	    }
	 else
 /** See if we are at the end of the buffer.  If so, only accept an end **/
      if (pos <= count-1)
	 {
	    if (c >= SPACE && c < ASCIITOP)
	       {
		c=toupper(c);
		str[pos] = c;   /* add the character to buffer */
		putch(c);     /* display it */
		pos++;          /* advance the buffer pointer */
		}
		     else putch(BELL);
	     }
		  else putch(BELL);
	 } while ( c != ESC && c != ENTER);
    str[pos] = '\0';   /* Terminate the input string */
    return(c);
}

void error(char *es)
{
   putch(BELL);
   gotoxy(2,24);
   printf("%s",es);
   getch();
   gotoxy(2,24);
   printf("                                                      ");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -