Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

Duvida projecto

Mensagens Recomendadas

fo_11

Estou com um trabalho de programação em c entre mãos e parte do trabalho obriga-me a efectuar pesquisa.

O problema é o seguinte:

O utilizador tem que inserir um bi ou uma sequencia de adn e ele escolhe uma das opcoes. A minha duvida coloca-se é como é que verifico se o utilizador insere um bi ou um adn sem erros. Um exemplo para terem uma ideia do ques estou a falar:

bi==>12a53 (é um bi com erros logo o programa deve emitir um erro e não efectua a procura)

adn==> augact2aagt (é um adn com erro pois tem um numero pelo meio e até tem algo que não pertence ao adn o 'u')

Alguem conhece uma solução de verificar se foi inserido um bi ou adn correcto?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
IRX773

Na minha opinião, depois de fazeres algo para a escolha do Bi ou ADN, seja ele um If ou Switch ou outro (aí é mesmo da maneira que preferires pois há várias opções para programares essa parte), guardavas o Bi e/ou o ADN numa string e, no exemplo concreto do ADN, fazias verificações por cada instância da string a ver se a letra é ou não aquelas permitidas.

Para o BI penso que pelo número de caracteres, verificar se são letras e ainda usar o código de verificação bem como os cálculos para ver se é um número válido através do número de verificação, dariam. (encontrei este site que explica como fazer a verificação através do número de controlo/verificação: http://geramat.blogs.sapo.pt/13528.html)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

OK.

Obrigado pela dica. Emrelacao ao bi não é necessário ser tão rigoroso pois a ele são gerados aleatoriamente pelo professor.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

O que tens de fazer é definir à mão todas as regras que um BI ou um ADN tem de seguir para ser válido depois aplicas essas regras. Depois de fazeres isso metes aqui as tais regras para ser ajudado com mais eficácia.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Aqui estão as regras impostas:

int validadeAdn(char *adn)                          //verifica a validade da sequencia de adn introduzida pelo utilizador, caso seja valido return 1 se não return 0
{
     int i;
    
     for(i=0;i<strlen(adn);i++)
      if(adn[i]!='A' && adn[i]!='C' && adn[i]!='G' && adn[i]!='T')             //verifica se os caracteres inseridos correspondem a uma das bases nucleótidias            
        {printf("\n\n  !!!!!!!!SEQUENCIA ADN INVALIDA!!!!!!!!\n");
         system("pause");
         return 0;
        }
     return 1;
}
int validadeBi(char *s)
{
    int i;

    if(strlen(s)==0 || s[0]=='0')        //caso o array esteja vazio reportar erro ou o primeiro elemento seja zero
     {printf("\n\n   !!!!!!!!BI INVALIDO!!!!!!!!\n");
      system("pause");
      return 0;
     }
     
    for(i=0;s[i]!='\0';i++)           
      if(s[i]<'0' ||'9'<s[i])            //verifica se conteudo que o array possui são numeros
        {printf("\n\n   !!!!!!!!BI INVALIDO!!!!!!!!\n");
         system("pause");
         return 0;
        }
}

O que acham?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Quando disse "definir regras", queria dizer à mão. Não sei quais são as regras mas se esse código funciona, é isso.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Edit: Vou explicar o que pretendo. O quicksort é muito mais eficiente se o array for de um tamanho considerável do que o insertsort. Mas quando o array é de pequenas dimensões, que é o que acontece quando o vector está quase ordenado no quicksort, o insertsort é melhor opcao em relacao ao quicksort.

Efectuei a relacao mas está acontecer o inverso, está mais lento. Alguem pode ajudar?

void Quicksort(PESSOA *id, int left, int right,int flag_ord)             //flag_ord indica qual é o tipo de ordenacao que foi selecionado           
{
        int pivot;
         
        if(left < right) 
          {if(flag_ord==1)                                               //se flag_ord for 1 é ordenado por bi
             pivot=PartitionBi(id, left, right);
           else if(flag_ord==2)                                          //se for 2 é ordenado por adn
             pivot=PartitionAdn(id,left, right);      
           else                                                      //senão é por comprimento de adn
             pivot=PartitionAdnComp(id, left, right);
           
           //verificar se é mais util utilizar o quicksort ou o insertsort
           if(10<((pivot-1)-left))
             Quicksort(id, left, pivot-1, flag_ord);
           else
             Insertsort(id,left,pivot-1,flag_ord);
           
           if(10<(right-(pivot+1)))
              Quicksort(id, pivot+1, right, flag_ord);
           else
              Insertsort(id,pivot-1,right,flag_ord);
          }
}

void Insertsort(PESSOA *id,int inicio,int fim,int flag_ord)
{
     int i,j;
     
     for(i=inicio+1;i<=fim;i++)
      for(j=0;j<i;j++)
       {if(flag_ord==1)
           if(id[i].bi<id[j].bi)
            swap(&id[i],&id[j]);
        else
         if(strcmp(id[i].adn,id[j].adn)<0)
            swap(&id[i],&id[j]);
       }
}


Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Não, não é necessário ser eu a criar a função. Eu é que estive a pesquisar e deparei me com a situação de juntar duas funções numa visto que as suas qualidades são opostas

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Se não é necessário usa a função que já mencionei (coloquei também um link que te pode interessar).


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Não estou a conseguir implementar a função que me indicas-te simplesmente não ordena :)

Daqui a pouco já coloco o que fiz...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Aqui está o código. É uma estrutura do tipo PESSOA que contem int bi e char *adn.

qsort (id, n_pessoas, sizeof(PESSOA), compare);

int compare (const void * a, const void * b)
{
 return ( *(int*)a - *(int*)b );
}

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.