Kalkulator wielomianów

0

Witam,

Mam do napisania projekt pt.: "Kalkulator wielomianów". Ma on dodawać i mnożyć wielomiany dowolnego stopnia wczytane z pliku dane.txt. Muszę wykorzystać do tego listę, a szczerze powiedziawszy nie wiem jak. Poszperałam trochę w internecie i wiem mniej-więcej jak lista działa, ale nie wiem jak ją tu wykorzystać.
Zastanawiam się również w jaki sposób zapisać te wielomiany w pliku, żeby programowi wygodnie było je odczytać, np.: 4x^2+7 czy może 4 * pow(x,2) + 7 ?
Z góry dziękuję za wszelkie porady :)

0

Wielomian stopnia n zapisujesz jako liste n wspolczynnikow, albo utrzymujesz liste n wartosci wielomianu w n punktach. Dodawanie jest oczywiste, a mnozenie, mozna uzyc discrete Fourier transform, algorytm jest O(n), ale skomplikowany lub w O(n^2) mnozyc wspolczynniki kazdy przez kazdy, dostaniemy wielomian stopnia Max 2*n I redukoeac wyrazy podobne.

0

Tak długo jak operujesz na jednym argumencie (x), nie jest wymagane żebyś go zapisywał w pliku tekstowym. W momencie gdy pobierasz dane liniami do listy, możesz spokojnie zapisać to w nastepujacym formacie: 5 0 0 -2, co oznaczało by 5x^3 - 2. Każda pozycja reprezentuje potęgę, a wiersz cały wielomian.

Ps.
Zapis ten nie będzie wystarczający w przypadku potęg ujemnych i w formie ułamków.

0

Ps.
Zapis ten nie będzie wystarczający w przypadku potęg ujemnych i w formie ułamków.

Nie będzie potęg ujemnych, ani ułamków. Dziękuję za pomoc :)

Mam jeszcze jedno pytanie. Jak odczytać wartości z pliku "dane" i zapisać je do poszczególnych list (jedna linijka w pliku, to jeden wielomian, przewiduję działanie na 2 wielomianach)? W tym momencie odczytana linia znaków zapisuje mi się jako string, przez co mam niezgodność formatów. Próbowałam konwersji ze string'a na int, ale też dość nieudolnie.

0

Mam póki co to.
Wiem, że niektóre biblioteki są niepotrzebne, ale to jest wersja próbna, więc to szczegół.
Nie wiem jak wczytać dane z pliku do listy i potem jak odwoływać się do danego elementu listy.

#include <iostream>
#include <list>
#include <stdio.h>
#include <cstdlib>
#include <fstream>
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>


using namespace std;

list <int> lista1;
list <int> lista2;
int wybor;
fstream plik;

bool wczytaj()
{
    plik.open("dane.txt",ios::in);
    if(plik.good()==false)
    {
        cout << "Plik nie istnieje!";
        exit(0);
    }
    else return(true);
}

void dodawanie()
{
    wczytaj();
    //tutaj wczytanie z pliku do listy i dalsze operacje na listach
    plik.close();

    return;
}

void mnozenie()
{
    wczytaj();
    //tutaj wczytanie z pliku do listy i dalsze operacje na listach
    plik.close();

    return;
}

void exit()
{
    cout<<"Koniec programu!";
    Sleep(3000);
}

int main()
{
do
{
    cout << "MENU GLOWNE:" << endl;
    cout << "----------------------------------------------" << endl;
    cout << "1. Dodawanie" << endl;
    cout << "2. Mnozenie" << endl;
    cout << "3. Zakoncz" << endl;
    cout << "----------------------------------------------" << endl;
    cout << "Wybierz dzialanie, ktore chcesz wykonac: ";
    cin >> wybor;
    switch (wybor)
    {
        case 1: dodawanie(); break;
        case 2: mnozenie(); break;
        case 3: exit(); break;

        default:
            cout << "Nie ma takiej opcji w menu!";
            Sleep(3000);
            break;
    }
}
    while(wybor!=3);

    return 0;
}

