C语言实现小型电子词典

C语言实现小型电子词典攻略

项目概述

这是一个使用C语言实现的小型电子词典,它可以通过命令行窗口输入单词并查询其对应的中文翻译。本词典基于哈希表实现。哈希表是一种数据结构,可以快速地进行查询和插入操作,因此非常适合用于实现词典这样的查询应用。

实现步骤

1. 读取词典文件

首先需要从词典文件中读取单词和对应的中文翻译,这里推荐使用标准数据格式JSON来存储词典数据。JSON格式非常方便读取、修改和传输,并且有很多现成的解析库可以使用。

下面是一个简单的示例,展示如何读取一个JSON格式的词典文件:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h" // 引入cJSON库

int main() {
  FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
  char buffer[1024];
  fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
  fclose(fp); // 关闭文件

  cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
  if (json == NULL) {
    printf("解析JSON出错\n");
    exit(1);
  }

  cJSON *word = cJSON_GetObjectItem(json, "hello"); // 获取单词hello的JSON对象
  if (word == NULL) {
    printf("找不到单词hello\n");
    exit(1);
  }

  cJSON *translation = cJSON_GetObjectItem(word, "translation"); // 获取hello的翻译
  if (translation == NULL) {
    printf("找不到单词hello的翻译\n");
    exit(1);
  }

  printf("hello的翻译是%s\n", translation->valuestring);

  cJSON_Delete(json); // 释放内存
  return 0;
}

2. 初始化哈希表

接下来需要初始化哈希表,将词典中的所有单词按照哈希函数的规则插入到哈希表中。这里使用了一种非常简单的哈希函数,即将单词的ASCII码值相加。

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

#define TABLE_SIZE 1000

// 哈希表节点结构体
typedef struct hash_node {
  char *key;
  char *value;
  struct hash_node *next;
} HashNode;

// 哈希表结构体
typedef struct hash_table {
  HashNode *nodes[TABLE_SIZE];
} HashTable;

// 哈希函数
unsigned long hash(char *str) {
  unsigned long hash = 5381;
  int c;
  while ((c = *str++) != '\0') {
    hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
  }
  return hash;
}

// 初始化哈希表
void initHashTable(HashTable *ht) {
  for (int i = 0; i < TABLE_SIZE; i++) {
    ht->nodes[i] = NULL;
  }
}

// 插入哈希表节点
void insertNode(HashTable *ht, char *key, char *value) {
  unsigned long index = hash(key) % TABLE_SIZE; // 计算哈希值
  HashNode *node = (HashNode *)malloc(sizeof(HashNode)); // 创建新节点
  node->key = key;
  node->value = value;
  node->next = ht->nodes[index]; // 将节点插入链表的头部
  ht->nodes[index] = node;
}

// 查找哈希表节点
char *findNode(HashTable *ht, char *key) {
  unsigned long index = hash(key) % TABLE_SIZE; // 计算哈希值
  HashNode *node = ht->nodes[index]; // 获取链表
  while (node != NULL) {
    if (strcmp(node->key, key) == 0) { // 找到节点
      return node->value;
    }
    node = node->next;
  }
  return NULL;
}

// 释放哈希表内存
void freeHashTable(HashTable *ht) {
  for (int i = 0; i < TABLE_SIZE; i++) {
    HashNode *node = ht->nodes[i];
    while (node != NULL) {
      HashNode *next = node->next;
      free(node->key);
      free(node->value);
      free(node);
      node = next;
    }
  }
}

int main() {
  HashTable ht;
  initHashTable(&ht);
  insertNode(&ht, "hello", "你好");
  insertNode(&ht, "world", "世界");
  char *value = findNode(&ht, "hello");
  if (value != NULL) {
    printf("hello的翻译是%s\n", value);
  }
  freeHashTable(&ht);
  return 0;
}

3. 命令行交互

最后需要在命令行中与用户进行交互,读取用户输入的单词并查询其翻译。这里使用了一个简单的循环来读取用户的输入并输出翻译结果。

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

