C语言:简单英文词典排版系统课程设计

课程目的为学生提供了一个既动手又动脑,独立实践的机会,使学生能够将课本上的理论知识和应用实际有机地结合起来,锻炼学生分析、解决较复杂问题的能力,提高学生独立编写较大程序的能力。在完成具有一定难度的综合性程序设计题目过程中,要求学生利用学到的编程知识和编程技巧,独立完成编程及程序调试,最后按格式和要求写出课程设计报告,培养学生科技论文写作技能,如文献查找和引用,论文格式规范等。

设计内容

系统实现单词的录入、删除、浏览、排序功能

功能要求:

(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()

第五模块 统计单词个数

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值