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ę. |
|
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ę. |
|
DejaVu |
» 2017-01-24 15:12:01 Kto wymyśla tak głupie zadania... :/ 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. |
|
CTRL85 Temat założony przez niniejszego użytkownika |
» 2017-01-24 15:38:41 A coś w stylu 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. |
|
pekfos |
» 2017-01-24 16:32:31 Niech funkcja zwraca listę i zwróconą wartość ustawiaj jako nast. nowa->nast = IleArg > 1 ? WczytajArgumenty( IleArg - 1 ) : nullptr; return nowa;
Pierwsze wywołanie funkcji po prostu zwróci ci gotową listę. |
|
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); }
|
|
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.. |
|
CTRL85 Temat założony przez niniejszego użytkownika |
» 2017-01-24 20:30:12 Mam aktualnie tak: 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: 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: 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 |
|
« 1 » 2 |