leandro.diadema
(usa Slackware)
Enviado em 19/02/2009 - 12:33h
E ae cara, parabens pelo esforço!!!
Então, você tá no caminho certo, o segredo é colocar isso num laço e quando o usuário não quiser mais calcular, break!
Existem vários formas de se fazer isso, você pode escolher o modo que você pode achar mais "bonito", o importante é que todo o programa fique dentro dela, por exemplo, o começo do laço entra na linha depois da declaração da variável "menu" e o fim do laço vir depois do fim do "switch". Pode fazer isso utilizando um for:
/* iContinua recebe zero como default */
for (int iContinua = 0; iContinua == 1;)
{
/* lógica do programa aqui */
E antes de terminar o laço, pode escolher um metodo de captura para que o usuário escolha se deve continuar ou parar, esse é o meu preferido:
printf ("\n\n\tDeseja efetuar outra conta? (s/n)\n");
fflush (stdin); /* limpa o bufer da entrada padrão, do teclado, para não receber "lixo" */
/* getchar recebe um caractere da entrada padrão */
if (getchar () == 's') /* Continua o laço e começa tudo de novo */
{
iContinua = 1;
}
else /* Qualquer coisa diferente de "s" é considerado "não" como resposta */
{
iContinua = 0; /* E o laço será finalizado */
}
} /* fim do "for" */
Porém, existe um outro laço, "while" e "do while", o que acredito que com o "do while fica mais "limpo" o código:
do /* inicio do laço */
{
/* lógica do programa aqui */
printf ("\n\n\tDeseja efetuar outra conta? (s/n)\n");
fflush (stdin);
} while (getchar () == 's'); /* quando o usuário digitar algo diferente de "s", o laço termina */
Ou você pode receber a palavra "sim" e "não" e comparar a resposta dentro de um laço infinito:
while (1) /* laço infinito */
{
char acResposta[3+1];
scanf ("%s", acResposta);
if (!strncmp (acResposta, "nao", 3))
break; /* finaliza o "laço infinito" */
else if (strncmp (acResposta, "sim", 3)) /* diferente de "nao" e de "sim" */
{
printf ("\nResposta %s invalida!\n"
"\nFianlizando o programa...\n");
break;
}
}
Só explicando a linha do "if", o ponto de exclamação significa "não", que é o mesmo que: "if (0 == strncmp..." e strncmp compara duas strings do inicio até o tamanho indicado (3) retornando "0" se forem iguais, que também seria o mesmo que fazer:
if (acResposta[0] == 'n' && /* Primeira posição da str */
acResposta[1] == 'a' && /* Segunda posição da str */
acResposta[2] == 'o') /* Terceira posição da str */
... ou ...
if (*(acResposta) == 'n' &&
*(acResposta + 1) == 'a' &&
*(acResposta + 2) == 'o')
Só que aí já entra na parte de ponteiros, que é essencial em muitos programas escritos em C.
Ah! Percebi que você declarou sua função "main" como "int" [int main(int nargs, char *args[])] e não retornou nenhum valor no final do código, antes de fechar a "chave" do "main", é necessário que se dê um retorno inteiro (int) para o sistema operacional, pode ser "return 1;", "return 0;", "return 100;", etc. O importante é ser um retorno inteiro, não sei se você conhece isso, mas aí vai uma dica: no "switch case", caso o usuário entrar um uma opção inválida (diferente de 1, 2, 3 ou 4), no default poderia escrever a mensagem como já está feito e finalizar o programa com um "return -1;", caso alguém queira saber se o programa terminou bem e for olhar o retorno que ele deu para o sistema, o sistema irá responder que o retorno foi "-1", ou se o programa chegar no seu final (ocorrendo tudo bem), poderia ver que o retorno foi "0". Não sei se ficou cláro, mas tá aí. Esse esquema de retorno serve para qualquer função que criar dentro do seu código.
Espero ter ajudado, qualquer coisa estamos aqui pra isso!
Fechou!?!?