Ir ao conteúdo
  • Cadastre-se

Programa dando erro


Arthurdr

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

}

 

Link para o comentário
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]?

Link para o comentário
Compartilhar em outros sites

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;

 

Link para o comentário
Compartilhar em outros sites

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)

Link para o comentário
Compartilhar em outros sites

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...