1

Po kiego grzyba jakaś lista? Do implementacji wielomianów najlepiej wykorzystać std::vector.
To jest proste jak konstrukcja cepa:

class Polynomial
{
public:
     // rule of zero

     Polynomial(std::inistialzation_list<double> ai);

     auto Added(const Polynomial& other) const -> Polynomial;
     auto Subtracted(const Polynomial& other) const -> Polynomial;
     auto Multiplied(const Polynomial& other) const -> Polynomial;
     auto Divided(const Polynomial& other, Polynomial& remainder) const;

     auto PrintToStream(std::ostream& output) const -> std::ostream&;
     auto ReadFromStream(std::istream& input) -> std::istream&;

private:
     std::vector<double> coefficients;
};

auto operator+(const Polynomial& a, const Polynomial& b)
{
       return a.Added(b);
}

// and so on …
0
MarekR22 napisał(a):

Po kiego grzyba jakaś lista?

Ponieważ jest w treści zadania, więc trzeba ją wykorzystać ;)

0

Vector to jest lista.

0

Pobieram pojedyncze znaki z pliku, konwertuję na int i zapisuję je w liście (z pominięciem spacji).
Dane w pliku mam zapisane w ten sposób:
4 0 5 7 0
3 7 0 1 8
Nie wiem jak rozwiązać to, żeby jedna linijka była zapisana do 1 listy, a druga do drugiej. Momentem charakterystycznym jest pojawienie się entera. Nie do końca wiem jakiej pętli użyć, żeby wykonywała mniej więcej takie zadanie "Zapisuj n, do listy1. Jeśli napotkasz -38 (wartość n, gdy napotyka enter), zacznij zapisywać do listy2".

while (plik.get(c))
    {
        int n=c-'0';
        if (n!=-16)
        lista1.push_back(n);
    }
    for(list<int>::iterator i=lista1.begin(); i!= lista1.end(); ++i)
       cout<<*i<<" ";
0

standardowa funkcja z C to załatwia:
double poly (double x, int degree, double *coeffs);

0
wil napisał(a):

standardowa funkcja z C to załatwia:
double poly (double x, int degree, double *coeffs);

No właśnie nie do końca o to chodzi, bo funkcja double poly oblicza wartość wielomianu dla danej wartości x, a mój program ma sumować i mnożyć wielomiany (może później będę go miała udoskonalić, ale póki co ma robić tylko te dwie rzeczy).

0
poprostu napisał(a):

Pobieram pojedyncze znaki z pliku, konwertuję na int i zapisuję je w liście (z pominięciem spacji).
Dane w pliku mam zapisane w ten sposób:
4 0 5 7 0
3 7 0 1 8
Nie wiem jak rozwiązać to, żeby jedna linijka była zapisana do 1 listy, a druga do drugiej. Momentem charakterystycznym jest pojawienie się entera. Nie do końca wiem jakiej pętli użyć, żeby wykonywała mniej więcej takie zadanie "Zapisuj n, do listy1. Jeśli napotkasz -38 (wartość n, gdy napotyka enter), zacznij zapisywać do listy2".

while (plik.get(c))
    {
        int n=c-'0';
        if (n!=-16)
        lista1.push_back(n);
    }
    for(list<int>::iterator i=lista1.begin(); i!= lista1.end(); ++i)
       cout<<*i<<" ";

Tregedia.

To powinno iść tak:

auto Polynomial::ReadFromStream(std::istream& input, char terminator = '\n') -> std::istream&
{
    string line;
    if (std::getline(input, line, terminator)) {
           istringstream data(line);
           double x;
           coefficients.clear();
           while (data >> x) {
               coefficients.push_back(x);
           }
           std::reverse(coefficients.begin(), coefficients.end());
    }
    return input;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1