• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

xcarlos2

DICA

20 mensagens neste tópico

Olá...sou novo neste forum e a programar....

tenho um exercicio para entregar...mas estou bloqueado!!

consiste nisto:  o utilizador introduz um numero inteiro...e o compliador mostra todas as somas possiveis com 3 parcelas .

ex:  introduza um numero: 12

as somas possiveis sao 1+2+9, 1+3+8..etc.

nao quero o codigo...apenas quero uma dica...porque ainda nao consegui chegar la no raciocionio do programa..

o que pensei incialmente é nas condicoes if else apenas... dentro do DO While soma = a+b+c...

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

São muitas somas digo-te desde já.

Ora bem... começa por somas que incluam o número 1, o 2 e o restante para completar o teu numero inserido. Depois

1+3+x. depois 1+4+y, depois 1+4+...

quanto já não tiveres mais começa no 2

2+2+...

2+3+...

2+4...

depois começa no 3

3+3+..

3+4+....

Basicamente tens que fazer dois ciclos, um dentro do outro... o primeiro varre a primeira parcela, o segundo, dentro do primeiro, varre a segunda, clacula a terceira e mostra-a no ecrã.

Penso que seja isto que queres... já deve ajudar-te a começar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei é se precisas de ter em atenção que 1 + 2 + 8 = 1 + 8 +2

Ou seja à posição dos valores, não sei se tens que apresentar estas ou não. Caso não reduzes muitas somas a apresentar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é verdade existe mais essa condicao...ou seja nao pode haver parcelas repetidos ex:1 + 2 + 8 = 1 + 8 +2....

e como penso que nao  é possivel atravez desse tipo de  ciclos se 1+2+8  ja foi utilizado com 8+2+1 ou 2+1+8.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É possível, só tens que conferir se o trio já existe.

Penso que é a dica do exercício para implemtares uma pequena função para fazer isso mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

outra nota:: o numero inteiro é positivo logo >=0

nao sei se com condicoes vou la ..porque as parcelas podem ser 999+998+997 ou 333333+333334+333335

etc.

nao sei se isto nao envolve matrizes!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu, e julgando pela resposta, o anolsi tambem, assumimos que estavas a falar de números naturais, de outra forma tens um número de soluções infinitas.

Não são precisas matrizes para nada neste problema. O método já referido funciona.

Não te atires logo de cabeça para números como esses que acabaste de mostar, isso vai gerar um número de resultados enorme.

Começa com números pequenos, para efeitos de teste do algoritmo é rigorosamente a mesma coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se não podes ter repetição de somas, isto é, se apresentas só uma dentre "1+2+8", "1+8+2", "2+1+8", etc. podes fazer a primeira parcela <= segunda parcela <= terceira parcela.

Isto é mais ou menos o mesmo que disse o pedrotuga, só com outro aspecto

Se fizeres isto a primeira parcela nunca é maior que número / 3.

Vais variando a primeira parcela entre 1 e o limite

  a segunda parcela nunca é maior que (número - primeira parcela) / 2;

  vais variando a segunda parcela entre o limite inferior e o limite superior

      e calculas a terceira parcela

Se podes ter repetição, o código até fica mais simples ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

São muitas somas digo-te desde já.

Ora bem... começa por somas que incluam o número 1, o 2 e o restante para completar o teu numero inserido. Depois

1+3+x. depois 1+4+y, depois 1+4+...

quanto já não tiveres mais começa no 2

2+2+...

2+3+...

2+4...

depois começa no 3

3+3+..

3+4+....

Basicamente tens que fazer dois ciclos, um dentro do outro... o primeiro varre a primeira parcela, o segundo, dentro do primeiro, varre a segunda, clacula a terceira e mostra-a no ecrã.

Penso que seja isto que queres... já deve ajudar-te a começar.

---

mas este racicionio seria possivel apenas se fosse para algarismos ate 9.

ou seja quando chegasse ao 9, passaria o b a aumentar.

e c seria sempre a diferenca entra a soma com a+b

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

---

mas este racicionio seria possivel apenas se fosse para algarismos ate 9.

ou seja quando chegasse ao 9, passaria o b a aumentar.

e c seria sempre a diferenca entra a soma com a+b

Sim, é precisamente isso, mas não estou a perceber porque é que dizes que só é possível para algarismos até 9, isto funciona para qualquer número natural.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

/*exerc 28)*/

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

int main()

{
   system("chcp 1252");
   int soma, a, b, c;

          printf("Introduza um Número Inteiro Positivo: ");
       scanf("%d", &soma);

           while
           (
           a<=soma-3){    a=a++  ;

           }
           while (b < a )
           {   
                   b=b++  ;   

           }
           c = (soma - (a + b));

          printf("as somas possiveis: %d + %d + %d\n",a,b,c);

   system ("PAUSE");
   return 0;
}

fiz assim...e nao esta a funk!!!

da me valores estranhos!! e sempre os mesmos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não inicializaste as variáveis `a` e `b`.

