Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Arthurdr

Programa dando erro

Recommended Posts

Estou fazendo um programa, mas estou trancado em uma parte. O ojetivo desta parte do programa é ver se as letras em que o usuário digita, são iguais as permitidas. Procurei algumas maneiras de fazer isso, mas só achei essa. O problema deste programa é que quando ele vai analisar a cadeia t, ele sempre mostra que a cadeia é invalida, mesmo estando dentro do exigido, abrindo melhor a cadeia t, descobri que o programa sempre diz que a 18º letra é invalida, mas não consegui descobrir o motivo, mesmo ponto letras validas, a 18º ele mostra que é errada.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
    int M, N, i, j, a, b;
    char p[M], t[N];
    int letrasT, letraT, letrasP, letraP;
    
    M=5;
    N=25;
do
{
                do
                {
                    i=0;
                    letraP=0;
                    letrasP=0;
                    printf ("\n    Digite a cadeia p: ");
                    scanf ("%s", p);
                    if (M!=strlen(p))
                        printf ("\n\n        !!!TAMANHO DE p INVALIDO!!!\n");
                    for (i=0; i<M; i++)
                        if ((p!='A') && (p!='C') && (p!='G') && (p!='T'))
                            letrasP=1;
                        else
                            letrasP=0;
                    for (i=0; i<M; i++)
                        if (letrasP==1)
                            letraP=1;
                    if (letraP==1)
                        printf ("\n\n        !!!CADEIA DE p INVALIDA!!!\n");
                }while (letraP==1);
            }while (M<strlen(p));
        
            do
            {
                do
                {
                    i=0;
                    letraT=0;
                    letrasT=0;
                    printf ("\n    Digite a cadeia t: ");
                    scanf ("%s", t);
                    if (N!=strlen(t))
                        printf ("\n\n        !!!TAMANHO DE t INVALIDO!!!\n");
                    for (i=0; i<N; i++)
                        if ((t!='A') && (t!='C') && (t!='G') && (t!='T'))
                            letrasT=1;
                        else
                            letrasT=0;
                    for (i=0; i<N; i++)
                        if (letrasT==1)
                            letraT=1;
                    if (letraT==1)
                        printf ("\n\n        !!!CADEIA DE t INVALIDA!!!\n");
                }while (letraT==1);
            }while (N<strlen(t));
                
            printf ("\n%s", p);
            printf ("\n%s", t);
}

 

Screenshot_1.png

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Existem vários problemas com seu código, então vou te ajudando em partes, e começarei com os principais (corrigindo eles já deve fazer o seu código funcionar, vamos iterando mais após isso).

 

1. Tamanho inválido para p e t. Se você der um printf no sizeof deles depois, vai vir um valor diferente de 5 e 25 (no meu caso veio 0 e 1).

char p[M], t[N];

O certo seria alterar essa e a linha anterior para ficar:

const int M = 5, N = 25;
int i, j, a, b;
char p[M+1], t[N+1]; // o +1 é por causa do '\0' (último caractere de uma C-string é sempre um '\0')

 

2. Comparação entre ponteiro e caractere.

if ((p!='A') && (p!='C') && (p!='G') && (p!='T'))

Na verdade você não queria usar p, e sim:

p[i]

Verifique se há outros casos semelhantes no código (adianto logo que há :))! Isso pega o i-ésimo caractere de p.

 

Como seu código ainda não está finalizado, vá tirando suas dúvidas aqui, que se eu ver respondo.

