Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2020, 23:03   #1
masha99
 
Регистрация: 08.11.2018
Сообщений: 9
По умолчанию Вычисление многочлена, представленного в виде очереди

Многочлен вида p(x)=с1 * xe1 + с2 * xe2 +…+ сn * xen, где e1>e2>...>en>=0
можно представить в виде очереди , где каждый элемент имеет 2 поля: 1-для коэффициента ci, 2-для показателя степени ei.
Вычислить значение многочлена при заданном x.

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

Код:
struct num
{
  float c; /* Коэффициент */
  int e; /* Степень */
};
 
int main(int argc, char *argv[])
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  queue <struct num> plnm1;
  queue <struct num> plnm3;
  num polinom;
  num cplnm;
  num polinom1;
  num cplnm1;
 
  float x=0;
  /* Меню */
  bool loop = true;
  while(loop)
  {
     system("cls");
     cout << "p(x)=C1*X^e1+C2*X^e2+...+Cn*X^en" <<endl;
     cout << "e1>e2>...>en>=0" <<endl;
     cout << "_____________________________" <<endl;
     cout << "01: Задать полином " <<endl;
     cout << "02: Удалить полином " <<endl;
     cout << "03: Посчитать значение полинома " <<endl;
     cout << "00: Выход" <<endl;
     cout << endl;
    char k;
    cin >> k;
    switch(k)
    {
    case '0':  /* Выход из цикла "Меню" */
        loop = false;
      break;
 
      case '1': {
        system("cls");
        if (plnm1.empty())
        {
          cout << "Задайте полином " << endl;
          short n;
          int t;
          cout << "Введите количество элементов: ";
          cin >> n;
          while (n<1)
          {
            cout << "Количество элементов не может быть менее 1. Введите количество элементов: ";
            cin >> n;
          }
          cout << "Введите коэффициент: ";
          cin >> polinom.c;
          while (polinom.c==0)
          {
            cout << "При коэффициенте х=0 многочлен не будет существовать. Введите коэффициент x: ";
            cin >> polinom.c;
          }
          cout << "Введите степень: ";
          cin >> polinom.e;
          t = polinom.e;
          plnm1.push(polinom);
          n--;
          while (n>0)
          {
            if(t==0)
            {
              cout << "Ввод не может быть продолжен, так как степень меньше 0 не может существовать. " << endl;
              break;
            }
            cout << "Введите коэффициент: ";
            cin >> polinom.c;
            while (polinom.c==0)
            {
              cout << "При коэффициенте х=0 многочлен не будет существовать. Введите коэффициент x: ";
              cin >> polinom.c;
            }
            cout << "Введите степень: ";
            cin >> polinom.e;
            while (polinom.e>=t || polinom.e<0)
            {
              cout << "Степень должна быть меньше предыдущей, но не меньше 0. Введите степень y: ";
              cin >> polinom.e;
            }
            t = polinom.e;
            plnm1.push(polinom);
            n--;
          }
          cout << "Полином задан" << endl;
        }
        else
          cout << "Полином уже задан" << endl;
 
        /* Просмотр полинома */
        if (!plnm1.empty())
        do
        {
          plnm1.pop();
          cout << polinom.c << " " << polinom.e << endl;
          plnm1.push(polinom);
          cplnm = plnm1.front();
        } while (cplnm.e<polinom.e);
      }
      break;
 
      case '2': {
        system("cls");
        plnm1.~queue();
        cout << "Полином очищен" << endl;
      }
      break;
      case '3': {
        system("cls");
        /* Просмотр полинома */
        if (!plnm1.empty())
        do
        {
          plnm1.pop();
          cout << polinom.c << " " << polinom.e << endl;
          plnm1.push(polinom);
          cplnm = plnm1.front();
        } 
          while (cplnm.e<polinom.e);
          cout << endl;
 
          cout << "x=";
          cin >> x;
 
      /*значение полинома*/
 
        for (int i = polinom.e; i >= 0; i--)
    {
        plnm3 += plnm1 * pow(x,i);
  }
 
        cout << "\nЗначение полинома=" <<plnm3<< endl;
 
        return 0;
      }
    }
  }
}

Последний раз редактировалось masha99; 02.04.2020 в 09:21.
masha99 вне форума Ответить с цитированием
Старый 02.04.2020, 08:16   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

"обычное" вычитание "требует" 3 переменных.
теперь у нас 3 будет три сложных переменных (очереди)
из двух первых мы будем брать "значения" а в третью записывать результат.

1. заведем 2 "рабочих" переменных изначально "пустых"
и будем "попеременно" их заполнять.
2. если первая переменная пуста, возьмем значение из первой очереди
3. если вторая переменная пуста, возьмем значение из второй очереди
4. теперь когда у нас есть два значения сравним их показатели степеней.
4.1. они равны
можно найти разность коэффициентов.
записать найденное значение в третью очередь.
"удалить" значения из обоих рабочих переменных
4.2. степень первой переменной < другой
записываем первую переменную как результат в третью очередь.
"удаляем" первое значение из первой переменной
4.3. степень второй переменной < первой
записываем вторую переменную
"удаляем" второе значение из ...
5. повторяем до исчерпания какой-либо из очередей начиная с п.2.
6. дописываем в результат "остаток" одной и другой очереди
( на самом деле он будет только один, но мы не знаем какой именно).

P.S. в целом алгоритм похож на сортировку слиянием.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 02.04.2020, 09:23   #3
masha99
 
Регистрация: 08.11.2018
Сообщений: 9
По умолчанию

evg_m,
Я ошиблась, задание немного другое: нужно не вычитать многочлены, а найти значение одного.
masha99 вне форума Ответить с цитированием
Старый 02.04.2020, 21:34   #4
masha99
 
Регистрация: 08.11.2018
Сообщений: 9
По умолчанию

Помогите, пожалуйста, очень нужна помощь!
masha99 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление многочлена через рекуррентные формулы qqqerrard Помощь студентам 1 05.11.2018 12:51
Вычисление корней многочлена по схеме Горнера maxwelln1 Visual C++ 1 11.12.2017 17:39
Написать программу вычисления коэффициентов многочлена, что является произведением многочлена n-степени на многочлен степени m amelie29 Помощь студентам 3 12.03.2013 21:19
Вычисление многочлена записаного в файле Senator16 Общие вопросы C/C++ 4 16.01.2011 20:54
Вычисление функции заданной в виде разложения в ряд StudeHt Паскаль, Turbo Pascal, PascalABC.NET 2 02.05.2009 20:08