c语言关键字中英翻译机,要求创建文件搜索

C语言有32个关键字,要求建立关键字的中英文词典,输入中文的名词和关键字,将其翻译成英语,如输入“基本整型”+回车,得到int;输入英文的单词int,则可以翻译成中文“基本整型”。可多次查询。 【功能要求】 1. 建立如下菜单(图 9.1) 图 9.1 程序主菜单 从键盘上输入 1-5 某个数字,就调用某个函数实现对应的功能。 2. 定义结构体数据类型存放关键字中英文。 3. 创建关键字中英文词典,将其保存在 cidian.txt 文件中。 4. 读 cidian.txt 文件,将词典内容显示在屏幕上。 5. 输入要查找的英文关键字,利用顺序查找法查阅词典显示对应的中文。可多次查询。 6. 输入要查找的中文关键字,利用顺序查找法查阅词典显示对应的英文。可多次查询。

程序使用结构链表实现。

由于我写的函数已经自动识别中英文输入,中英文翻译功能其实可以合并成一个选项(3,4选项),但你题目既然要求2项目,所以没合并。

根据题目,创建字典是覆盖性,既每次创建输入,都会覆盖掉原文件,但考虑后期扩展,我的函数writeFile可以不覆盖,在原文件后新增,具体看备注。

菜单显示是利用递归函数,如果你想新增功能,参照我选项改。

(另外所有函数异常,我都是采取抛出,没有处理,你想处理根据我的函数返回值写处理吧!)

#include<stdio.h>

#include<string.h>

#include<malloc.h>

#define FPATH "C:\\keyWord.txt"

typedef struct keyWord

{

    char kwCN[20];// 中文名

    char kwEN[10];// 英文名

    struct keyWord *next;

}KW;

void freeKWS(KW *kwsHead);//释放链表内存

int createDictionary(char *path);//创建字典。成功返回1 失败返回0

int writeFile(char *path,KW *kwsHead,int flag);//写入文件。成功返回1,失败返回0。flag:0新增;1修改或删除

KW *readFile(char *path);//读取文件。成功返回头节点,失败返回NULL。

int isCN(char *strCN);//判断字符串是否是全中文,是返回1,否返回0

void showKWS(char *path,char*keyCN,char *keyEN);//参数全部传NULL打印整个链表。keyCN!=NULL打印对应英文,keyZN!=NULL打印对应中文

void showMenu(int n);//递归函数打印菜单,第一次调用传值-1

void selectByKey(char *keyN);//输入中文输出英文,输入英文输出中,自动识别中英文关键字

int main()

{

    //createDictionary("C:\\keyWord.txt");

    //showKWS(NULL,NULL);

    showMenu(-1);


}

void showMenu(int n)//打印菜单

{

    char cn[20],en[10];

    switch(n)

    {

        case 1:

            createDictionary(FPATH);

            break;

        case 2:

            printf("当前中英文词典的内容:\n");

            showKWS(FPATH,NULL,NULL);

            break;

        case 3:

            printf("请输入英文关键字:");

            scanf("%s",en);

            getchar();

            selectByKey(en);

            break;

        case 4:

            printf("请输入中文关键字:");

            scanf("%s",cn);

            getchar();

            selectByKey(cn);

            break;

        case 5:

            exit(0);

            break;

        case -1:

            while(1)

            {

                system("cls");

                printf("|***********************电子词典模拟软件***********************|\n");

                printf("1、创建关键字中英文词典\n");

                printf("2、显示关键字中英文词典\n");

                printf("3、输入英文关键字,查阅英汉词典\n");

                printf("4、输入中文关键字,查阅汉英词典\n");

                printf("5、退出\n");

                printf("|*********************All rights reserved**********************|\n");

                printf("请选择菜单中的1或2或3或4或5\n");

                scanf("%d",&n);

                getchar();

                showMenu(n);

            }

            break;

    }

    n=-1;

    printf("----------按任意键返回上级菜单-----------\n");

    getchar();

}

void selectByKey(char *keyN)//输入中文输出英文,输入英文输出中,自动识别中英文关键字

{

    if(isCN(keyN))

        showKWS(FPATH,keyN,NULL);

    else

        showKWS(FPATH,NULL,keyN);

}

int isCN(char *strCN)//判断字符串是否包含中文,是返回1,否返回0

