Skocz do zawartości
dj_tej

C - Problem Ze Zwracaniem

Rekomendowane odpowiedzi

mam do wykonania funkcje ktora rozwiazuje rownianie kwadratowe i zwraca jego rozwiazania... probowalem to zrobic przy pomocy tablicy.... no nie wychodzi mi to jakos... :/ moze mi pomozecie i wskarzecie bledy... z gory dzieki

 

 

oto jaki kod wymodzilem w dev-cpp

#include <stdio.h>#include <math.h>float pierwiastki (float x, float y, float z){float a;float b; float c;float x1, x2, delta;float tab_rozw[2];printf ("podaj wspolczynnik a:"); scanf ("%f", &a);printf ("podaj wspolczynnik b:"); scanf ("%f", &b);printf ("podaj wspolczynnik c:"); scanf ("%f", &c);	if (a==0) //równanie liniowe bo a=0	{	x1=(-c)/b;	tab_rozw[0]=x1;	}	else //równanie kwadratowe		{		delta=b*b-4*a*c;		if (delta==0) // jeden pierwiastek			{			x1=x2=-b/(2*a);			tab_rozw[0]=x1;			}		else			{			if (delta<0); //brak rozwiazan			else //dwa pierwiastki				{				x1=(-b-sqrt(delta))/(2*a);				x2=(-b+sqrt(delta))/(2*a);				tab_rozw[0]=x1;				tab_rozw[1]=x2;				}			}		}return tab_rozw;}
Edytowane przez dj_tej

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ale to ma byc funkcja :) main to sie chyba daje jak sie pisze glowny program?:> zrestza juz troche zmienilem. wczytywanie abc jest poza funkcja.. bo tak powinno byc ;p deklaracje abc tez wywalilem bo to sie robi w glownym programie ;p

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

float pierwiastki (float x, float y, float z){(..)float tab_rozw[2]; (...)return tab_rozw;}
Jak widać typ nie zgadza się z tym co zwracasz ?

zrób lepiej to w taki sposób

 

/** * Funkcja zwraca liczbę znalezionych pierwiastków * @param a współczynnik przy x^2  * @param b współczynnik przy x * @param c wyraz wolny * @param tab_rozw - tablica 2 elementowa w której zapiszesz sobie rozwiązania * @return Liczba pierwiastkół równania ax^2+bx+c = 0 */int pierwiastki (float a, float a, float a,float* tab_rozw);
To jest prototyp , ciało funkcji chyba umiesz zmajstrować ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

btw pytanie poczatkujacego: to da sie przekazac tablice poza funkcje w ktorej sie ja zdefiniowalo? nie powinno sie ja zdefiniowac "pietro wyzej" w strukturze programu?

Jeżeli utworzyłeś zmienną, tablicę etc. w funkcji to poza nią one nie będą funkcjonować. Odwołanie do nich spowoduje błąd. Zresztą kompilator tego nie przepuści.

 

Zmienne utworzone pomiędzy { } // klamrami funkcjonują tylko w tym bloku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nom, rozumiem. rozszerzam pytanie: czy wiec mozna zwrocic cala tablice zdeklarawana wewnatrz funkcji poprzez return tak jak kolega na samej gorze zrobil? bo wg mnie nie

Pytanie za 100 punktów - a gdzie ja twierdzę że zwracam tablicę ,przecież funkcja zwraca int-a <_<

Ja i kompilator GCC twierdzimy że można odwołać się do tablicy poprzez wskaźnik na jej pierszy element , np.

 

