Jump to content
Ruka284

Moedas

Recommended Posts

Ruka284

#include<stdio.h>
#include <cstdlib>
main ()
{
int quantia;
int moedas,moedas100,moedas50,moedas20,moedas10,moedas5,moedas1;
printf(" \n   Inico do programna   \n");  

printf(" \n   Introduza a quantia   \n");
scanf("%d",&quantia);
if (quantia >= 100)
{
   while (quantia >=100)
 quantia=quantia-100;
	   moedas100=moedas+1;
printf("Sao precisas moedas de 100   \n",moedas100);		   
}
if (quantia>=50)
{
quantia=quantia-50;
moedas50=1;
printf("Sao precisas moedas de 50   \n",moedas50); 
}		
if (quantia >= 20)
{
   while (quantia >= 20)
	   quantia=quantia-20;
	   moedas20=moedas20+1;
printf("Sao precisas moedas de 20   \n",moedas20);			
}
if (quantia>=10)
{
quantia=quantia-10;
moedas10=1;
printf("Sao precisas moedas de 10   \n",moedas10); 
}
if (quantia>=5)
{
quantia=quantia-5;
moedas5=1;
printf("Sao precisas moedas de 5   \n",moedas5); 
}
if (quantia>=1)
{
while (quantia>0)
quantia=quantia-1;
moedas1=moedas1+1;
printf("Sao precisas moedas de 1   \n",moedas1);
}
system("PAUSE");
}

Também aproveito para pedir uma ajuda, como faço para apareçer as moedas exatas para a quantia.

vou dar exemplo como queria que aparecesse

printf(são precisas 14 moedas de 20, e 7 de 10) é so um exemplo.

tambem qual instrução que faço quando chego ao fim do programa e repito novamente o programa em vez de estar abrir o programa

Share this post


Link to post
Share on other sites
pmg

Falta-te inicializar, pelo menos, moedas100 e moedas.

Não mistures as duas variaveis desnecessariamente.

Para aparecer as moedas exactas fazes com diversos ifs.

A instrução para repetir o que quer que seja é um loop (for, while, od do ... while). A maneira mais rápida é dares outro nome à função main e fazeres uma main nova que chama a main antiga num loop.

