programação [RESOLVIDO]

1. programação [RESOLVIDO]

Jorge Augusto Rabello Pinto
jorgerabello

(usa Ubuntu)

Enviado em 18/02/2009 - 16:59h

ola desenvolvi ao longo de 3 anos o seguinte cod fonte, é uma calculadora simples aprendi tudo oq está ai na raça e graças ao viva o linux conseui chegar nisso:
#include <stdio.h>
#include <stdlib.h>

/*Calculadora Simples */
/*Por Jorge Rabello*/


int main(int nargs, char *args[])
{


float result,a,b;
int menu;
system("clear"); /*executa um comando shell (limpar a tela)*/
printf("\n\tMenu\n\t[1] Somar\n\t[2] Subtrair\n\t[3] Dividir\n\t[4] Multiplicar\n\t>> ");
scanf("%d",&menu);

switch (menu)
{

case 1: printf("\n\tOpcao %d escolhida!\n",menu);

printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result= a+b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


case 2: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a -b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 3: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a/b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 4:
printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a*b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


default: printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");


}





}
Só que agora estou tentando fazer o seguinte.Cada vez que uma operação for finalizada o sistema pergunta se o usuário deseja fazer outra operação se o usuário colocar sim ele retorna la no menu e se colocar não executa o camndo break.Como posso fazer isso ?

jorge.augusto.rabello@gmail.com

Valeu


  


2. MELHOR RESPOSTA

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 26/02/2009 - 18:38h

sim, pode-se verificar o s/n através do scanf, porém evite utilizar o pattern %c para caractere. utilize o %s de string mesmo.
modifiquei seu código a fim de torná-lo mais sucinto, evitando repetições de código e sobrecarga de avaliações. além disso, eliminei o for através de um laço while infinito:

#include <stdio.h>
#include <stdlib.h>

/*Calculadora Simples */
/*Por Jorge Rabello*/

int main(int nargs, char *args[])
{

float result,a,b;
char resp;
int menu;

while(1) {
system("clear"); /*executa um comando shell (limpar a tela)*/
printf("\n\tMenu\n\t[1] Somar\n\t[2] Subtrair\n\t[3] Dividir\n\t[4] Multiplicar\n\t>> ");
scanf("%d",&menu);

if (menu >= 1 && menu <= 4) { /* o usuário escolheu uma das opções válidas */
printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);

switch (menu) {
case 1: result = a + b; break;
case 2: result = a - b; break;
case 3: result = a / b; break;
case 4: result = a * b; break; /* é boa prática colocar o break também na última avaliação do switch */
}

printf("\n\t>> Resultado: %.2f\n\n",result);
} else /* o usuário escolheu uma opção inválida */
printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");

printf ("\n\n\tDeseja efetuar outra conta? (s/n)\n");
scanf("%s",&resp); /* utilizar %c aqui pode e deverá causar memleak! */
if (resp != 's') /* se a resposta não for 's', termina. */
break; /* 'quebra' o laço while infinito */
}

return 0; /* sempre faça main retornar alguma coisa. 0 == sucesso */
}


3. Laço

Leandro Santiago de Souza
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!?!?


4. ^^

Jorge Augusto Rabello Pinto
jorgerabello

(usa Ubuntu)

Enviado em 19/02/2009 - 22:21h

Cara valeu.
Mas eu ainda sou muito cabeçudo me c/c++
Tentei fazer oq vc me disse mas retornou erros....
Oq não entendi é onde extamente tenho qu ecolocar o loop...
Pelo que eu entendi a parte 01 fica em