Editado por RafaelCLP

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • O programa estava com os "i", quando eu copiei eles não vieram. Alterei o char para p[M+1] e t[N+1], não sabia deste caso.

    Vou enviar o trabalho inteiro, antes enviei só uma parte dele. O problema que está acontecendo no momento é que quando a cadeia do t é comparada com as letras, ele identifica como errada, mesmo estando certo.

    Obrigado pela ajuda!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    main()
    {
    	
    int M, N, cont, i, j, k, x, aux, a, b, salva_direto[cont][a], salva_invertido[cont][b];
    
    	printf ("\n				   PROJETO GENOMA \n\n	        * O tamanho maximo de uma cadeia e 15000 letras *\n   * As cadeias inseridas so poderao conter os caracteres 'A', 'C', 'T', 'G' *\n		* A cadeia t deve ser maior ou igual a cadeia p *\n     * Para executar o programa digite o tamanho das cadeias p e t como 0 *\n\n");
    	
    	do
    	{
    	cont=cont+1;
    		do
    		{
    			do
    			{
    			printf ("\n	Digite os tamanhos das cadeias p e t:	");
    			scanf ("%i %i", &M, &N);
    			if((0>M) || (M>15000) || (0>N) || (N>15000) || (M==0 && N!=0) || (N==0 && M!=0))
    				printf ("\n\n		!!!VALORES INVALIDOS!!!\n\n");
    			}while ((0>M) || (M>15000) || (0>N) || (N>15000) || (M==0 && N!=0) || (N==0 && M!=0));
    
    			if (M>N)
    				printf ("\n\n		!!!VALOR INVALIDO!!!\n	!!!VALOR DE p SUPERIOR AO VALOR DE t!!!\n\n");
    		}while (M>N);
    			
    		if ((M!=0) || (N!=0))
    		{
    	
    			char p[M+1], t[N+1];
    			int teste[M], ocorrencia_direta = 0, ocorrencia_complementar_invertida=0, letrasT[i], letraT, letrasP[i], letraP;
    			bool igual = true ;
    		
    			do
    			{
    				do
    				{
    					i=0;
    					letraP=0;
    					letrasP[i]=0;
    					printf ("\n	Digite a cadeia p: ");
    					scanf ("%s", p);
    					if (M!=strlen(p))
    						printf ("\n\n		!!!TAMANHO DE p INVALIDO!!!\n");
    					for (i=0; i<M; i++)
    						if ((p[i]!='A') && (p[i]!='C') && (p[i]!='G') && (p[i]!='T'))
    							letrasP[i]=1;
    						else
    							letrasP[i]=0;
    					for (i=0; i<M; i++)
    						if (letrasP[i]==1)
    							letraP=1;
    					if (letraP==1)
    						printf ("\n\n		!!!CADEIA DE p INVALIDA!!!\n");
    				}while (letraP==1);
    			}while (M<strlen(p));
    		
    			do
    			{
    				do
    				{
    					i=0;
    					letraT=0;
    					letrasT[i]=0;
    					printf ("\n	Digite a cadeia t: ");
    					scanf ("%s", t);
    					if (N!=strlen(t))
    						printf ("\n\n		!!!TAMANHO DE t INVALIDO!!!\n");
    					for (i=0; i<N; i++)
    						if ((t[i]!='A') && (t[i]!='C') && (t[i]!='G') && (t[i]!='T'))
    							letrasT[i]=1;
    						else
    							letrasT[i]=0;
    					for (i=0; i<N; i++)
    						if (letrasT[i]==1)
    							letraT=1;
    					if (letraT==1)
    						printf ("\n\n		!!!CADEIA DE t INVALIDA!!!\n");
    				}while (letraT==1);
    			}while (N<strlen(t));
    	
    			printf ("\n%s", p);
    			printf ("\n%s", t);
    		
    			printf ("\nTESTE %i", cont);
    		
    			// ocorrencia direta
    			
    			printf("\nOcorrencia direta: ");
    			
    			for (i=0; i<strlen(t); i++)
    				{
    					igual = true;
    					if (t[i]==p[0])
    						{
    														
    							aux=i+1;
    							teste[0]=1;
    							for (j=1; j<strlen(p); j++)
    							{
    									if (p[j]==t[aux])
    								{
    									teste[j]=1;
    									
    								} 
    								else 
    								{
    									teste[j] = 0; 
    								}
    								aux++;
    							}
    							
    						
    							for (x=0; x<strlen(p); x++)
    							{
    								if (teste[x]==0)
    									igual = false;	
    								  
    							}
    							if(igual == true){
    								ocorrencia_direta++;
    								printf (" %i", i+1);
    								salva_direto[cont][a]=i+1;
    								a++;
    							}
    						}
    				}
    				
    				if(ocorrencia_direta==0)
    				{
    					printf("0");
    					salva_direto[cont][a]=0;
    				}
    				printf("\n");
    			
    		//ocorrencia complementar invertida	
    
    			for(i=0;i<strlen(p); i++)
    			{
    				if(p[i]=='A')
    				{
    					p[i]='T';	
    				}
    				else if(p[i]=='C')
    				{
    					p[i]='G';	
    				}	
    				else if(p[i]=='G')
    				{
    					p[i]='C';	
    				}
    				else if(p[i]=='T')
    				{
    					p[i]='A';	
    				}	
    				
    			}
    			
    			char auxiliar;
    			for(i=0;i<M/2; i++)
    			{
    		
    		      auxiliar=p[i]; 
    		      p[i]=p[M-1-i];
    		      p[M-1-i]=auxiliar;  
    		   
    			}
    			
    			printf("Ocorrencia complementar invertida: ");
    			
    				for (i=0; i<strlen(t); i++)
    				{
    					igual = true;
    					if (t[i]==p[0])
    						{
    														
    							aux=i+1;
    							teste[0]=1;
    							for (j=1; j<strlen(p); j++)
    							{
    									if (p[j]==t[aux])
    								{
    									teste[j]=1;
    									
    								} 
    								else 
    								{
    									teste[j] = 0; 
    								}
    								aux++;
    							}
    							
    						
    							for (x=0; x<strlen(p); x++)
    							{
    								if (teste[x]==0)
    									igual = false;	
    								  
    							}
    							if(igual == true){
    								ocorrencia_complementar_invertida++;
    								printf (" %i", i+1);
    								salva_invertido[cont][b]=i+1;
    								b++;
    							}
    						}
    				}
    				
    				if(ocorrencia_complementar_invertida==0)
    				{
    					printf("0");
    					salva_invertido[cont][b]=0;
    				}
    				printf("\n");
    
    		}
    			
    		
    	}while ((M!=0) && (N!=0));
    	
    	cont=0;
    	
    	do
    	{
    		printf ("	Teste %i\n	Ocorrencia Direta:  ", cont);
    		for (a=0; a<100; a++)
    			printf ("%i", salva_direto[cont][a]);
    		printf ("\n	Ocorrencia Complementar Invertida:  ");
    		for (b=0; b<100; b++)
    			printf ("%i", salva_invertido[cont][b]);
    		cont++;
    	}while (cont<100);
    
    }

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Vou olhar, mas me diz qual o comportamento esperado da comparação por ocorrência direta e da comparação por ocorrência complementar invertida.

     

    Também notei isto:

    int teste[M], ocorrencia_direta = 0, ocorrencia_complementar_invertida=0, letrasT[i], letraT, letrasP[i], letraP;

    Não era pra ser letrasT[N] e letrasP[M]?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Bom, o programa deve ler 2 cadeias de tamanhos variados, onde a cadeia p deve ser menor ou igual a cadeia t. Uma comparação direta ocorre quando a cadeia p aparece como subcadeia de t. Uma cadeia complementar invertida ocorre quando o inverso da cadeia p (além de alterar as letras A<=> T e C<=>G)aparece dentro da t. No caso uma cadeia p=CATA vira uma cadeia p=TATG.

    O programa vai identificar em que posição a subcadeia aparece na cadeia.

    Eu procurei na internet, mas não achei muita coisa para comparar os caracteres da string com outros caracteres, no caso do letrasT[ i ] , eu usei o "i" pro "for" percorrer  a palavra inteira, e ver uma a uma se elas são iguais a "A", "C", "T", "G".

    for (i=0; i<M; i++)
    	if ((p[i]!='A') && (p[i]!='C') && (p[i]!='G') && (p[i]!='T'))
    		letrasP[i]=1;
    	else
    		letrasP[i]=0;

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Na hora de declarar as variáveis deveria ser letrasT[N] e letrasP[M], na hora de acessar que seria [i].

    Aqui teu código funciona.

    genoma.png

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Postado (editado)

    faz um teste ponto o t como maior que 18 caracteres. Fiz o teste e funcionou

    Muito obrigado!!

    Acho que era o N e o M mesmo

    Valeuu

    adicionado 44 minutos depois

    Só mais uma coisa, o programa deve armazenar todos os dados que são as posições das subcadeias, e só apresentar no final depois de digitar 0 0 para os tamanhos. Do jeito que eu fiz, ficou muito complicado e não funcionou, teria um jeito mais fácil de armazenar? eu pensei em matriz, mas não está funcionando. (Os printf no meio do programa são só para testes)

    Editado por Arthurdr

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×