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

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

Сообщение fie4fix »

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

Сообщение daslex »

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

Сообщение Синица »

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

Сообщение daslex »

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

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

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

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

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

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

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

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

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

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

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

P.S. - такие вопросы надо спрашивать на форумах по программированию, а не на форумах по русскому языку, ещё и в ветке нужного языка программирования. Язык языку - рознь :-)
Образование среднее-низшее.
Автор темы
fie4fix
Всего сообщений: 2
Зарегистрирован: 31.05.2016
Образование: студент
 Re: Не совсем школьное задание

Сообщение fie4fix »

daslex: Я могу показать рабочий пример генератора, написанный на C++
Было бы просто замечательно! Хоть я и пишу на C# :)
daslex
Гениалиссимус
Гениалиссимус
Всего сообщений: 7818
Зарегистрирован: 07.02.2016
Образование: среднее
 Re: Не совсем школьное задание

Сообщение daslex »

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

#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: Не совсем школьное задание

Сообщение НаталияЛия »

я бы сделала проще: замените прилагательные на наречия, например; быстро, хорошо и т.п., которые подойдут ко всем сказуемым и подлежащим
Ответить Пред. темаСлед. тема
Для отправки ответа, комментария или отзыва вам необходимо авторизоваться
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не могу выполнить задание за 2 класс (род имен существ.)
    КоротковаЕА » » в форуме 2 класс
    12 Ответы
    4255 Просмотры
    Последнее сообщение irida
  • Проверьте, пожалуста, задание
    Техничка » » в форуме Высшее образование
    12 Ответы
    9647 Просмотры
    Последнее сообщение Техничка
  • Проверьте, пожалуста, задание
    adeli » » в форуме Высшее образование
    1 Ответы
    3107 Просмотры
    Последнее сообщение irida
  • Помогите пожалуйста решить задание
    rik66 » » в форуме 10 класс
    1 Ответы
    1893 Просмотры
    Последнее сообщение irida
  • Задание по критике речи-определить ошибку в предложении
    ыцц » » в форуме Высшее образование
    3 Ответы
    764 Просмотры
    Последнее сообщение irida