📄 cet4word.c
字号:
#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
int win();
void number();
int key();
unsigned long address[98],letter[26];
FILE *hzk_p,*fr;
char big=1,bigbak=1,lit,work=1;
char bigch[3]={0},litch[3]={0};
int group=1;
struct { char english[25];
char sound[25];
char chinese[50];
}cet[100];
int cetread(int a)
{
int i;
unsigned long addr;
char c;
addr=address[a-1];
rewind(fr);
fseek(fr,addr,SEEK_SET);
for(i=0;i<100;i++)
{
fread(&a,1,1,fr);
if(a==0) break;
cet[i].english[a]=0;
fread(cet[i].english,a,1,fr);
fread(&a,1,1,fr);
cet[i].sound[a]=0;
fread(cet[i].sound,a,1,fr);
fread(&a,1,1,fr);
cet[i].chinese[a]=0;
fread(cet[i].chinese,a,1,fr);
}
return i;
}
void dishz();
void showchinese(int x,int y,unsigned char *s)
{
char sa[10]={0},i;
while(*s!=NULL)
{ if(0<*s&&*s<0xa0)
{ for(i=0;0<*s&&*s<0xa0;i++)
sa[i]=*s++;
sa[i]=0;
outtextxy(x,y-5,sa);
if(*s==0) break;
x=i*10+x;
}
dishz(x,y,s);
x+=20;
s+=2;
}
}
void get_hz(char incode[],char bytes[])
{
unsigned char qh,wh;
unsigned long offset;
qh=incode[0]-0xa0;
wh=incode[1]-0xa0;
offset=(94*(qh-1)+(wh-1))*32L;
fseek(hzk_p,offset,SEEK_SET);
fread(bytes,32,1,hzk_p);
}
void dishz(int x0,int y0,char code[])
{
unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
register int i,j,x,y,pos;
char mat[32];
get_hz(code,mat);
y=y0;
for(i=0;i<16;++i)
{
x=x0;
pos=2*i;
for(j=0;j<16;++j)
{
if((mask[j%8]&mat[pos+j/8])!=NULL)
putpixel(x,y,WHITE);
++x;
}
++y;
}
}
void topwin()
{ setviewport(20+3,10+3,620-2,41,1); /* top window */
clearviewport();
showchinese(400,7,"第 大组第 小组");
if(work==1)
{
showchinese(5,7,"浏览单词");
/* showchinese(400,7,"第 大组第 小组"); */
}
else if(work==2)
{ showchinese(5,7,"词意识别"); }
else if(work==3)
showchinese(5,7,"单词查找");
if(big>9)
{ bigch[0]=big/10+48;
bigch[1]=big%10+48;
}
else { bigch[0]=big+48; bigch[1]=0; }
if(lit>9)
{ litch[0]=lit/10+48;
litch[1]=lit%10+48;
}
else { litch[0]=lit+48; litch[1]=0 ; }
outtextxy(425,3,bigch);
outtextxy(510,3,litch);
}
int look()
{
int showy=10,i,j; int res;
while(1)
{ settextstyle(2,0,7);
topwin();
setviewport(20+3,45,620-2,390,1); /* middle window */
clearviewport();
cetread(big);
for(;(lit-1)<10;)
{ showy=10;
i=(lit-1);
topwin();
setviewport(20+3,45,620-2,390,1);
for(j=0;j<10;j++)
{
outtextxy(10,showy+j*30,cet[i*10+j].english);
outtextxy(180,showy+j*30,cet[i*10+j].sound);
showchinese(370,showy+j*30+5,cet[i*10+j].chinese);
}
lit++;
while((res=key())!=1)
{
switch(res)
{
case 'g':
case 'G': if(win(1)!=2) goto next; break;
case 'l':
case 'L': if(win(2)!=3) goto next; break;
case 4 : if(lit==2&&big>1)
{ big--; lit=10 ;
cetread(big); bigbak=big;
}
else if(lit>2 ) lit-=2;
goto next;
case 3 : work++; lit--; return 1;
case 2 : if(win(3)==0) return 0;
}
}
next: if(lit==11) { big++;lit=1 ;}
if(lit<1||lit>10) lit=1;
if(big>group) { big=1; lit=1;}
if(bigbak!=big)
{ cetread(big); j=0; lit=1; bigbak=big; }
clearviewport();
}
big++; bigbak=big; lit=1;
}
}
void set()
{
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
line(20,10,620,10);
line(20,470,620,470);
line(20,43,620,43);
line(20,10,20,470);
line(620,10,620,470);
line(20,400,620,400);
setviewport(20+3,400+2,620-2,470-2,1); /* down window */
clearviewport();
outtextxy(3,3,"HELP:");
outtextxy(70,3,"TAB-");
showchinese(120,3+5,"选择");
outtextxy(230,3,"1 2 3 4-");
showchinese(320,3+5,"答题");
outtextxy(430,3,"ESC-");
showchinese(480,3+5,"退出");
outtextxy(70,30,"G-");
showchinese(100,30+5,"输入大组号");
outtextxy(230,30,"L-");
showchinese(300,30+5,"输入小组号");
}
int key()
{ int a; char c;
a=bioskey(0);
c=a;
switch(a)
{ case 0x4800: return 4;
case 0x5000:
case 0x4b00:
case 0x4d00: return 1;
case 0x011b: return 2; /* ESC */
case 0x0f09: return 3; /* TAB */
}
if(c!=0)
{ c=a&0x00ff;
return c;
}
}
int win(int a)
{ int x0=100,x1=500,y0=100,y1=200,i=0,e,falg=0;
char c[2]={0},d=0;
void *buffer;
setviewport(0,0,639,479,1);
buffer=(void *)malloc(imagesize(x0-2,y0-2,x1+2,y1+2));
if(buffer==NULL) {printf("ERROR!"); exit(0); }
getimage(x0-2,y0-2,x1+2,y1+2,buffer);
rectangle(x0,y0,x1,y1);
setviewport(x0+2,y0+2,x1-2,y1-2,1);
clearviewport();
if(a==1)
{ showchinese(0,5,"请输入大组号:");
while((e=key())!=0x0d)
{
if(e==2) { falg=2; break;} /* ESC */
if(e>='0'&&e<='9')
{
c[0]=e;
big=d=(c[0]-'0')+d*10;
outtextxy(100+i*20,20,c);
i++;
}
}
}
if(a==2)
{ showchinese(0,5,"请输入小组号:");
while((e=key())!=0x0d)
{
if(e==2) { falg=3; break; }
if(e>='0'&&e<='9')
{
c[0]=e;
lit=d=(c[0]-'0')+d*10;
outtextxy(100+i*20,20,c);
i++;
}
}
}
if(a==3)
{ showchinese(50,25,"要退出本程序吗? [Y]/[N]");
e=getch();
if(e=='y'||e=='Y')
falg=1;
}
setviewport(x0-2,y0-2,x1+2,y1+2,1);
clearviewport();
setviewport(0,0,639,479,1);
putimage(x0-2,y0-2,buffer,1);
free(buffer);
setviewport(20+3,45,620-2,390,1);
switch(falg)
{ case 0: return 1;
case 1: return 0;
case 2: return 2;
case 3: return 3;
}
}
select()
{
int i,j,k,error=0,right=0,a,showx=10,showy=70;
unsigned char chuiji[4],s[30];
topwin();
cetread(big);
setviewport(20+3,45,620-2,390,1);
clearviewport();
while(1)
{ if(big>group) { big=1; lit=1; }
if(lit<1||lit>10) lit=1;
i=lit-1;
topwin();
if(lit>10) { cetread(++big); lit=1;i=0 ; }
lit++;
for(j=0;j<9;j++)
{
setviewport(20+3,45,620-2,390,1);
clearviewport();
outtextxy(100,20,cet[i*10+j].english);
outtextxy(300,20,cet[i*10+j].sound);
number(chuiji,i*10+j);
outtextxy(showx,showy,"1.");
outtextxy(showx,showy+40,"2.");
outtextxy(showx,showy+80,"3.");
outtextxy(showx,showy+120,"4.");
showchinese(showx+400,showy+200+5,"答案[ ]");
for(k=0;k<4;k++)
{ if(k==chuiji[0])
showchinese(showx+20,showy+k*40+5,cet[i*10+j].chinese);
else
showchinese(showx+20,showy+k*40+5,cet[chuiji[k]].chinese);
}
while(a=key())
{
setfillstyle(0,0);
bar(showx+450,showy+200,showx+480,showy+220);
bar(showx+480,showy+200+20,showx+550,showy+200+50);
switch(a)
{
case '1': outtextxy(showx+460,showy+200,"1"); break;
case '2': outtextxy(showx+460,showy+200,"2"); break;
case '3': outtextxy(showx+460,showy+200,"3"); break;
case '4': outtextxy(showx+460,showy+200,"4"); break;
case 'g':
case 'G': if(win(1)==2) break;
cetread(big); lit=1;
goto next;
case 'l':
case 'L': if(win(2)==3) break;
goto next;
case 2 : if(win(3)==0) return 0; break;
case 3 : work++; lit--; return 1;
}
k=a-'1';
if(k==chuiji[0])
{ showchinese(showx+480,showy+200+30,"<正确>");
right=1;
for(k=0;k<4;k++)
{ if(k!=chuiji[0])
{ outtextxy(showx+250,showy+k*40,cet[chuiji[k]].english);
outtextxy(showx+400,showy+k*40,cet[chuiji[k]].sound);
}
}
}
else if(0<=k&&k<=3)
{ showchinese(showx+480,showy+200+30,"<错误>");
outtextxy(showx+250,showy+k*40,cet[chuiji[k]].english);
outtextxy(showx+400,showy+k*40,cet[chuiji[k]].sound);
}
if(right==1)
{ while(getch()==a) delay(100);
clearviewport();right=0; break;
}
}
}
next: ;
}
}
void number( unsigned char *s,int a)
{
int i;
s[0]=rand()%4; /* 0---3 four numbers */
for(i=1;i<4;i++)
{ s[i]=rand()%100 ; /* 0----99 */
if(a==s[i])
i--;
}
}
int find()
{
char s[25],now,low,ch,show[2]={0}, not=0;
int a,i=0;
char english[25];
char sound[25];
char chinese[50];
topwin();
setviewport(23,45,620-2,390,1);
again:i=0;
clearviewport();
showchinese(30,30,"请输入一个完整单词:");
while(a=key())
{ switch(a)
{ case 2: if(win(3)==0) return 0; break;
case 3: work++; return 1;
}
if((a>='a'&&a<='z')||(a>='A'&&a<='Z'))
{ show[0]=s[i]=a; now=s[0];
if(now<'a') now=now+32;
outtextxy(50+12*i,50,show); i++;
}
if(a==0x0d) { s[i]='\0';
while(s[--i]==' ')
s[i]='\0';
break;
}
if(a==0x08)
{ i--;
if(i<0) i=0;
bar(50+12*i,50,62+12*i,70);
}
}
fseek(fr,letter[now-'a'],SEEK_SET);
while(1)
{ fread(&ch,1,1,fr);
if(ch==0) { not=1; break; }
fread(english,ch,1,fr);
english[ch]=0;
low=english[0];
if(low<'a') low=low+32;
if(now!=low) { not=1; break; }
fread(&ch,1,1,fr);
fread(sound,ch,1,fr);
sound[ch]=0;
fread(&ch,1,1,fr);
fread(chinese,ch,1,fr);
chinese[ch]=0;
if(strcmp(s,english)==0)
{
outtextxy(20,90,english);
outtextxy(200,90,sound);
showchinese(340,90+5,chinese);
showchinese(100,150,"按任意键查下一个");
getch();
break;
}
}
if(not==1) { not=0; showchinese(100,150,"找不到该词"); getch(); }
goto again;
}
void main()
{
int graphdriver=VGA;
int graphmodel=VGAHI;
int showx,showy,shu,i,j;
char *s;
unsigned long filelong;
hzk_p=fopen("hzk16","rb");
if(hzk_p==NULL) { printf("can't not open file!"); getch(); }
fr=fopen("short.dat","rb");
if(fr==NULL)
printf("Can't open file!\n");
fseek(fr,-2L,SEEK_END);
fread(&group,2,1,fr);
fseek(fr,-(2+group*4),SEEK_END);
fread(address,4,group,fr);
fseek(fr,-(2+4*group+4*26),SEEK_END);
fread(letter,4,26,fr);
initgraph(&graphdriver,&graphmodel,"");
setbkcolor(BLACK);
cleardevice();
settextstyle(1,0,2);
settextjustify(LEFT_TEXT,TOP_TEXT);
set();
big=lit=1;
while(1)
{
switch(work)
{
case 1: if(look()==0) goto back;
break;
case 2: if(select()==0) goto back;
break;
case 3: if(find()==0) goto back;
break;
}
if(work>3) work=1;
}
back:
fclose(fr);
fclose(hzk_p);
closegraph();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -