11 классНе совсем школьное задание

Информация
Уважаемые школьники!
Вместе с заданиями размещайте и свои варианты решения. В противном случае ваше сообщение будет проигнорировано
Автор темы
fie4fix
Сообщений в теме: 2
Всего сообщений: 2
Зарегистрирован: 31.05.2016
Образование: студент
Не совсем школьное задание

Сообщение fie4fix » 31 май 2016, 13:07

Здравствуйте, недавно у меня возникли проблемы с одним очень не стандартным заданием. Скажу так, я начинающий программист, и мне как не странно, нужна ваша помощь! Мне дали задачу, написать генератор фраз(предложений). Нужно было создать 3 класса(словаря), в котором по отдельности были существительные, глаголы и прилагательные. Т.е., это выглядело примерно так:
1 класс: Дерево, бумага, самолет, стол и т.д.
2 класс: Радоваться, летать, смотреть и т.д.
3 класс: Желтое, кривое, легкое и т.д.
Так вот, между ними должно происходить генерирование, т.е. программа должна выбрать по одному слову из каждого класса и сложить в предложение, в моем случае может получиться так "Самолет летать красивое". И тут возникают проблемы! Между словами должно быть логическое сопряжение, и, что самое главное, правильно склоняться, чтобы получалось нормальное предложение.
Надеюсь вы поняли, что мне нужно! Буду очень благодарен за вашу помощь!

Реклама
daslex
ВПЗР
ВПЗР
Сообщений в теме: 3
Всего сообщений: 3126
Зарегистрирован: 07.02.2016
Образование: среднее
Re: Не совсем школьное задание

Сообщение daslex » 01 июн 2016, 22:44

Меняй задание. Компьютер человеческой логике не научишь.
Образование среднее-низшее.

Синица
романист
романист
Сообщений в теме: 1
Всего сообщений: 259
Зарегистрирован: 08.12.2014
Образование: высшее естественно-научное
Re: Не совсем школьное задание

Сообщение Синица » 02 июн 2016, 07:08

fie4fix:Надеюсь вы поняли, что мне нужно! Буду очень благодарен за вашу помощь!
Одно из возможных решений -- для каждого слова прописать грамматические свойства и составить словарь словоформ, индексированный этими свойствами. Потом выбирать нужную словоформу по свойству. Тогда можно будет строить предложения вроде: "Красивый самолёт летал/летает" или "Красивые розы цвели/цветут". Сборку предложения можно начинать с любого слова. Например, вытаскиваете по rnd "пела" -- глагол, ед. число, ж. р. => ищете словоформы существительного и прилагательного с этими же свойствами => "зелёная" + "собака". Получаете предложение: "Зелёная собака пела"...

daslex
ВПЗР
ВПЗР
Сообщений в теме: 3
Всего сообщений: 3126
Зарегистрирован: 07.02.2016
Образование: среднее
Re: Не совсем школьное задание

Сообщение daslex » 02 июн 2016, 14:39

Я могу показать рабочий пример генератора, написанный на C++, генерирующий предложения одного вида, но там могут быть таки фразы:
"Красная бумага стоит" :-)

Нельзя научить ПК человеческой логике.
===============================

Классы не хранят данные, это я автору темы точно могу сказать. Хранят их в файлах, в контейнерах, в массивах, на сервере, в базе данных, но не в классах.
Если я буду показывать, то без классов, потому что классы тут ни причём.

А ещё противоречие есть, если не применять предлогов для управления падежами, то ничего и не получится. Либо препод не разбирается, либо он - козёл, либо ты там напросился на подобную задачу выпендрежом своего ума.
==============================

Автору темы будет тяжело понять пример кода, полагаю. Это сама по себе задача такого вида, которые тяжелы для начала учёбы.

Алгоритм может быть такой.

