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

📄 crecord.cpp

📁 数据结构大作业-变长记录类库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      initgraph(&Driver,&Mode,"c:\\");
      cleardevice();
      rectangle(0,0,639,33);
      rectangle(0,35,639,420);
      flag16=open("c:\\ucdos\\HZK16",O_RDWR|O_BINARY);
      flag24=open("c:\\ucdos\\HZK24F",O_RDWR|O_BINARY);
      if(flag16==-1){printf("Cannot Open HZK16\n");exit(1);}
      if(flag24==-1){printf("Cannot Open HZK24\n");exit(1);}
      x=2;
      for(i=0;i<=5;i++)
	x=out24hz(8+x,6,0,14,1,1,menu[i]);
      close(handle);
      setfillstyle(SOLID_FILL,4);
      fillellipse(320,260,200,5);
      out24hz(125,200,0,15,2,2,"变长记录操作系统");
      settextstyle(3,0,1);
      rectangle(0,422,639,460);
      outtextxy(20,427,"F1:");
      out16hz(48,429,0,12,bottom[0]);
      outtextxy(100,427,"Arrows:");
      out16hz(170,429,3,12,bottom[1]);
      outtextxy(320,427,"Enter:");
      out16hz(375,429,0,12,bottom[2]);
      outtextxy(440,427,"Esc:");
      out16hz(480,429,0,12,bottom[3]);
      outtextxy(530,427,"Alt-X:");
      out16hz(590,429,0,12,bottom[4]);
      close(handle);
      main_frame();
      closegraph();
      close(flag16);
      close(flag24);
  }

  void main_frame()//Set up the main menu frame
  {
      register int i;
      int size;
      int curx=3,menu_num;
      size=imagesize(3,2,105,30);
      if(size!=-1){
        buffer=malloc(size);
        if(buffer)
          getimage(3,2,105,30,buffer);
        putimage(3,2,buffer,NOT_PUT);
      }
      else outtext("Out memory");
      while((select=specialkey())!=ALT_X)
        switch(select){
          case F1:help();break;
          case LEFT:
          case RIGHT:putimage(curx,2,buffer,COPY_PUT);
                     if(select==LEFT)
                       curx=curx<=3?3+160*5:curx-106;
                     else
                       curx=curx>=3+106*5?3:curx+106;
                     getimage(curx,2,curx+102,30,buffer);
                     putimage(curx,2,buffer,NOT_PUT);
                     break;
	  case ENTER:
          case DOWN:select=0;
                    menu_num=(curx-3)/106;
		    pull_menu(menu_num);
        }
      free(buffer);
  }

  void pull_menu(int oldnum)
  {
      switch(oldnum){
        case 0:help();break;
        default:dis_menu(oldnum);
      }
  }

  void dis_menu(int num)
  {
      char c;
      register int i;
      int x0,y0,xx,size;
      int cury,c_num;
      int key,key1;
      x0=frame[num-1].startx;
      y0=frame[num-1].starty;
      //---------------------------------------------------------------------------
      ChangeRecord test;
      ElemType a[MAXLEN];
      KeyType b[MAXLEN];
      int k;
      int j;
      int m;
      int n;
      char fname1[30]="C:\\test.rec";
      char fname2[30]="C:\\index.dex";
      fstream iof1(fname1,ios::in|ios::out|ios::binary);
      fstream iof2(fname2,ios::in|ios::out|ios::binary);
      iof1.close();
      iof2.close();
      //---------------------------------------------------------------------------
      rectangle(x0,y0+1,x0+4*24+4,34+frame[num-1].count*18+10);
      key=0;
      for(i=0;i<frame[num-1].count;i++)
        switch(num){
	  case 5:out16hz(x0+20,y0+5+i*18,32,12,frame[num-1].content[i]);
                 xx=10;
                 break;
	  case 4:out16hz(x0+10,y0+5+i*18,0,12,frame[num-1].content[i]);
                 xx=5;
                 break;
	  default:out16hz(x0+20,y0+5+i*18,0,12,frame[num-1].content[i]);
                  xx=5;
        }
      size=imagesize(x0+xx,y0+4,x0+4*24-xx,y0+4+18);
      if(size!=-1){
        frame[num-1].p=malloc(size);
        if(frame[num-1].p)
          getimage(x0+xx,y0+4,x0+4*24-xx,y0+4+18,frame[num-1].p);
        putimage(x0+xx,y0+4,frame[num-1].p,NOT_PUT);
      }
      else printf("Out memory");
      cury=y0+4;
      do{
        key1=specialkey();
        switch(key1){
          case F1:help();break;
          case ESC:size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
                   if(size!=-1){
                     branch_buf=malloc(size);
                     if(branch_buf)
                       getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
                   }
	           else outtext("Out memory");
                   putimage(x0,y0+3,branch_buf,XOR_PUT);
                   free(frame[num-1].p);
                   free(branch_buf);
                   key=1;
                   break;
          case ALT_X:free(frame[num-1].p);
                     key=1;
	             keybuffer(0,45);
                     break;
         case UP:
         case DOWN:putimage(x0+xx,cury,frame[num-1].p,COPY_PUT);
                   if(key1==UP)
                     cury=cury<=y0+4?y0+4+(frame[num-1].count-1)*18:cury-18;
                   else
                     cury=cury>=y0+4+(frame[num-1].count-1)*18?y0+4:cury+18;
                   getimage(x0+xx,cury,x0+4*24-xx,cury+18,frame[num-1].p);
                   putimage(x0+xx,cury,frame[num-1].p,NOT_PUT);
                   break;
         case LEFT:size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
                   if(size!=-1){
                     branch_buf=malloc(size);
                     if(branch_buf)
                       getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
                   }
	           else outtext("Out memory");
                   putimage(x0,y0+3,branch_buf,XOR_PUT);
                   free(frame[num-1].p);
                   free(branch_buf);
                   key=1;
	           keybuffer(0,75);
                   if(num!=1)
		     keybuffer(0,13);
                   break;
        case RIGHT:size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
                   if(size!=-1){
                     branch_buf=malloc(size);
                     if(branch_buf)
                       getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
                   }
	           else outtext("Out memory");
                   putimage(x0,y0+3,branch_buf,XOR_PUT);
                   free(frame[num-1].p);
                   free(branch_buf);
                   key=1;
	           keybuffer(0,77);
                   if(num<5)
		     keybuffer(0,13);
                   break;
        case ENTER:c_num=(cury-(y0+4))/18;
                   switch(num){
	             case 1:switch(c_num){
			      case 0:
			        Imageoutput(202,40,"输入一次插入记录的数目",0);
				vsget(202,180,"%d",&m);
				for(j=0;j<m;j++)
				{
				  Imageoutput(210,45,"输入第",0);gprintf(270,160,"%d",j+1);
				  Imageoutput(280,45,"个记录的关键字",1);
				  vsget(210,180,"%d",&a[j].key);
				  do
				  {
				    k=test.KeySearch(fname1,a[j]);
				    if(k)
				    {
				      Imageoutput(202,40,"关键字已经存在",0);
				      Imageoutput(250,60,"重新输入:",1);
				      vsget(250,200,"%d",&a[j].key);
				    }
				  }while(k);
				  do
				  {
				    Imageoutput(202,40,"输入记录标识",0);
				    vsget(202,180,"%s",a[j].Mark);
				    do
				    {
				      k=test.MarkSearch(fname1,a[j]);
				      if(k)
				      {
				        Imageoutput(202,40,"记录标识已经存在",0);
					Imageoutput(250,60,"重新输入:",1);
					vsget(202,200,"%s",a[j].Mark);
				      }
				    }while(k);
				    n=strlen(a[j].Mark);
				  }while(n<1||n>10);
				  Imageoutput(202,45,"输入记录类型",0);outtextxy(300,160,"0/1");
				  do
				  {
				    vsget(202,180,"%d",&a[j].kind);
				  }while(a[j].kind!=0&&a[j].kind!=1);
				  Imageoutput(202,40,"输入记录内容",0);
				  vsget(202,180,"%s",a[j].Elem);
				  a[j].len=strlen(a[j].Elem);
				}
				test.MFAppend(fname1,fname2,a,m);
				Imageoutput(250,40,"成功插入一块记录",0);
				break;
			      case 1:
				//Imageoutput(202,40,"输入要删除记录的数目",0);
				//vsget(202,180,"%d",&n);
				Imageoutput(202,40,"输入要删除记录的关键字",0);
				for(j=0;j<1;j++)
				{
				  vsget(250,180+j*20,"%d",&b[j]);
				}
				test.MFDelete(fname1,fname2,b,1);
				break;
			      case 2:
				Imageoutput(202,40,"输入要删除记录的记录标识",0);
				vsget(202,180,"%s",a[1].Mark);
				test.MarkDelete(fname1,fname2,a[1]);
				break;
			      case 3:
			        size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
				if(size!=-1){
				  branch_buf=malloc(size);
				  if(branch_buf)
				    getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
				}
				else outtext("Out memory");
				putimage(x0,y0+3,branch_buf,XOR_PUT);
				free(frame[num-1].p);
				free(branch_buf);
				key=1;
			    }
                            break;
	             case 2:switch(c_num){
			      case 0:
			        //Imageoutput(202,40,"输入一次查找记录的数目",0);
	                        //vsget(202,180,"%d",&n);
	                        Imageoutput(202,40,"输入要查找记录的关键字",0);
		                for(j=0;j<1;j++)
		                {
                                  vsget(250,180+j*20,"%d",&b[j]);
		                }
	                        test.MFSearch(fname1,fname2,b,1);
	                        break;
			      case 1:
				Imageoutput(202,40,"输入要查找的记录标识",0);
	                        vsget(202,180,"%s",a[1].Mark);
		                test.MarkSearch2(fname1,a[1]);
				break;
			      case 2:
			        size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
				if(size!=-1){
				  branch_buf=malloc(size);
				  if(branch_buf)
				    getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
				}
				else outtext("Out memory");
				putimage(x0,y0+3,branch_buf,XOR_PUT);
				free(frame[num-1].p);
				free(branch_buf);
				key=1;
			    }
			    break;
                     case 3:switch(c_num){
			      case 0:
				Imageoutput(202,40,"输入要修改的记录标识",0);
		                vsget(202,180,"%s",a[0].Mark);
		                test.MarkReplace(fname1,a[0]);
				break;
			      case 1:   
			        Imageoutput(202,40,"输入重写记录的记录标识",0);
		                vsget(202,180,"%s",a[0].Mark);
				test.RecordReplace(fname1,a[0]);
				break;
			      case 2:
			        size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
				if(size!=-1){
				  branch_buf=malloc(size);
				  if(branch_buf)
				    getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
				}
				else outtext("Out memory");
				putimage(x0,y0+3,branch_buf,XOR_PUT);
			        free(frame[num-1].p);
				free(branch_buf);
				key=1;
			    }
			    break;
		     case 4:switch(c_num){
			      case 0:
			        test.PrintMainFile(fname1);
				break;
			      case 1:
			        test.PrintIndexFile(fname2);
				break;
			      case 2:
			        test.PrintDeleteFile(fname1);
				break;
			      case 3:
			        size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
				if(size!=-1){
				  branch_buf=malloc(size);
				  if(branch_buf)
				    getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
				}
			        else outtext("Out memory");
				putimage(x0,y0+3,branch_buf,XOR_PUT);
				free(frame[num-1].p);
				free(branch_buf);
				key=1;
			    }
                            break;
                     case 5:switch(c_num){
                              case 0:
                                free(frame[num-1].p);
				key=1;
				keybuffer(0,45);
				break;
			      case 1:
			        size=imagesize(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10);
				if(size!=-1){
				  branch_buf=malloc(size);
				  if(branch_buf)
				    getimage(x0,y0+3,x0+4*24+4,34+frame[num-1].count*18+10,branch_buf);
				}
				else outtext("Out memory");
				putimage(x0,y0+3,branch_buf,XOR_PUT);
				free(frame[num-1].p);
				free(branch_buf);
				key=1;
                            }
                            break;
                  }
        }
      }while(key==0);
  }


  void help()
  {
      setviewport(1,50,637,419,1);
      clearviewport();
      rectangle(50,40,600,150);
      out16hz(120,40,0,15,"变长记录类库操作");
      out16hz(65,65,0,15,"记录项自动存储到");
      outtextxy(200,60,"C:\\test.rec");
      out16hz(300,65,0,15,"位置");
      out16hz(65,85,0,15,"索引项自动存储到");
      outtextxy(200,80,"C:\\index.dex");
      out16hz(310,85,0,15,"位置");
      out16hz(65,105,0,15,"顺序读支持采用下箭头翻页功能");
      out16hz(100,125,0,15,"计算机学院张斌制作");
      while(specialkey()!=ESC);
      clearviewport();
      setviewport(0,0,639,420,1);
  }

  int specialkey()
  {
      int key;
      while(bioskey(1)==0);
      key=bioskey(0);
      key=key&0xff?key&0xff:key>>8;
      return(key);
  }

  void keybuffer(char k1,char k2)
  {
      int keybufbott;
      keybufbott=peek(0,0x041c);
      if(keybufbott<0x03c)pokeb(0,0x041c,keybufbott+2);
      else pokeb(0,0x041c,0x01e);
      pokeb(0,0x0400+keybufbott,k1);
      pokeb(0,0x0400+keybufbott+1,k2);
  }

  int out16hz(int x,int y,int z,int color,char*p)
  {
      unsigned int i,QM,WM,f=0;
      int record,i1,i2,i3;
      long pointer;
      char Bit[32];
      while((i=*p++)!=0)
      {
	if(f==0){
	  QM=(i-0xa1)&0x07f;
          f=1;
        }
        else{
	  WM=(i-0xa1)&0x07f;
          f=0;
          record=QM*94+WM;
          pointer=record*32L;
	  lseek(flag16,pointer,SEEK_SET);
	  read(flag16,Bit,32);
          for(i1=0;i1<16;i1++)
            for(i2=0;i2<2;i2++)
              for(i3=0;i3<8;i3++)
                if(convert(Bit[i1*2+i2],7-i3))
                  putpixel(x+i2*8+i3,y+i1,color);
          x=x+z+16;
        }
      }
      return(x);
  }

  int out24hz(int x,int y,int z,int color,int m,int n,char*p)
  {
      unsigned int i,QM,WM,f=0;
      int i1,i2,i3,i4,i5,record;
      long pointer;
      char Bit[72];
      while((i=*p++)!=0)
      {
        if(i>0xa1)
          if(f==0){
            QM=(i-15-0xa1)&0x07f;
            f=1;
          }
        else{
          WM=(i-0xa1)&0x07f;
          f=0;
          record=QM*94+WM;
          pointer=record*72L;
          lseek(flag24,pointer,SEEK_SET);
          read(flag24,Bit,72);
          for(i1=0;i1<24*m;i1=i1+m)
            for(i4=0;i4<m;i4++)
              for(i2=0;i2<=2;i2++)
                for(i3=0;i3<8;i3++)
                  if(convert(Bit[i1/m*3+i2],7-i3))
                    for(i5=0;i5<n;i5++)
                      putpixel(x+i1+i4,y+i2*8*n+i3*n+i5,color);
          x=x+24*m+z;
        }
      }
      return(x);
  }

  int convert(unsigned char ch,int n)
  {
      return((ch>>n)&1);
  }


  void Imageoutput(int x,int y,char*s,int choice)
  {
      if(!choice)
      {
        setviewport(1,120,637,415,1);
        clearviewport();
        rectangle(200,20,500,120);
        out16hz(x,y,0,14,s);
      }
      else{
        setviewport(1,120,637,415,1);
        out16hz(x,y,0,14,s);
      }
      setviewport(0,0,639,420,1); 
  }


























⌨️ 快捷键说明

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