资源描述
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(EGAVGA_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 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[]={"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_eg.name);
}
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(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 <width;i++)
putch(0xc4);
putch(0xbf);
展开阅读全文