#define TABLE_SIZE 1000

// 省略哈希表结构体和函数,与上面一样

int main() {
  HashTable ht;
  initHashTable(&ht);

  FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
  char buffer[1024];
  fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
  fclose(fp); // 关闭文件

  cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
  if (json == NULL) {
    printf("解析JSON出错\n");
    exit(1);
  }

  cJSON *word = json->child;
  while (word != NULL) { // 将词典中的单词插入哈希表
    char *key = word->string;
    cJSON *translation = cJSON_GetObjectItem(word, "translation");
    char *value = translation->valuestring;
    insertNode(&ht, key, value);
    word = word->next;
  }

  cJSON_Delete(json); // 释放内存

  while (1) { // 循环获取用户输入并输出翻译结果
    printf("请输入要查询的单词(按q退出):");
    char input[100];
    fgets(input, 100, stdin);
    input[strlen(input) - 1] = '\0'; // 去掉换行符
    if (strcmp(input, "q") == 0) { // 退出程序
      break;
    }
    char *value = findNode(&ht, input);
    if (value != NULL) {
      printf("%s的翻译是%s\n", input, value);
    } else {
      printf("找不到%s\n", input);
    }
  }

  freeHashTable(&ht);
  return 0;
}

示例说明

示例1:读取JSON数据

假设词典文件dictionary.json的内容如下:

{
  "hello": {
    "translation": "你好"
  },
  "world": {
    "translation": "世界"
  }
}

则可以使用以下代码读取JSON数据并输出hello单词的翻译:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main() {
  FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
  char buffer[1024];
  fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
  fclose(fp); // 关闭文件

  cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
  if (json == NULL) {
    printf("解析JSON出错\n");
    exit(1);
  }

  cJSON *word = cJSON_GetObjectItem(json, "hello"); // 获取单词hello的JSON对象
  if (word == NULL) {
    printf("找不到单词hello\n");
    exit(1);
  }

  cJSON *translation = cJSON_GetObjectItem(word, "translation"); // 获取hello的翻译
  if (translation == NULL) {
    printf("找不到单词hello的翻译\n");
    exit(1);
  }

  printf("hello的翻译是%s\n", translation->valuestring);

  cJSON_Delete(json); // 释放内存
  return 0;
}

示例2:命令行交互

假设词典文件dictionary.json的内容与上面一样,则可以使用以下代码实现命令行交互查询:

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

#define TABLE_SIZE 1000

// 省略哈希表结构体和函数,与上面一样

