当前位置:文档之家› c语言课程设计-电子英汉词典(含源码)

c语言课程设计-电子英汉词典(含源码)

C语言课程设计软件学院指导老师:学号:姓名:一、实验题目及要求题目:电子英汉词典设计要求:1.用图形用户界面实现2.能够编辑词典库中的信息3.能够实现英译汉,汉译英。

(要考虑一词多义)二、实验过程主要思想: 1 建立词典库(相关文件的处理)2 设计词典图形用户界面3 查找单词及词典的重复使用(实现一词多义)主要过程1.词典库的建立:文件的建立,写入和调出参考老师给的FILE.C 文件FILE.C大致内容{FILE *fp/*建立文件指针*/fp=fopen("d:\list.txt","wb+");/*在指定路径建立文本文件*/for(i=0;i<SIZE;i++) /*将结构体中的内容if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) 写进指定文件中并进{ printf("file write error!"); 行判断是否写入*/ exit(0);}fread(&stu_temp,sizeof(struct student),1,fp); /*将文件中的指定内容调出*/ }单词库存储在指定路径的指定文件中方便后文的查询和调出单词库的建立利用结构体可以包含一词多义,并将汉译英和英译汉的词典库分开以便实现英汉互译(在中文dos环境下运行)图例:(未在中文dos环境下运行)2. 设计词典图形用户界面参考文件Graph.c 进行图形驱动void init(){int gdriver, gmode, i, j;gdriver = DETECT;registerbgidriver(EGA VGA_driver);initgraph(&gdriver, &gmode, "");}图例(未设置鼠标前)上网查找相关资料调用鼠标鼠标绘制函数设置鼠标指针位置函数设置函数得到鼠标左右键点击的不同状态(设置鼠标后运行结果全屏无法截图)在图形界面下设计用户界面并使用该鼠标设置相关区域的鼠标键点击后得到不同的结果,进入英译汉或汉译英界面3. 查找单词及词典的重复使用(考虑一词多义)利用文件指针和函数fseek ,fread 对结构体内的单词名称查找和该相关释义的调用同时考虑英汉互译设置查找不到单词的页面和利用while语句使实现词典是否需要重复使用功能图例:三、实验结果及心得根据题目描述基本达到题目要求。

在实验过程中对照老师给予的帮助程序和相关软件不断构思得到大致的框架,不断的调试不断的查询函数用法的同时加深对c语言的认识,也许只是简单的一句话也许只是简单的一个功能也是需要一个一个经过深思熟虑的代码敲打出来。

此次试验中了解图形用户界面,相关文件的存储和调用,鼠标的调用及使用等等平常没有接触到的c语言的知识。

深深感受到c语言博大精深,将为以后的软件方面知识的学习打下深刻的基础。

