Вводя слово (англ или рус), найти перевод или выдать сообщение "нет в словаре" - 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, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д