Schemat Hornera w C

0

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.

0

Popraw kod C++ tak by się skompilował jako C. Nie jest to takie trudne. Nikt nie zrobi tutaj zadania za Ciebie.

0

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.

0

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ł.

0

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 :(

0

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.

1

Bez kompilowania kodu:

  1. Źle używasz scanf (we wszystkich przypadkach) oraz printf (tam gdzie wyświetlasz coś innego niż napis). Poczytaj dokumentację tych funkcji !
  2. W C zamiast new/delete musisz użyć malloc/free. Używa się ich inaczej niż new/delete - przeczytaj dokumentację !
  3. W złym miejscu deklarujesz zmienną lokalną i (wiersz 5).
  4. W funkcji main używasz zmiennej i ale jej nie zadeklarowałeś

1 użytkowników online, w tym zalogowanych: 0, gości: 1