int main() {
  HashTable ht;
  initHashTable(&ht);

  FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
  char buffer[1024];
  fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
  fclose(fp); // 关闭文件

  cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
  if (json == NULL) {
    printf("解析JSON出错\n");
    exit(1);
  }

  cJSON *word = json->child;
  while (word != NULL) { // 将词典中的单词插入哈希表
    char *key = word->string;
    cJSON *translation = cJSON_GetObjectItem(word, "translation");
    char *value = translation->valuestring;
    insertNode(&ht, key, value);
    word = word->next;
  }

  cJSON_Delete(json); // 释放内存

  while (1) { // 循环获取用户输入并输出翻译结果
    printf("请输入要查询的单词(按q退出):");
    char input[100];
    fgets(input, 100, stdin);
    input[strlen(input) - 1] = '\0'; // 去掉换行符
    if (strcmp(input, "q") == 0) { // 退出程序
      break;
    }
    char *value = findNode(&ht, input);
    if (value != NULL) {
      printf("%s的翻译是%s\n", input, value);
    } else {
      printf("找不到%s\n", input);
    }
  }

  freeHashTable(&ht);
  return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现小型电子词典 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 详解C++编程中类的声明和对象成员的引用

    我来详细讲解一下“详解C++编程中类的声明和对象成员的引用”的完整攻略。 什么是C++中的类 类是C++中面向对象编程的基本概念,它是一种描述对象属性和行为的数据类型。一个类封装了数据和方法(函数)来描述所引用对象的特性。 声明类 在C++中声明一个类,需要使用 class 关键字,接着在大括号中定义类的数据成员和成员函数,如下所示: class Human…

    C 2023年5月22日
    00
  • C++如何获取系统信息 C++获取IP地址、硬件信息等

    获取系统信息是很常见的需求,C++ 作为一门底层语言,自然是可以做到的。获取系统信息可以说需要获取的信息非常多,从最基础的 IP 地址、MAC 地址、操作系统版本等等,到更深层次的 CPU 类型、内存大小、文件系统结构等等。在这里,我们将分别来介绍如何获取 IP 地址和如何获取硬件信息。 获取 IP 地址 要获取 IP 地址,我们需要用到 Winsock2 …

    C 2023年5月23日
    00
  • c/c++获取系统时间函数的方法示例

    获取系统时间是编程中常用的功能之一,c/c++提供了多种方法来获取系统时间。下面将介绍获取系统时间的常用方法。 获取系统时间的常用函数 1. time() time()函数返回从1970年1月1日0时0分0秒到当前时间的秒数。time函数的详细定义如下: #include <time.h> time_t time(time_t *timer); …

    C 2023年5月30日
    00
  • 一起来了解c语言的str函数

    一起来了解C语言的str函数 str函数简介 在C语言中,字符串是以字符数组的形式存在的,而str函数就是C语言中对字符串的处理函数之一。str函数常用于字符串的复制,连接,比较和查找等操作。 str函数的常用类型 str函数有多个类型,其中最常用的函数类型如下: strcpy: 字符串拷贝函数,用于将源字符串复制到目标字符串中。 strcat: 字符串连接…

    C 2023年5月23日
    00
  • 暗影精灵3 Pro值得买吗?惠普暗影精灵III Pro 144Hz电竞屏笔记本全面评测

    暗影精灵3 Pro值得买吗?——惠普暗影精灵III Pro 144Hz电竞屏笔记本全面评测 引言 暗影精灵系列一直以高性能和高配置吸引着广大游戏玩家的关注,而其中的暗影精灵3 Pro更是备受瞩目。本文将对这款笔记本进行全面评测,分析其性能、散热、外观等方面,帮助大家了解暗影精灵3 Pro是否值得购买。 外观设计 暗影精灵3 Pro采用了HP独有的暗影系金属材…

    C 2023年5月22日
    00
  • R语言基础统计方法图文实例讲解

    R语言基础统计方法图文实例讲解 本文将为读者讲解使用R语言进行基础的统计分析方法,具体包括了数据的读取、数据展示及探索性数据分析(EDA)、t检验、方差分析及线性回归分析。 1. 数据的读取 在R语言中,我们可以使用以下代码读取csv或Excel文件: # 读取csv文件 data <- read.csv("data.csv", h…

    C 2023年5月22日
    00
  • win10打开c/d/e/f盘符很慢提示现正在处理它该怎么解决?

    Win10打开磁盘慢的解决方法 出现此问题后,是因为Win10系统正在检测并优化磁盘的性能,过程需要一定的时间。但在某些情况下,这个过程会超时,导致磁盘打开慢,以下是两种解决方法。 方法一:禁用磁盘预读取功能 Win10系统默认启用了磁盘预读取功能,这个功能会将一些磁盘里的数据预读取到内存,以加快下一次打开磁盘时的速度。但是,如果磁盘内存数据过大,预读取功能…

    C 2023年5月23日
    00
  • C语言自定义类型详解(结构体、枚举、联合体和位段)

    C语言自定义类型详解 C语言中自定义类型是构建代码结构的关键组成部分。一个程序中定义的自定义类型,可以用来描述程序中的状态和数据,使程序更加清晰和易于维护。C语言中的自定义类型有结构体、枚举、联合体和位段等。本文将为大家详细讲解C语言中这四种自定义类型的使用和应用场景。 结构体 定义结构体 结构体是用于存储多个不同数据类型的变量的自定义类型。例如,一个保存学…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部