C语言课程设计一种简单的英文词典排版系统的实现.docx
《C语言课程设计一种简单的英文词典排版系统的实现.docx》由会员分享,可在线阅读,更多相关《C语言课程设计一种简单的英文词典排版系统的实现.docx(27页珍藏版)》请在冰豆网上搜索。
C语言课程设计一种简单的英文词典排版系统的实现
1.课程论文题目
一种简单的英文词典排版系统的实现
【要求】
(1)能输入和现实打入的单词
(2)能分辨出单词
(3)对重复的单词和已经输入的单词能自动排除
(4)能按A~Z的顺序排版
(5)能将运行结果以文本形式储存
(6)具有添加新单词蹦重新排版的能力
[提示]
(1)需求分析:
运行结果以文本形式储存,因而要提供文件的输入输出操作;通过查找操作检查重复单词;提供排序操作现实按A~Z的顺序排版;提供插入操作添加新单词并重新排版。
另外通过键盘式菜单实现功能选择。
(2)总体设计:
整个系统被设计为单词录入模块,文件存储模块和单词浏览模块。
其中单词录入模块要完成输入单词,检查是否重复,排序操作。
文件存储模块把存放单词的数组中的数据写入文件。
单词浏览模块完成英文词典的输出,即文件的输出操作。
(3)数据结构采用指针数组或二维数组。
以【Enter】键或者空格键作为单词输入结束标志,对重复的单词自动排除可选用查找方法,数据结构可采用指针和数组。
2.程序设计思路
整个系统被设计为单词录入模块,文件存储模块和单词浏览四个模块。
其中单词录入模块要完成输入单词,检查是否重复,排序操作。
文件存储模块把存放单词的词组中的数据写入文件。
单词浏览模块完成英文词典的输出,即文件的输出操作。
这四个模块是整体的设计思路,设计核心,整个程序的设计都将围绕这四个模块进行,各个模块都相互衔接,所以需要在设计好各个部分地同时,还要把握好各个部分的连接。
3.功能模块图
(
4.数据结构设计
数据结构采用指针数组或二维数组:
char*dictionary[N];或chardictionary[N][20]。
其中N是宏定义#defineN256(表示单词个数)
(1)单词录入模块
输入一个单词,存放在一个临时字符数组中,以空格或回车表示单词的结束(这也是默认操作),然后换行输出刚刚输入的单词。
采用插入排序算法的思想把该单词插入单词数组中,不同的是如果两个单词相同则不插入。
(2)文件存储模块
采用fwrite或fprintf把单词数组输入到文件中。
(3)单词浏览模块
采用fread或fscanf把单词从文件中读出,然后输出。
5.算法设计
1.主函数
【流程图】
N
Y
【程序】
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"ctype.h"
#defineROWS256
#defineCOLS32
staticFILE*fp;
staticchara[ROWS][COLS];
charget_option(void);
intb(intcount);
voidc(char*pt[],intcount);
intcheck(chararr[],intcount);
voidstorage(char*pt[],intcount);
int n; //****n全局变量*****//
char word[N][20];
voidmenu()//***主界面***//
{
intn,w;//*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*//
do
{
puts("\t\t********************MENU********************\n\n");
puts("\t\t\tWelcometodj'sprogram!
\n\n");
newword.");
puts("\t\t\t\t2.Browseallthewords.");
puts("\t\t\t\t3.Searchtheword.");
puts("\t\t\t\t4.Sortthewords.");
puts("\t\t\t\t5.OrderbyA-z.");
puts("\t\t\t\t6.Exit!
");
puts("\n\n\t\t****************************************\n");
printf("Choiceyournumber(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)//*对选择的数字作判断*//
{
w=1;
getchar();
}
elsew=0;
}while(w==1);
switch(n)
{
case1:
add();break;//*追加模块*//
case2:
browse();break;//*浏览模块*//
case3:
search();break;//*查找模块*//
case4:
sort();break;//*分类模块*//
case5:
order();break;//*排序模块*//
case6:
exit(0);//*退出*//
}
}
voidmain()//********主函数*********//
{
menu();
}
【程序】
intload()//*加载函数*//
{
inti,count;
intstart;
char*pt[ROWS];
charch,len;
charinput;
if((fp=fopen("words.txt","a+"))==NULL)//*以输出打开方式,在此前的记录被覆盖*//
{
printf("\nCannotopenfile!
\n");
returnNULL;
}
for(i=0;!
feof(fp);i++)
fscanf(fp,"%s",&word[i]);
fclose(fp);
returni+1;//*返回记录个数*//
}
voidsave(intn)//*保存函数,保存n个记录*//
{
FILE*fp;
inti;
if((fp=fopen("words.txt","a+"))==NULL)//*以输出打开方式,在此前的记录被覆盖*//
{
printf("\nCannotopenfile!
\n");
exit(0);
}
for(i=0;ifprintf(fp,"%s",&word[i]);
fclose(fp);
}
1)分类模块
【程序】
voidsort()
{
inti,j,k;
charc[20];
if((n=load())==0)
{
printf("\nCannotopenfile!
\n");
exit(0);
}
for(i=0;ifor(j=0;jif(strcmp(word[j],word[j+1])>0)
{
strcmp(c,word[j]);
strcmp(word[j],word[j+1]);
strcmp(word[j+1],c);
}
save(n);
printf("Successful!
^_^.\n");
printf("\nNow?
1.browseall2.back");
scanf("%d",&k);
if(k==1)
browse();
elseif(k==2)
menu();
}
2)排序模块
【流程图】
【程序】
voidorder()//*排序模块*//
{
inta[N],i,j,t;
structwords;
n=load();
for(i=0;ifor(i=0;ifor(j=i+i;jif(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(j=0;jprintf("%3d",a[i]);
}
3)修改模块
【流程图】
YN
Y
Y
【程序】
voidmodify(inta)//*修改模块*//
{
charc[20];
printf("Enterthenewword:
");
scanf("%s",c);
strcpy(word[a],c);
save(n);
}
4)删除模块
【流程图】
YN
Y
N
【程序】
voiddel(inta)//*删除模块*//
{
intx,i,y;
printf("Areyousuretodeletethisword?
\n\t1).sure2).noandbackmenu[]\b\b");
scanf("%d",&x);//*输入要修改的单词*//
if(x==1)
{
for(i=a;istrcpy(word[i],word[i+1]);
save(n-1);
printf("Successful!
^_^.\nNow?
1).onemore2).backmenu");
scanf("%d",&y);
if(y==1)
search();
elseif(x==2)
menu();
}
elseif(x==2)
{
menu();
}
}
5)追加模块
【流程图】
返回主菜单
Y
N
【程序】
voidadd()//*追加模块*//
{
inti,x,w1,w2,w;
charc[20];
if((n=load())==0)
exit(0);
else
{
puts("Enterthenewword!
\n");
scanf("%s",c);//*输入要追加的单词*//
for(i=0;i{
if(strcmp(word[i],c)==0)
break;
}
if(i{
w=1;
do
{
printf("Thewordhasalreadyexit!
\n");
printf("\n\nWhatdoyouwanttodo?
\n\t1).enteronemore2).backmenu[]\b\b");
scanf("%d",&x);
if(x<1||x>2)
w1=1;
else
w1=0;
}while(w1==1);
}
else
{
w2=1;
strcpy(word[i],c);
save(n+1);
printf("Successful!
^_^.Nowchoosewhatyouwilldonext?
\n\t1).addanother2).backmenu[]\b\b");
do
{
scanf("%d",&x);
if(x<1||x>2)
w2=1;
else
w2=0;
}while(w2==1);
}
switch(x)
{
case1:
add();break;
case2:
menu();break;
}
}
6)浏览(全部)模块
【流程图】
【程序】
voidbrowse()//*浏览(全部)模块*//
{
inti,w;
if((n=load())==0)//*加载记录*//
{
printf("\nCannotopenfile!
\n");
exit(0);
}
for(i=0;iprintf("%s/n",word[i]);
puts("Successful!
^_^.Now1.backmenu2.sort");
scanf("%d",&w);
if(w==1)
menu();
elseif(w==2)
sort();
}
7)查找模块
【流程图】
YN
YN
【程序】
voidsearch()//*查找模块*//
{
inti,x,y;
charvs[20];
if((n=load())==0)//*加载记录*//
{
printf("\nCannotopenfile!
\n");
exit(0);
}
printf("Enterthewordwhatyouwanttosearch!
");
scanf("%s",vs);//*输入要查找的单词*//
for(i=0;iif(strcmp(word[i],vs)==0)
{
printf("Successful!
^_^.\nThewordis:
%s\n",word[i]);//*找到需要修改的单词*//
printf("Whatwouldyouliketodowiththeword?
\n\t1).modify2).delrte3).nothing[]\b\b");
scanf("%d",&y);
if(y==1)
modify(i);
else
{del(i);}
}
if(i==n)
printf("HOHO!
Sorry........Notfound~~~");
printf("Now.....1).onemore2).back3).exit");
scanf("%d",&x);
switch(x)
{case1:
search();break;
case2:
menu();break;
case3:
exit(0);
}
}
6.程序代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"ctype.h"
#defineROWS256
#defineCOLS32
staticFILE*fp;
staticchara[ROWS][COLS];
charget_option(void);
intb(intcount);
voidc(char*pt[],intcount);
intcheck(chararr[],intcount);
voidstorage(char*pt[],intcount);
intmain(void)
{
inti,count;
intstart;
char*pt[ROWS];
charch,len;
charinput;
if((fp=fopen("words.txt","a+"))==NULL)
{
fputs("不能打开或建立文件!
\n",stderr);
exit
(1);
}
fseek(fp,0L,SEEK_END);
start=(int)ftell(fp)/32;
count=start;
rewind(fp);
if(fread(a,32*sizeof(char),start,fp)==0)
{
i=0;
puts("开始创建词库");
puts("请输入单词(每行一个)");
puts("在新行输入END结束输入:
");
while(i{
fflush(stdin);
if(strncmp(a[i],"END",3)==0)
{
count+=i;
break;
}
if(check(a[i],i))
continue;
i++;
}
}
puts("\t\t*********************欢迎使用字典排版系统*******************\n\n");
puts("MENU");
puts("您要做些什么?
");
puts("a.显示已有的单词b.添加新单词");
puts("c.对已有的单词进行排序d.退出");
puts("\n\n\t\t**********************************************************\n");
while((input=get_option())!
='d')
{
if(input=='a')
{
puts("已有的单词:
");
for(i=0;i{
printf("");
puts(a[i]);
}
}
if(input=='b')
{
puts("开始创建词库");
puts("请输入新的单词(每行一个)");
puts("在新行输入END结束输入:
");
count=b(count);
}
if(input=='c')
{
puts("对单词进行排序:
");
c(pt,count);
for(i=0;i{
printf("");
puts(pt[i]);
}
}
puts("还要做些什么?
");
}
storage(pt,count);
fclose(fp);
puts("谢谢使用,再见!
");
return0;
}
charget_option(void)
{
charch;
while((ch=getchar())<'a'||ch>'d')
{
while((ch=getchar())!
='\n')
;
puts("请输入a,b,c或者d.");
}
fflush(stdin);
returnch;
}
intb(intcount)
{
inti;
i=count;
while(i{
fflush(stdin);
if(check(a[i],i))
continue;
if(strncmp(a[i],"END",3)==0)
{
count=i;
break;
}
i++;
}
returncount;
}
voidc(char*pt[],intcount)
{
inti,j;
char*temp;
for(i=0;ipt[i]=a[i];
for(i=0;ifor(j=i+1;j{
if(strcmp(pt[i],pt[j])>0)
{
temp=pt[i];
pt[i]=pt[j];
pt[j]=temp;
}
}
}
intcheck(chararr[],intcount)
{
inti;
intflag=0;
for(i=0;iif(isalpha(arr[i])==0)
{
printf("%s不是一个单词.\n",arr);
flag=1;
break;
}
for(i=0;iif(strncmp(a[i],a[count],strlen(a[count])+1)==0)
{
puts("重复的单词!
");
flag=1;
}
returnflag;
}
voidstorage(char*pt[],intcount)
{
inti,j;
charptr[ROWS][COLS];
c(pt,count);
for(i=0;ifor(j=0;pt[i][j]!
='\0';j++)
ptr[i][j]=pt[i][j];
fp=fopen("words.txt","w+");
rewind(fp);
fwrite(ptr,32*sizeof(char),count,fp);
}
7.程序运行结果
8.编程中遇到的困难及解决方法
在学习C语言时,最初使用的是TurboC计算机编程软件,实习则用VC软件编程。
两个软件各有自己的特点。
VC作为后来开发的软件,功能上来讲比TurboC有优势,但是在很多方面VC并不能兼容TurboC。
以前在TurboC的习惯用法,在VC中使用就会出错。
一开始是很难适应的,。
比如,子函数写在VC,前面必须要声明其类型,在TurboC中时不必的,这类的问题很多,在以后索性只要涉及到的我都会注明类型。
在编程的过程中,很容易出现一个问题,就时少大括号“}”的问题。
这是,error只有一个,但是错误的地方很多,且都在括号处。
按照计算机所指出的错误位置寻找是不容易找出错误的。
直到整个程序看了一遍后才会发现是一个大括号的问题。
通常少的是“{”或着“}”,错误位置会出现在缺少括号位置之后的其他大括号出现的地方。
只要这种情况发生后,往前找是否有大括号缺失就可以将问题很快解决了。
在帮同学修改程序的过程中,也遇到过一个问题。
在头文件后定义了子函数,可是之后忘了编写子函数,在纠错时,有的是不会发现错误的,但是连接过程中就会报告出错。
我觉得在以后的编程过程中,最好用什么函数写什么函数,后者在写完一个子函数后再在头文件底下声明。
9.总结心得及良好建议
C语言实习基本上由老师引导,自己很多都靠自学,不明白的问老师,自学能力得到了很大的培养。
在实习过程中,我感觉到一点,程序是不能一气呵成的。
至少一气呵成的程序不会尽善尽美。
程序编写要一步一步的完成。
首先,对于要编的程序要有一个总体思路。
要明确想要什么。
只要把思路理清楚了,程序就好编写了。
把程序分割成几个块,即多个函数,一块一块的编写。
然后将分散的函数用另外的函数连接起来或者用main函数连接。
到这一步,程序也就初步编成了,之后便是调试,检查错误。
最后我觉得还可以对于已经编写好的程序进行一些修改添加,使它更加人性化。
优化程序的阶段是很重要的。
10.致谢
在C语言的实习过程中,让我巩固了C语言的基础知识,以前从来没有这样编过完整的程序,实习让我有这样的一个机会,自己独立编写程序。
我觉得自己说学的