1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C] Problema - não executa a função invocada

Discussão em 'Programação' iniciada por Dak, 4 de Novembro de 2008. (Respostas: 13; Visualizações: 597)

  1. Dak

    Dak Power Member

    Boa noite!

    Preciso aqui de uma ajudinha com o meu programa. Ao que parece ele não reclama erros mas não faz o que é suposto.

    Fica aqui uma forma reduzida do dito cujo...

    Código:
    #include <stdio.h>
    
    int menu (void)
    
    int ordemDeDivisor( int n, int m );
    
    int main (void) {
      int opcao = -1;
      int n, m;
      
      while ( opcao != 0 ) {
        opcao = menu( );
        switch ( opcao ) {
    
        case 1:  
    printf( "Introduza n: " ); 
    scanf( "%d", &n );
    break;
    
        case 2:
          printf( "Introduza m: " ); 
          scanf( "%d", &m );
          ordemDeDivisor( n, m );
          break;
        case 0: 
        ...
          break;
        default:
         ...
          break;
        } 
    }
      
      return 0;
    }
    
    int ordemDeDivisor( int n, int m ){
     int pot=m;
     int k=0;
    
     while(pot < n){
       if(n%pot == 0)
         pot = pot * m;
         k=k+1;  
     }
        printf("%d eh divisor de %d de ordem %d\n", m, n, k);
    return 0;
    }
    
    O programa deveria de correr mais ou menos assim

    Sendo que o que está a vermelho não chega a aparecer. Não sei como chamam ao fenómeno fantástico que é esse em que sou obrigado a fechar o terminal (sei que ha outra forma mas nao sei qual e) para voltar correr o programa.

    Já tentei tirar o printf da função, fazer return k e depois na main escrever o printf("%d eh divisor de %d de ordem %d\n", m, n, ordemDeDivisor( n, m )); mas o resultado é o mesmo. O que é estranho pois fiz mais ou menos o que tenho no primeiro quote noutra função também neste programa mas a diferença é que o printf na função estava num if

    PS: Não sei se é importante( não deve ser) mas o programa tens mais case's e mais funções mas nenhuma com problemas.

    Obrigado desde já ;)
     
    Última edição: 4 de Novembro de 2008
  2. Valdijiu

    Valdijiu Power Member

    tens:

    Código:
     
    case 2:
    printf( "Introduza m: " ); 
    scanf( "%d", &m );
    ordemDeDivisor( n, m ); //Ao invocares esta função qual o valor de n ?!
    break;
    
     
    Última edição pelo moderador: 4 de Novembro de 2008
  3. Baderous

    Baderous Banido

    Não precisas do break no default.
     
  4. Dak

    Dak Power Member

    n é pedido no case 1 que no exemplo que dei é 600



    Acho que essa não é a principal preocupação neste momento visto que nem faz diferença :)
     
    Última edição: 4 de Novembro de 2008
  5. Baderous

    Baderous Banido

    O teu algoritmo dos divisores está mal, pois quando n%pot!=0, ele entra em ciclo infinito.
     
  6. Dak

    Dak Power Member

    então tenho de por um if dentro do if mas depois que raio e que ponho no segundo if ? (tá me a dar uma branca de tanto tempo com isto a frente :S)

    edit:
    se fizer uma coisa assim vai aprecer muito mal? vai me resolver o problema?
    Código:
    while(pot < n){
       if(n%pot == 0)
         pot = pot * m;
         k=k+1
           if(n%pot != 0)
             pot=n;
     }
    
     
    Última edição: 5 de Novembro de 2008
  7. Baderous

    Baderous Banido

    if (n%pot==0)
    ...
    else
    ...
     
  8. Dak

    Dak Power Member

    acabei de ver que if(pot == 1) fica num ciclo infinito -.-'
     
  9. Dak

    Dak Power Member

    Código:
    int pot=m;
     int k=0;
    
     while(pot < n){
       if(pot == 1){
         k=n;
         pot=n;
      }
       else
         if(n%pot == 0)
           pot = pot * m;
           k++; 
             if(n%pot != 0)
               pot=n;
     }
       printf("%d eh divisor de %d de ordem %d\n", m, n, k);
    return 0;
    }
    mas aqui se n for por exemplo 20 e m for 1 vai me dizer: "1 eh divisor de 20 de ordem 21" quando é de ordem 20... Não estou a perceber de onde vem aquele 1 a mais...
     
  10. Baderous

    Baderous Banido

    Não sei se sabes mas quando queres que várias instruções executem dentro de um if, tens de as englobar por chavetas.
     
  11. Dak

    Dak Power Member

    Não reparei... Já equipei 1º if dentro de else com as chavetas e já corre bem. Tava a adicionar o k++ que parvoice.

    Obrigado pela optima ajuda Baderous :D

    Esperemos que o programa não apresente mais erros pois pelo que parece já está concluido ;)

    Veremos...

    Obrigado mais uma vez :x2:
     
  12. c4l1m3r0

    c4l1m3r0 Power Member

    hehe olha o programa da FCUL! Já 2 pessoas me pediram ajuda nisso :D

    Se tiveres mais problemas diz que eu ja sei esse codigo de trás para a frente
     
  13. Dak

    Dak Power Member

    Não é preciso. Já o entreguei (:

    Também fizeste este trabalho?
     
  14. c4l1m3r0

    c4l1m3r0 Power Member

    Neps, eu sou de Física do IST, nós cá temos programação a sério ;) Para não pensares que isto é flame, a meio do semestre de C eu já estava a dar vectores dinâmicos e estruturas, e isto sempre aplicado a problemas da física. É o chamado crescer à força :D Por comparação, os meus amigos na FCUL dizem-me que nem sabem o que é um vector.
     

Partilhar esta Página