汉英词典

前言:

我的大一下学期实训项目是好记星移动词典,基本功能是已知中文找英文,已知英文找中文,还要词典词条的增删查改,由于前俩天我就实现了这些功能,于是在之后我又增添了一个登录系统,虽然好像用处不大,但也还是我第一次写这种多文件互动的项目,写的比较用心,下面将附上项目源代码,和文件下载链接(文件是公开在本人的Github上的,有需要的可以随时取用,其中有7个文件,只要全都下载时,项目才能正常运行,且项目是通过main.c启动的)。

运行效果图:

image-20211029005243741

Main.c

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include "function.h"
#include "dictionary.c"  


int main(int argc,char **argv)
{
    printf("\033[;36;5m ******************************************** \033[0m\n");
    printf("\033[;36;5m *               电子词典项目               * \033[0m\n");
    printf("\033[;36;5m ******************************************** \033[0m\n");
    printf("\033[;36;5m *     1. 注册     2. 登录     3. 退出      * \033[0m\n");
    printf("\033[;36;5m ******************************************** \033[0m\n");
    int choice,flag;
    char FILENAME[20]="user.txt";
    read(user,&numofuser,FILENAME);
    printf("请输入:");
    scanf("%d",&choice);
    switch (choice)
    {
    case 1:sign_in(&numofuser,FILENAME,user);
        break;
    case 2:login(&numofuser,user);
        break;
    case 3:printf("\033[;31;5m   即将退出,欢迎您再次使用!  \033[0m\n");
        break;
    default:printf("\033[;31;5m   输入错误,请重新输入!!!  \033[0m\n");
        break;
    }

    return 0;
}

//统计函数
void read(struct userlist user[],int *numofuser,char filename[]){
    FILE *fp;
    fp=fopen(filename,"r");
    if(fp!=NULL){
        while(!feof(fp)){
            fscanf(fp,"%s %s %d",&user[*numofuser].name,&user[*numofuser].pwd,&user[*numofuser].numofmemwd);
            (*numofuser)++;
        }
    }else{
        printf("\033[;31;5m文件读取失败!!! \033[0m\n");
    }
    fclose(fp);
}