int main(int nargs, char *args[])
{

float result,a,b;
int menu;
/* iContinua recebe zero como default */
for (int iContinua = 0; iContinua == 1;)
{
system("clear"); /*executa um comando shell (limpar a tela)*/
printf("\n\tMenu\n\t[1] Somar\n\t[2] Subtrair\n\t[3] Dividir\n\t[4] Multiplicar\n\t>> ");
scanf("%d",&menu);

switch (menu)
{

case 1: printf("\n\tOpcao %d escolhida!\n",menu);

printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result= a+b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


case 2: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a -b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 3: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a/b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 4:
printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a*b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


default: printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");

return 0;

}
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" */







}




5. resumindo

Jorge Augusto Rabello Pinto
jorgerabello

(usa Ubuntu)

Enviado em 19/02/2009 - 22:34h

Não entendi onde tenho que colocar as coisas...mas mesmo assim muito obrigado pela ajuda.


6. Re: programação [RESOLVIDO]

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 20/02/2009 - 11:52h

Olá,

Dúvidas é normal. Vamos lá.
Bom, a sugestão foi colocar um loop. Bom, temos o "for", o "while" e "do/while". Use o que mais lhe agradar, o "for" tem uma sintaxe e lógica mais fácil de entender. Isso vai servir para que o programa continue até que uma dada condição seja satisfeita. Para melhorar seu código use funções:
Função para Menu.....
Vai ficar mais fácil de gerenciar seu código, além de ficar estruturado.

Dúvidas é só postar aí.

Abraços


7. ok

Jorge Augusto Rabello Pinto
jorgerabello

(usa Ubuntu)

Enviado em 20/02/2009 - 12:20h

Ok o que não entendi é onde exatamente devo posicionar o loop no código.E eu utilizaria o loop 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" */


8. =o

Leandro Santiago de Souza
leandro.diadema

(usa Slackware)

Enviado em 20/02/2009 - 12:59h

Tá, vamos ver.
Eu não sei se você conhece lógica de programação ou algorítimos, mas conhecer como funcionam os laços é muito importante. Você usou o for que eu tinha passado como primeiro exemplo, ele é constituido de 3 partes e funciona assim:

for [para]
(int iVar = 0 [1 = variável iniciando com esse valor];
iContinua == 1 [2 = enquanto essa condição for satisfeita];
iVar++ [3 = a cada volta no laço efetua esse comando])
{ /* instruções */ }

A primeira parte é efetuada somente a primeira vez, a segunda parte é verificada todas as vezes (inclusive a primeira vez) e a terceira parte é efetuada a partir da segunda vez, porém nenhuma dessas partes é obrigatório o preenchimento, alguns exemplos:

for (iNum = 0; iNum < 10; iNum++)
{
printf (" %d", iNum);
}
O resultado disso na tela seria:" 0 1 2 3 4 5 6 7 8 9".

for (iNum = 0; iNum == 0;)
{
if (iNum == 0)
printf ("Variavel igual a 0\n");
else
printf ("Variavel diferente de 0\n");

iNum = 12;
}
O resultado disso na tela seria:"Variavel igual a 0" e só uma vez, nunca que iria cair no "else", a não ser que houvesse instruções antes do "if".

for (;;)
{
printf ("Loop Infinito\n");
}
Laço infinito, erro de invazão de memória.

Não sei se fui cláro, mas conseguiu entender o significado de laço!?!?

Eu também não sei que erros que deu pra você, varia pouca coisa de compilador pra compilador, eu só estou com acesso a um compilador, o cc e o sistema e SCO unix, ele não deixou eu declarar a variável dentro do for que nem eu tinhe te passado ("for (int iContinua = 0; ..."), então tive que alterar a delcaração para fora do for, junto com a variável "menu" ("int menu, iContinua;") e como eu não testei, eu tinha feito uma cagada básica de lógica no "for" que estava assim:

for (int iContinua = 0; iContinua == 1;)

Nesse caso iContinua começa com o valor "0", e logo já é verificado se iContinua é igual a "1", como não é ele finaliza o laço e o programa (=P), o valor default de iContinua deve ser "1" pro laço ser executado pelo menos uma vez (né!), então a linha ficou assim?

for (iContinua = 1; iContinua == 1;)

Aí sim o programa funcionou aqui.
Do resto você fez tudo certinho, mas é importante você sempre saber o que está escrito no código (como funciona), pois ele é seu, não adianta só copiar (;]).
E só pra ficar mais a pampa, antes do fim do main, coloca um "return" com algum valor direfente do "return" que você colocou no "default" do "switch" (finalizou com erro ou com sucesso), aí sua calculadora vai funcionar bem mais legal!!! hehehe.

