Ir ao conteúdo

Posts recomendados

Postado

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

Postado

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.

Postado

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);

}

 

Postado

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]?

Postado

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;

 

Postado

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)

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!