课程目的:为学生提供了一个既动手又动脑,独立实践的机会,使学生能够将课本上的理论知识和应用实际有机地结合起来,锻炼学生分析、解决较复杂问题的能力,提高学生独立编写较大程序的能力。在完成具有一定难度的综合性程序设计题目过程中,要求学生利用学到的编程知识和编程技巧,独立完成编程及程序调试,最后按格式和要求写出课程设计报告,培养学生科技论文写作技能,如文献查找和引用,论文格式规范等。
设计内容
系统实现单词的录入、删除、浏览、排序功能。
功能要求:
(1)录入:录入单词
(2)添加:添加单词到词典,要求词典的单词重复
(3)删除:
(4)查找浏览:根据单词查找单词,浏览整本词典
(5)排序:按A~Z的顺序进行排版
1.需求分析
建立一个简单英文词典排版系统,对单词信息状态进行管理。
能添加单词到文件内并保存,通过询问是否需要添加多个单词来满足系统多元性。
能查找单词并输出单词,并能针对错误数据退出程序,同时可以继续查找和分析,若查找成功则能继续修改或删除单词,连接各个函数。
能对单词信息进行更新,并对其保存数据。
能浏览所有单词,同时可以按照要求按顺序输出,并能统计单词的总个数,在退出程序前保存数据。
在遇到错误数据或错误指令时,或在打不开文件以及文件为空时,能及时退出程序,在各个函数中都添加了退出程序的指令,以防错误指令错误数据带来的系统崩溃。
2.概要设计
先确定文件内单词个数,然后再进入菜单,通过划分将系统分为添加单词,查找单词,浏览单词,删除单词,排序单词,统计单词总个数几类,在进入一个函数的同时,与其他函数相关联,运用模块化处理,完善系统的整体结构,让使用者获得更好的体验感。
2.1主界面设计
2.2存储结构设计
此系统采用的是二维数组存储结构,利用二维数组可以充分将每个单词信息存进文件中,方便使用者理解的同时还简洁高效,二维数组还可以根据需求增加自身的单词查找量。
2.3系统功能设计
主函数(main)中运用(load)函数来统计文件内单词个数,并赋值给n,下一步进入菜单(menu)函数。
在菜单(menu)函数中输出一系列选择,其中有添加函数(add)、搜索函数(search)、浏览函数(browse)、修改函数(modify)、删除函数(del)、排序函数(order)、统计单词个数(num),并在用户选择后进入相对应的函数。
在添加函数(add)中,先输入一个单词读取文件单词信息,在与文件内单词比较后分析是否为同一个单词,若是则退出程序,若否则向文件内输入一个新单词并询问是否需要多添加一个新单词,若是则重新进入添加函数(add),若否则返回菜单(menu),若遇到错误数据则退出程序。
在搜索函数(search)中,先输入一个用户想查找的单词,在和文件内的每个单词逐个比较,分析是否为相同的单词,若找到相同的单词,则用户可以选择进入修改函数(modify)或者进入删除函数(del),若没找到相同的单词,则询问用户是否要查找另一个单词,若是则重新进入搜索函数(search),若否则返回菜单(menu),若遇到错误数据则退出程序。
在浏览函数(browse)中,先打开一个文件读取数据,然后将文件中所有单词信息输出,然后询问用户要进行什么操作,用户可以选择排序函数(order)或者返回菜单(menu),若选择排序函数(order),则进入此函数,否则返回菜单(menu),若遇到错误数据则退出程序。
在修改函数(modify)中,输入需要替换的单词则双方交换,并询问用户还需要进行什么操作,用户可以重新进入修改函数(modify)修改另一个、浏览所有单词(browse)或者返回菜单(menu),然后读取用户需要的操作,并进入其函数,若遇到错误数据则退出程序。
在删除函数(del)中,输入需要删除的单词进行删除,并询问用户接下来的操作,用户可以选择再删除一个(del)、返回菜单(menu)或者浏览所有单词(browse),然后读取用户需要的操作,并进入其函数,若遇到错误数据则退出程序。
在排序函数(order)中,将每每两个数组之间进行比较,然后进行排序输出,并询问用户接下来的操作,用户可以选择浏览单词(browse)或者返回菜单(menu),然后读取用户需要的操作,并进入其函数,若遇到错误数据则退出程序。
在统计单词个数的函数(num)中,打开文件遍历文件,将单词用函数(save)提取出来n,并输出n,若遇到错误数据则退出程序。
代码如下:
//简单英文词典排版系统
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1000
static FILE *p;
int load();//单词个数
void add();//添加单词
void del(int a);//删除单词
void browse();//浏览单词
void search();//搜索单词
void order();//排序单词
void menu();//菜单
void save(int n);//保存单词数据
void modify(int a);//修改单词
int num();//统计单词总个数
int n=0;
char words[N][20];//二维数组存储单词
int main()
{
n=load();//此句统计单词总个数
menu();//进入菜单
}
int load()
{
int i;
p=fopen("/Users/jim/Desktop/程序/简单英文词典排版系统(课设)/作业/words.txt", "r");//打开文件
if (p==NULL) {
printf("不能打开文件!\n");
exit(0);
}//判断文件是否存在
for (i=0; !feof(p); i++){
fscanf(p, "%s",words[i]);//输出单词
}
fclose(p);
return i;//返回单词的个数
}
void menu()
{
int i = 1,j = 0;
while (i==1)
{
printf("\t\t\t\t***********************************************\n");
printf("\t\t\t\t*************欢迎使用简单英文词典排版系统***********\n");
printf("\t\t\t\t*********************菜单**********************\n");
printf("\t\t\t\t***********************************************\n");
printf("\t\t\t\t***** 请选择你需要的操作: ****\n");
printf("\t\t\t\t***** 1.添加一个单词 ****\n");
printf("\t\t\t\t***** 2.查找单词 ****\n");
printf("\t\t\t\t***** 3.浏览所有单词 ****\n");
printf("\t\t\t\t***** 4.修改或删除单词 ****\n");
printf("\t\t\t\t***** 5.排序所有单词 ****\n");
printf("\t\t\t\t***** 6.统计单词总个数 ****\n");
printf("\t\t\t\t***** 7.退出系统 ****\n");
printf("\t\t\t\t***********************************************\n");
printf("请做出你的选择:");
scanf("%d",&j);
if (j<1||j>7) {
i=1;
}
else
i=0;
}
switch (j) {
case 1: add();break;//添加单词
case 2: search();break;//搜索单词
case 3: browse();break;//浏览单词
case 4: search();break;//修改删除单词(需先查找)
case 5: order();break;//排序单词
case 6: num();break;//统计单词个数
case 7: exit(0);//退出程序
}
}
void save(int n){
int i;
p=fopen("/Users/jim/Desktop/words.txt", "a");//打开文件
if (p==NULL) {
printf("不能打开文件!\n");
exit(0);
}//判断文件是否存在
for(i=0;i<n;i++)
{
if(i<n-1)
fprintf(p,"%s ",words[i]);
else
fprintf(p,"%s",words[i]);
}//保存单词数据
fclose(p);//关闭文件
}
void modify(int a)
{
int i;
char c[20];
printf("请输入你要替换的单词:\n");
scanf("%s",c);
stpcpy(words[a], c);//二者替换
p=fopen("/Users/jim/Desktop/程序/简单英文词典排版系统(课设)/作业/words.txt", "wt");//打开文件
save(n);
printf("修改成功!");
printf("你还需要干什么?\n");
printf("1.再修改一个 2.返回菜单 3.浏览 4.退出程序\n");
printf("请做出你的选择:");
scanf("%d",&i);
if (i<1||i>4) {
exit(0);//退出系统
}
else if (i==1)
search();//修改多一个
else if (i==2)
menu();//返回菜单
else
browse();//浏览单词
}
void del(int a)
{
int x,y,i;
printf("你确认要删除此单词吗?\n");
printf("确认请按1,否认请按2并返回菜单\n");
printf("请做出你的选择:");
scanf("%d",&x);
if (x==1) {
for (i=a; i<n-1; i++)
stpcpy(words[i], words[i+1]);//删除单词
n-=1;
p=fopen("/Users/jim/Desktop/程序/简单英文词典排版系统(课设)/作业/words.txt", "wt");//打开文件
save(n);
printf("已经成功删除,请问现在需要怎样?\n");
printf("1.再删除一个,2.返回菜单 3.浏览所有单词");
scanf("%d",&y);
if (y==1)
search();//再删除一个
else if (y==2)
menu();//返回菜单
else
browse();//浏览单词
}else if (x==2)
menu();//返回菜单
}
void search()
{
int i,x,y;
char m[20];
printf("请输入你想查找的单词:\n");
scanf("%s",m);//输入单词
for (i=0; i<n; i++) {
if (strcmp(m, words[i])==0)//比较两个单词是否一样
{
printf("查找成功,此单词为:%s",words[i]);//输出结果
printf("\n你还想对这个单词做什么?\n");
printf("1.修改 2.删除");
printf("\n请做出你的选择:");
scanf("%d",&x);
if (x<1||x>2) {
exit(0);//退出系统
}
else if (x==1){
modify(i);//进入修改单词
}
else del(i);//进入删除函数
}
}
if (i>=n)//若单词超出n的范围
{
printf("对不起!此单词找不到!\n");
printf("请选择你现在要选择的操作:\n");
printf("1.查找另一个 2.返回菜单 3.退出程序\n");
printf("请做出你的选择:");
scanf("%d",&y);
if (y<1||y>2) {
exit(0);
}
switch (y)
{
case 1:search();break;//重新搜索一个
case 2:menu();break;//返回菜单
}
}
}
void browse()
{
int i,j;
p=fopen("/Users/jim/Desktop/程序/简单英文词典排版系统(课设)/作业/words.txt", "r");//打开文件
if (p==NULL) {
printf("不能打开文件!\n");
exit(0);
}//判断文件是否存在
printf("以下是所有单词\n");
for (i=0; i<n-1; i++)//输出所有单词
{
printf("%s",words[i]);
printf("\n");
}
printf("%s",words[i]);
fclose(p);//关闭文件
printf("\n请问现在要怎样操作?\n");
printf("1.排序 2.返回菜单 3.退出程序\n");
printf("请做出你的选择:");
scanf("%d",&j);
if (j<1||j>2)
{
exit(0);
}
switch (j)
{
case 1:order();break;//进入排序函数
case 2:menu();break;//返回菜单
}
}
void order()
{
int i,j,k;
char c[20];
for (i=0; i<n; i++) {
for (j=0; j<n-1; j++) {//比较两个单词并排序
if (strcmp(words[i], words[j])<0) {
strcpy(c,words[j]);
strcpy(words[j],words[i]);
strcpy(words[i],c);
}
}
}
p=fopen("/Users/jim/Desktop/程序/简单英文词典排版系统(课设)/作业/words.txt", "wt");//覆盖当前文件
save(n);
printf("排序成功!");
printf("现在想进行什么操作?\n");
printf("1.浏览 2.返回菜单");
printf("\n请做出你的选择:");
scanf("%d",&k);
if (k==1)
{
browse();//浏览
}
else if(k==2){
menu();//返回菜单
}
else
exit(0);//退出程序
}
void add()
{
int i,x,u,v,w;
char c[20];
{
puts("请输入一个新单词:");
scanf("%s",c);//输入一个新单词
for(i=0;i<n;i++)
{
if(strcmp(words[i],c)==0)//比较文件内是否有相同单词
break;
}
if(i<n)
{
w=1;
do
{
printf("单词已经存在!\n");
printf("你现在想要干什么?1.添加多一个 2.返回菜单");
printf("\n请做出你的选择:");
scanf("%d",&x);
if(x<1||x>2)
u=1;
else
u=0;
}while(u==1);
if(x==1)
add();//重新添加一个单词
else
menu();//返回菜单
}
else
{
v=1;
strcpy(words[i],c);
n+=1;
p=fopen("/Users/jim/Desktop/words.txt", "wt");//覆盖文件
save(n);
printf("输入成功!现在要干什么?\n1.添加多一个 2.返回菜单");
printf("\n请做出你的选择:");
do
{
scanf("%d",&x);
if(x<1||x>2)
v=1;
else
v=0;
}
while(v==1);
}
switch(x)
{
case 1:add();break;//再添加多一个单词
case 2:menu();break;//返回菜单
}
}
}
int num()
{
int x;
p=fopen("/Users/jim/Desktop/程序/简单英文词典排版系统(课设)/作业/words.txt", "wt");//覆盖当前文件
save(n);//统计单词个数
printf("单词总个数为%d\n",n);//输出
fclose(p);//关闭文件
printf("输出成功!现在需要返回菜单吗?\n");
printf("需要请按1");
printf("\n请做出你的选择:");
scanf("%d",&x);
if(x==1)
menu();//返回菜单
else
exit(0);//退出系统
return n-1;
}
测试分析:
第一模块
第二模块:搜索修改浏览search()modify()和browse()
第三模块
删除del()
第四模块 排序order()
第五模块 统计单词个数