Se der erro, posta aqui que se ninguém te ajudar até semana quarta-feira, eu te ajudo com as correções (e a identificar o que significa cada erro).

Falou, abrá!!!


9. OLÁ

Jorge Augusto Rabello Pinto
jorgerabello

(usa Ubuntu)

Enviado em 25/02/2009 - 16:43h

Olá, cara não sei se o correto é isso escrevi meu código assim conf. segue abaixo, mas me retornou erros utilizo o gcc para compilar.A ordem (do loop for) está correta ?
Não consegui identificar meu erro.Poderia me ajudar por gentileza ?
Grato

#include <stdio.h>
#include <stdlib.h>

/*Calculadora Simples */
/*Por Jorge Rabello*/


int main(int nargs, char *args[])
{


float result,a,b;
int menu;
for (int iContinua = 0; iContinua == 1;)
system("clear"); /*executa um comando shell (limpar a tela)*/
printf("\n\tMenu\n\t[1] Somar\n\t[2] Subtrair\n\t[3] Dividir\n\t[4] Multiplicar\n\t>> ");
scanf("%d",&menu);

switch (menu)
{

case 1: printf("\n\tOpcao %d escolhida!\n",menu);

printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result= a+b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


case 2: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a -b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 3: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a/b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 4:
printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a*b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


default: printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");


}
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" */






}

ERROS:
gcc dc.c -o dc

dc.c: In function ‘main’:
dc.c:14: error: ‘for’ loop initial declaration used outside C99 mode
dc.c:14: error: expected ‘;’ before ‘)’ token
dc.c: At top level:
dc.c:92: error: expected identifier or ‘(’ before ‘}’ token








10. Re: programação [RESOLVIDO]

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 25/02/2009 - 16:57h

Sobre os erros:
Linha 14 - Observe o for, parece que não está de acordo com o padrão.
Linha 92 - Será que está sobrando, ou faltando um chave aí.

Abraços


11. Re: programação [RESOLVIDO]

Jorge Augusto Rabello Pinto
jorgerabello

(usa Ubuntu)

Enviado em 25/02/2009 - 17:44h

Cara, realmente tinha uma chave a+, valeu pela dica, maior vacilo não tinha notado, mas o for ainda não consegui fazer funcionar..oq está errado parece a posição do laço mas qual é a posição correta dentro do fonte tentei asssim mas não funcionou....
No inicio do topico foi dito q o for fica entr a delcaração de menu e fim de switch mas não está dando certo....
oq está errado no código abaixo ?!
Grato

#include <stdio.h>
#include <stdlib.h>

/*Calculadora Simples */
/*Por Jorge Rabello*/


int main(int nargs, char *args[])
{

float result,a,b;
int menu;
for (int iContinua = 0; iContinua == 1;)
system("clear"); /*executa um comando shell (limpar a tela)*/
printf("\n\tMenu\n\t[1] Somar\n\t[2] Subtrair\n\t[3] Dividir\n\t[4] Multiplicar\n\t>> ");
scanf("%d",&menu);

switch (menu)
{

case 1: printf("\n\tOpcao %d escolhida!\n",menu);

printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result= a+b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


case 2: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a -b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 3: printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a/b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;

case 4:
printf("\n\tOpcao %d escolhida!\n",menu);
printf("\n\tDigite o Primeiro Valor:");
printf("\n\t>> ");
scanf("%f",&a);
printf("\n\tDigite o Segundo Valor:");
printf("\n\t>> ");
scanf("%f",&b);
result = a*b;
printf("\n\t>> Resultado: %.2f\n\n",result);
break;


default: printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");


}
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 */
}
}

ERROS:
gcc cac.c -o cac
cac.c: In function ‘main’:
cac.c:13: error: ‘for’ loop initial declaration used outside C99 mode




12. Re: programação [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/02/2009 - 17:50h

3 anos ?!!!!!!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts