JMAS 0 Posted October 21, 2011 Report Share Posted October 21, 2011 Este e o enunciado do exercicio, um programa que calcula e imprime no ecrã um múltiplo de num2 cuja diferença para num1, em valor absoluto, seja mínima. Caso haja dois múltiplos de num2 a igual distância de num1, deve ser indicado o maior deles. #include <stdio.h> int main ( void ) { int num1; int num2; int num3; printf( "introduza um primeiro valor positivo\n"); scanf( "%d", &num1); printf( "introduza o segundo valor positivo\n"); scanf( "%d", &num2); if( num1 > num2){ for ( num3 = 1; num1 >= num2 * num3; num3++) printf( "%d ",num2 * num3 ); } else if( num1 < num2 ){ printf( "multiplo = 0" ); } else printf( "multiplo = 1" ); return 0; } os problemas: imprime mais que um numero e nao imprime o que e preciso. Link to post Share on other sites
pmg 85 Posted October 21, 2011 Report Share Posted October 21, 2011 Vamos lá a uns exemplos ... num1 = 12; num2 = 5; output pretendido: 10 ==> 12 / 5 dá 2; entre 2*5 e 3*5 escolher o primeiro num1 = 14; num2 = 5; output pretendido: 15 ==> 14 / 5 dá 2; entre 2*5 e 3*5 escolher o segundo num1 = 15; num2 = 6; output pretendido: 18 ==> 15 / 6 dá 2; entre 2*6 e 3*6 escolher o segundo ... ... ... vê lá se assim consegues fazer o programa 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! Link to post Share on other sites
KTachyon 276 Posted October 21, 2011 Report Share Posted October 21, 2011 Estás a imprimir os valores no ciclo, é normal que te imprima vários valores menos o que pretendes. Repara que aquilo que queres irá resultar depois de teres feito o ciclo para achar o multiplicador. Depois, achares a altura em que num3*num2 > num1 não significa que achaste o número mais próximo, tens que verificar se qual deles é mais próximo (ou o maior se estiverem a igual distância): se num3*num2 ou se (num3-1)*num2 Finalmente, se num1 < num2, tens duas hipóteses: ou o múltiplo é 1 ou é 0. Podes fazer uma segunda comparação: se num1 < num2/2 -> imprime 0; se num1 >= num2/2 -> imprime 1; Tendo, obviamente em conta a questão dos arredondamentos de números inteiros que o computador vai fazer. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to post Share on other sites
JMAS 0 Posted October 21, 2011 Author Report Share Posted October 21, 2011 ok, depois de pensar um bocado resolvi dividir isto em 2 casos, quando o resto da divisao e igual e diferente de 0. if( num1 > num2) divisao = num1 % num2; if(divisao == 0){ printf("divisao = %d", num1 + num2); } este parte e para que e igual a 0, ou seja quando a distancia entre os mais pertos inferior e superior e igual, verfica tudo para este caso. Link to post Share on other sites
KTachyon 276 Posted October 21, 2011 Report Share Posted October 21, 2011 Sim, mas só para o caso em que o resto da divisão é igual a zero. Mas o múltiplo será multiplo = num1 / num2; Mas dessa forma podes resolver todos os casos: multiplo = num1 / num2; // multiplo de num2 < num1 divisao = num1 % num2; if (num2*(multiplo+1) - num1 <= divisao) { // multiplo de num2 > num1 multiplo++; } printf("multiplo: %d\n", multiplo); “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to post Share on other sites
JMAS 0 Posted October 21, 2011 Author Report Share Posted October 21, 2011 dessa maneira so irei obter a divisao +1 e nao o multiplo, porque quando dividi 15 por 4 deu 3. Link to post Share on other sites
KTachyon 276 Posted October 21, 2011 Report Share Posted October 21, 2011 Deve dar 4: multiplo = 15 / 4; // multiplo = 3 divisao = 15 % 4; // (15 - 4*3 = 3) divisao = 3 if (4 * (3 + 1) - 15 <= 3) { // if (16-15 <= 3) multiplo++; // multiplo = 4 } printf("%d\n", multiplo); // 4 “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to post Share on other sites
JMAS 0 Posted October 21, 2011 Author Report Share Posted October 21, 2011 mas tem que dar 16 nesse caso, pois e o multiplo de 4 mais perto de 15. Link to post Share on other sites
KTachyon 276 Posted October 21, 2011 Report Share Posted October 21, 2011 Então imprimes o valor: printf("%d\n", multiplo * num2); “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to post Share on other sites
JMAS 0 Posted October 22, 2011 Author Report Share Posted October 22, 2011 sim de facto funciona na totalidade, obrigado, como ainda tenho pouca pratica e nao sei pensar bem a coisa, invento um bocado e como estava a fazer nao estava mal o problema ia ser para o resto diferente de 0, mas com o tempo.... Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now