![]() |
|
Модераторы: bsa |
![]()
|
|
| dimefield |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.4.2015 Репутация: нет Всего: нет |
Привет всем.
Помогите, пожалуйста, написать программу на языке Си. Задание: Пользователь вводит два слова (или две строки). Проверить, являются ли они анаграммами. Анаграмма — слово состоящее из того же набора символов. Пример анаграмм: smartest mattress Нужно составить таблицу вхождений каждого символа для каждой из строк, затем сравнить таблицы, у анаграмм таблицы совпадают. У меня есть наброски кода: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <ctype.h> int main () { int n = 10; char a[n + 1]; printf("Введите первое слово, состоящее не более чем из десяти символов: \n"); if (scanf("%10s", a) != 1) { printf("Ошибка ввода\n"); exit(EXIT_FAILURE); } char b[n + 1]; printf("Введите второе слово, состоящее не более чем из десяти символов: \n"); if (scanf("%10s", b) != 1) { printf("Ошибка ввода\n"); exit(EXIT_FAILURE); } printf("Сравним строки: %s и %s\n", a, b); int l = 26; int word[l]; for (int i = 0; i < l; i++) { word[i] = 0; } char *s = a; while (*s != '\0') { if (isalpha(*s)) { НЕ ЗНАЮ, ЧТО ЗДЕСЬ ПИСАТЬ } s++; } int word2[l]; for (int i = 0; i < l; i++) { word2[i] = 0; } char *t = b; while (*t != '\0') { if (isalpha(*t)) { НЕ ЗНАЮ, ЧТО ЗДЕСЬ ПИСАТЬ t++; } Это сообщение отредактировал(а) dimefield - 15.4.2015, 09:28 |
|||
|
||||
| rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Привет.
Во-первых, по-моему, анаграмы не обязательно должны содержать все буквы входного слова. Я бы, наверное, делал так. Составлял, как вы сказали, таблицу вхождений каждого символа входного слова. То есть для слова "smartest" эта таблица будет выглядить так: s - 2 m - 1 a - 1 r - 1 t - 2 e - 1 Потом составлять такую же таблицу для второго слова, которое будет потенциальной анаграмой для первого слова. Допустим, будет слово "smart" s - 1 m - 1 a - 1 r - 1 t - 1 А затем просто берем каждую строку из второй таблицы, находим в первой таблице символ и смотрим, чтоб значение этого символа из второй таблицы было не больше чем значение этого символа в первой таблице. По реализации, проблема в том, что вам надо реализовать все на Си, а не на Си++ и контейнеры STL (в частности std::map) вам не доступны. Поэтому надо думать что то другое. Я бы, наверное, сделал так: для таблиц использовал одномерные массивы размером в 26 элементов (столько букв в англ. алфавите), где каждый индекс - номер буквы в англ. алфавите. Заполнение таблицы будет выглядить примерно так:
"(int)word[i]" - таким образом мы получаем ASCII код символа. Отнимаем 97 потому что код символа 'a' == 97. Но этот код будет работать только для слов в нижнем регистре, поэтому сначала надо привести все к нижнему регистру. Вот, вроде и весь алгоритм. Будут вопросы - обращайтесь. |
|||
|
||||
| rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Вот, вроде как, рабочий код. Прогоните его на различных примерах:
В конце просто смотрите значение переменной is_anagram. Если оно true - то слова являются анаграммами. Если есть какие-то вопросы - спрашивайте. |
|||
|
||||
| dimefield |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.4.2015 Репутация: нет Всего: нет |
Вроде всё работает как надо. Спасибо огромное! Посмотрим, что скажет препод. |
||||
|
|||||
| rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Вы хоть с кодом разобрались? Основной смысл моих предидущих сообщений был не в том, чтоб в преподу сдали, а в том, чтоб вы поняли что, как и для чего.
|
|||
|
||||
| dimefield |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.4.2015 Репутация: нет Всего: нет |
Единственное, что я не понял, в этой строке: if (src_table[index] >= test_table[index]) почему знак >= ,а не == ? |
|||
|
||||
| rudolfninja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Потому что анаграмы, по-моему, не должны содержать все буквы исходного слова. То есть, если в исходном слове две буквы 't', а в составленном из него слове буква 't' одна, то эти слова будут анаграмами. То есть тут просиходит проверка, чтоб количество букв в слове-потенцаильной анагреме не превышало количество таких же букв в исходном слове. Если я не прав, то да, надо поставить проверку на строгое равенство. |
|||
|
||||
| dimefield |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 15.4.2015 Репутация: нет Всего: нет |
окей, теперь все понятно. Спасибо. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |