Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obliczanie wartości wielomianów bez użycia pętli

Ostatnio zmodyfikowano 2017-01-24 21:19
Autor Wiadomość
CTRL85
Temat założony przez niniejszego użytkownika
Obliczanie wartości wielomianów bez użycia pętli
» 2017-01-24 14:47:50
Mam za zadanie obliczyć wartości wielomianów dla podanych argumentów bez używania pętli (for, while, goto, switch), bez używania jakichkolwiek tablic i bez klas, jedyny plik nagłówkowy to iostream.

Przykładowe dane wejściowe wyglądają tak:

2 //liczba wielomianów
2 //liczba argumentów
0 1 //podane argumenty
2 //stopień pierwszego wielomianu
1 2 3 //współczynniki pierwszego wielomianu od najniższej potęgi
3 //stopień drugiego wielomianu
2 3 4 5 // współczynniki drugiego wielomianu

Chcę stworzyć listę jednokierunkową, w której będę przechowywał argumenty wraz z wartościami, ale mam problem jak rekurencyjnie i bez użycia pętli uzupełniać listę.
P-156857
pekfos
» 2017-01-24 15:11:55
A jak byś rozwinął taką pętlę for, czy while do postaci funkcji rekurencyjnej? Mógłbyś nawet to zapakować do szablonu funkcji, przyjmującego lambdy jako warunki i powtarzaną instrukcję.
P-156859
DejaVu
» 2017-01-24 15:12:01
Kto wymyśla tak głupie zadania... :/
C/C++
void readData( std::list < int >& _list )
{
    int value;
    std::cin >> value;
    if( value == 0 )
         return;
   
    _list.push_back( value );
}
Niemniej jednak zgodnie z tym co napisałeś to header listy też nie jest dozwolony, więc have fun.
P-156860
CTRL85
Temat założony przez niniejszego użytkownika
» 2017-01-24 15:38:41
A coś w stylu

C/C++
struct Lista {
    int arg;
    int wynik;
   
    Lista * nast;
};

void WczytajArgumenty( int IleArg ) {
   
    Lista * nowa = new Lista;
   
    int arg = 0;
   
    cin >> arg;
   
    nowa->arg = arg;
    nowa->nast = 0;
   
    if( IleArg > 1 )
         WczytajArgumenty( IleArg - 1 );
   
    nowa->nast = nowa;
}

Aktualnie kod nie działa, bo problem mam ze wskazaniem następnego elementu.
P-156862
pekfos
» 2017-01-24 16:32:31
Niech funkcja zwraca listę i zwróconą wartość ustawiaj jako nast.
C/C++
nowa->nast = IleArg > 1 ? WczytajArgumenty( IleArg - 1 )
    : nullptr;
return nowa;
Pierwsze wywołanie funkcji po prostu zwróci ci gotową listę.
P-156865
mokrowski
» 2017-01-24 17:55:02
#include <iostream>

using namespace std;

template<typename T>
struct Node {
    T arg;
    T result;
    Node * next = nullptr;
};

template<typename T>
void readArgument(Node<T>& node, int argCount) {
    cin >> node.arg;
    if(--argCount) {
        auto newNode = new Node<T>();
        node.next = newNode;
        readArgument(*newNode, argCount);
    }
}

template<typename T>
void showList(Node<T>& node) {
    cout << node.arg;
    if(node.next != nullptr) {
        cout << ' ';
        showList(*(node.next));
    } else {
        cout << '\n';
    }
}

int main() {
    Node<int> node;
    readArgument(node, 2);
    cout << "Lista: ";
    showList(node);
}
P-156870
pekfos
» 2017-01-24 18:24:13
@mokrowski: Walczę właśnie z silną chęcią, żeby skasować twój post.. Sam gotowiec, więc dość kontrowersyjna forma odpowiedzi na tym forum, to jeszcze źle sformatowany i nic nie wnoszący do tematu. Nie ma w nim nic, co nie padło w tym temacie, a ubieganie autora tematu w składaniu kodu do kupy, to zwyczajne robienie z niego idioty. Możesz to uznać za ostrzeżenie..
P-156871
CTRL85
Temat założony przez niniejszego użytkownika
» 2017-01-24 20:30:12
Mam aktualnie tak:

C/C++
Lista WczytajArgumenty( int IleArg ) {
   
    Lista * nowa = new Lista;
   
    int arg = 0;
   
    cin >> arg;
   
    nowa->arg = arg;
   
    nowa->nast = IleArg > 1 ? WczytajArgumenty( IleArg - 1 )
        : nullptr;
   
    return * nowa;
}

I kompilator wywala:

Error C2446: ':': no conversion from 'nullptr' to 'Lista'
note: No constructor could take the source type, or constructor overload resolution was ambiguous

Tylko nie za bardzo rozumiem dlaczego.

EDIT, dobra, już poradziłem sobie:

C/C++
Element WczytajArgumenty( int IleArg ) {
   
    Element * nowa = new Element;
   
    int arg = 0;
   
    cin >> arg;
   
    nowa->arg = arg;
   
    if( IleArg > 1 )
         nowa->nast = & WczytajArgumenty( IleArg - 1 );
    else
         nowa->nast = NULL;
   
    return * nowa;
}

EDIT2:

Ale teraz mam inny problem:
C/C++
Element * start = new Element;

start = & WczytajArgumenty( ileArgumentow );

cout << start->arg << endl;
cout << start->nast->arg << endl;

Wywołuję sobie funkcje i wszystko byłoy ok, gdyby nie to, że zamiast drugiego elementu wyświetla jakieś bzdury. Co dziwniejsze wszystko psuje cout - gdy chcę wyświetlić tylko drugi element, to nie ma problemu, w debuggerze, jak zatrzymam program przed coutem to wszystko wygląda ładnie i po wykonaniu tej linii się psuje. Oo
P-156891
« 1 » 2
  Strona 1 z 2 Następna strona