Словари, хранящие следующее:
1. Набор существительных. Каждое существительное во всех падежах для каждого из родов.
2. Набор прилагательных. Каждое прилагательное, ассоциируемое с существительным в определённом падеже, согласующееся с родом существительного.
3. Набор глаголов. Каждый глагол в трёх вариантах времени, согласующийся с родом существительного.
4. Варианты предлогов, сочетаемые с падежом, для каждого падежа.

В реализации поведения программы:
- Выбирается существительное.
- Выбирается падеж существительного.
- Выбирается ассоциируемое с выбранным существительным прилагательное (ассоциации две: род, падеж)
- Выбирается ассоциируемый по роду существительного глагол случайного времени.

=============================

Это я алгоритм очень упрощённый привёл, может где неточно выразился. Можно варьировать предлоги, но потом нужно будет конкатенировать строки (предлог + прилагательное, например). В предлагаемом мною коде предлоги и не варьируются, а просто существует один для каждого падежа, совместно со словом.

Из такого алгоритма можно генерировать простые предложения по схеме: предлог+прилагательное+существительное+глагол.

P.S. - такие вопросы надо спрашивать на форумах по программированию, а не на форумах по русскому языку, ещё и в ветке нужного языка программирования. Язык языку - рознь :-)
Образование среднее-низшее.

Автор темы
fie4fix
Сообщений в теме: 2
Всего сообщений: 2
Зарегистрирован: 31.05.2016
Образование: студент
Re: Не совсем школьное задание

Сообщение fie4fix » 05 июн 2016, 12:51

daslex: Я могу показать рабочий пример генератора, написанный на C++
Было бы просто замечательно! Хоть я и пишу на C# :)

daslex
ВПЗР
ВПЗР
Сообщений в теме: 3
Всего сообщений: 3126
Зарегистрирован: 07.02.2016
Образование: среднее
Re: Не совсем школьное задание

Сообщение daslex » 05 июн 2016, 15:07

Код: Выделить всё

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

