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

Sign in to follow this  
fo_11

Duvida projecto

Recommended Posts

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?

Share this post


Link to post
Share on other 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)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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]);
       }
}


Share this post


Link to post
Share on other sites
Localhost

Precisas de ser tu a criar uma função de para ordenar? Se não for preciso utiliza a função *qsort*.


here since 2009

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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 );
}

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.