C语言实现小型电子词典

yizhihongxing

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 2023年4月27日
    00
  • linux c程序中获取shell脚本输出的实现方法

    获取shell脚本输出是Linux C编程中的一个常见需求,通常的实现方法是通过调用Linux系统的管道机制来实现。下面是具体的攻略: 步骤1:运行shell脚本并将输出写入到管道中 代码示例: $ echo "hello world" > /tmp/output.txt 上述示例向文件output.txt中写入了一行文本。要将其写…

    C 2023年5月30日
    00
  • win10开机蓝屏终止代码SYSTEM_SERVICE_EXCEPTION怎么办

    以下是针对“win10开机蓝屏终止代码SYSTEM_SERVICE_EXCEPTION”的详细攻略: 概述 “SYSTEM_SERVICE_EXCEPTION”是Windows系统蓝屏错误代码之一,表示系统服务异常。出现这种错误一般是由于系统设备驱动程序出现问题或者是系统文件损坏等原因引起的。启动Windows时出现“SYSTEM_SERVICE_EXCEP…

    C 2023年5月23日
    00
  • SpringBoot定制三种错误页面及错误数据方法示例

    下面是对SpringBoot定制三种错误页面及错误数据方法的详细讲解和示例说明: 1. SpringBoot错误处理 在SpringBoot应用中,我们可以自定义错误页面,以显示更友好的错误提示信息,同时也可以记录异常日志。 SpringBoot提供了一组异常处理相关的注解,包括 @ControllerAdvice 和 @ExceptionHandler 等…

    C 2023年5月22日
    00
  • 基于C语言自制华容道游戏的示例代码

    首先需要说明的是,华容道是一种古老的拼图游戏,通常用于测试思维策略和空间认知能力。现在我将为你提供一份基于C语言自制华容道游戏的示例代码攻略。 1. 游戏介绍 华容道游戏是一款将不同大小的方块放置在一个方格中的游戏,最终目标是将一块木板上的关键方块移动到棋盘的出口处。游戏规则简单,但是有很多不同的问题需要解决,从而使得这个游戏成为一个极好的思维训练工具。 2…

    C 2023年5月24日
    00
  • C++类和对象到底是什么

    C++是一种面向对象的程序设计语言,类和对象是它最为重要的特性之一。 类是对现实事物的抽象,是对具有相同属性和行为的对象的实现。例如,对于一个图书类,每本书都会有书名、作者、出版社、价格等属性,每本书都可以借阅、购买、查阅等行为。在C++中,类的定义以class关键字开始,紧跟着是类的名称和花括号内的成员变量和成员函数。 class Book{ public…

    C 2023年5月23日
    00
  • FGO伊丽莎白巴陶里怎么样 C龙娘详细分析

    FGO伊丽莎白巴陶里怎么样 C龙娘详细分析 伊丽莎白巴陶里 伊丽莎白巴陶里(以下简称伊丽莎白)是一名SR级从者,属性为从者女性/恶魔。她在游戏中具有比较全面的能力,可以作为团队中的输出和支援,同时还拥有较高的生存能力。 技能分析 歌唱自由 (自身):提升自身攻击力(3宝石)和获得星星(5-10颗),持续3回合。该技能可以大幅提升伊丽莎白的输出能力,同时也可以…

    C 2023年5月23日
    00
  • 详解JavaScript中数组的一些特殊用法

    详解JavaScript中数组的一些特殊用法 数组是JavaScript中最重要的数据类型之一,其具有存储一组有序数据的能力。常见的操作包括遍历、添加、删除、排序、查找等。而除此之外,数组还有一些特殊的用法,可以让我们更好地处理数据或进行编程。 数组去重 数组去重是数组操作中的一个常见需求,我们可以使用ES6中的Set来实现简单的去重。 const arr …

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