Dificuldade Ep

Dificuldade Ep

por Paulo Tarso -
Número de respostas: 11
depois de fazer o "estado inicial" vem a "interação com o usuários"
como ele nao tem ordem exata pois pode receber tanto credito como pedido de compra estou usando uma variavel que recolhe o valor digitado no caso y
e fiz este script mais nao importa o valor recebido o programa acaba, se alguem souber o erro agradeceria a ajuda =D
scanf("%d",&y);
while((i>0)){
if (y == 0)
botao = 0;
break;
if (y == -1){
botao = y;
for(j=0;saldo>=250&&choca>0;choca--){
printf("Venda de Choca-Cola");
}
}
y=20;
i++;

obs:a variavel saldo ja está começando com 250 (para testes) // o while estou tentando usar para fazer o programa dar loops para o usuario poder creditar valor ao saldo ou fazer os pedidos sem ter uma ordem exata, y recebe 20 no final para poder receber uma nova opçao.

flws.

Em resposta à Paulo Tarso

Re: Dificuldade Ep

por Virgilio Junior -

Posso estar errado, mas você abriu 3 vezes as chaves (no while, em um dos ifs e no for) e fechou apenas 2..

Em resposta à Paulo Tarso

Re: Dificuldade Ep

por Victor Gomes -
Bom... o programa sempre acaba por isso:

...
if(y==0)
botao = 0;
break;
...

Veja que você não abriu '{' depois do if, então apenas a próxima linha está "dentro" do if. Assim sendo o comando break é executado sempre, independente da escolha do usuário, e por isso sai do loop.

O correto seria abrir e fechar chaves, assim:

if(y == 0)
{
botao = 0;
break;
}


Em resposta à Victor Gomes

Re: Dificuldade Ep

por Paulo Tarso -
Realmente era isso, a falta dos {} no break, obrigado =D mais agora estou em outro problema o programa imprime venda de choca-cola um monte de vezes e fexa =S mas eu fiz o y=20 para virar um valor sem açao para ter a opçao de digitar de novo.

obs: coloquei o scanf("%d",&y) dentro do while,e botao=20 no final para botao voltar a ter um valor nulo (nao sei se isso influencia o printf constante)

agradeço desde ja =D
Em resposta à Paulo Tarso

Re: Dificuldade Ep

por Victor Gomes -
Preste atenção nessa parte do código:

...
for(j=0;saldo>=250&&choca>0;choca--){
printf("Venda de Choca-Cola");
}
...

Pelas condições de parada, o loop só vai parar quando o cliente tiver menos que 250 de saldo, ou quando acabarem as chocas do estoque certo? Pois bem, vc apenas atualiza o estoque com o choca-- , com isso o saldo do cliente é constante (ele sempre terá saldo), e você venderá chocas até acabar o estoque. Precisa atualizar o saldo também.


Em resposta à Victor Gomes

Re: Dificuldade Ep

por Paulo Tarso -
obrigado novamente pela ajuda, e deu um novo problema eu começei o saldo com 250 para testes e retirando o saldo da choca-cola funcionou perfeito o problema esta em outro produto que custa 120 o programa roda 2x ou seja até o saldo ser menor q o valor do produto, existe algum modo de fazer o for rodar soh quando for pedido? no caso 1x a cada pedido de produto nao importa se o saldo for maior que o custo.

e tambem nao entendi o pq de ocorrer isso se no final botao recebe valor nulo, e antes de xegar no for de novo ele tem q passar no while onde vai pedir o valor, pq ele vai direto pro for?

flw.
Em resposta à Paulo Tarso

Re: Dificuldade Ep

por Victor Gomes -
Isso ocorre porque o for é uma laço, um loop. Ele é uma instrução feita para executar algo várias vezes.

Se vc quer algo que execute apenas uma vez, dependendo de uma condição, por que não usar um if ?

Você até pode fazer um for que rode apenas uma vez, mas eu não recomendaria, o código pode ficar mais difícil de entender, uma vez que quem for lê-lo, vai esperar que aquela parte do código rode várias vezes. Basta colocar alguma condição do tipo: for(i = 0 ; i < 1; i++), mas como disse, isso é meio estranho.
Em resposta à Victor Gomes

Re: Dificuldade Ep

por Paulo Tarso -
Estava fazendo os ultimos testes no programa quando percebi que faltava 1 coisa, na parte de troco eu usei:
if (y == -5){ /* y variavel que guarda valor digitado pelo usuario*/
printf("troco: %d ",saldo);
if (saldo >= 1000 && a1000>0){
z = saldo/1000; /* z eu uso para saber exatamente quantas cedulas retirar */
saldo = saldo%1000;
a1000 -= z; /*a1000 variavel que guarda quantidade de cedulas de 10 reais*/
z = 0;
}

o problema é: exemplo se tem 1 nota de 10 reais 20 notas de 5 reais
e o troco é 25 reais ele tira 2 notas de 10 reais fazendo a a1000 virar -1, tentei algumas solucoes que nao foram validas ja que resolviam este problema parcialmente e criavam outros maiores. entao vim pedir ajuda no forum.
Como faço para o programa tirar soh 1 de 10 e pegar o resto de 5?

obrigado desde ja!!
flws.
Em resposta à Paulo Tarso

Re: Dificuldade Ep

por Victor Gomes -
Vc precisa verificar quantas notas tem disponíveis. Por exemplo

z = saldo/1000;

/* Verifica se tem notas suficientes */
if(z > a1000)
{
/* Não tem... pega apenas o q tem */
z = a1000;
}

/* Retira do saldo apenas o valor das notas retiradas*/
saldo = saldo - z*1000;

E por aí vai...
Em resposta à Paulo Tarso

Re: Dificuldade Ep

por Luiz Ricardo Carvalho Uchoa -

Bom dia a todos,

Também estou com tendo problemas com a elaboração do troco, vi que há um algoritimo de exemplo mais não o compreendi, se alguém puder dar uma ajuda.

obrigado.

Em resposta à Luiz Ricardo Carvalho Uchoa

Re: Dificuldade Ep

por Thiago Ferreira da Costa -

Estou com a mesma dúvida, não consigo montar o algoritmo pra mim algumas coisas não fazem sentido. Mesmo assim eis a resposta que o monitor me deu:

Pode usar o algoritmo "guloso", que pode não funcionar em todos os casos, como o rpfessor deve ter dito em aula, mas vai funcionar nos casos de teste que serão utilizados na correção.

Esse algoritmo funciona assim:

1) Comece com a nota de maior valor, e ache quantas dessas notas "cabem" no troco. Por exemplo, se o troco é R$25,00 e a nota de maior valor R$10,00, "cabem" duas dessas notas no troco. Tem que lembrar de ver quantas notas tem no caixa. Se couberem duas, mas só tiver uma no caixa, só pode usar uma.

2) Uma vez descoberto qtas notas desse valor vai usar, retire do troco o valor total que vc vai dar em troco nessa nota. No exemplo anterior, se vc tiver duas notas de R$10,00, você precisa retirar 2*R$10,00 do troco, sobrando R$5,00.

3) Repita o procedimento (1) e (2) para as notas (e moedas) seguintes, sempre atualizando o valor do troco.

No final vc deve ter o troco em notas mínimas.

Repetindo, esse algoritmo não funciona em 100% dos casos, mas será considerado correto nesse EP.