四、代码(dictionary)#include <process.h>#include <stdlib.h>#include <stdio.h>#include <dos.h>#include <conio.h>#include <string.h>#include <graphics.h>#include <stdlib.h>#include <bios.h>#define SIZE 2 /*设置词典的词汇量*/#define NO_PRESSED 0 /*为读取鼠标的各个状态*/#define LEFT_PRESSED 1#define RIGHT_PRESSED 2void DrawMouse(float x,float y);int setMousePos(int x,int y);int mouseStatus(int* x,int* y);void init();void box(int startx,int starty,int high,int width) ;struct word{char name[10]; /*存储英译中词典单词名*/char exp[3][20]; /*存储英译中词典单词释义*/char namm[10]; /*存储中译英词典单词名*/char exx[3][20]; /*存储英译中词典单词释义*/}; /*创建存放单词及其释义的结构体*/char buf[20*20*4]; /*设置缓存区*/main(){char *f[]={"Chinese-English Translation(中译英)","English-Chinese Translation(英译中)"};int key,y,x;char u;int t=0,r;int o1[SIZE];int o2[SIZE]; /*o1,o2数组用来储存单词的释义数目*/ char seek[10]; /*存储查询功能时用户输入的单词*/int last_x,last_y;int x1,y1; int x0,y0;int m=0;struct word stu[SIZE],stu_eg; /*为读取文件中内容设定的相关结构体变量*/FILE *fp; /*定义文件指针*/int i,j;fp=fopen("c:\list.txt","wb+");if(fp==NULL){printf("cannot open this file\n");exit(0);} /*创建或打开特定路径的文件*/for(i=0;i<SIZE;i++){puts("English word:");scanf("%s",&stu[i].name); /*添加英译中词典中单词名*/u='y'; /*字符变量u存储用户输入的键盘值查询用户是否需要添加释义*/ j=0; /*变量j的数值能控制每个单词释义在三个之内*/ while(u=='y'&&j<=2){o1[i]=j; /*int类型数组o1记载每个单词拥有的释义数*/ printf("Chinese explanation %d :",j+1);y=wherey();scanf("%s",stu[i].exp[j]);gettext(1,1,60,14,buf);if(j<2)printf("\nanother explaination ? ('n'or 'y')\n") ;getchar();scanf("%c",&u);clrscr();puttext(1,1,60,14,buf);gotoxy(1,y+2);j++;}clrscr();} /*添加英译中词典中单词*//*利用循环语句添加单词释义实现一次多义功能*/ for(i=0;i<SIZE;i++){puts("中文单词:");scanf("%s",&stu[i].namm);u='y';j=0;while(u=='y'&&j<=2){o2[i]=j;printf("英文释义%d :",j+1);y=wherey();scanf("%s",stu[i].exx[j]);gettext(1,1,60,14,buf);if(j<2)printf("\n增加释义? ('n'or 'y')\n") ;getchar();scanf("%c",&u);clrscr();puttext(1,1,60,14,buf);gotoxy(1,y+2);j++;/*相关解释同上文英译汉词典中注释*/ } /*添加中译英词典中单词*/clrscr();}for(i=0;i<SIZE;i++)if(fwrite(&stu[i],sizeof(struct word),1,fp)!=1){printf("file write error!");exit(0);} /*利用文件指针和fwrite语句将单词存放在指定打开文件中/*window(1,1,80,25);gettext(20,10,40,14,buf);u='y';init();x0=250;y0=250; /*设定鼠标的初始位置*/textbackground(15);textcolor(0);clrscr();outtextxy(180,220,f[0]); /*在设定好的背景颜色和字体颜色下指定位置输出目录文字*/ outtextxy(180,270,f[1]);setMousePos(x0,y0);setwritemode(1);DrawMouse(x0,y0); /*调用相关的鼠标函数*/last_x=x0;last_y=y0;line(170,210,470,210);line(170,240,470,240);line(170,260,470,260);line(170,290,470,290);line(170,210,170,240);line(470,210,470,240);line(170,260,170,290);line(470,260,470,290); /*设计界面相关文字的框框*/while(m==0){m=0;while(mouseStatus(&x1,&y1) == NO_PRESSED&&m==0){if(last_x!=x1 && last_y!=y1){DrawMouse(last_x,last_y);DrawMouse(x1,y1);last_x=x1;last_y=y1;}} /*设计当鼠标坐标移动且没有按下任何键时鼠标的移动轨迹*/ while(!(mouseStatus(&x1,&y1)==NO_PRESSED) ){if(mouseStatus(&x1,&y1)==LEFT_PRESSED&&x1>170&&x1<470&&y1>210&& y1<240){m=1;break;}if(mouseStatus(&x1,&y1)==LEFT_PRESSED&&x1>170&&x1<470&&y1>260&& y1<290){m=2;break;}if(x1<170 ||x1>470 ||y1<210 || y1>290);} /*设定鼠标在界面内一定区域进行相关点击后实现的功能*/ }restorecrtmode(); /*设计词典的界面*/while(u=='y') /*利用u=='y'使词典能重复使用*/while(1){textbackground(3);textcolor(15);if(m==1){t=0;clrscr();box(15,10,10,65);gotoxy(27,7);printf("English-Chinese Translation");gotoxy(31,12);rewind(fp);printf("enter the word:");gotoxy(31+strlen("enter the word:"),12);/ *设计英译汉词典查找功能时的页面*/ scanf("%s",seek);for(i=0;i<SIZE;i++){if(strcmp(stu[i].name,seek)==0){t=1;break;}} /*利用字符串strcmp函数实现查找对比功能*/if(t==1) /*如果找到相同单词名令t=1,判断是否执行下个步骤*/ {fseek(fp,i*sizeof(struct word),0);fread(&stu_eg,sizeof(struct word),1,fp);gotoxy(31,15);for(j=0;j<=o1[i];j++){if(j==0)printf("the explanation is :(%d) %s",j+1,stu_eg.exp[j]);else{gotoxy(31+strlen("the explanation is :"),15+j);printf("(%d) %s",j+1,stu_eg.exp[j]);}} /*如果t=1,找到该单词在文件中存储的位置后,利用循环结构,fseek和fread语句将其所有释义调出,循环的判断次数取决o1数组内相对应的数字*/}for(i=0;i<SIZE;i++){for(r=0;r<=o2[i];r++){if(strcmp(stu[i].exx[r],seek)==0){t=2;break;}} /*如果找到相同单词释义令t=2,判断是否执行下个步骤*/if(t==2)break;}if(t==2){rewind(fp);fseek(fp,(i)*sizeof(struct word),0);fread(&stu_eg,sizeof(struct word),1,fp);gotoxy(31,15);printf("the explanation is :(1) %s",stu_eg.namm);/*如果t=2在汉译英词典库中找到相关释义并将其单词名调出*/ }if(t==0){gotoxy(31,15);printf("sorry,don't find it"); /*词典库中没有此单词则输出sorry,don't find it*/}getchar();scanf("%c",&u)clrscr(); /*停顿使用户看清结果*/gotoxy(22,10);printf("Do you want use is again ?('n' or 'y')");gotoxy(35,14);printf("enter:");gotoxy(35+strlen("enter:"),14); /*设计没有查到单词的界面*/scanf("%c",&u);break; /*对u进行赋值来判定用户是否需要重新使用词典*/ }if(m==2){t=0;clrscr();gotoxy(38,7);printf("汉译英");box(20,10,10,60);gotoxy(35,12);rewind(fp);printf("输入单词:");gotoxy(35+strlen("输入单词:"),12);scanf("%s",seek);for(i=0;i<SIZE;i++){if(strcmp(stu[i].namm,seek)==0){t=1;break;}}if(t==1){fseek(fp,i*sizeof(struct word),0);fread(&stu_eg,sizeof(struct word),1,fp);gotoxy(35,15);for(j=0;j<=o2[i];j++){if(j==0)printf("释义:(%d) %s",j+1,stu_eg.exx[j]);else{gotoxy(35+strlen("释义:"),15+j);printf("(%d) %s",j+1,stu_eg.exx[j]);}}}for(i=0;i<SIZE;i++){for(r=0;r<=o2[i];r++){if(strcmp(stu[i].exp[r],seek)==0){t=2;break;}}if(t==2)break;}if(t==2){rewind(fp);fseek(fp,(i)*sizeof(struct word),0);fread(&stu_eg,sizeof(struct word),1,fp);gotoxy(35,15);printf("释义:(1) %s",stu_);}if(t==0){gotoxy(35,15);printf("对不起,没有这个单词");}getchar();scanf("%c",&u);clrscr();gotoxy(27,10);printf("重新查询?('n' or 'y')");gotoxy(35,14);printf("输入:");gotoxy(35+strlen("输入:"),14);scanf("%c",&u);break; /*相关注释参考上文英译中词典*/ }}}int mouseStatus(int* x,int* y){/*定义两个寄存器变量,分别存储入口参数和出口参数*/union REGS inregs,outregs;int status;status=NO_PRESSED;/*入口参数AH=3,读取鼠标位置及其按钮状态*/inregs.x.ax=3;int86(0x33,&inregs,&outregs);/*CX表示水平位置,DX表示垂直位置*/*x=outregs.x.cx;*y=outregs.x.dx;/*BX表示按键状态*/if(outregs.x.bx&1)status=LEFT_PRESSED;else if(outregs.x.bx&2)status=RIGHT_PRESSED;return (status);}/*设置鼠标指针位置函数*/int setMousePos(int x,int y){union REGS inregs,outregs;/*入口参数AH=4,设置鼠标指针位置*/inregs.x.ax=4;inregs.x.cx=x;inregs.x.dx=y;int86(0x33,&inregs,&outregs);}/*绘制鼠标函数*/void DrawMouse(float x,float y){line(x,y,x+5,y+10);line(x,y,x+10,y+5);line(x+5,y+10,x+10,y+5);line(x+7,y+8,x+12,y+13);line(x+8,y+7,x+13,y+12);line(x+14,y+12,x+13,y+13); /*利用line函数一条一条绘制鼠标形状*/ }void init() /*进行相关图形驱动*/{int gdriver, gmode, i, j;gdriver = DETECT;registerbgidriver(EGA VGA_driver);initgraph(&gdriver, &gmode, "");}void box(int startx,int starty,int high,int width) /*框框的建立*/{int i;gotoxy(startx,starty);putch(0xda);for (i=startx+1;i <width;i++)putch(0xc4);putch(0xbf);for(i=starty+1;i <high+starty;i++){gotoxy(startx,i);putch(0xb3);gotoxy(width,i);putch(0xb3);}gotoxy(startx,starty+high-1);putch(0xc0);gotoxy(startx+1,starty+high-1);for(i=startx+1;i <width;i++)putch(0xc4);putch(0xd9);return;}。

相关主题