📄 crecord.cpp
字号:
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 + -