[C], liczenie silni korzystając z pętli while

Moje zadanie brzmi:

Napisz program, który korzystajac z petli while obliczy silnie wartosci wprowadzonej z klawiatury.

Zmodyfikuj powyzszy program tak, aby zadanie liczenia silni było realizowane wewnatrz osobnej funkcji

silnia i wynik zwracany do funkcji main z uzyciem instrukcji return.

O ile pierwsza część poszła względnie łatwo, rozumiałem co pisałem, to z drugą jest słabo :smiley: Wynik to jakieś cuda na kiju+ nie umiem zastosować funkcji return.

#include 


void silnia(int i, int n, int silnia)

{	


	while(i<=n)

	{

    silnia=silnia*i;

   i=i+1;



    }	

	while(n=0){

		silnia=1;


	}

}

void main()

{

     silnia(1,1,5);


	printf("%d\n",silnia);




}

Wynik to nie cuda na kiju, tylko adres twojej funkcji.

Funkcja silnia jest u ciebie typu void, czyli nic nie zwraca. Możesz zmienić void silnia na np. int silnia i na końcu funkcji zwracać go (wynik): return jakiśwynik;.

Do poczytania: http://pl.wikibooks.org/wiki/C/Funkcje .

Nie potrzebnie dodajesz 2 argumenty. Jeśli coś zmieniasz systematycznie co krok, lepiej wychodzi robić to pętlą for. A samą silnie najlepiej zrobić rekurencją :slight_smile:

int silnia(int silnia)

{   

   int i=1,wynik=1;

   while(i<=silnia)

   {

    wynik=wynik*i;

    i=i+1;

   }

   return wynik;

}

int silnia(int silnia)

{   

   int wynik=1;

   for(int i=1;i<=silnia;wynik=wynik*i,i++);

   return wynik;

}

int silnia(int silnia)

{

	return silnia>1?(silnia*rek(silnia-1)):1;

}

A w printf możesz bez problemu sobie wywołać. Weź też pod uwagę, że nie przypisujesz zwróconej wartości do niczego. Więc robisz tak:

printf("%d\n",silnia(5));

Lub tak:

int wartosc_silnia=silnia(5);//nie możesz mieć zmiennej globalnej o tej samej nazwie co funkcja

printf("%d\n",wartosc_silnia);

Mam takie pytanie do pytającego oraz odpowiadających.

skąd pomysł: int silnia(int silnia)

Czyżby umieliście policzyć silnie od liczb ujemnych lub silnia jakieś liczby mogła być ujemna?

Czemu nie unsigned?

_bezradny.gif

Choć w sumie wtedy powstaje problem dlaczego nie użyłem typedef. Tak więc trudno powiedzieć :slight_smile:

Niby wszystko powinienem mieć w unsigned, jednak sugerując się autorem tematu powieliłem jego błąd. - taka będzie chyba najlepsza odpowiedź :))

@Alex zaskoczę cię, można nie tylko dla ujemnych, ale rzeczywistych i zespolonych

http://pl.wikipedia.org/wiki/Funkcja_%CE%93

kostek135, jakoś nie widzę tu nawet próby realizacji tego przez funkcję gama.