Strona 1 z 2

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:15
autor: kuna12345
Program ma wyświetlać 11 liczb naturalnych liczący ich silnie i wyświetlać wynik na konsoli. Zrobiłam (źle) za pomocą pętli, czy ktoś wie jak zrobić to poprawnie ?
Należy stworzyć program, który pobierze od użytkownika 11 liczb naturalnych i zapisze je w tablicy. Następnie dla każdej z tych liczb należy obliczyć wartość silni. Obliczanie silni ma być zaimplementowane z użyciem funkcji. Oblicz one wartości silni mają zostać wyświetlone na konsoli.
Jeżeli temat się powtarza to najmocniej przepraszam.

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:22
autor: Kacperdev
Pokaż co zrobiłaś.

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:27
autor: kuna12345

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
    int main ()
    {
        int n=11;
        int tab[n];
        int silnia;
        printf ("Podaj 11 liczb naturalnych:
");
        scanf ("%d",&n);
    for (n=0;n<=tab[11];n++)
    {
        silnia=silnia*n;
    }
    printf ("Silnia liczby %d wynosi %d:
",n,silnia);
    return 0;
}

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:32
autor: matinf
Pomijając masę błędów w kodzie, domyślam się pewnie, że chodzi o rekurencyjną funkcję silni. Acz wydajniejsze pamięciowo jest iteracyjne;

Kod: Zaznacz cały

int silnia(int n)
   if(i==1)   return 1;
   else return n * slinia(n-1)

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:35
autor: Althorion
Warto pamiętać, że nawet najdłuższy typ całkowity, unsigned long long int, gwarantuje tylko 64-bitową zmienną, a już \(\displaystyle{ 21! > 2^{64}-1}\). Jeśli musisz pisać w standardzie C sprzed 1999 roku (bo wtedy ten typ został wprowadzony), to najdłuższym typem całkowitym będzie co najmniej 32-bitowy unsigned long int, gdzie limit jest jeszcze ostrzejszy: \(\displaystyle{ 13! > 2^{32}-1}\).

Można oczywiście skorzystać z biblioteki dużych liczb (np.

Kod: Zaznacz cały

https://gmplib.org/
), ale to pewnie wykracza poza zakres ćwiczenia.

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:46
autor: Kacperdev
Właściwie ze swieca szukać co w tym kodzie jest ok . Wydaje mi się, że go w ogóle nie rozumiesz.
1.

Kod: Zaznacz cały

int n=11;
int tab[n];
tak niewolno. Jezli nie deklarujesz dynamicznej tablicy rozmiar musi byc jednoznacznie okreslony tzn.

np.

Kod: Zaznacz cały

int tab[11];
2.

Kod: Zaznacz cały

for (n=0;n<=tab[11];n++)
zastanow sie nad senem warunku.

Na razie tyle.

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:55
autor: Althorion
Kacperdev, od 1999 roku już można deklarować tablice o rozmiarze zadanym zmienną. To rozszerzenie nosi nazwę .

[C] Obliczanie silni liczb

: 18 mar 2014, o 22:58
autor: Kacperdev
Hm... dziwne, bo uczono mnie inaczej i VS 2012 krzyczy jak tak próbuje.

[C] Obliczanie silni liczb

: 18 mar 2014, o 23:03
autor: Althorion
Bo VS 2012 . Ot, nie zauważyli pewnie, mało czasu minęło . Stąd i w poprzedniej wiadomości (tej o zakresie zmiennych) podkreślałem konieczność zgodności kompilatora, bo to w przypadku dzieła Microsoftu niestety nie chce być oczywiste. Dopiero w wersji 2013 to poprawili. Wikipedia ma , jeśli to kogoś interesuje.

[C] Obliczanie silni liczb

: 18 mar 2014, o 23:05
autor: Kacperdev
No proszę, dobrze wiedzieć. Chyba dlatego wolę matematykę. Tam zasady tak szybko sie nie zmieniają .
Chyba starczy offtopa.

[C] Obliczanie silni liczb

: 19 mar 2014, o 09:07
autor: kuna12345
Wiem że ten kod który napisałam jest tragiczny ale dopiero się uczę więc proszę o wyrozumiałość i cierpliwość

[C] Obliczanie silni liczb

: 19 mar 2014, o 17:01
autor: Althorion
Program ten powinien składać się z trzech części:
1. Pobierania danych od użytkownika i zapisywania ich w tablicy.
2. Obliczania silni dla danych z tablicy.
3. Wyświetlania elementów tablicy.

Zacznijmy od pierwszego punktu. Spróbuj napisać go, przy użyciu pętli for. Sprawdzimy Ci to i poprawimy ewentualne błędy.

[C] Obliczanie silni liczb

: 19 mar 2014, o 17:09
autor: MichalPWr
Kacperdev pisze:

Kod: Zaznacz cały

int n=11;
int tab[n];
tak niewolno. Jezli nie deklarujesz dynamicznej tablicy rozmiar musi byc jednoznacznie okreslony tzn.
Autor miał chyba na myśli dyrektywę preprocesora.

Kod: Zaznacz cały

.
.
#define ROZMIAR_TABLICY 11
.
.
.
int tab[ ROZMIAR_TABLICY ];
.
.
.

[C] Obliczanie silni liczb

: 20 mar 2014, o 23:18
autor: Kacperdev
Przykładowy kod:

Kod: Zaznacz cały

#include <stdio.h>
#include <conio.h>

#define TABLICA 11

long silnia(int a);


int main()
{
	int tab[TABLICA];
	
	for(int i=0;i<TABLICA;++i) scanf("%d",&tab[i]);
	for(int i=0;i<TABLICA;++i) printf("Silnia z %d wynosi: %d 
",tab[i],silnia(tab[i]));

	getch();
	return 0;
}


long silnia(int a)
{
	if (a==0) return 1;
	else return a*silnia(a-1);
}

[C] Obliczanie silni liczb

: 22 mar 2014, o 14:40
autor: Gouranga
Kacperdev, niepotrzebnie mieszasz oddzielając nagłówek funkcji od ciała