资源描述
一种简单的英文词典排版系统
目 录
中文摘要 Ⅰ
主要符号表 Ⅳ
1 题目要求 1
1.1. 1
2 需求分析
3 总体设计
4 详细设计
4.1主函数
4.2各功能模块设计
5.运行结果(附带抓图)
6.总结
参考文献
致谢
主要符号表
#include "stdlib.h" ---为exit()函数提供原型;
#include "string.h"---字符串处理函数原型;
#include "ctype.h"---字符处理函数原型;
#define ROWS 256
#define COLS 32---定义“字典”的大小:可存放256个单词,每个单词的长度不超过31
static FILE *fp;---定义文件指针:内部链接,文件作用域;
static char a[ROWS][COLS];---定义数组:内部链接,文件作用域;该数组的作用是将文件的内容复制进来,并加以处理。因为处理数组比处理文件方便。
char get_option(void);---接收用户的选项,防止误操作。若输入“a;”(不包括引号),那么将视为选项a
int b(int count);---完成选项b的作用--接收新单词;
void c(char *pt[], int count);---完成选项c的作用--通过指针对数组排序,实际数组元素位置未改变;
int check(char arr[], int count);---对输入的单词进行分辨,若输入 ni hao ,将视为单词 ni ,并且提示并剔除重复的单词;
void storage(char *pt[], int count);---在程序结束之前重新排序存储数组中的单词到文件中。
1 题目要求
1. 能输入和显示打入的单词
2. 能分辨出单词
3. 对重复的单词和已经输入的单词能自动排除
4. 能按A—Z的顺序排版
5. 能将运行结果以文本形式存储
6. 具有添加新单词并重新排版的能力
7. 数据结构采用指针数组或二维数组。以回车键或者空格键作为单词输入结束标志,对重复的单词自动排除可选第一张提到的查找方法,数据结构可采用指针和数组
2 需求分析
运行结果以文本形式存储,因而要提供文件的输入输出操作;通过查找操作检查重复单词;提供排序操作系统实现按A—Z的顺序排版;提供插入操作添加新单词并重新排版。另外通过键盘式菜单实现功能选择。
3 总体设计
整个系统呗设计为单词录入模块、文件存储模块和单词浏览模块。其中单词录入模块要完成输入单词、检查是否重复、排序操作。文件存储模块把存放单词的数组中的数据写入文件。单词浏览模块完成英文词典的输出,即文件的输出操作。
系统功能模块图:
一种简单的英文词典排版系统
单词浏览
删除单词
添加单词
单词存储
单词排序
单词录入
4 详细设计
1.主函数
【流程图】
显示一系列的功能选项
输入n,判断n是否是1—9
根据n的值调用各功能模块函数
N
Y
【程序】
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#define ROWS 256
#define COLS 32
static FILE *fp;
static char a[ROWS][COLS];
char get_option(void);
int b(int count);
void c(char *pt[], int count);
int check(char arr[], int count);
void storage(char *pt[], int count);
int n; //****n全局变量*****//
char word[N][20];
void menu()//***主界面***//
{
int n,w;//*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*//
do
{
puts("\t\t********************MENU********************\n\n");
puts("\t\t\tWelcome to dj's program!\n\n");
puts("\t\t\t\t 1.Add new word.");
puts("\t\t\t\t 2.Browse all the words.");
puts("\t\t\t\t 3.Search the word.");
puts("\t\t\t\t 4.Sort the words.");
puts("\t\t\t\t 5.Order by A-z.");
puts("\t\t\t\t 6.Exit!");
puts("\n\n\t\t****************************************\n");
printf("Choice your number(1-6): [ ]\b\b");
scanf("%d",&n);
if(n<1||n>6)//*对选择的数字作判断*//
{
w=1;
getchar();
}
else w=0;
}while(w==1);
switch(n)
{
case 1:add();break;//*追加模块*//
case 2:browse();break;//*浏览模块*//
case 3:search();break;//*查找模块*//
case 4:sort();break;//*分类模块*//
case 5:order();break;//*排序模块*//
case 6:exit(0);//*退出*//
}
}
void main() //********主函数*********//
{
menu();
}
2.公共函数
【程序】
int load()//*加载函数*//
{
int i,count;
int start;
char *pt[ROWS];
char ch, len;
char input;
if((fp=fopen("words.txt","a+"))==NULL)//*以输出打开方式,在此前的记录被覆盖*//
{
printf("\nCannot open file!\n");
return NULL;
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%s",&word[i]);
fclose(fp);
return i+1;//*返回记录个数*//
}
void save(int n)//*保存函数,保存n个记录*//
{
FILE *fp;
int i;
if((fp=fopen("words.txt","a+"))==NULL)//*以输出打开方式,在此前的记录被覆盖*//
{
printf("\nCannot open file!\n");
exit(0);
}
for(i=0;i<n;i++)
fprintf(fp,"%s",&word[i]);
fclose(fp);
}
3.各功能模块设计
1)分类模块
【程序】
void sort()
{
int i,j,k;
char c[20];
if((n=load())==0)
{
printf("\nCannot open file!\n");
exit(0);
}
for(i=0;i<n;i++)
for(j=0;j<n-i-1;j++);
if(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.browse all 2.back");
scanf("%d",&k);
if(k==1)
browse();
else if(k==2)
menu();
}
2)排序模块
【流程图】
用选择法排序
保 存
返回主菜单
【程序】
void order() //*排序模块*//
{
int a[N],i,j,t;
struct words;
n=load();
for(i=0;i<N;i++)
for(i=0;i<N-1;i++)
for(j=i+i;j<N;j++)
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
for(j=0;j<N;j++)
printf("%3d",a[i]);
}
3)修改模块
【流程图】
输入要修改的单词
是否找到此单词记录
显示所有记录,让用户看哪个要修改
Y N
显示找到的单词,调用修改函数
提示没有找到
询问用户是
否继续修改
Y
返回主菜单
Y
【程序】
void modify(int a) //*修改模块*//
{
char c[20];
printf("Enter the new word:");
scanf("%s",c);
strcpy(word[a],c);
save(n);
}
4)删除模块
【流程图】
显示所有记录,让用户看哪个需要删除
输入需要删除的单词
是否找到此单词记录
Y N
提示没有找到
显示找到的记录 调 用 删 除 函 数
询问用户是否继续删除
返回主菜单
Y
N
【程序】
void del(int a) //*删除模块*//
{
int x,i,y;
printf("Are you sure to delete this word?\n\t1).sure 2).no and back menu [ ]\b\b");
scanf("%d",&x); //*输入要修改的单词*//
if(x==1)
{
for(i=a;i<n-1;i++) //*查找要修改的单词*//
strcpy(word[i],word[i+1]);
save(n-1);
printf("Successful!^_^.\nNow? 1).one more 2).back menu");
scanf("%d",&y);
if(y==1)
search();
else if(x==2)
menu();
}
else if(x==2)
{
menu();
}
}
5)追加模块
询问用户是否继续追加单词
保存追加的单词
输入用户要追加的的单词
调用加载函数n=load();并计算可以记录个数n
【流程图】
返回主菜单
Y
N
【程序】
void add() //*追加模块*//
{
int i,x,w1,w2,w;
char c[20];
if((n=load())==0)
exit(0);
else
{
puts("Enter the new word!\n");
scanf("%s",c); //*输入要追加的单词*//
for(i=0;i<n;i++)
{
if(strcmp(word[i],c)==0)
break;
}
if(i<n)
{
w=1;
do
{
printf("The word has already exit!\n");
printf("\n\nWhat do you want to do?\n\t1).enter one more 2).back menu [ ]\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!^_^.Now choose what you will do next?\n\t1).add another 2).back menu [ ]\b\b");
do
{
scanf("%d",&x);
if(x<1||x>2)
w2=1;
else
w2=0;
}while(w2==1);
}
switch(x)
{
case 1:add();break;
case 2:menu();break;
}
}
}
6)浏览(全部)模块
返回主菜单
回到分类模块
用户进行选项
显示所有单词记录
【流程图】
【程序】
void browse() //*浏览(全部)模块*//
{
int i,w;
if((n=load())==0) //*加载记录*//
{
printf("\nCannot open file!\n");
exit(0);
}
for(i=0;i<n-1;i++)
printf("%s/n",word[i]);
puts("Successful!^_^.Now 1.back menu 2.sort");
scanf("%d",&w);
if(w==1)
menu();
else if(w==2)
sort();
}
7)查找模块
是否找到该单词记录
输入需要查找的单词
【流程图】
Y N
返回主菜单
让用户选择1).查找另一个2).返回
询问用户是否继续查找
提示没有找到
显示找到的记录
Y N
【程序】
void search() //*查找模块*//
{
int i,x,y;
char vs[20];
if((n=load())==0) //*加载记录*//
{
printf("\nCannot open file!\n");
exit(0);
}
printf("Enter the word what you want to search!");
scanf("%s",vs); //*输入要查找的单词*//
for(i=0;i<n;i++) //*查找要修改的单词*//
if(strcmp(word[i],vs)==0)
{
printf("Successful!^_^.\nThe word is:%s\n",word[i]);//*找到需要修改的单词*//
printf("What would you like to do with the word?\n\t1).modify 2).delrte 3).nothing []\b\b");
scanf("%d",&y);
if(y==1)
modify(i);
else
{del(i);}
}
if(i==n)
printf("HOHO!Sorry........Not found~~~");
printf("Now.....1).one more 2).back 3).exit");
scanf("%d",&x);
switch(x)
{ case 1:search();break;
case 2:menu();break;
case 3:exit(0);
}
}
5 运行结果(附带抓图)
主菜单
输入新单词
退出
6总结
通过这次的C语言程序设计实习,我收获了很多。以前的学习是为了应付考试,而此次的实习是将所学的知识运用到实际当中。
该次实习中,我独立完成了这道题。这道题看似繁琐,但思路清晰,就很简单了,指导书中有关文件的题目大同小异,一通则百通。只要讲各功能模块融会贯通并加以适当调整即可,但前提是必须对指导书里的立体熟练掌握。
一年的大学生活让我对计算机理论知识有了一定的了解,但实践出真知,只有吧理论与实践相结合,才能更好地为社会服务。同时也让我了解到了自己的不足,我会继续努力,完善自我。对于学校的精心安排和指导老师的用心辅导非常感谢!!!
展开阅读全文