//注册函数
void sign_in(int *numofuser,char filename[],struct userlist user[]){
    char keyn[10],keyp1[20],keyp2[20];
    printf("用户名:");
    scanf("%s",&keyn);
    for(int i=0;i<*numofuser;i++){
        if(strcmp(user[i].name,keyn)==0){
            printf("\033[;31;5m    该用户已经注册,请登录!\033[0m\n");
            sign_in(&(*numofuser),filename,user);
            return;
        }
    }
    printf("密  码:");
    int i = 0;
    char c;
    while (1)
    {
        //getch()这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车
        //函数用途:从控制台读取一个字符,但不显示在屏幕上
        c = getch();
        //如果按下Esc键可以退出
        if((c-48) == (-21)){
            printf("\n\033[;31;1m      退出成功!     \033[0m\n");
                return;
        }
        //windows平台下按下回车(ENTER)键会产生两个转义字符 \r\n,因此getch返回13(\r),
        //                而'\n‘的的转义字符无法读取,因此无法通过判断'\n'的方式结束输入,
        //可以通过读取第一个转义字符进行判断结束输入
        if (c == '\r')//按下回车键时结束输入,退出
        {
            keyp1[i] = '\0';
            break;
        }
        if (c == '\b')//遇到退格键时(←Backsapce)
        {
            //当没有输入密码时,即输入的密码为空时,不进行任何操作
            //即输入的密码不为空时,对显示的字符进行退格
            if (i > 0) 
            { 
                i--;
                //对显示的字符进行退格,两个\b之间存在一个空格
                printf("\b \b");
                        
                keyp1[i] = '\0';//修改输入的字符
                continue;
            }
        }
        else//没有遇到回车键时和退格键时,读取输入的密码存储在字符串password中
        {
            printf("*");    //对输入的密码在控制台显示*号
            keyp1[i] = c;//存储输入的字符        
            if (i < 20) i++;
            else break;
        }
    }
    printf("\n");
    if (i > 0) ;
    else  printf("输入的密码为空");
    printf("请确认密码");
    int j = 0;
    char d;
    while (1)
    {
        d = getch();
        if((d-48) == (-21)){
            printf("\n\033[;31;1m      退出成功!     \033[0m\n");
            return;
        }
        if (d == '\r')
        {
            keyp2[j] = '\0';
            break;
        }
        if (d == '\b')
        {
            if (j > 0) 
            { 
                j--;
                printf("\b \b");    
                keyp2[j] = '\0';
                continue;
            }
        }
        else
        {
            printf("*");
            keyp2[j] = d;    
            if (j < 20) j++;
            else break;
        }
    }
     
    printf("\n");
    if (j > 0) ;
    else  printf("输入的密码为空");
    if(strcmp(keyp1,keyp2)!=0){
        printf("\033[;31;5m   两次输入密码不一致,请重新输入! \033[0m\n");
        sign_in(&(*numofuser),filename,user);
    }
    int flag=0;   
    strcpy(user[*numofuser].name,keyn);
    strcpy(user[*numofuser].pwd,keyp1);
    user[*numofuser].numofmemwd=0;
    (*numofuser)++;
    FILE *fp;
    fp=fopen(filename,"w");
    if(fp!=NULL){
        for(int k=0;k<(*numofuser)-1;k++){
            fprintf(fp,"%s %s %d\n",user[k].name,user[k].pwd,user[k].numofmemwd);
        }
        fprintf(fp,"%s %s %d",user[*numofuser-1].name,user[*numofuser-1].pwd,user[*numofuser-1].numofmemwd);
    }else{
        printf("文件打开失败\n");
    }
    fclose(fp);
    printf("\n\033[;31;5m      %s,恭喜您,注册成功\033[0m\n",keyn);
    printf("请重新登录!\n");
    login(&(*numofuser),user);
    flag=1;      
    if(flag==0){
        printf("\033[;31;5m注册失败!!!\033[0m\n");
    }
}

//登录函数
void login(int *numofuser,struct userlist user[]){
    char keyn[10],keyp[20];
    while(1){
        printf("用户名:");
        scanf("%s",keyn);
        printf("密  码:");
        int i = 0,flag=0;
        char c;
        while (1)
        {
            c = getch();
            if((c-48) == (-21)){
                printf("\n\033[;31;1m      退出成功!     \033[0m\n");
                return;
            }
            if (c == '\r')
            {
                keyp[i] = '\0';
                break;
            }
            if (c == '\b')
            {
                if (i > 0) 
                { 
                    i--;
                    printf("\b \b");    
                    keyp[i] = '\0';
                    continue;
                }
            }
            else
            {
                printf("*");
                keyp[i] = c;    
                if (i < 20) i++;
                else break;
            }
        }
        printf("\n");
        if (i > 0) ;
        else  printf("输入的密码为空");
        for(int i=0;i<*numofuser;i++){
            if(strcmp(keyn,user[i].name)==0&&strcmp(keyp,user[i].pwd)==0){
                printf("\n\033[;31;1m      %s,恭喜您,登录成功! \033[0m\n",keyn);
                flag=1;
                fakemain(user[i].name);
                return;
            }
        }
        if(flag==0){
            printf("\033[;31;5m     用户名或密码错误,请重新输入!!! \033[0m\n");
        
        }
    } 
}

dictionary.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "function.h"

//本文件的主函数
void fakemain(char name[])
{
    struct entry ent[10000];
    int numofwords = 0, choose;
    char FILEPATH[30] = "new_dictionary.txt";
    search(FILEPATH, ent, &numofwords);
    UI(&numofwords, ent, FILEPATH, &choose, name);
    return;
}

//查询有多少个词条的功能函数
void search(char filepath[], struct entry ent[], int *numofwords)
{
    FILE *fp;
    fp = fopen(filepath, "a+");
    if (fp != NULL)
    {
        while (!feof(fp))
        {
            fscanf(fp, "%s %s", &ent[*numofwords].english, &ent[*numofwords].chinese);
            (*numofwords)++;
        }
    }
    else
    {
        printf("\033[;31;5m文件读取失败!!! \033[0m\n");
    }
    fclose(fp);
}

