paulo1205
(usa Ubuntu)
Enviado em 16/09/2017 - 07:32h
O erro indicado acima pelo nosso colega “apostasia” poderia ser percebido se você instruísse o compilador a fazer diagnóstico de código. Se você usar o GCC como compilador, recomendo que use as seguintes opções de diagnóstico:
-Wall -Werror -O2 -pedantic-errors .
Além do mais, considere os seguintes problemas secundários no seu programa:
– Procure usar nomes de variáveis mais significativos.
n1 e
n2 sugerem que são dois dados do mesmo tipo, mas, na verdade, um mede dinheiro e o outro mede tempo. Assim sendo, considere usar nomes como
salario_base e
meses_trabalhados (ou, se você não quiser digitar nomes longos, alguma abreviatura, mas que preserve o sentido da coisa).
– Por falar em sentido, qual o sentido de somar o salário base com o número de meses e dividir essa soma por doze? Será que você não quis dizer algo como
salario_13=salario_base*meses_trabalhados/12 (note o produto em vez de soma)?
– Tem certeza de que você quer que suas variáveis representem apenas valores inteiros? Os salários, tanto o base quanto o calculado, não podem ter centavos? Se o funcionário trabalhar apenas nos últimos dez dias do ano (menos do que um mês inteiro), isso não conta para o cálculo do 13º? Parece-me que você deveria usar valores em ponto flutuante, em vez de inteiros.
– Acostume-se a colocar as quebras de linha
ao final das strings de formatação (a não ser que você queira que o próximo texto a ser impresso ou digitado fique na mesma linha). Entre outras razões, existe o fato de que a saída padrão usa buffer orientado a linha, o que significa que o texto ficará retido, sem ser impresso, até que aconteça uma das seguinte possibilidades:
- o programa envie um caráter de fim de linha (
'\n' ) (se essa marca só vier no início da próxima linha, a mensagem só será exibida no momento em que o programa mandar imprimir essa outra linha);
- se a próxima operação for uma operação de leitura do terminal (mas a mensagem ficará retida até essa operação de leitura iniciar);
- se você forçar a escrita, mesmo sem quebra de linha, por meio da função
fflush ();
- se o programa terminar sem erros (porque
fflush () é chamada implicitamente quando o programa termina sem erros).
– O padrão do C prescreve duas alterativas para declarar a função
main (): ou como “
int main(void) ”, se você não quiser que o programa receba argumentos vindos do sistema operacional, ou como “
int main(int argc, char **argv) ”, caso você queira receber argumentos vindos do SO (no caso,
argc será um contador da quantidade de argumentos, e
argv é um vetor de strings, em que cada elemento corresponde a um argumento distinto; por convenção, o nome usado para invocar o programa fica guardado em
argv[0] ). A forma que você usou, “
int main() ”, significa que a função pode ser chamada com qualquer quantidade de argumentos de quaisquer tipos de dados (e.g. você poderia, dentro do seu programa escrever algo como
main(3.14159265) ou
main(main, printf, scanf, NULL) ), e é aceita por compatibilidade com código antigo. Como seu código não é antigo, prefira ficar com o que o padrão preconiza.
– Lembre-se de que as funções de leitura (principalmente
scanf (), que é muito complexa) podem falhar. Acostume-se a verificar se elas foram bem sucedidas (alguns sistemas, como o Debian e o Ubuntu, inclusive exigem isso, não deixando programa compilar sem alarmes se você omitir o tratamento da sinalização de erros feita pela função).
Eis como eu reescreveria seu programa, considerando as dicas acima.
#include <stdio.h>
int main(void){
double salario_base, salario_13, n_meses;
printf("Digite o valor do salário mensal (em reais): ");
if(scanf("%lf", &salario_base)!=1)
goto erro_de_leitura;
printf("Digite a quantidade de meses trabalhados: ");
if(scanf("%lf", &n_meses)!=1)
goto erro_de_leitura;
salario_13=salario_base*n_meses/12.0;
printf ("\nSeu décimo-terceiro salário é de R$%0.2f.\n", salario_13);
return 0; /* Sai indicando sucesso. */
erro_de_leitura:
fprintf(stderr, "\nErro de leitura. Abortando o programa.\n");
return 1; /* Sai indicando falha. */
}