Bom, no main
você fez isso:
printf("\nFatorial calculado: %d", fat);
Ou seja, está usando uma variável fat
que não foi declarada. Até existe uma variável fat
, mas ela está dentro da função fatorial_x
(ela só existe lá dentro, mas no main
ela não é vista). Então na verdade você precisa chamar a função, para que o cálculo seja feito.
Outra coisa que eu faria é separar as responsabilidades: a função deveria ser responsável apenas pelo cálculo, e a leitura do valor deveria ficar fora dela. Resumindo, ficaria assim:
int fatorial_x(n) {
int fat = 1; // ATENÇÃO: tem que inicializar a variável, senão ela começa com um valor qualquer
for (int i = 2; i <= n; i++)
fat *= i;
return fat;
}
int main () {
int n;
printf("Insira um valor para o qual deseja calcular seu fatorial: ");
scanf("%d", &n);
printf("\nFatorial calculado: %d", fatorial_x(n));
return 0;
}
No for
eu começo em 2, pois não tem porque multiplicar por 1: qualquer número multiplicado por 1 é igual a ele mesmo, então posso pular este passo desnecessário e começar direto no 2.
Eu também mudaria o nome da função para simplesmente fatorial
, pois ela não calcula somente o fatorial de x
, e sim de qualquer número (esse x
no nome não acrescenta nada).
Depois, se quiser calcular x! + y! + z!
, é só reaproveitar a função:
int fatorial(n) {
int fat = 1; // ATENÇÃO: tem que inicializar a variável, senão ela começa com um valor qualquer
for(int i = 2; i <= n; i++)
fat *= i;
return fat;
}
int main () {
int x, y, z;
printf("Valor de x: ");
scanf("%d", &x);
printf("Valor de y: ");
scanf("%d", &y);
printf("Valor de z: ");
scanf("%d", &z);
printf("\nx! + y! + z!= %d", fatorial(x) + fatorial(y) + fatorial(z));
return 0;
}
Ao contrário do que sugeriram acima, não use recursão. Entendo que fatorial é muito usado para ensinar recursão (pois a definição matemática é recursiva e de fato fica mais “didático” usá-lo como exemplo), mas o que esquecem de mencionar é que a implementação recursiva é bem pior que um loop simples (por fazer várias chamadas de função à toa, etc).
Recursão é um recurso interessante e tal, mas para casos como esse, um loop simples é a melhor solução.