//英译汉功能函数
void E2C(int *numofwords, struct entry ent[])
{
    char key[20];
    while (1)
    {
        printf("请输入要查询的词(输入0000退出查询):");
        scanf("%s", key);
        if (strcmp(key, "0000") == 0)
        {
            return;
        }
        int flag = 0;
        for (int i = 0; i < *numofwords; i++)
        {
            if (strcmp(key, ent[i].english) == 0)
            {
                printf("\033[;33;5m\"%s\" 的中文释义为:%s\033[0m\n", ent[i].english, ent[i].chinese);
                flag = 1;
                break;
            }
        }
        if (flag == 0)
        {
            printf("\033[;31;5m查无此词!!!\033[0m\n");
        }
    }
}

//汉译英功能函数
void C2E(int *numofwords, struct entry ent[])
{
    char key[20];
    while (1)
    {
        printf("请输入要查询的词(输入0000退出查询):");
        scanf("%s", key);
        if (strcmp(key, "0000") == 0)
        {
            return;
        }
        int flag = 0;
        for (int i = 0; i < *numofwords; i++)
        {
            if (strstr(ent[i].chinese, key) != NULL)
            {
                printf("\033[;33;5m\"%s\" 对应的英文是:\"%s\"\033[0m\n", ent[i].chinese, ent[i].english);
                flag++;
            }
        }
        if (flag == 0)
        {
            printf("\033[;31;5m查无此词!!!\033[0m\n");
        }
    }
}

