Jump to content
leonina

Programa das sequência de DNA

Recommended Posts

leonina

Boa noite, estou a fazer um trabalho em que me foi solicitado para que criasse um programa que a  partir de um ficheiro que continha a sequência de uma das hélice de DNA, permitisse a criação da hélice complementar, da sequência de RNA, e da conversão em proteínas. Acontece que o programa apresenta um problema, o qual não consigo resolver: este está a ler caracteres para um espaço de memória não alocado, mas nao consigo solucionar, este encontra-se no case '3' será que alguém poderia dizer onde se encontra o erro e como solucioná-lo? Obrigado.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char* codoes[61] = {"GCU", "GCC", "GCA", "GCG", "CGU", "CGC", "CGA", "CGG", "AGA", "AGG", "AAU", "AAC", "GAU", "GAC", 
"UGU", "UGC", "CAA", "CAG", "GAA", "GAG", "GGU", "GGC", "GGA", "GGG", "CAU", "CAC", "AUU", "AUC","AUA", "UUA", "UUG", "CUU", "CUC", "CUA", "CUG", "AAA", "AAG", "AUG", "UUU", "UUC", "CCU", "CCC", 
"CCA", "CCG", "UCU", "UCC", "UCA", "UCG", "AGU", "AGC", "ACU", "ACC", "ACA", "ACG", "UGG", "UAU", 
"UAC", "GUU", "GUC", "GUA", "GUG"};
char* aminos[61] = 
{"Ala/A", "Ala/A", "Ala/A", "Ala/A", "Arg/R", "Arg/R", "Arg/R", "Arg/R", "Arg/R", "Arg/R", "Asn/N", "Asn/N", "Asp/D", "Asp/D",
"Cys/C", "Cys/C", "Gln/Q", "Gln/Q", "Glu/E", "Glu/E", "Gly/G", "Gly/G", "Gly/G", "Gly/G", "His/H", "His/H", "Ile/I", "Ile/I", "Ile/I", "Leu/L", "Leu/L", "Leu/L", "Leu/L", "Leu/L", "Leu/L", "Lys/K", "Lys/K", "Met/M", "Phe/F", "Phe/F", "Pro/P", "Pro/P", "Pro/P", "Pro/P", "Ser/S", "Ser/S", "Ser/S", "Ser/S", "Ser/S", "Ser/S", "Thr/T", "Thr/T", "Thr/T", "Thr/T", "Trp/W", "Tyr/Y",
"Tyr/Y", "Val/V", "Val/V", "Val/V", "Val/V"};

