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

Wynik dzielenia wielomianów

VPS Starter Arubacloud
0 głosów
142 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)

Cześć, pisze sobie taki kalkulator wielomianowy i mam dodawanie, odejmowanie, dzielenie przez dwumian(metoda hornera) i mnożenie i zostawiłem na koniec dzielenie przez cokolwiek bo wiedziałem, że będzie najtrudniejsze no i mam napisane takie coś tylko, że to raz działa a raz program się wysypuje (częściej się wysypuje) albo np dla niektórych wielomianów np dla takich dla których wynik jest np. x^3+4 (że jest jakaś wartość dla trzeciej potęgi dla drugiej nie dla pierwszej nie i potem 4 w wyrazie wolnym) to outputem jest 1,jakieś głupoty typu nan albo jakieś duże cyfry Bozia wie skąd, 4. I chciałem zapytać jak to jest możliwe, że program nieraz dla tych samych danych wejścia działa a nieraz się sypie oraz proszę o rady co do kodu. Kod:

Oczywiście na początku pobieram od użytkownika stopnie wielomianów W(x) oraz P(x), 
następnie użytkownik wprowadza współczynniki przy danej potędze a potem wybiera
co chce zrobić, case 6 to dzielenie.
Wspolczynniki przechowuje w ten sposob, ze np dla 8x^3-6x^2+11 mam
w wWx[3]=8, wWx[2]=-6, wWx[1]=0, wWx[0]=11

case 6:
                {

                    float *WynDziel;                                      //Wyniki
                    WynDziel = new float [stopienWx-1];

                    float *Nowe;                                           //Wynik przemnozenia pierwszego wyniku 
                    Nowe = new float [stopienWx];              //przez caly wielomian P(x)

                    float *NoweNowe;                                 //To co powstaje po odjęciu Nowe[]
                    NoweNowe = new float [stopienWx];      od wielomianu

                    int pomocnicza=stopienWx;




                    for (int j=stopienWx; j>=0; j--)
                    {
                        NoweNowe[j]=wWx[j];
                    }


                    for (int i=stopienWx; i>=0; i--)
                    {
                        bool flag=false;
                    for (int n=stopienWx; n>=0; n--)
                    {
                        if (NoweNowe[n]!=0)
                        {
                            flag=false;
                        }
                        else
                        {
                            flag=true;
                        }
                    }
                    if (flag==true)
                    {
                        break;
                    }
                        if (NoweNowe[pomocnicza]!=0)
                        {
                         WynDziel[i-stopienPx]=NoweNowe[pomocnicza]/wPx[stopienPx];
                        for (int j=stopienPx; j>=0; j--)
                        {
                            Nowe[pomocnicza-stopienPx+j]+=WynDziel[i-stopienPx]*wPx[j];
                        }
                        for (int k=pomocnicza; k>=0; k--)
                        {
                         NoweNowe[k]=NoweNowe[k]-Nowe[k];
                        }
                        }
                        for (int s=stopienWx; s>=0; s--)
                        {
                            Nowe[s]=0;
                        }
                        pomocnicza--;

                    }

                    for (int b=stopienWx-1; b>=0; b--)
                    {
                        if (WynDziel[b]!=0)
                        {
                        cout<<WynDziel[b];
                        cout<<",";
                        }
                    }
                }
                break;

 

1
komentarz 30 maja 2020 przez 10kw10 Pasjonat (22,880 p.)
zmienne nazywaj po angielsku i przede wszystkim zawieraj w nich sens zmiennej zamiast pisac obok komentarz do czego sluzy: *WynDziel -> results. I pisz camelCasem
komentarz 30 maja 2020 przez lujasjeden Użytkownik (860 p.)
ok dzieki za rady, a cos na temat jak to jest mozliwe ze kod dla tych samych danych nieraz dziala a nieraz sie wysypuje?
komentarz 30 maja 2020 przez 10kw10 Pasjonat (22,880 p.)

nie wiem, zdebuguj, na pierwszy rzut oka znalazlem taki blad

float *NoweNowe;                                 //To co powstaje po odjęciu Nowe[]
NoweNowe = new float [stopienWx];      od wielomianu
int pomocnicza=stopienWx;
 
for (int j=stopienWx; j>=0; j--)
{
   NoweNowe[j]=wWx[j];
}

wychodzisz tutaj poza zakres tablicy, ostatni elemnt to zawsze rozmiar - 1

komentarz 30 maja 2020 przez lujasjeden Użytkownik (860 p.)
Nie wychodze bo dla kazdego wielomianu mam o 1 tablice wiecej niz jego potega tzn dla x^5 mam 6 tablic od 0-5 gdzie w zerowej przechowuje wyraz wolny w pierwszej x w drugiej x^2 w trzeciej ^3 w czwartej x^4 w piatej x^5. Jak się debuguje?
komentarz 30 maja 2020 przez lujasjeden Użytkownik (860 p.)

@10kw10, ok ogolnie to naprawilem juz, kalkulator liczy dobrze teraz, (bylo pare glupich bledow w kodzie) z tym, ze co jakis czas sie wysypuje np policze 2 razy i jak wprowadzam dane do trzeciego dzialania to sie losowo sypie, nie wiem dlaczego, i nie wiem jak sie zabradz za debugowanie bo jak klikne w codeblocks na debug na ta czerwona strzalke to mam:

You need to specify a debugger program in the debuggers's settings. I w sumie nie znam sie na tym i nie wiem co zrobic

komentarz 31 maja 2020 przez 10kw10 Pasjonat (22,880 p.)
pewnie musisz wejsc w ustawienia i ustawic. Nie wiem jak mam Ci pomoc jesli chodzi o te crashe, nie widze calego kodu, moze nie usuwasz tablicy, ktorej stworzyles? Mozesz tez wypisac sobie logi w konsoli, co, kiedy sie dzieje i co sie zapisuje i jak.
komentarz 31 maja 2020 przez lujasjeden Użytkownik (860 p.)
no rozumiem, calego kodu nie bede wklejal bo to 1000 linijek a duzo z tego to kosmetyka aby sie wynik ladnie wyswietlal a nie same cyfry, napisales ciekawa rzecz o usuwaniu tablicy ktore stworzylem, chodzi o to ze powinienem usuwac dynamicznie zalokowane tablice za kazdym razem jak juz ich nie uzywam?, tzn ze jak obliczylem jeden wynik i licze drugi? (Bo mam to w nieskonczonej petli zeby sie nie konsola nie zamykala po obliczeniu jednej rzeczy)
komentarz 31 maja 2020 przez 10kw10 Pasjonat (22,880 p.)
tak, jesli alokujesz kolejna, to ta wczesniejsza powinienes usunac, dodaj po prostu na koniec petli usuniecie tej tablicy

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 252 wizyt
0 głosów
0 odpowiedzi 959 wizyt
pytanie zadane 13 września 2019 w C i C++ przez Screen45 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 718 wizyt
pytanie zadane 1 lutego 2018 w Python przez Kamil Maciantowicz Nowicjusz (160 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...