Вводя слово (англ или рус), найти перевод или выдать сообщение "нет в словаре" - 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;
}
Объяснение кода листинга программы
- Сначала подключаются необходимые библиотеки: stdio.h, stdlib.h, string.h.
- Определяются макросы и типы данных:
- MAXWORDSIZE - максимальная длина слова в словаре.
- dict_data_t - структура данных, представляющая одно слово из словаря.
- list_node_t - структура данных, представляющая один узел списка.
- Создаются функции:
- node_create - создает новый узел списка и заполняет его данными из словаря.
- list_init - инициализирует список, устанавливая начальные значения head и tail в NULL.
- list_destroy - освобождает память, выделенную под узлы списка.
- list_push_back - добавляет новый узел в конец списка.
- list_find_tr_fill - ищет перевод слова в словаре и заполняет его значение в переводе.
- В функции main() создается список dictionary и инициализируется с помощью list_init().
- Открывается файл input для чтения с помощью fopen().
- В цикле while с помощью fscanf() считываются слова из файла и добавляются в список с помощью list_push_back().
- После чтения всех слов из файла, выводится содержимое списка с помощью цикла for и функции printf().
- Пользователю предлагается ввести слово для поиска перевода.
- С помощью scanf() считывается введенное слово и передается в функцию list_find_tr_fill() для поиска перевода.
- Найденный перевод выводится на экран с помощью printf().
- Вызывается функция list_destroy() для освобождения памяти, выделенной под узлы списка.
- Возвращается 0, что означает успешное завершение программы.