Program znajdujący rozwiązania równania kwadratowego

0

Witam, mam do zrealizowania pewne zadanie. Jest on dość błahe ale jestem na razie na początkowym etapie poznawania języka C. Mianowice chodzi o napisanie programu liczącego pierwiastki równania kwadratowego. Delta oraz pierwiastki mają być obliczane w funkcjach które uruchamiane będą za pomocą wskaźników funkcji. Poniżej zamieszczam kod - funkcja "roots" nie jest jeszcze skończona dla wszystkich przypadków:

#include <stdio.h>
#include <math.h>

float delta(float a, float b, float c)
{
	return(b*b-4*a*c);
}


float roots(float a, float b, float del)
{
	if(del>0)
	{
		return (-b-sqrt(del))/(2*a);
	}	
}


int main()
{
	float a,b,c;
	float (*pFUN)(float a, float b, float c);
	
	printf("Podaj wspolczynniki rownania kwadratowego:\n");
	printf("a = ");
	scanf("%f",&a);
	printf("b = ");
	scanf("%f",&b);
	printf("c = ");
	scanf("%f",&c);
	
	pFUN=delta;
	printf("Delta: %f",pFUN(a,b,c));
	
	//pFUN=roots;
	//printf("Pierwiastek to: %f",pFUN(a,b,c));
		
}

I tutaj pojawia się moje pytanie. Czy jest jakaś możliwość aby argumentem zakomentowanego wskazania na funkcje roots był rezultat wskazania na funkcje delta (bez deklaracji dodatkowych wskaźników czy zmiennych):

printf("Pierwiastek to: %f",pFUN(a,b,pFUN(a,b,c))); --> gdzie pFUN(a,b,c) to rezultat pFUN=delta;

Rozumiem że mógłbym to zrobić deklarując w funkcji main dodatkową zmienną np.:

float del;
pFUN=delta;
del = pFUN(a,b,c);

i finalnie:

pFUN=roots;
printf("Pierwiastek to: %f",pFUN(a,b,pFUN(a,b,del)));

ale chciałbym się dowiedzieć czy można to zrobić w sposób który opisałem wcześniej bez deklaracji zmiennej i przy wykorzystaniu tylko jednego wskaźnika tj. pFUN?

2

Totalnie nie rozumiem, co chcesz osiągnąć, po co ci tu jakieś wskaźniki na funkcję ani dlaczego funkcja roots zwraca jedną wartość i tylko gdy Δ > 0 (gdy Δ=0 jest jeden pierwiastek przecież). W C, printf nie wyświetli ci kilku wartości na raz. Mógłbyś napisać coś więcej, co jak i dlaczego?

0
elwis napisał(a):

Totalnie nie rozumiem, co chcesz osiągnąć, po co ci tu jakieś wskaźniki na funkcję ani dlaczego funkcja roots zwraca jedną wartość i tylko gdy Δ > 0 (gdy Δ=0 jest jeden pierwiastek przecież). W C, printf nie wyświetli ci kilku wartości na raz. Mógłbyś napisać coś więcej, co jak i dlaczego?

Tak jak napisałem. Funkcja roots nie ma jeszcze wszystkich przypadków, nie jest skończona. I tak, jestem świadom, że dla
Δ > 0 powinny być dwa rozwiązania. Nie kończyłem tej funkcji gdyż skupiłem się na zrozumieniu wskaźników funkcji - aby je zrozumieć dla tego jedynego przypadku (celowo dałem tylko jedno rozwiązanie). Dla mnie to zadanie też nie ma większego sensu, nie używałbym wskaźników. No ale takie dostałem polecenie - delta i pierwiastki mają być obliczane w funkcjach, które uruchamiane są za pomocą wskaźników.

I tutaj zrodziło się moje pytanie podczas tworzenia programu. Czy mogę zagnieździć w jakiś sposób wskaźnik we wskaźniku czyli pFUN(a,b,pFUN(a,b,c)) gdzie wewnętrzny wskaźnik wskazuje na funkcje delta, a zewnętrzny na funkcję roots tak aby rezultatem powyższego czylipFUN(a,b,pFUN(a,b,c)) był pierwiastek/pierwiastki lub ich brak?

1
typedef float FUN(float a, float b, float c);
FUN *pdelta=&delta,*proot=&root;
printf("Pierwiastek to: %f",pdelta(a,b,proot(a,b,del)));
3

Tak podejrzewałem, że jakiś nauczyciel miał fajny nieżyciowy pomysł. Jak rozumiem, chodzi ci o coś takiego?

typedef float (*DeltaFun)(float a, float b, float c);
typedef float (*RootFun)(float a, float b, float c, DeltaFun df));

Dopisałem float c do RootFun, bo jak rozumiem funkcja delta ma być wywoływana w funkcji root, więc musi mieć wszystkie parametry.

2

Podaj może treść zadania (dokładną, bez Twoich interpretacji), bo mocno podejrzewam że na tym etapie nikt nie chce od Ciebie wskaźników na funkcje, a użycia wskaźników do tego żeby w C zwrócić z funkcji więcej niż jedną wartość...

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