int main()
{
    const int CountNouns    = 3;   //Число существительных (дерево, бумага, самолёт)
    const int CountAdject   = 3;   //Число прилагательных   (красный, зелёный, красивый)
    const int CountAct      = 2;   //Число глаголов (стоит, летит)
    const int CountSKL      = 6;   //Число склонений (в русском 6)
    const int CountTime     = 3;   //Число времён для глагола (настоящее, будущее, прошлое)


                          //  Именительный,      Родительный,    Дательный,       Винительный,   Творительный,       Предложный,    Род (ср,ж,м)
   string Nouns[CountNouns][CountSKL + 1] = {
                                {"дерево",       "дерева",       "дереву",       "дерева",        "деревом",        "дереве",       "0"},
                                {"бумага",       "бумаги",       "бумаге",       "бумаги",        "бумагой",        "бумаге",       "1"},
                                {"самолёт",      "самолёта",     "самолёту",     "самолёта",      "самолётом",      "самолёте",     "2"}
   };

   string Adject[CountAdject][CountNouns][CountSKL] = {
                            {
                                {"Красное",     "У красного",     "К красному",    "У красного",      "Красным",       "На красном"}, //(0,0,0),(0,0,1),(0,0,6)
                                {"Красная",     "У красной",      "К красной",     "У красной",       "Красной",       "На красной"}, //(0,1,0),(0,1,1),(0,1,6)
                                {"Красный",     "У красного",     "К красному",    "У красного",      "Красным",       "На красном"}
                            },

                            {
                                {"Зелёное",     "У зелёного",     "К зелёному",     "У зелёного",       "Зелёным",       "На зелёном"}, //(1,0,0),(1,0,1),(1,0,6)
                                {"Зелёная",     "У зелёной",      "К зелёной",      "У зелёной",        "Зелёной",       "На зелёной"}, //(1,1,0),(1,1,1),(1,1,6)
                                {"Зелёный",     "У зелёного",     "К зелёному",     "У зелёного",       "Зелёным",       "На зелёном"}
                            },

                            {
                                {"Красивое",     "У красивого",     "К красивому",     "У красивого",   "Красивым",       "На красивом"}, //(1,0,0),(1,0,1),(1,0,6)
                                {"Красивая",     "У красивой",      "К красивой",      "У красивой",    "Красивой",       "На красивой"}, //(1,1,0),(1,1,1),(1,1,6)
                                {"Красивый",     "У красивого",     "К красивому",     "У красивого",   "Красивым",       "На красивом"}
                            }

   };


                                //   Настоящее,            Прошлое,                 Будущее
   string Action[CountAct][3][CountTime] = {
                            {
                                      {"стоит",            "стояло",            "встанет"},    //Средний род
                                      {"стоит",            "стоялa",            "встанет"},    //Женский род
                                      {"стоит",            "стоял",             "встанет"},    //Мужской род
                            },

                            {
                                      {"летит",            "летело",            "полетит"},    //Средний род
                                      {"летит",            "летела",            "полетит"},    //Женский род
                                      {"летит",            "летел",             "полетит"},    //Мужской род
                            }
   };
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   setlocale(LC_ALL,"");
   srand(time(0));

   

   //1. Выбор существительного
   int Noun_word =  rand() % CountNouns;
   int Noun_case =  rand() % CountSKL;

   //2. Ассоциируем с прилагательным
   int Adj_word  =  rand()%CountAdject;
   int Adj_case  =  Noun_case;

   int Act_word = rand() % CountAct;
   int Act_Case = rand() % CountTime;



    if (Nouns[Noun_word][CountSKL] == "0"){    //Если средний род
        cout << Adject[Adj_word][0][Adj_case] << ' ' << Nouns[Noun_word][Noun_case] << ' ' << Action[Act_word][0][Act_Case];
    }
    else if (Nouns[Noun_word][CountSKL] == "1"){         //Если женский род
        cout << Adject[Adj_word][1][Adj_case] << ' ' << Nouns[Noun_word][Noun_case] << ' ' << Action[Act_word][1][Act_Case];
    }
    else if (Nouns[Noun_word][CountSKL] == "2"){        //Если мужской род
       cout << Adject[Adj_word][2][Adj_case] << ' ' << Nouns[Noun_word][Noun_case] << ' ' << Action[Act_word][2][Act_Case];
    }
    cout << '\n';
   }

Пример работы (с добавлением цикла): https://ideone.com/MjduTq
(прокрутить вниз, там будут генерированные фразы)
Образование среднее-низшее.

НаталияЛия
Re: Не совсем школьное задание

Сообщение НаталияЛия » 19 мар 2017, 10:38

я бы сделала проще: замените прилагательные на наречия, например; быстро, хорошо и т.п., которые подойдут ко всем сказуемым и подлежащим

Ответить Пред. темаСлед. тема
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Задание к ГИА
    Дарья Александровна » 19 окт 2012, 13:54 » в форуме 9 класс
    11 Ответы
    3190 Просмотры
    Последнее сообщение Miyuki
    01 ноя 2012, 15:30
  • Задание за 2 класс
    Kat » 03 окт 2012, 12:44 » в форуме Фонетика и орфоэпия
    1 Ответы
    1009 Просмотры
    Последнее сообщение Дарья Александровна
    03 окт 2012, 18:54
  • Задание на синтаксис
    chem7856 » 02 дек 2017, 19:53 » в форуме Синтаксис и пунктуация
    1 Ответы
    1390 Просмотры
    Последнее сообщение Гудвин01
    03 дек 2017, 17:45
  • Задание на внимательность
    4 Ответы
    862 Просмотры
    Последнее сообщение ALNY
    13 сен 2013, 20:26
  • Олимпиадное задание
    гость » 23 фев 2010, 21:18 » в форуме 9 класс
    10 Ответы
    2848 Просмотры
    Последнее сообщение Гость
    24 фев 2010, 14:54