• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Własna interpretacja i wykonanie schematu Hornera - działa, ale gdzieś jest mały błąd.

VPS Starter Arubacloud
0 głosów
559 wizyt
pytanie zadane 27 kwietnia 2016 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,480 p.)

Witam. Dla własnych potrzeb, oraz ćwiczeń napisałem schemat Hornera całkowicie z głowy. Kod działa, jeżeli za pierwszym razem trafimy szukaną liczbę, czyli miejsce zerowe wielomianu. Przykładowe liczby na wejściu aby otrzymać 0 (2, 3, 5, 2, -1). Jeżeli zamiast -1, wpiszemy 1, lub cokolwiek innego, to program poprosi nas o ponowne podanie liczby, oraz poinformuje że poprzednia nie jest miejscem zerowym. Tu nadchodzi problem. Dlaczego po ponownym podaniu nawet dobrej liczby, otrzymuję inne wyniki niż w przypadku podania tej dobrej na początku. 

Wiem dlaczego, gdzieś się dopisują liczby do zmiennej, ale za nic nie mogę znaleźć tego miejsca. Mogę na Was liczyć? :) 

 

Kod: 

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int stopien_wielomianu;
    cout<<"Stopien wielomianu: ";
    cin>>stopien_wielomianu;

    int stopien_wielomianu_tab[stopien_wielomianu];

    for (int i=0; i<=stopien_wielomianu; i++)
    {
        cout<<i+1<<". argument wielomianu: ";
        cin>>stopien_wielomianu_tab[i];
    }

    int mnoznik;
    cout<<"Mnoznik: ";
    cin>>mnoznik;


    int wynik=stopien_wielomianu_tab[0];

    while (wynik!=0)
    {
        for (int i=0; i<stopien_wielomianu; i++)
        {
            wynik = (mnoznik * wynik) + stopien_wielomianu_tab[i+1];
        }

        cout<<endl<<wynik<<endl<<endl;

        if (wynik == 0)
        {
            cout<<"Podany mnoznik "<<mnoznik<<" jest miejscem zerowym wielomianu"<<endl<<endl;
            break;
        }
        else
        {
            cout<<"Podany mnoznik "<<mnoznik<<" nie jest miejscem zerowym wielomianu. Podaj inny mnoznik: ";
            cin>>mnoznik;
        }
    }


    system("pause");


    return {};

}

 

1 odpowiedź

+1 głos
odpowiedź 27 kwietnia 2016 przez draghan VIP (106,230 p.)
wybrane 27 kwietnia 2016 przez Konrad Nabożny
 
Najlepsza

Ten kod jest błędny:

    int stopien_wielomianu;
    cout<<"Stopien wielomianu: ";
    cin>>stopien_wielomianu;
 
    int stopien_wielomianu_tab[stopien_wielomianu];

Rozmiar tablicy statycznej musi być znany w czasie kompilacji. Jeśli chcesz mieć tablicę o rozmiarze nieznanym w czasie kompilacji, stosujesz jakiś fajny kontener z std lub  alokację dynamiczną.

A to return {}; co jest?

Gwoli rozwiązania Twojego problemu: nie powinieneś na początku pętli przypisywać wynik=stopien_wielomianu_tab[0];?

komentarz 27 kwietnia 2016 przez Daaa22 Dyskutant (8,250 p.)

Uzupełnię kolegę, to z tą tablicą powinno wyglądać tak:

int stopien_wielomianu_tab=new int[stopien_wielomianu];

Zamiast

return {};

powinno być

return 0;

 

komentarz 27 kwietnia 2016 przez Radfler VIP (101,030 p.)
return {};

To samo co to

return int{};

Czyli po prostu to:

return 0;
komentarz 27 kwietnia 2016 przez draghan VIP (106,230 p.)
Radfler, dlaczego {} jest traktowane jak inicjalizator int?

EDIT:
Zajrzałem sobie do podanej strony. Szczerze? Nie jest to dla mnie jasny zapis, ale skoro można, to niech będzie.
komentarz 27 kwietnia 2016 przez Radfler VIP (101,030 p.)
No skoro funkcja zwraca int to kompilator wie jaki tu typ jest tworzony (luźno mówiąc).

http://en.cppreference.com/w/cpp/language/list_initialization
komentarz 27 kwietnia 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)

Ok, co do pierwszej kwestii. Często używałem tego typu tworzenia tablic statycznych. Bez problemu potrafię użyć wskaźnika i tablicy dynamicznej, lub nawet wektorowej (w sumie nie wiem jaka jest lepsza), ale w tym przypadku po prostu mi się nie chciało, przyznaję :) A jeżeli mogę wiedzieć, co złego jest w tworzeniu tablic statycznych w ten sposób?

 

return {}; wczoraj @Radfler napisał mi, że w mainie lepiej pisać return'a w ten sposób. Zna się ode mnie lepiej na rzeczy więc zacząłem tego używać. 

 

Rozwiązanie mojego problemu - wielkie dzięki, jestem często w szoku że autor kodu nie potrafi znaleźć takiego błędu, a osoby z zewnątrz potrafią go dostrzec smiley

 

 

komentarz 27 kwietnia 2016 przez draghan VIP (106,230 p.)

A jeżeli mogę wiedzieć, co złego jest w tworzeniu tablic statycznych w ten sposób?

Bo jest to niezgodne ze standardem. :)

wczoraj @Radfler napisał mi, że w mainie lepiej pisać return'a w ten sposób.

Radfler, naprawdę tak napisałeś? ;)

Rozwiązanie mojego problemu - wielkie dzięki

Spoczi. :)

komentarz 27 kwietnia 2016 przez Radfler VIP (101,030 p.)
Napisałem tak, co w tym złego? Ogólnie to sam uważam, że return 0; nie powinno znaleźć się w funkcji main :p
komentarz 27 kwietnia 2016 przez draghan VIP (106,230 p.)
A jaką to ma przewagę, skoro lepiej?
komentarz 27 kwietnia 2016 przez Radfler VIP (101,030 p.)

Nie ma żadnej przewagi, po prostu to inny sposób zrobienia tego samego...

return 0; <=> return {};
komentarz 27 kwietnia 2016 przez draghan VIP (106,230 p.)
Teraz wszystko jasne. :)

Podobne pytania

0 głosów
0 odpowiedzi 1,551 wizyt
pytanie zadane 19 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
2 odpowiedzi 476 wizyt
0 głosów
0 odpowiedzi 246 wizyt

92,775 zapytań

141,703 odpowiedzi

320,571 komentarzy

62,111 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...