Nie musisz używać zmiennych globalnych, żeby wywołać funkcję.
Wczytujesz dane do zmiennej globalnej x (Twój program to przykład, dlaczego powinno unikać się zmiennych globalnych), która jest typu long double. Następnie wywołujesz funkcję silnia i podajesz argument (typu int) przez wartość (tracisz dane; 8 bajtów -> 4 bajty). W tej funkcji zwracasz również inta, więc najzwyczajniej w świecie korzystasz z inta przy wyliczaniu silnii, a nie z long double'a, jak myślałeś (czy kompilator nie pokazał ostrzeżeń?). Deklaruj zmienne, żeby były o najmniejszym możliwym zasięgu (jeżeli używasz zmiennej tylko w funkcji - deklaruj w funkcji; jeżeli w pętli - to na przykład w nagłówku pętli for, itd.). Zasięg lokalny jest nie jako ważniejszy; "przykrywa" nazwy z większego zasięgu. w Twoim wypadku zmienna automatyczna int x jest ważniejsza od long double x.
Miejscem, gdzie w programie jest największy problem to typ zwracany i typ przyjmowany przez funkcję silnia. Funkcja przyjmuje liczbę typu long double jako zwykłego inta, a także zwraca zwykłego inta.
How to fix that?
#include <iostream>
#include <windows.h>
#include <iomanip>
using namespace std;
long double silnia(long double x)
{
if(x<2) return x;
return x*silnia(x-1);
}
int main()
{
// nie ma sensu, zeby te zmienne byly globalne
long double x;
int z
do{
cout << "Podaj cyfre silni" << endl;
cin>>x;
cout<<setprecision(99999)<<silnia(x);
cout<<"\nCzy chcesz kontynuowac?\n";
cout<<"1.Kontynuuj\nInna liczba: zakoncz\n";
cin>> z;
if(z!=1)
{
return 0;
}
system("cls");
}while(z=1);
}
Wystarczy (z dobrym nawykiem) zmienić miejsce deklaracji zmiennych x i z, a także zmienić typ zwracany przez funkcję silnia, jak i typ przyjmowany jako argument. Teraz ze zmiennej long double x, która jest zadeklarowana w funkcji main używasz tylko do wczytania danych, a następnie do przekazania do funkcji silnia argumentu przez wartość. Funkcja ta przyjmuje daną jako long double (teraz nic nie tracimy), wykonuje stosowne obliczenia i zwraca dane typu long double (yaay, znowy nic nie tracimy).