{

    char *p=strCN;

    while(*p!=0)

    {

        if((*p&0x80)==0x80)

            return 1;

        p++;

    }

    return 0;

}

void showKWS(char *path,char *keyCN,char *keyEN)//参数全部传NULL打印整个链表。keyCN!=NULL打印对应英文,keyZN!=NULL打印对应中文

{

    KW *kwsHead=NULL;

    kwsHead=readFile(path);

    if(kwsHead)

        while(kwsHead->next)

        {

            if(keyCN!=NULL && keyEN==NULL && strcmp(kwsHead->next->kwCN,keyCN)==0){

                printf("对应英文关键字:%s\n",kwsHead->next->kwEN);

                break;

            }

            if(keyEN!=NULL && keyCN==NULL && strcmp(kwsHead->next->kwEN,keyEN)==0){

                printf("对应中文关键字:%s\n",kwsHead->next->kwCN);

                break;

            }

            if(keyEN==NULL && keyCN==NULL)

                printf("%s %s\n",kwsHead->next->kwEN,kwsHead->next->kwCN);

            kwsHead=kwsHead->next;

        }

    freeKWS(kwsHead);

}

int createDictionary(char *path)//创建字典。成功返回1 失败返回0

{

    char cn[20],en[10];

    KW *kwsHead=NULL,*kwTail=NULL,*kwNew=NULL;

    kwsHead=(KW *)malloc(sizeof(KW));

    if(!kwsHead)

        return 0;

    kwsHead->next=NULL;

    printf("请输入关键字中文及英文(每行一组空格分割,输入NULL退出输入):\n");

    while(1)

    {

        cn[0]=en[0]=0;

        scanf("%s",cn);

        if(strcmp(cn,"NULL")==0)

            break;

        scanf("%s",en);

        if(strcmp(en,"NULL")==0)

            break;

        kwNew=(KW *)malloc(sizeof(KW));

        kwNew->kwCN[0]=kwNew->kwEN[0]=0;

        kwNew->next=NULL;

        strcpy(kwNew->kwCN,cn);

        strcpy(kwNew->kwEN,en);

        if(kwsHead->next)

            kwTail->next=kwNew;

        else

            kwsHead->next=kwNew;

        kwTail=kwNew;

    }

    getchar();

    return writeFile(path,kwsHead,1);

}

KW *readFile(char *path)//读取文件。成功返回头节点,失败返回NULL。

{

    FILE *fp=NULL;

    char cn[20],en[10];

    KW *kwsHead=NULL,*kwTail=NULL,*kwNew=NULL;

    kwsHead=(KW *)malloc(sizeof(KW));

    if(!kwsHead)

        return NULL;

    kwsHead->next=NULL;

    fp=fopen(path,"r");

    if(!fp)

    {

        printf("文件打开失败!\n");

        return NULL;

    }

    fseek(fp,0,SEEK_SET);

    while(fscanf(fp,"%s%s",cn,en)!=-1)

    {

        kwNew=(KW *)malloc(sizeof(KW));

        if(!kwNew)

            return NULL;

        kwNew->next=NULL;

        strcpy(kwNew->kwCN,cn);

        strcpy(kwNew->kwEN,en);

        if(kwsHead->next)

            kwTail->next=kwNew;

        else

            kwsHead->next=kwNew;

        kwTail=kwNew;

    }

    fclose(fp);

    return kwsHead;

}

int writeFile(char *path,KW *kwsHead,int flag)//写入文件。成功返回1,失败返回0。flag:0新增;1修改或删除

{

    FILE *fp=NULL;

    if(flag)

        fp=fopen(path,"wt+");

    else

        fp=fopen(path,"rt+");

    if(!fp)

    {

        printf("文件打开失败!\n");

        return 0;

    }

    fseek(fp,0,SEEK_END);

    while(kwsHead->next)

    {

        fprintf(fp,"%s %s\n",kwsHead->next->kwCN,kwsHead->next->kwEN);

        kwsHead=kwsHead->next;

    }


    fclose(fp);

    printf("数据写入文件成功!\n");

    freeKWS(kwsHead);

    return 1;

}

void freeKWS(KW *kwsHead)//释放链表内存

{

    KW *kwDel=NULL;

    while(kwsHead->next)

    {

        kwDel=kwsHead->next;

        kwsHead=kwsHead->next;

        free(kwDel);

    }

    free(kwsHead);

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-19
这题目值100元.付费编写吧..