A instrução "a=a++;" (e "b=b++;") não faz grande sentido.

a++ soma 1 a `a` e devolve o número anterior. Tu pegas nesse número anterior e mete-lo em `a` outra vez!!! Essa construção (a=a++) representa o "Undefined Behaviour" e portanto o compilador pode fazer o que quiser com ela. Tens sorte que no teu caso, aparentemente, ele decidiu tratá-la como um simples "a++;".

Para o teu programa começar a fazer qualquer coisa que se veja tens que por o b "dentro" do a, e o c "dentro" do b.

Tenta melhorar a tua indentação. É mais fácil perceber o programa com um indentação consistente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi nada do teu código, desculpa :s

Tens que fazer uma coisa deste tipo:

for(a=1;a<(soma-1);a++){
  for(b=a;b+a<soma;b++){
      c=soma-(a+b);
      printf("[%d + %d p %d]\n",a,b,c);
  }
}

falta antes do printf() verificares se o trio existe ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok Obrigado pela dica. tens razao...

isto foi feito muito a pressa. vou fazer com mais calma...mas amanha..pois estou des de as 11h dwe volta nisto. e apenas agora com a vossa ajuda avancei no sentido certo.

obrigado a todos e boa noite.

amanha dou o feedback do resultado.

Valeu!!

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

int main()

{
   system("chcp 1252");
   int soma, a=0, b=1, c;

       printf("Introduza um Número Inteiro Positivo: ");
       scanf("%d", &soma);

         while (a<(soma-3)){
           a++;
           if(b=a )         
           b++;

               { c = soma - (a+b);       

               printf("[%d + %d + %d]=%d \n",a,b,c,soma);   
         }  }

   system ("PAUSE");
   return 0;

}



assim está correctamento indentado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A indentação é uma ajuda para os programadores. Para o compilador não há diferença nenhuma no número de espaços ou TABs ou ENTERs que estão no código: portanto não há indentações correctas e incorrectas. O valor da indentação é subjectivo.

Mas ... há milhentos anos (bem ... praí 40) que se escreve código em C e há uns poucos estilos de indentação adoptados por grande parte dos programadores. Se te conseguires adaptar a um desses estilos (tanto para ler código de outros programadores, como para outros programdores lerem o teu código) é melhor para toda a gente.

O importante é usares um estilo que gostes (adoptado por muita gente ou não) e usá-lo consistentemente.

http://en.wikipedia.org/wiki/Indent_style

http://en.wikipedia.org/wiki/Programming_style

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Incializa a,b com 1, faça exatamente esse whiles com a condição de que a e b só andam até a soma-2.

Para toda vez que C for diferente > 0, imprima a,b,c na tela.

#include <stdio.h>

main(){
int a,b,c,soma,aux;
printf("Digite o número: ");
scanf("%d",&soma);
for(a=1;a<=soma-2;a++){
	for(b=1;b<=soma-2;b++){
		c = soma - (a+b);
		if(c > 0){
			printf("%d + %d + %d\n",a,b,c);
		}
	}
}
}

Pena que esse código nao quer identar ;/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tomei a liberdade de editar do código do amigo pedrotuga e fiz assim:

#include <stdio.h>

main(){
       int a,b,c,soma;
       printf("Digite o número: ");
       scanf("%d",&soma);
       for(a=1;a<(soma-2);a++){
               for(b=a;b+a<soma;b++){
                        c=soma-(a+b);
                        if(c>=b){
                                  printf("[%d + %d p %d]\n",a,b,c);
                        }
               }
       }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá a todos.. :)

obrigado pela dica...

consegui fazer atravez do comando while com 2 cilos..

mas agora tou a tentar faze lo com um menu,,,

e da me erro no else..nao consigo perceber porque..

alguem me pode ajudar .

obrigado.

/*variavel do program...com menu   */
#include <stdlib.h>
#include <stdio.h>

int main()
{
   system("chcp 1252");

   printf("\n\n\n");

   int a = 1, b = 0, c, num, count=1;
   char opcao;

   printf("Este programa apresenta todas as somas possiveis, sem repeticoes\n");
   printf("para um determinado numero inteiro e positivo, bem como,\n");
   printf("calcula o numero de operações possiveis.\n\n\n");
   printf("Menu\n\n");
   printf("Escolha uma das seguintes opções\n");
   printf(" 1 Para continuar\n");
   printf(" 2 Para sair\n");

       if (scanf("%c", &opcao)=='1'){

       printf("Introduza um numero inteiro e positivo\n\n");
       scanf("%d", &num);

       c= num-(a+b);

       for (a=1; a<c; a++) {
           for (b=a+1; b<c; b++) {
           c=num-(a+b);
               if (b<=c) printf ("\n %d->  %d + %d + %d = %d", count, a, b, c, num);

                   count+=1;
                   }
                   }
                   printf("n\rNumero total de somas possiveis  %d\n\n", count-1);
       }
       else (scanf("%c", &opcao)=='2') ;
       break;

   system ("PAUSE");
   return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora