paulo1205
(usa Ubuntu)
Enviado em 25/05/2019 - 18:02h
Matheus10772 escreveu:
Na verdade, a função main não precisa ser do tipo int porque eu não preciso retornar nada.
Errado. Se o seu programa executar num sistema operacional como Linux, Windows ou MS-DOS, ou qualquer outro que caracterize que um
ambiente hspedado (
hosted environment) para o programa em C, então o padrão da linguagem (§5.1.2.2.1 do padrão de 2011, que é pago, mas cujo rascunho pode ser encontrado em
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf) determina que você tem de retornar um valor do tipo
int. E essa determinação já existia desde o primeiro padrão (de 1989).
Se o seu compilador está aceitando outra especificação, é porque eles deve estar compilando em modo permissivo (geralmente para habilitar a compilação de código obsoleto, anterior à padronização do C) e com opções de diagnóstico desabilitadas. Não tome esse caso como se fosse a regra, pois não é.
Eu recomendo fortemente que você não utilize código obsoleto. E recomendo também que você ligue o máximo de opções de diagnóstico que seu compilador tiver (se você estiver usando o compilador do GCC, indico pelo menos as opções “
-O2 -Wall -Werror -pedantic-errors”), pois elas ajudarão você a garantir que seu código vai conseguir compilar com o mínimo de dificuldades em múltiplos ambientes diferentes.
E os parenteses pode ficar vazios, escrever void dentro deles é opcional.
Não é opcional em C (poderia ser em C++, que tem uma semântica para a lista de argumentos vazias diferente da que tem o C, mas não parece que você esteja usando C++). A mesma §5.1.2.2.1 determina que você deve usar uma das formas alternativas que eu indiquei na mensagem anterior.
Em C, a lista de argumentos vazia significa que a função pode receber qualquer quantidade de argumentos de quaisquer tipos.
Com relação a função soma, eu modifiquei o código, mas ainda não consigo entender o que pode estar errado.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
float soma (float valor[], int X){
if(valor[X]==0) return 0;
Tem certeza de que o critério para interromper a recursividade depende do
valor do elemento? Não seria com base no
índice desse elemento?
return valor[X] + soma(valor[], X-1);
Esses colchetes vazios estão errados.
Eu tenho quase certeza de que o seu compilador deve ter alarmado a respeito dessa linha, indicando erro de sintaxe, não? Se sim, então existe uma indicação clara de erro que você poderia ter corrigido antes de postar o código aqui.
Duas violações da §51.2.2.1 na declaração de
main().
Aconselho-o a usar nomes mais significativos para suas variáveis, e evite usar nomes distintos entre si apenas no fato de que um usa letras minúsculas e o outro, maiúsculas, e mais especialmente quando as letras minúsculas e maiúsculas tem formatos muito parecidos, pois isso dificulta a leitura, tanto visualmente quanto semanticamente.
printf("\nDigite quantos números deseja somar ");
scanf("%d", &x);
Alguns sistemas modernos (por exemplo, todos os derivados do Debian, incluindo Ubuntu e Mint) podem reclamar do fato de você não verificar o valor de retorno de
scanf(), pelo potencial que isso abre para que uma falha de segurança e erros de execução, pois o valor da variável que deveria ter sido lida mas não foi pode ficar indefinido.
Acostume-se, portanto, a verificar o estado da entrada após o retorno de cada operação de leitura.
X=x+1;
float valor[X],resultado;
valor[0]=0;
Se você usar o índice do elemento na função
soma(), não vai precisar da gambiarra de usar um elemento a mais. Até porque, se você não conhecer antecipadamente os dados que o usuário do seu programa tiver, não deveria impedi-lo, na prática, de colocar uma das parcelas como zero.
printf("\nDigite números para somar");
for(int i=1; i<=X; i++){
Esse “
<=” está errado. Deveria ser apenas “
<”.
E se você usar o índice em lugar do valor em
soma(), pode contar de [0,
x), em lugar de [1,
X) (e pior ainda se for [1,
X], por causa do “
<=”).
scanf("%f", &valor[i]);
}
resultado=soma(valor,X);
printf("A soma é %f", resultado);
}
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)