int main(void) {
   int val;
   do val = mainantiga(); while (val == 0);
   return val;
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
thoga31

Também aproveito para pedir uma ajuda, como faço para apareçer as moedas exatas para a quantia.

vou dar exemplo como queria que aparecesse

printf(são precisas 14 moedas de 20, e 7 de 10) é so um exemplo.

printf("Sao precisas %d moedas de 20 centimos", moedas20);

Construir uma frase "bonita" implica uma série de ifs sem "\n" no fim, de maneira a que a frase vá sendo construída.


Knowledge is free!

Share this post


Link to post
Share on other sites
pmg

#include <cstdlib>

Oops ... isto não é C; parece-me C++ (mas eu não sei essa linguagem).

Certifica-te que estás a usar um compilador de C ou então mete a tua dúvida no quadro de C++.

Sugiro-te que configures o teu compilador (seja de C ou de C++) para o máximo de warnings; e faz compilações sem warnings!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Ruka284

Falta-te inicializar, pelo menos, moedas100 e moedas.

Não mistures as duas variaveis desnecessariamente.

Para aparecer as moedas exactas fazes com diversos ifs.

A instrução para repetir o que quer que seja é um loop (for, while, od do ... while). A maneira mais rápida é dares outro nome à função main e fazeres uma main nova que chama a main antiga num loop.

int main(void) {
int val;
do val = mainantiga(); while (val == 0);
return val;
}

podes explicar melhor o funcionamento desta sintaxe, ainda não dei esta matéria

printf("Sao precisas %d moedas de 20 centimos", moedas20);

Construir uma frase "bonita" implica uma série de ifs sem "\n" no fim, de maneira a que a frase vá sendo construída.

esta sintaxe esta bem estruturada, vou implementar no programa.

Share this post


Link to post
Share on other sites
pmg

podes explicar melhor o funcionamento desta sintaxe, ainda não dei esta matéria

Um ciclo do ... while é composto por tres partes: a palavra chave do; a instrução ou bloco de instruções a executar repetidamente e a condição de paragem incluindo a palavra chave while.

faz coisas enquanto isto for verdade;

Usa-se normalmente para ciclos que têm que correr pelo menos uma vez, já que o teste é efectuado no fim das operações.

O código que eu apresentei

do val = mainantiga(); while (val == 0);

tem a palavra chave do, a instrução a repetir é a atribuição do valor devolvido pela função mainantiga à variável val, e o ciclo deixa de repetir quando val for diferente de 0 (repete enquanto val for zero).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
Ruka284

printf("Sao precisas %d moedas de 20 centimos", moedas20);

estive a experimentar com esta sintaxe e o valor que sai e errado

Share this post


Link to post
Share on other sites
thoga31

printf("Sao precisas %d moedas de 20 centimos", moedas20);

estive a experimentar com esta sintaxe e o valor que sai e errado

Então o problema não está nesse printf mas sim no teu algoritmo.


Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

indenta o teu código

já agora ficas com uma solução com validação de dados de entrada e algoritmo simplista

pode ser que não percebas à primeira vista, mas sempre podes ver que o que estás a fazer, pode ser muito melhorado

#include <stdio.h>

int main()
{
   int valores[6] = {100, 50, 20, 10, 5, 1};
   int ok = 0, valor = 0, i = 0, count = 0;

   do
   {
       printf("Intruduza a quantia : ");
       fflush(stdout);
       ok = (scanf("%d", &valor) ? valor > 0 : 0);
       while (getchar() != '\n');
   } while (!ok);

   for (i = 0; i < sizeof (valores) / sizeof (int); i++)
   {
       count = 0;
       while (valor >= valores[i])
       {
           valor -= valores[i];
           count++;
       }

       printf("Sao precisas %d moedas de %d\n", count, valores[i]);
   }

   return 0;
}

ps : inicializa todas as tuas variáveis a zero

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ruka284
#include <stdio.h>
int main()
{
    int valores[6] = {100, 50, 20, 10, 5, 1}; - aqui declaraste os seis valores
    int ok = 0, valor = 0, i = 0, count = 0; - aqui não percebi
    do
    {
		    printf("Intruduza a quantia : ");-introdução de dados
		    fflush(stdout);-não percebi
		    ok = (scanf("%d", &valor) ? valor > 0 : 0);
		    while (getchar() != '\n');
    } while (!ok);
    for (i = 0; i < sizeof (valores) / sizeof (int); i++)- aqui estas fazer ciclo, mas não percebo o conteudo
    {
		    count = 0;- aqui tb não percebo
		    while (valor >= valores[i])
		    {
				    valor -= valores[i];
				    count++;
		    }
		    printf("Sao precisas %d moedas de %d\n", count, valores[i]); - aqui mandas sair
    }
    return 0;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

int valores[6] = {100, 50, 20, 10, 5, 1}; - aqui declaraste os seis valores

vou deixar a hipótese de que poderia ser da seguinte forma para perceberes um ponto mais à frente

 int valores[] = {100, 50, 20, 10, 5, 1}; // 

int ok = 0, valor = 0, i = 0, count = 0; - aqui não percebi

é só declaração de variáveis com a sua inicialização a zero !!!

fflush(stdout);-não percebi

como a mensagem que usei no printf não tem um '\n' no final, existe a possibilidade de que a mensagem não seja enviada para a consola antes do scanf.

esta função força esse passo (algo que o '\n' também faz).

no entanto, desta maneira é possível inserires os valores na mesma linha da mensagem pedida e não na linha seguinte

for (i = 0; i < sizeof (valores) / sizeof (int); i++)- aqui estas fazer ciclo, mas não percebo o conteudo

é um ciclo que serve para iterar os elementos do array

isto porque o sizeof(valores) da-te o tamanho em bytes do array e o sizeof(int) da-te o tamanho em bytes de cada elemento do array.

conclusão, tens o número de elementos do array.

é certo que sabes que são 6. mas isso é para este caso específico, além de que se necessitares de alterar o número de elementos do array, basta alterar na declaração.

é por isso que te fiz a demonstração na declaração do array

count = 0;- aqui tb não percebo

é só uma atribuição ...

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thoga31

bela explicação, hei-de chegar a essa matéria

Estás a aprender na escola ou universidade, não é?

Não esperes pela matéria, vai ter com ela. Muitas vezes, estas coisas nem são dadas nas aulas (o que é estúpido).


Knowledge is free!

Share this post


Link to post
Share on other sites
Dexter's Lab

HHHippo, explica-me uma coisa do fflush(stdout), se não te importares: Como é possível o scanf ser direccionado para a consola antes do printf?

Share this post


Link to post
Share on other sites
HappyHippyHippo

o tratamento de dados de entrada e saída é feito através de buffers ao nível do sistema operativo (não digo todos porque não sei).

ao fazer a chamada da função printf não implica que os dados sejam enviados imediatamente para a o dispositivo de saída (normalmente a consola). o que acontece é que é enviado para o buffer e o resto é tratado pelo sistema operativo.

é normal as pessoas ignorarem esta questão por duas razões:

- o sistema operativo é suficientemente inteligente para perceber que não interessa ter os dados em buffer por muito tempo.

- a existência do caracter de mudança de linha ('\n') força a saída dos dados no buffer para o dispositivo.

o problema acontece quando se efectua uma chamada que faz lockdown do sistema antes dos dados no buffer sejam processados, como no caso do scanf, função que bloqueia até ler dados do buffer de entrada (sim, também é por buffer, mas desta um diferente do de saída).

para resolver o problema de um scanf ser chamado logo após um printf que não possua o caracter '\n' no seu conteúdo, podendo a mensagem deste printf não ser apresentada, é usada a função fflush para forçar essa operação.

logo, quando se pretende que na consola se tenha uma mensagem qualquer onde o utilizador deverá inserir dados de entrada na mesma linha da questão, é aconselhável efectuar este processo.

exemplos demonstrativos:

printf("Insira um numero : "); // <- sem o caracter '\n'
scanf("%d", &num);             // ler os dados inseridos pelo utilizador
printf("O numero e : %d", num);

output (possível, depende da sorte)

4
Insira um numero :
O numero e : 4

printf("Insira um numero : "); // <- sem o caracter '\n'
fflush(stdout);                // forçar o processamento dos dados no buffer de saída (stdout)
scanf("%d", &num);             // ler os dados inseridos pelo utilizador
printf("O numero e : %d", num);

output

Insira um numero : 4
O numero e : 4


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.