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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2023, 15:17   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию С++ Динамические структуры данных. Вычислить произведение сумм. Ввод последовательности завершается символом перевода строки

Делаю программу, но она у меня не работает. Подскажите, как сделать чтобы она работала.

Это мое условие: Динамические структуры данных. Пусть с клавиатуры вводится последовательность х1, х2, …, хn вещественных чисел, n заранее неизвестная величина.
Ввод завершается символом перевода строки. Вычислить произведение сумм
S=(x1+x2+2xn)*(x2+x3+2x(n-1))...(x(n-1)+x(n-2)+2x2)

Пожалуйста, помогите с программой.

Код:
#include <iostream>
#include <string>
#include <Windows.h> 
 
using namespace std;
 
struct node 
{
    double inf;
    node* next;
};
 
struct list 
{
    node* head = nullptr;
 
    list() {}
 
    void clear() // очистка
    {
        node* ptr1 = head, * ptr2 = head->next;
        while (ptr2)
        {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
            delete ptr1;
        }
        delete head;
        head = nullptr;
    }
 
    ~list()
    {
        (*this).clear();
    }
 
    void add(double n) // добавление
    {
        node* ptr = head;
        if (ptr)
        {
            while (ptr->next)
                ptr = ptr->next;
            ptr->next = new node;
            ptr->next->inf = n;
            ptr->next->next = nullptr;
        }
        else
        {
            head = new node;
            head->inf = n;
            head->next = nullptr;
        }
    }
 
    void print() // печать
    {
        node* ptr = head;
        if (ptr)
        {
            while (ptr)
            {
                cout << ptr->inf << ' ';
                ptr = ptr->next;
            }
            cout << '\n';
        }
        else cout << "Нет элементов\n";
    }
 
    void summ_proizv(double* element, int n) 
    {
        double S;
        S = 0;
                for (int i = 0; i < n; i++)
                {
                    S *= (element[i] + element[i + 1] + 2 * element[n]);
                }
            cout << "S = " << S;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n;
    printf("\nВведите n: ");
    cin >> n;
    cout << '\n';
    list lst;
    for (int i = 0; i < n; i++)
    {
        double element;
        cout << "Введите элемент x" << i + 1 << ": ";
        cin >> element;
        if (i == n)
        {
            cout << "\n";
        } 
        lst.add(element);
    }
    printf("\nСозданая последовательность: ");
    lst.print();
    lst.summ_proizv();
 
    printf("\n");
    system("pause");
    return 0;
}

Последний раз редактировалось lenaiv; 27.04.2023 в 19:51.
lenaiv вне форума Ответить с цитированием
Старый 27.04.2023, 16:50   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Считывание нужно по-другому организовывать, т.к. N не дано. В clear нельзя сразу "трогать" head->next, т.к. head может быть пустым. Лучше использовать двухсвязный список, т.к. требуются числа и из начала, и из конца. Лучше хранить и голову, и хвост, иначе добавление слишком дорогое. Последняя сумма какая-то странная - мне кажется, она должна быть (x(n-1)+xn+2x2). Поставил ограничение на 3 элемента в списке, но, наверное, достаточно двух (и тогда можно не добавлять дополнительное поле для хранения длины). S нужно инициализировать единицей, иначе произведение будет всегда равно 0.
Код:
#include <iostream>
#include <string>
#include <Windows.h>
#include <cstdio>

using namespace std;

struct node
{
    double inf;
    node* next, * prev;
};

struct list
{
    node* head = nullptr, * tail = nullptr;
    int len = 0;

    list() {}

    void clear()
    {
        while (head)
        {
            node* ptr = head->next;
            delete head;
            head = ptr;
        }
        tail = nullptr;
        len = 0;
    }

    ~list()
    {
        (*this).clear();
    }

    void add(double n)
    {
        len++;
        if (tail)
        {
            tail->next = new node;
            tail->next->prev = tail;
            tail = tail->next;
            tail->inf = n;
            tail->next = nullptr;
        }
        else
        {
            head = new node;
            head->inf = n;
            head->next = nullptr;
            head->prev = nullptr;
            tail = head;
        }
    }

    void print()
    {
        node* ptr = head;
        if (ptr)
        {
            while (ptr)
            {
                cout << ptr->inf << ' ';
                ptr = ptr->next;
            }
            cout << endl;
        }
        else cout << "Нет элементов" << endl;
    }

    void product_sum()
    {
        if (len < 3)
            cout << "Мало элементов в списке" << endl;
        else
        {
            double S = 1;
            node* x1 = head;
            node* x2 = head->next;
            node* xn = tail;
            while (x2) {
                S *= (x1->inf + x2->inf + 2 * xn->inf);
                x1 = x1->next;
                x2 = x2->next;
                xn = xn->prev;
            }
            cout << "S = " << S << endl;
        }
    }
};

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    list lst;
    do {
        double v;
        char sep;
        auto code = scanf("%lf%c", &v, &sep);
        if (code >= 1)
            lst.add(v);
        if (code < 2 || sep == '\n')
            break;
    } while (true);
    lst.print();
    lst.product_sum();
    system("pause");
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 27.04.2023 в 16:53.
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] Даны две последовательности целых чисел одинаковой длины N. Требуется вычислить их скалярное произведение S [C] Maksim__ Помощь студентам 1 03.11.2017 18:05
Вычислить произведение элементов последовательности vladikson Помощь студентам 1 15.12.2015 11:29
Дано N действительных чисел. Вычислить произведение тех членов последовательности, для которых выполнено условие... c@rtman Паскаль, Turbo Pascal, PascalABC.NET 1 12.06.2015 15:36
Вычислить сумму элементов каждой строки матрицы A(NxM) , определить наименьшее значение этих сумм и номер соответствующей строки merilyn Помощь студентам 3 14.12.2013 11:39
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39