Вводя слово (англ или рус), найти перевод или выдать сообщение "нет в словаре" - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Изначальная задача была такова, сформировать запись "английское слово-перевод". Вводя слово (англ или рус), найти перевод или выдать сообщение "нет в словаре". И она более менее работала. Вот код.
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
struct word
{
    //слово
    char current_word[20];
    // перевод
    char translation[20];
};
 
void main()
{
    setlocale(LC_ALL, "Russian");
    struct word words[100];
    char search_world[20];
    int n = 0;
    printf("Введите количество слов:");
    scanf_s("%d", &n);
 
    // составляем словарь
    for (int i = 0; i < n; i++)
    {
        printf("Введите слово:\n");
        gets_s(words[i].current_word);
        printf("Введите перевод:\n");
        gets_s(words[i].translation);
    }
    // Выводим словарь
    for (int i = 0; i < n; i++)
    {
        printf("\nСлово: %s", words[i].current_word);
        printf("\nПеревод: %s", words[i].translation);
    }
    printf("\n");
    printf("Введите слово для поиска перевода: ", &search_world);
    gets_s(search_world);
 
    int k = 0;
    for (int i = 0; i < n; i++)
    {
        if (strcmp(words[i].current_word, search_world) == 0)
        {
            printf("%s", words[i].translation);
            break;
        }
        k++;
        if (k == n - 1) {
            printf("Перевод ");
        }
    }
 
    _getch();
}
Но далее нужно было дополнить ее заполнением и обработкой файлов. Имя файла вводить с клавиатуры в процессе работы программы. И тут то и начались проблемы. Вот код
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <cstring>

struct sl
{
    //слово
    char word[20];
    // перевод
    char perevod[20];
};
 
void main()
{
    setlocale(LC_ALL, "Russian");
    struct sl w[100];
    char s_w[20];
    char slovar[20][20];
    char t[200];
    char fname[15];
    int n = 0;
    FILE*f1;
    scanf("%s", fname);
    f1 = fopen(fname, "r");
    fscanf(f1, "%s", &t);/*
                         printf("Введите количество слов:");
                         scanf("%d", &n);
                         */
    char sm = ' ';
    int i = 0, j = 0, k = 0;
    while (t[i] != '\0')
    {
 
        if (t[i] != ':')
        {
            slovar[j][k] = t[i];
        }
        else
        {
            slovar[j][k] = '\0';
            j++;
 
            k = -1;
 
        }
        i++;
        k++;
 
    }
    n = j;

    printf("Введите слово для поиска перевода: ");
    scanf("%s", &s_w);
    k = 0;
    for (int i = 0; i < n; i++)
    {
        if (i % 2 == 0 && strcmp(slovar[i], s_w) == 0)
        {
            printf("Перевод : %s", slovar[i + 1]);
            break;
        }
 
        if (k == n - 1) {
            printf("Нет слова в словаре");
        }
        k++;
    }
    fclose(f1);
    _getch();
}
Программа запускается, но пустая и при каких либо действиях начинается виснуть. Не пойму как заставить ее работать

Решение задачи: «Вводя слово (англ или рус), найти перевод или выдать сообщение "нет в словаре"»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXWORDSIZE 20
 
typedef struct dict_data
{
    char native[MAXWORDSIZE];
    char transl[MAXWORDSIZE];
} dict_data_t;
 
typedef struct list_node
{
    struct list_node* next;
    dict_data_t value;
} list_node_t;
 
list_node_t* node_create(const dict_data_t* x)
{
    list_node_t* ret = (list_node_t*)malloc(sizeof(list_node_t));
    if(ret)
    {
        strcpy(ret->value.native, x->native);
        strcpy(ret->value.transl, x->transl);
        ret->next = NULL;
    }
    return ret;
}
 
typedef struct list
{
    list_node_t* head;
    list_node_t* tail;
} list_t;
 
void list_init(list_t* l)
{
    l->head = NULL;
    l->tail = NULL;
}
 
void list_destroy(list_t* l)
{
    list_node_t* cur;
    while((cur = l->head))
    {
        l->head = cur->next;
        free(cur);
    }
}
 
void list_push_back(list_t* l, const dict_data_t* x)
{
    list_node_t* n = node_create(x);
    if(!l->head)
        l->head = l->tail = n;
    else
    {
        l->tail->next = n;
        l->tail = n;        
    }
}
 
void list_find_tr_fill(list_t* l, dict_data_t* x)
{
    list_node_t* ret = l->head;
    for(; ret; ret = ret->next)
    {
        if(strcmp(ret->value.native, x->native) == 0)
        {
            strcpy(x->transl, ret->value.transl);
            return;
        }
    }
    x->transl[0] = '\0';
}
 
int main()
{
    list_t       dictionary;
    dict_data_t  temp_data;
    list_node_t* cur;
    FILE*        fp;
    
    fp = fopen("input", "r");
    if(!fp)
    {
        perror("input");
        exit(EXIT_FAILURE);
    }
    
    list_init(&dictionary);
    /* 
     * считаю, что формат файла такой:
     *    слово : перевод
     *    слово : перевод
     *    ...
    */
    while(fscanf(fp, " %[^: ] %*[:] %s", temp_data.native, temp_data.transl) > 0)
        list_push_back(&dictionary, &temp_data);
    fclose(fp);
    
    puts("Значения в словаре:");
    for(cur = dictionary.head; cur; cur = cur->next)
        printf("%s : %s\n", cur->value.native, cur->value.transl);
    
    printf("Введите слово для поиска перевода: ");
    scanf("%s", temp_data.native);
    list_find_tr_fill(&dictionary, &temp_data);
    printf("Перевод: %s\n", temp_data.transl);
    
    list_destroy(&dictionary);
    return 0; 
}

Объяснение кода листинга программы

  1. Сначала подключаются необходимые библиотеки: stdio.h, stdlib.h, string.h.
  2. Определяются макросы и типы данных:
    • MAXWORDSIZE - максимальная длина слова в словаре.
    • dict_data_t - структура данных, представляющая одно слово из словаря.
    • list_node_t - структура данных, представляющая один узел списка.
  3. Создаются функции:
    • node_create - создает новый узел списка и заполняет его данными из словаря.
    • list_init - инициализирует список, устанавливая начальные значения head и tail в NULL.
    • list_destroy - освобождает память, выделенную под узлы списка.
    • list_push_back - добавляет новый узел в конец списка.
    • list_find_tr_fill - ищет перевод слова в словаре и заполняет его значение в переводе.
  4. В функции main() создается список dictionary и инициализируется с помощью list_init().
  5. Открывается файл input для чтения с помощью fopen().
  6. В цикле while с помощью fscanf() считываются слова из файла и добавляются в список с помощью list_push_back().
  7. После чтения всех слов из файла, выводится содержимое списка с помощью цикла for и функции printf().
  8. Пользователю предлагается ввести слово для поиска перевода.
  9. С помощью scanf() считывается введенное слово и передается в функцию list_find_tr_fill() для поиска перевода.
  10. Найденный перевод выводится на экран с помощью printf().
  11. Вызывается функция list_destroy() для освобождения памяти, выделенной под узлы списка.
  12. Возвращается 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5
Похожие ответы