char codao[3];
char opcao, conversao;
char dna[200], dnacomp[200], rna[200], prot[200];
int conversao2,a, i,nprot,proteina;
printf("ACEDEU AO PROGRAMA: CONVERSOR DE CADEIAS\n");
printf("Autores:\n");
printf("\tAndré Fernandes(42160) e Cátia Martins(41748)\n");
printf("Curso: Bioquímica\n\n");
do{
	printf("MENU\n");
        	printf ("\t1 - Gerar ficheiro complemento DNA\n");
        	printf ("\t2 - Gerar ficheiro RNA\n");
        	printf ("\t3 - Gerar ficheiro Proteínas\n");
        	printf ("\t\t\t\tS - SAIR\n");
	printf ("\t\t\tIntroduza a opcao:");
        	scanf (" %c", &opcao);
        	switch (opcao){ /*o switch(opcao) ordena ao pc seguir para casos (case '1', case'2',...) dependendo da opção que introduzirmos no programa*/

		case '1':
		conversao2=0;
		printf("Ficheiro DNA:");
		scanf("%s",dna);
		FILE*DNA;
		DNA=fopen(dna,"r");
		if(!DNA){
			printf("Erro na abertura do ficheiro %s",dna);
			exit(0);
		}
		FILE*DNAcomp;
		printf("Ficheiro complemento DNA:");
		scanf("%s",dnacomp);
		DNAcomp=fopen(dnacomp,"w");
		printf("A calcular o complemento DNA...\n");
		while((conversao=fgetc(DNA))!=EOF){
			if(conversao=='A'){conversao='T';}
			else if(conversao=='T'){conversao='A';}
			else if(conversao=='C'){conversao='G';}
			else if(conversao=='G'){conversao='C';}
			else if((conversao=fgetc(DNA))==EOF){printf("O complemento DNA está completo e gravado como %s\n\n",dnacomp);}
			else{
				conversao='?';
				conversao2=conversao2+1;
				if(conversao2==1){printf("Foi encontrado pelo menos uma base azotada anormal e convertida em: ?. Por favor verifique se o DNA tem a sequência correcta\n");}
			}
			fputc(conversao,DNAcomp);
		}
		fclose(DNAcomp);	
		continue; /*utilizou-se o continue, para que, após óbtidos os valores, o programa volte ao menu.*/


               		case '2': 
		conversao2=0;
		printf("Ficheiro DNA:");
		scanf("%s",dna);
		DNA=fopen(dna,"r");
		if(!DNA){
			printf("Erro na abertura do ficheiro %s",dna);
			exit(0);
		}
		FILE*RNA;
		printf("Ficheiro RNA:");
		scanf("%s",rna);
		RNA=fopen(rna,"w");
		printf("A converter DNA para RNA...\n");
		while((conversao=fgetc(DNA))!=EOF){
			if(conversao=='A'){conversao='U';}
			else if(conversao=='T'){conversao='A';}
			else if(conversao=='C'){conversao='G';}
			else if(conversao=='G'){conversao='C';}
			else if((conversao=fgetc(DNA))==EOF){printf("A conversão está completa e gravada como %s\n\n",rna);}
			else{
				conversao='?';
				conversao2=conversao2+1;
				if(conversao2==1){printf("Foi encontrado pelo menos uma base azotada anormal e convertida em: ?. Por favor verifique se o DNA tem a sequência correcta\n");}
			}
			fputc(conversao,RNA);
		}
		fclose(RNA);
		continue;


                  	case '3':
		proteina=0;
		nprot=0;
		printf("Ficheiro DNA:");
		scanf("%s",dna);
		DNA=fopen(dna,"r");
		if(!DNA){
			printf("Erro na abertura do ficheiro %s",dna);
			exit(0);
		}
		FILE*RNA2;
		RNA2=fopen("rnaauxiliar.txt","w");			
		while((conversao=fgetc(DNA))!=EOF){
			if(conversao=='A'){conversao='U';fputc(conversao,RNA2);}
			else if(conversao=='T'){conversao='A';fputc(conversao,RNA2);}
			else if(conversao=='C'){conversao='G';fputc(conversao,RNA2);}
			else if(conversao=='G'){conversao='C';fputc(conversao,RNA2);}
		}
		fclose(RNA2);
		FILE*RNA3;
		RNA3=fopen("rnaauxiliar.txt","r");
		printf("Ficheiro da sequencia de proteinas:");
		scanf("%s",prot);
		FILE*PROT;
		PROT=fopen(prot,"w");
		printf("A converter DNA para sequencia de proteinas...\n");
		while((conversao=fgetc(RNA3))!=EOF){
			codao[0]=conversao;
			i++;
			if (i==2){
				codao[3]='\0';				
				if((strcmp(codao,"AUG"))==0){
					proteina=1;
					nprot=nprot+1;
					fprintf(PROT,"Proteina %i:",nprot);
				}
				else if((strcmp(codao,"UAA")==0)||(strcmp(codao,"UAG")==0)||(strcmp(codao,"UGA")==0)){
					proteina=0;
					fprintf(PROT,"----;\n ");
				}
				for(a=0;a<61;a++){
					if(proteina==1){
						if((strcmp(codao,codoes[a]))==0){
							fprintf(PROT,"%s; ",aminos[a]);
						}
					}
				}
			i=0;
			}
		}
		fclose(PROT);
		fclose(DNA);
		fclose(RNA3);
		continue;


               		case 's': 
		printf("Escolheu sair do programa. Ate a proxima.");
		break; /*no caso de utilizarmos as letras s minusculo e maiusculo, utilizamos o break para sair do programa*/

               		case 'S': 
		printf("Escolheu sair do programa. Ate a proxima.");
		break;

		default: /*o default serve como o else, em que os restantes casos não descritos efectua-se uma acção*/
		printf("A opcao nao e valida.\n\n\n");
		continue;
               	}      

        } while ((opcao!='s')&&(opcao!='S')); /*aqui o while vai fazer com que o ciclo, iniciado por do, não termine enquanto não for introduzido o s minusculo ou maiusculo*/	
return (0);
}

Share this post


Link to post
Share on other sites
Surtr

Isso é muito código para digerir. Dá-nos algo mais específico. Compila isso com a flag -g, corre no gdb, faz o backtrace e põe aqui  o resultado do debugger.

Mas provavelmente o erro estará aqui:

char* codoes[61] = ...

O que fizeste foi um array de apontadores para char que não é bem o que queres.

Podes manter essa sintaxe, e fazer um ciclo até ao fim do array e a cada iteração fazer malloc para uma string de n caracteres

int i;
for(i = 0; i < 61; i++) 
        codoes[i] = (char*) malloc (5 * sizeof(char));

Ou, para manter a coisa mais simples;

Declarar no ínicio assim:

char codoes[61][5];

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

×
×
  • Create New...

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.