//删除词条功能函数
void deleteentry(int *numofwords, struct entry ent[], char filepath[])
{
    char key[20];
    printf("请输入要删去的词(输入0000退出删除):");
    scanf("%s", key);
    if (strcmp(key, "0000") == 0)
    {
        return;
    }
    int flag = 0;
    for (int i = 0; i < *numofwords; i++)
    {
        if (strcmp(key, ent[i].english) == 0)
        {
            for (int j = i; j < (*numofwords) - 1; j++)
            {
                ent[j] = ent[j + 1];
            }
            (*numofwords)--;
            FILE *fp;
            fp = fopen(filepath, "w+");
            if (fp != NULL)
            {
                for (int k = 0; k < (*numofwords) - 1; k++)
                {
                    fprintf(fp, "%s %s\n", ent[k].english, ent[k].chinese);
                }
                fprintf(fp, "%s %s", ent[*numofwords].english, ent[*numofwords].chinese);
                printf("\033[;33;5m词条删除成功!\033[0m\n");
            }
            else
            {
                printf("文件读取失败\n");
            }
            fclose(fp);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
    {
        printf("\033[;31;5m查无此词!!!\033[0m\n");
    }
}

//用户操作界面
void UI(int *numofwords, struct entry ent[], char filepath[], int *choose, char name[])
{
    /*操作界面*/
    printf("\n\033[;33;5m*************************************************\033[0m\n");
    printf("\033[;33;5m*                欢迎使用电子词典               *\033[0m\n");
    printf("\033[;33;5m*************************************************\033[0m\n");
    printf("\033[;33;5m*     1.英译汉      2.汉译英     3.删除词条     *\033[0m\n");
    printf("\033[;33;5m*     4.添加词条    5.修改词条   6.背单词       *\033[0m\n");
    printf("\033[;33;5m*               7. 保 存 并 退 出               *\033[0m\n");
    printf("\033[;33;5m*************************************************\033[0m\n");
    printf("\033[;33;5m当前字典一共用%d个单词\033[0m\n", *numofwords);

    //用户输入选择
    printf("请输入:");
    scanf("%d", &(*choose));
    switch (*choose)
    {
    case 1:
        E2C(&(*numofwords), ent);
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    case 2:
        C2E(&(*numofwords), ent);
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    case 3:
        deleteentry(&(*numofwords), ent, filepath);
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    case 4:
        addentry(&(*numofwords), ent, filepath);
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    case 5:
        modientry(&(*numofwords), ent, filepath);
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    case 6:reciteword(name,user,ent,&numofuser);
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    case 7:printf("\033[;31;5m        保存成功,欢迎再次使用!\033[0m\n");
        break;
    default:
        printf("\033[;31;5m输入错误,请重新输入!!!\033[0m\n");
        UI(&(*numofwords), ent, filepath, &(*choose), name);
        break;
    }
    return;
}

//添加词条功能函数
void addentry(int *numofwords, struct entry ent[], char filepath[])
{
    char keye[20], keyc[20];
    printf("请输入要添加的单词(输入0000退出添加):");
    scanf("%s", &keye);
    if (strcmp(keye, "0000") == 0)
    {
        return;
    }
    for (int i = 0; i < *numofwords; i++)
    {
        if (strcmp(ent[i].english, keye) == 0)
        {
            printf("该词已在单词库中!\n");
            return;
        }
    }
    printf("请输入中文释义:");
    scanf("%s", &keyc);
    int flag = 0, tmp;
    for (int i = 0; i < *numofwords; i++)
    {
        if (strcmp(keye, ent[i].english) > 0)
        {
            tmp = i;
        }
        else
        {
            break;
        }
    }
    for (int j = *numofwords - 1; j > tmp; j--)
    {
        ent[j + 1] = ent[j];
    }
    strcpy(ent[tmp + 1].english,keye);
    strcpy(ent[tmp + 1].chinese,keyc);
    (*numofwords)++;
    FILE *fp;
    fp = fopen(filepath, "w");
    if (fp != NULL)
    {
        for (int k = 0; k < (*numofwords) - 1; k++)
        {
            fprintf(fp, "%s %s\n", ent[k].english, ent[k].chinese);
        }
        fprintf(fp, "%s %s", ent[*numofwords - 1].english, ent[*numofwords - 1].chinese);
    }
    else
    {
        printf("文件打开失败\n");
    }
    fclose(fp);
    printf("\033[;33;5m添加成功!!!\033[0m\n");
    flag = 1;
    if (flag == 0)
    {
        printf("添加失败!!!\n");
    }
}

//修改词条功能函数
void modientry(int *numofwords, struct entry ent[], char filepath[])
{
    char key[20], keye[20], keyc[20];
    FILE *fp;
    int flag = 0, tmp;
    do
    {
        printf("请输入要修改的单词(退出修改请输入0000):");
        scanf("%s", key);
        if (strcmp(key, "0000") == 0)
        {
            return;
        }
        for (int i = 0; i < *numofwords; i++)
        {
            if (strcmp(key, ent[i].english) == 0)
            {
                flag = 1;
                for (int j = i; j < (*numofwords) - 1; j++)
                {
                    ent[j] = ent[j + 1];
                }
                (*numofwords)--;
                FILE *fp;
                fp = fopen(filepath, "w");
                if (fp != NULL)
                {
                    for (int k = 0; k < (*numofwords) - 1; k++)
                    {
                        fprintf(fp, "%s %s\n", ent[k].english, ent[k].chinese);
                    }
                    fprintf(fp, "%s %s", ent[*numofwords].english, ent[*numofwords].chinese);
                    break;
                }
            }
        }
        if (flag == 0)
        {
            printf("\033[;31;5m查无此词!!!\033[0m\n");
        }
    } while (!flag);
    printf("请输入修改后的英文和中文(其间请用空格或换行隔开):\n");
    scanf("%s", keye);
    scanf("%s", keyc);
    for (int i = 0; i < *numofwords; i++)
    {
        if (strcmp(ent[i].english, keye) == 0)
        {
            printf("\033[;31;5m该词已在单词库中!\033[0m\n");
            return;
        }
    }
    for (int i = 0; i < *numofwords; i++)
    {
        if (strcmp(keye, ent[i].english) > 0)
        {
            tmp = i;
        }
        else
        {
            break;
        }
    }
    for (int j = *numofwords - 1; j > tmp; j--)
    {
        ent[j + 1] = ent[j];
    }
    strcpy(ent[tmp + 1].english, keye);
    strcpy(ent[tmp + 1].chinese, keyc);
    (*numofwords)++;
    fp = fopen(filepath, "w");
    if (fp != NULL)
    {
        for (int k = 0; k < (*numofwords) - 1; k++)
        {
            fprintf(fp, "%s %s\n", ent[k].english, ent[k].chinese);
        }
        fprintf(fp, "%s %s", ent[*numofwords - 1].english, ent[*numofwords - 1].chinese);
        printf("\033[;33;5m修改完成!\033[0m\n");
    }
    else
    {
        printf("文件打开失败\n");
        return;
    }
    fclose(fp);
}

//背单词功能函数
void reciteword(char name[],struct userlist user[],struct entry ent[],int *numofuser)
{
    int n, choice, station, m;
    FILE *fp;
    for (int i = 0; i < *numofuser; i++)
    {
        if (strcmp(user[i].name, name) == 0)
        {
            station = user[i].numofmemwd;
            m = i;
            printf("\033[;35;5m     您已经背了%d个单词了,继续加油哦~('.')~\033[0m\n", user[i].numofmemwd);
        }
    }
    printf("\n\033[;34;5m*************************************\033[0m\n");
    printf("\033[;34;5m*      1.背新单词    2.复习单词     *\033[0m\n");
    printf("\033[;34;5m*************************************\033[0m\n");
    printf("请输入:");
    scanf("%d", &choice);
    switch (choice)
    {
        case 1:
        {
            printf("请输入这次要背的单词数:");
            scanf("%d", &n);
            for (int i = 0; i < n; i++)
            {
                printf("\033[;33;5m   %s %s\033[0m\n", ent[station + i].english, ent[station + i].chinese);
            }
            printf("\033[;33;5m你是最棒的!~('o')~\033[0m\n");
            user[m].numofmemwd += n;
            fp = fopen("user.txt", "w");
            if (fp != NULL)
            {
                for (int k = 0; k < (*numofuser)-1; k++)
                {
                    fprintf(fp, "%s %s %d\n", user[k].name, user[k].pwd, user[k].numofmemwd);
                }
                fprintf(fp, "%s %s %d", user[*numofuser - 1].name, user[*numofuser - 1].pwd, user[*numofuser - 1].numofmemwd);
            }
                else
            {
                printf("\033[;31;5m文件读取失败!!! \033[0m\n");
            }   
            fclose(fp);
        }
            break;
        case 2:
        {
            printf("请输入这次要复习的单词数:");
            scanf("%d", &n);
            for (int i = 0; i < n; i++)
            {
                printf("\033[;33;5m   %s %s\033[0m\n", ent[station - i - 1].english, ent[station - i - 1].chinese);
            }
            printf("\033[;33;5m你是最棒的!~('o')~\033[0m\n");
        }
            break;
        default:printf("\033[;31;5m输入错误,请重新输入!!!\033[0m\n");
            reciteword(name,user,ent,&(*numofuser));
            break;
    }

}

function.h

#include<stdio.h> 
#ifndef function_h

#define function_h

#define MAXC 20
#define MAXE 20
#define total 10000

struct entry
{
    char english[MAXE+1]; //key 
    char chinese[MAXC+1];
    struct entry *next;
};
struct userlist
{
    char name[10];
    char pwd[20];
    int numofmemwd;
};

struct userlist user[1000];
int numofuser=0;

/*函数声明*/
void search(char filepath[],struct entry ent[],int *numofwords);
void E2C(int *numofwords,struct entry ent[]);
void C2E(int *numofwords,struct entry ent[]);
void deleteentry(int *numofwords,struct entry ent[],char filepath[]);
void UI(int *numofwords,struct entry ent[],char filepath[],int *choose,char name[]);
void addentry(int *numofwords,struct entry ent[],char filepath[]);
void modientry(int *numofwords,struct entry ent[],char filepath[]);
void fakemain(char name[]);
void read(struct userlist user[],int *numofuser,char filename[]);
void sign_in(int *numofuser,char filename[],struct userlist user[]);
void login(int *numofuser,struct userlist user[]);
void reciteword(char name[],struct userlist user[],struct entry ent[],int *numofuser);

#endif
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 舒窈
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信