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

📄 myimm.h

📁 这是毕业设计的程序主要是图书管理功能,希望大家给给意见
💻 H
字号:

/* ==================================================== */
/*                                                      */
/* 学生宿舍管理系统Ver 1.00.1 源代码                    */
/* 文件名: MyImm.h                                      */
/* 作用: 实现字符的输入,包括中文的输入.其主要思路是二   */
/*       分查找的算法查找汉字库中的拼音,然后进行匹配.   */
/* 版权所有 (c) 2007  张元龙 保留所有权利               */
/*                                                      */
/* ==================================================== */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include <bios.h>
#include <graphics.h>
#include <io.h>
#include <ctype.h>

#include "MyIco.h"
#include "MyChn.h"
#include "MyMouse.h"


#ifndef ImmDefined
#define ImmDefined

FILE *ImmFile;
long FileSize;

char ImmBuf[50];                /*中文输出缓冲区*/
char SelectBuf[30];             /*选择的目标缓冲区*/
char InBuf[30];                 /*按键输入缓冲区*/
int  Pages;                     /*翻页数目*/
bool ImmIsChn=false;            /*当前输入法是否是中文*/

typedef void (*InputCharFunc)(char *Text);

InputCharFunc OnInputChar;

int DelChar(char *Text,int Index=-1){   /*返回删除几个字节*/
    int i,last;
    if (Index==-1) Index=0x7FFF;
    for (i=0;Text[i] && i<Index;){
        last=i;
        if (Text[i]<0) i+=2;
        else i++;
    }
    if (i==0) return 0;
    char buf[50];
    strcpy(buf,Text+i);
    i=Text[last] & 128?2:1;
    Text[last]=0;
    strcat(Text,buf);
    return i;
}

/* ================================ */
/*   使用二分查找算法查找拼音位置   */
/* ================================ */

long GetLast(long v){
    fseek(ImmFile,v,0);
    while (getc(ImmFile))
        v++;
    if (getc(ImmFile) & 128){
        v++;
        while (getc(ImmFile))
            v++;
    }
    return v;
}

long GetFirst(long v){
    if (v==0) return 0;
    v--;
    fseek(ImmFile,v,0);
    while (getc(ImmFile) && v>0){
        v--;
        fseek(ImmFile,v,0);
    }
    if (getc(ImmFile) & 128){
        v--;
        fseek(ImmFile,v,0);
        while (getc(ImmFile) && v>0){
            v--;
            fseek(ImmFile,v,0);
        }
    }
    return v?v+1:v;
}

char *GetText(long v, char *buf){
    v=GetFirst(v);
    fseek(ImmFile,v,0);
    fread(buf,20,1,ImmFile);
    return buf;
}


/* ================================ */
/*           二分查找开始           */
/* ================================ */
long Location(char *PinYin){
    long head=0;
    long tail=FileSize-1;
    long middle;
    char buf[20];
    int i;

    while (head<tail){
        middle = (head+tail)/2;
        GetText(middle,buf);
        if (strcmp(PinYin,buf)<=0)
            tail=GetFirst(middle);
        else
            head=GetLast(GetLast(middle)+1);
    }
    return GetFirst(tail);
}

long ImmStack[30];
int pImmStack=0;

void UpdateImm(long v=-1){
    if (v==-1) {
        if (InBuf[0]==0) {
            ImmBuf[0]=0;
            return;
        }
        if (strcmp("zuzubeibei",InBuf)<0) {
            ImmBuf[0]=0;
            return;
        }
        v=Location(InBuf);
        pImmStack=0;
        ImmStack[0]=v;
    }
    char tempbuf[50],buf[50];
    int i,j,t;
    int len=0;
    ImmBuf[0]=0;
    for (i=1;i<=9;i++){
        if (v>=FileSize) break;
        fseek(ImmFile,v,0);
        fread(buf,30,1,ImmFile);
        v+=strlen(buf)+1;
        fseek(ImmFile,v,0);
        fread(buf,30,1,ImmFile);
        t=strlen(buf);
        if (t+len+3>45) {
            v=GetFirst(v);
            break;
        }
        v+=t+1;
        ImmBuf[len++]=' ';
        ImmBuf[len++]=i+'0';
        ImmBuf[len++]='.';
        ImmBuf[len]=0;
        strcat(ImmBuf,buf);
        len+=t;
    }
    ImmStack[++pImmStack]=v;
}

void PgDown(){                          /*输入法翻页(下翻)*/
    if (pImmStack<29)
        UpdateImm(ImmStack[pImmStack]);
}

void PgUp(){                            /*输入法翻页(上翻)*/
    if (pImmStack-2>=0){
        pImmStack-=2;
        UpdateImm(ImmStack[pImmStack]);
    }
}

char *Select(int value){
    if (pImmStack==0 || InBuf[0]==0) return "";
    long v=ImmStack[pImmStack-1];
    char buf[32];
    fseek(ImmFile,v,0);
    fread(buf,30,1,ImmFile);
    v+=strlen(buf)+1;
    for (;value>1;value--){
        fseek(ImmFile,v,0);
        fread(buf,30,1,ImmFile);
        v+=strlen(buf)+1;
        fseek(ImmFile,v,0);
        fread(buf,30,1,ImmFile);
        v+=strlen(buf)+1;
    }
    fseek(ImmFile,v,0);
    fread(SelectBuf,30,1,ImmFile);
    InBuf[0]=0;
    ImmBuf[0]=0;
    pImmStack=0;
    if (OnInputChar!=NULL) OnInputChar(SelectBuf);
    return SelectBuf;
}

void AddKey(int key){
    key=key & 0xFF;
    if (!key) return;
    if (!ImmIsChn){
        if (isprint(key) || key==8) OnInputChar((char *)&key);
        return ;
    }
    
    if ('A'<=key && key<='Z') key-='A'-'a';     /*转化成小写*/
    int len=strlen(InBuf);
    if (len==0 && !('a'<=key && key<='z')) {
        if (isprint(key) || key==8) OnInputChar((char *)&key);
        return ;
    }
    if (key==8){
            InBuf[len-1]=0;
            UpdateImm();
    } else if ('a'<=key && key<='z'){
        if (len>12) return;
        InBuf[len]=key;
        InBuf[len+1]=0;
        UpdateImm();
    } else if (key=='=' || key=='+') PgDown();
    else if (key=='-') PgUp();
    else if ('1'<=key && key<='9') Select(key-'0');
    else if (key==' ') Select(1);
    else if (isprint(key)) OnInputChar((char *)&key);

}



void ImmInit(InputCharFunc Func){
    static AlreadyInit=false;                   /*确保初始化工作只执行一次*/
    if (AlreadyInit) return;
    AlreadyInit=true;
    ImmFile=fopen("Dat\\imm.dat","r");
    if (ImmFile==NULL){
        printf("Cannot open the \"imm.dat\" file!");
        getch();
        exit(0);
    }
    OnInputChar=Func;
    FileSize=filelength(fileno(ImmFile));
    memset(ImmBuf,0,sizeof ImmBuf);
    memset(InBuf,0,sizeof InBuf);
}

#endif

⌨️ 快捷键说明

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