Cześć, jestem laikiem w programowaniu, a mój nauczyciel nie potrafi uczyć. Potrzebowałbym schematu Hornera napisanego w C. W necie jedyne co to mogłem znaleźć w C++ bo jak widać C wychodzi z użytku. Jeśli mógłby ktoś coś takiego napisać byłbym bardzo wdzięczny, z góry dzięki.
Popraw kod C++ tak by się skompilował jako C. Nie jest to takie trudne. Nikt nie zrobi tutaj zadania za Ciebie.
Tu Masz w pseudokodzie (Python): https://github.com/lion137/Fundamental_Algorithms/blob/master/divsion.py
Przepisanie do C będzie trywialne, jako bonus dzielenie modulo i gcd dla wielomianów.
Tutaj taki kod. Brzydko to napisałem, ale działa.
Przekazujesz do funkcji zwrocWielomian
najpierw stopień wielomianu, następnie współczynniki. Modyfikuj tylko dzielną i dzielnik, reszta sama się wypełnia.
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
struct Wielomian
{
int stopien;
int wspolczynniki[20];
};
struct Reszta
{
int reszta;
};
struct Wielomian zwrocWielomian(int st, ...);
void podziel(const struct Wielomian * podzielTo, const struct Wielomian * przezTo, struct Wielomian * wynik, struct Reszta * reszta);
void wyswietlWielomian(const struct Wielomian * w);
int main(void)
{
struct Wielomian dzielna = zwrocWielomian(2, 1, -2, 1); // x^2 - 2x + 1
struct Wielomian dzielnik = zwrocWielomian(1, 1, -1); // x - 1
struct Wielomian wynik = zwrocWielomian(1, 0); // 0
struct Reszta reszta = {0};
podziel(&dzielna, &dzielnik, &wynik, &reszta);
return 0;
}
struct Wielomian zwrocWielomian(int st, ...)
{
struct Wielomian wynik = {-1, {0}};
int i = 0;
if (st < 0 || st > 19)
return wynik;
wynik.stopien = st;
va_list valist;
va_start(valist, st + 1);
for (i = st; i >= 0; --i)
wynik.wspolczynniki[i] = va_arg(valist, int);
va_end(valist);
return wynik;
}
void podziel(const struct Wielomian * podzielTo, const struct Wielomian * przezTo, struct Wielomian * wynik, struct Reszta * reszta)
{
int stopien = podzielTo->stopien - przezTo->stopien;
struct Wielomian w = {stopien, {0}};
int i = 0;
int wyrazWolny = -(przezTo->wspolczynniki[0]); // (x - wyrazWolny)
if (stopien < 0 || przezTo->stopien != 1)
{
printf("Wielomian, przez ktory chcesz podzielic, jest stopnia != 1\n"
"Lub stopien po podzieleniu jest ujemny (zbyt niska najwyzsza potega dzielnej)");
*wynik = w;
reszta->reszta = 0;
return;
}
for (i = podzielTo->stopien; i > 0; --i)
w.wspolczynniki[i - 1] = (i == podzielTo->stopien) ?
(podzielTo->wspolczynniki[i]) :
(w.wspolczynniki[i] * wyrazWolny + podzielTo->wspolczynniki[i]);
*wynik = w;
reszta->reszta = wynik->wspolczynniki[0] * wyrazWolny + podzielTo->wspolczynniki[0];
wyswietlWielomian(podzielTo);
printf(" / ");
wyswietlWielomian(przezTo);
printf(" = ");
wyswietlWielomian(wynik);
printf(" r. %d", reszta->reszta);
}
void wyswietlWielomian(const struct Wielomian * w)
{
int i = 0;
char znak = ' ';
for (i = w->stopien; i >= 0; --i)
{
znak = (w->wspolczynniki[i] >= 0) ? '+' : '-';
printf(" %c%dx^%d", znak, abs(w->wspolczynniki[i]), i);
}
}
Powodzenia.
Michał.
Tu jest w C++ , na C to nie powinno być problemów z przepisaniem.
http://www.algorytm.edu.pl/algorytmy-maturalne/schemat-hornera.html
Jeżeli nie potrafisz zmienić kod C++ na C, to już nie mój problem :(
Nie potrafię, w tym rzecz niestety. Wydawało mi się że mógłbym to zrobić, ale program wyrzuca błąd. Udało mi się coś takiego zrobić: https://pastebin.com/Fg0CvhYq
@Pawel Jaczewski Nie potrafisz skompilować tego jako kod C? Sprawdź czym różni się C++ od C. W twoim kodzie są to dwa miejsca.
https://www.geeksforgeeks.org/difference-between-c-and-c/
Jest tam wymienione słowo kluczowe, które masz w kodzie.
Bez kompilowania kodu:
- Źle używasz scanf (we wszystkich przypadkach) oraz printf (tam gdzie wyświetlasz coś innego niż napis). Poczytaj dokumentację tych funkcji !
- W C zamiast new/delete musisz użyć malloc/free. Używa się ich inaczej niż new/delete - przeczytaj dokumentację !
- W złym miejscu deklarujesz zmienną lokalną i (wiersz 5).
- W funkcji main używasz zmiennej i ale jej nie zadeklarowałeś