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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2023, 09:03   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию с++ не считает S

Помогите, пожалуйста!!!!! Я написала программу с помощью Списков, где с клавиатуры вводится последовательность x1, х2, ...,xп вещественных чисел, где n - заранее неизвестная величина. Ввод последовательности завершается Enter. Если меньше 2 элементов в последовательности, то должно выдавать "Мало элементов". Вычислить S=(x1+x2+2xn) * (x2+x3+2x(n-1)) * ... * (x(n-1)+xn+2*x2) Это моя программа на с++, S считает не верно. Подскажите, чтобы считало верно S

Код:
#include <iostream>
#include <string>
#include <Windows.h> 

using namespace std;

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

struct list 
{
    node* head = nullptr, * tail = nullptr;
    int kol_n = 0;
    list() {}

    void clear() // очистка
    {
        node* ptr1 = head, * ptr2 = head->next;
        while (ptr2)
        {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
            delete ptr1;
        }
        delete head;
        head = nullptr;
        tail = nullptr;
        kol_n = 0;
     }

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

    void add(double n) // добавление
    {
        node* ptr = head;
        kol_n++;
          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() 
    {
        if (kol_n > 2)
        {
            double S = 1;
            node* x1 = head;
            node* x2 = head->next;
            node* xn = tail;
            while (x1 && x2 && xn)
            {
                S *= (x1->inf + x2->inf + 2 * xn->inf);
                x1 = x1->next;
                x2 = x2->next;
                xn = xn->prev;
            }
            cout << "S = " << S << endl;
        }
        else
            cout << "Мало элементов в списке" << endl;
    }
};

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    list lst;
    double n;
    char ogranichitel = ' ';
    cout << "Введите элементы вещественной последовательности через пробел, заканчивая ввод символом перевода строки Enter: ";
     while (ogranichitel != '\n')
    {
        cin >> n;
        lst.add(n);
        while (true)
        {
            ogranichitel = cin.peek();
            if (ogranichitel != ' ') 
                break;
            cin.get();
        }
    } 
    printf("\nСозданая последовательность: ");
    lst.print();
    lst.summ_proizv();
    printf("\n");
    system("pause");
    return 0;
}
вот результат работы программы
Изображения
Тип файла: png Снимок2.PNG (6.2 Кб, 0 просмотров)
lenaiv вне форума Ответить с цитированием
Старый 29.04.2023, 11:01   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Это потому, что вы при добавлении элементов не правильно составляете список. У вас список сохраняют 2 переменные: head и tail, а вы используете при добавлении только head (из-за этого у вас при подсчётах цикл и не начинается т.к. xn == nullptr)
Код:
    void add(double n) // добавление
    {
        node* ptr = head;
        node *ptr = tail;
        kol_n++;
          if (ptr)
        {
            while (ptr->next)
                ptr = ptr->next;
            ptr->next = new node;
            ptr->next->next = nullptr;
            ptr->next->inf = n;
        }
        else
        {
            head = tail = new node;
            tail->inf = n;
            tail->next = nullptr;
        }
    }
macomics вне форума Ответить с цитированием
Старый 29.04.2023, 11:08   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Функция очистки тоже немного не правильная
Код:
    void clear() // очистка
    {
        node *ptr1 = head, *ptr2;
        while (ptr1)
        {
            ptr2 = ptr1->next;
            delete ptr1;
            ptr1 = ptr2;
        }
        head = nullptr;
        tail = nullptr;
        kol_n = 0;
     }
macomics вне форума Ответить с цитированием
Старый 29.04.2023, 11:09   #4
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

сделала, стало считать, но пропускать стала все элементы, кроме 1 и последнего
Изображения
Тип файла: png Снимок3.PNG (6.9 Кб, 0 просмотров)
lenaiv вне форума Ответить с цитированием
Старый 29.04.2023, 11:27   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А вто теперь я накосячил
Код:
    void add(double n) // добавление
    {
        node* ptr = head;
        node *ptr = tail;
        kol_n++;
        if (tail) {
            while (ptr->next)
                ptr = ptr->next;
            tail->next = new node;
            tail = tail->next;
        } else {
            head = tail = new node;
        }
        tail->next->next = nullptr;
        tail->next->inf = n;
    }
ADD: Чтобы не повторять одинаковые строки инициализации элемента списка

Последний раз редактировалось macomics; 29.04.2023 в 11:37.
macomics вне форума Ответить с цитированием
Старый 29.04.2023, 11:40   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так у вас там ещё и двухсвязный список, а вы заполняете его как односвязный
Код:
    void add(double n) // добавление
    {
        kol_n++;
        if (tail) {
            tail->next = new node;
            tail->next->prev = tail;
            tail = tail->next;
        } else {
            head = tail = new node;
            tail->prev = nullptr;
        }
        tail->next = nullptr;
        tail->inf = n;
    }
ADD: Вот это тоже немного не понятно зачем
Код:
     while (ogranichitel != '\n')
    {
        cin >> n;
        lst.add(n);
        while (true)
        {
            ogranichitel = cin.peek();
            if (ogranichitel != ' ') 
                break;
            cin.get();
        }
    }
https://godbolt.org/z/qxdnqYKe4

Последний раз редактировалось macomics; 29.04.2023 в 11:49.
macomics вне форума Ответить с цитированием
Старый 29.04.2023, 13:17   #7
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

СПАСИБО, я наконец-то разобралась и у меня все работает.
lenaiv вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не правильно считает Genzal Помощь студентам 2 15.04.2018 15:04
не считает программа new_u Помощь студентам 5 04.03.2018 23:19
Как считает компьютер lonsdale Помощь студентам 6 21.01.2013 20:02
считает не правильно rapgamer Помощь студентам 3 15.09.2010 14:23