Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

[Duvida] Progama executa mas não funciona

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ [Duvida] Progama executa mas não funciona

    Ola, sou estudante de Eng. da Computação e estou parendendo algoritmos, porem não aprendo C, tenho que me virar. Estou tendo problemas com um programa que tentei criar, ele complica, executa, mas na pratica não funciona e não descubro o porque.

    O programa deveria ler um valor, armazenalo em N, e procurar por dois numeros que multiplicados deem ele, A e B, sendo que A seja divisor de B, e que nem A nem B sejam o proprio numero. Para não resultar em 1*NUMERO.

    O DevC++ compila, ele executa normalmente, mas assim que digito o numero o cursor desse uma linha, e fica estatico, nada mais acontece. A seguir o código:

    Código:
    #include<stdio.h>
    #include<stdlib.h>
    int n,a,b,t,ab,nab;
    float rab;
    int main(char)
    {
        printf("Digite o numero:\n");
        scanf("%i",&n);
        a=0;
        nab=(n+n)-2;
        do{
              do{
                    a=a+1;
                    b=0;
                    do{
                            b=b+1;
                            t=a*b;
                    }
                    while((t=n)||(b=n-1));
              }
              while((t=n)||(a=n-1));
              ab=(a-1)+(b-1);
              rab=a%b;
        }
        while((rab=0)||(nab=ab));
        if(t=n)
               printf("%i e %i",a,b);
        else
               printf("Nao existem 2 numeros divisiveis entre si\nque deem %i multiplicados",n);
        system("pause");  
    }

  • Font Size
    #2
    Diegokindin,

    para tudo!!! tá pegando o caminho errado!!!
    vc tem 3 laços onde só um seria necessário!!!

    então vamos por partes:

    1 - vc tem de achar 2 números que multiplicados de um dado número
    1.1 - a verificação disso pode ser feita pela verificação do resto de uma divisão inteira
    1.2 - se o resto for 0, o divisor (D) e o quocientes (Q) são candidatos a A e B
    1.3 - não existem divisores de um número na parte superior a sua metade
    1.4 - 1 é divisor universal, então deirxar fora dos testes

    2 - A tem de ser divisor de B e A e B não podem ser o mesmo número
    2.1 - ver se D e Q são números diferentes
    2.2 - ver se o resto de D/Q ou o resto de Q/D são zero, se forem esses são os números

    3 - mostrar o resultado
    3.1 - se não acho nenhum número o resultado é vázio
    3.2 - se encontrou os números mostre A e B.

    []s
    Wahooka

    Comment


    • Font Size
      #3
      Ola amigo. Entendi em parte o que você falou. Mas acho que não fui claro em meu primeiro post. Eu quero entrar com um numero, por exemplo, 12, e quero que o programa ache A e B, sendo que A*B=12 e que A divida B. No que voce falou pelo que entendi o programa testa se A divide B, mas não entendi quando o programa procura por A e B.

      Na verdade pensei nesse algoritmo pelo fato de ele precisar varias dois valores. Ele precisa ir testando. Minha ideia é que ele fizec repetidamente isso:

      1(A) * 1(b) variando primeiro B ate o no caso 12-1, ou seja, 11. Chegando nesse ponto ele iria zerar o B e adicionar 1 ao A e recomeçaria 2(A) * 1(b), assim ele iria variar A e B ate encontrar dois valores que multiplicados descem 12, então, ele faria A%B e testaria se é zero, como você falou.

      Achei um pequeno errado no programa ja resolvido aqui, mas com os testes que fiz, notei que o problema do não funcionamento dele se encontra no fato de ter um comando REPITA dentro de outro. Fiz teste com programas simples e acontece o mesmo problema. Creio que o erro esta ai, no fato de termos comando de repetição dentro uns dos outros.

      Comment


      • Font Size
        #4
        Buenas decidi escrever o código simplificando um pouco o eu tinha dito.

        Dá uma olhada...
        #include <stdio.h>

        int main (void)
        {

        int n; // Recebe um numero digitado
        int A; // Valor de A (enunciado)
        int B; // Valor de B (enunciado)
        int liminf; // Limite inferior do loop
        int limsup; // Limite superior do loop
        int aux; // Variavel de uso geral (controle do loop)
        int quociente; // Quociente da divisao


        printf("Entre com um numero inteiro --> ");
        scanf("%i",&n);

        liminf = 2 ; // O limite inferior deve ser 2, ja que 1 eh divisor universal
        limsup = n / 2 ; // O limite superior deve ser a metade de "n", para reduzir passagens descecessarias

        if ( liminf >= limsup ) {
        printf("Ops!!! Nao existe A e B\n");
        return ;
        };

        // O uso de um for evita entrar em loop infinito
        for ( aux = liminf ; limsup > aux ; aux++ ) {
        if ( (n%aux) == 0 ) {
        quociente = n / aux ;
        if ( (quociente%aux) == 0 ) {
        printf("Encontrei!!! A = %i e B = %i.\n",aux,quociente);
        return;
        };
        };
        };
        printf("Ops!!! Nao existe A e B\n");
        return ;
        };
        Esses são os testes que fiz:

        $ gcc -o diegokindin diegokindin.c

        $ ./diegokindin
        Entre com um numero inteiro --> 12
        Encontrei!!! A = 2 e B = 6.

        $ ./diegokindin
        Entre com um numero inteiro --> 3
        Ops!!! Nao existe A e B

        $ ./diegokindin
        Entre com um numero inteiro --> 7
        Ops!!! Nao existe A e B

        $ ./diegokindin
        Entre com um numero inteiro --> 50
        Encontrei!!! A = 5 e B = 10.

        $
        Depois de olhar o código, ficou mais fácil entender o que eu havia escrito antes???

        []s
        Wahooka

        Comment


        • Font Size
          #5
          ops, pode tirar as váriaveis A e B... como simplifiquei o código não foram necessárias.
          []s
          Wahooka

          Comment


          • Font Size
            #6
            Primeiramente, muitissimo obrigado wahooka.

            Não entendi tudo vendo o código, mas é por que sou realmente inisciante tanto na area de algoritmos como na area de programação em C. Entendi quase tudo, algumas coisas fiquei com duvidas, mas vou me debruçar aqui sobre o teu código para compreendelo inteiro.

            Obrigado mesmo.

            Comment


            • Font Size
              #7
              diz ai as duvidas que tento explicar.

              Comment


              • Font Size
                #8
                Tu dividiu o programa em 3 partes não é? Não entendo bem o funcionamento disso ainda. E tambem não endendi muito bem a parte da variação dos numeros. Talvez falta entendimento matematico da minha parte. Não entendo como ele varia as possibilidades

                Comment


                • Font Size
                  #9
                  Vc tocou num ponto importante nesse programa, ele é 95% de entendimento matematico.
                  Uma coisa que poderia lhe ajudar é fazer o famigerado teste de mesa, você sabe como fazer?
                  Muitaqs vezes executar um programa no papel ajuda a entender melho o que e como ele faz.
                  []s
                  Wahooka

                  Comment


                  • Font Size
                    #10
                    Realmente o problema foi a matematica, agora captei a ideia sim, entendi algebricamente o que tu disse

                    Na verdade, eu tava variando dois numeros, quando só precisava variar um. No caso do teu programa a variavel AUX. Ficou realmente mais simples assim.

                    Obrigado amigo.

                    Comment

                    X
                    Working...
                    X