C语言课程设计
软件学院
指导老师: 学号: 姓名:
1
一、实验题目及要求
题目 : 电子英汉词典
设计要求 : 1.用图形用户界面实现
二、实验过程
2.能够编辑词典库中的信息
3.能够实现英译汉,汉译英。(要考虑一词多义)
主要思想 : 1 建立词典库(相关文件的处理)
2 设计词典图形用户界面
3 查找单词及词典的重复使用(实现一词多义)
2
主要过程 1.词典库的建立:
文件的建立,写入和调出参考老师给的FILE.C 文件
FILE.C大致内容 { FILE *fp/*建立文件指针*/
fp=fopen(\在指定路径建立文本文件*/
for(i=0;i 3 2. 设计词典图形用户界面 参考文件Graph.c 进行图形驱动 void init() { int gdriver, gmode, i, j; gdriver = DETECT; registerbgidriver(EGAVGA_driver); initgraph(&gdriver, &gmode, \ } 图例(未设置鼠标前) 上网查找相关资料调用鼠标 鼠标绘制函数 设置鼠标指针位置函数 设置函数得到鼠标左右键点击的不同状态 (设置鼠标后运行结果全屏无法截图) 在图形界面下设计用户界面并使用该鼠标设置相关区域的鼠标键点击后 得到不同的结果,进入英译汉或汉译英界面 4 3. 查找单词及词典的重复使用(考虑一词多义) 利用文件指针和函数fseek ,fread 对结构体内的单词名称查找和该相关 释义的调用同时考虑英汉互译 设置查找不到单词的页面和利用while语句使实现词典是否需要重复使用 功能 图例: 三、实验结果及心得 根据题目描述基本达到题目要求。 在实验过程中对照老师给予的帮助程序和相关软件不断构思得到大致的框架,不断 的调试不断的查询函数用法的同时加深对c语言的认识,也许只是简单的一句话也许只 是简单的一个功能也是需要一个一个经过深思熟虑的代码敲打出来。 此次试验中了解图形用户界面,相关文件的存储和调用,鼠标的调用及使用等等平 常没有接触到的c语言的知识。深深感受到c语言博大精深,将为以后的软件方面知识 的学习打下深刻的基础。 5 四、代码(dictionary) #include #define SIZE 2 /*设置词典的词汇量*/ #define NO_PRESSED 0 /*为读取鼠标的各个状态*/ #define LEFT_PRESSED 1 #define RIGHT_PRESSED 2 void 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[]={\Translation(中译英)\Translation(英译中)\ int key,y,x; char u; int t=0,r; int o1[SIZE]; 6 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(\ if(fp==NULL) { printf(\ exit(0); } /*创建或打开特定路径的文件*/ for(i=0;i puts(\ scanf(\ /*添加英译中词典中单词名*/ u='y'; /*字符变量u存储用户输入的键盘值 查询用户是否需要添加释义*/ j=0; /*变量j的数值能控制每个单词释义在 三个之内*/ while(u=='y'&&j<=2) { o1[i]=j; /*int类型数组o1记载每个单词拥有的 释义数*/ printf(\ y=wherey(); scanf(\ gettext(1,1,60,14,buf); if(j<2) printf(\ getchar(); scanf(\ clrscr(); puttext(1,1,60,14,buf); gotoxy(1,y+2); j++; } clrscr(); 7 } /*添加英译中词典中单词*/ /*利用循环语句添加单词释义实现一次 多义功能 */ for(i=0;i puts(\中文单词:\ scanf(\ u='y'; j=0; while(u=='y'&&j<=2) { o2[i]=j; printf(\英文释义 %d :\ y=wherey(); scanf(\ gettext(1,1,60,14,buf); if(j<2) printf(\增加释义 ? ('n'or 'y')\\n\ getchar(); scanf(\ clrscr(); puttext(1,1,60,14,buf); gotoxy(1,y+2); j++; /*相关解释同上文英译汉词典中注释*/ } /*添加中译英词典中单词*/ clrscr(); } for(i=0;i if(fwrite(&stu[i],sizeof(struct word),1,fp)!=1) { printf(\ exit(0); } /*利用文件指针和fwrite语句将单词存 放在指定打开文件中/* window(1,1,80,25); gettext(20,10,40,14,buf); u='y'; init(); x0=250; y0=250; /*设定鼠标的初始位置*/ 8 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) { 9 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(\ gotoxy(31,12); rewind(fp); printf(\ gotoxy(31+strlen(\the word:\ *设计英译汉词典查找功能 时的页面*/ scanf(\ for(i=0;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++) 10 { if(j==0) printf(\ else { gotoxy(31+strlen(\ printf(\ } } /*如果t=1,找到该单词在文件中存储的位置后,利用 循环结构,fseek和fread语句将其所有释义调出, 循环的判断次数取决o1数组内相对应的数字*/ } for(i=0;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(\ /*如果t=2在汉译英词典库中找到相关 释义并将其单词名调出*/ } if(t==0) { gotoxy(31,15); printf(\ /*词典库中没有此单词则输出 11 sorry,don't find it*/ } getchar(); scanf(\ clrscr(); /*停顿使用户看清结果*/ gotoxy(22,10); printf(\ gotoxy(35,14); printf(\ gotoxy(35+strlen(\ /*设计没有查到单词的界面*/ scanf(\ 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(\输入单词:\ scanf(\ for(i=0;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) 12 printf(\释义:(%d) %s\ else { gotoxy(35+strlen(\释义:\ printf(\ } } } for(i=0;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\ } if(t==0) { gotoxy(35,15); printf(\对不起,没有这个单词\ } getchar(); scanf(\ clrscr(); gotoxy(27,10); printf(\重新查询?('n' or 'y')\ gotoxy(35,14); printf(\输入:\ 13 gotoxy(35+strlen(\输入:\ scanf(\ 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) { 14 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(EGAVGA_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 for(i=starty+1;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 /*框框的建立*/ 15