Estou fazendo uma calculadora de decimo terceiro salário em C,a logíca está certa,porém falta algum detalhe que ainda não percebi,veja o código do programa:
#include<stdio.h>int main (){int n1,n2,resultado;
printf ("\n Digite o seu salario:");
scanf ("%d",&n1);
printf ("\n Digite a quantidade de meses em que trabalhou:");
scanf ("%d",&n2);
resultado=(n1+n2)/12;
printf ("\n O seu decimo terceiro salario eh: %d"&resultado );return0;}
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);return0;/* Sai indicando sucesso. */
erro_de_leitura:
fprintf(stderr,"\nErro de leitura. Abortando o programa.\n");return1;/* Sai indicando falha. */}
--- salario_orig.c+++ salario.c@@-13,7+13,7@@-printf ("\n O seu decimo terceiro salario eh: %d"&resultado );+printf ("\n O seu decimo terceiro salario eh: %d", resultado );return0;}