int main(int argc,char** argv){float wyniki[2];float wsp[3];int k;(...) // Wczytanie danychk= pierwiastki (wsp[0],wsp[1],wsp[2],wyniki);  if (0==k)   printf("Brak rozwiązań")else	for(int i=0;i<k;i++)	   printf("%f \n",wyniki[i]);return 0;}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

najlepsza w tym zabawa ze funkcja ma zwrac obydwa pierwiastki naraz... :/ czyli chyba bez struktury sie nie obejdzie :/

 

haguim troskze nie rozumeim twojego prototypu ;p

Edytowane przez dj_tej

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

najlepsza w tym zabawa ze funkcja ma zwrac obydwa pierwiastki naraz... :/ czyli chyba bez struktury sie nie obejdzie :/

haguim troskze nie rozumeim twojego prototypu ;p

3 pierwsze parametry to współczynniki równania

ostatni to tablica w której zapiszesz rozwiązania nim zwrócisz liczbę pierwiastków

tablicę z buforem przekażesz jako wskaźnik na jej 1 element dzięki temu będziesz mógł zapisać pierwiastki a po powrocie z funkcji będziesz mógł je odczytać tak jak to jest w moim przykładzie z funkcja main

 

Albo przepisz taki bloczek kodu

#include<stdio.h>float f(float *wsk,float a){  wsk[0]=a*a;  return a*wsk[0];}int main(){   float a,b,c;scanf("%f",&a); b = f(&c,a);  printf("b=%f c=%f",b,c);  getchar();  getchar();  return 0;}

Teraz może łatwiej będziesz mógł zrozumieć o co chodzi w przkazywaniu wskaźników w funkcjach w C

Edytowane przez Haquim

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

o cos takeigo ci chodzilo haguim? bo jak nie to padaczke mam dalej:

#include <stdio.h>#include <math.h>float * pierwiastki (float a, float b, float c, float *tab  ){float x1, x2, delta;float tab_rozw[2];	if (a==0) //równanie liniowe bo a=0	{	x1=(-c)/b;	tab_rozw[0]=x1;	}	else //równanie kwadratowe		{		delta=b*b-4*a*c;		if (delta==0) // jeden pierwiastek			{			x1=x2=-b/(2*a);			tab_rozw[0]=x1;			}		else			{			if (delta<0); //brak rozwiazan			else //dwa pierwiastki				{				x1=(-b-sqrt(delta))/(2*a);				x2=(-b+sqrt(delta))/(2*a);				tab_rozw[0]=x1;				tab_rozw[1]=x2;				}			}		}return 0;}int main(int argc,char** argv){float wyniki[2];float wsp[3];int k;printf ("podaj wspolczynnik a:"); scanf ("%f", &wsp[0]);printf ("podaj wspolczynnik b:"); scanf ("%f", &wsp[1]);printf ("podaj wspolczynnik c:"); scanf ("%f", &wsp[2]);k= pierwiastki (wsp[0],wsp[1],wsp[2],wyniki);  if (0==k)   printf("Brak rozwiązań");else	for(int i=0;i<k;i++)	   printf("%f \n",wyniki[i]);return 0;}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

o cos takeigo ci chodzilo haguim? bo jak nie to padaczke mam dalej:

Masz prawie padaczkę ;) chodziło o coś takiego :

#include <stdio.h>#include <math.h>int pierwiastki (float a, float b, float c, float *tab_rozw  ){float x1, x2, delta;	if (a==0) //równanie liniowe bo a=0 , a co jeśli b =0 ?	{		 		  if (b==0)		  {			 if (c==0)				return -1;			else 			   return 0;		  }		  else		  {			tab_rozw[0]=(-c)/b;				return 1; 		  }	}	else //równanie kwadratowe		{		delta=b*b-4*a*c;		if (delta==0) // jeden pierwiastek			{			tab_rozw[0]=-b/(2*a);						return 1;			}		else			{			if (delta<0)							   return 0; //brak rozwiazan			else //dwa pierwiastki				{				tab_rozw[0]=(-b-sqrt(delta))/(2*a);				tab_rozw[1]=(-b+sqrt(delta))/(2*a);								return 2;				}			}		}}int main(int argc,char** argv){float wyniki[2];float wsp[3];int k;printf ("podaj wspolczynnik a:"); scanf ("%f", &wsp[0]);printf ("podaj wspolczynnik b:"); scanf ("%f", &wsp[1]);printf ("podaj wspolczynnik c:"); scanf ("%f", &wsp[2]);k= pierwiastki (wsp[0],wsp[1],wsp[2],wyniki);  if (0==k)   printf("Brak rozwiązań");else if (k<0)   printf("Równanie tożsamościowe");else	for(int i=0;i<k;i++)	   printf("%f \n",wyniki[i]);return 0;}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...