[ Foro de C ]
1. Contando Nucleótidos de ADN.
Cadena ADN: Una cadena construida con los símbolos {A,C,G,T}, los cuales son usados para identificar los nucleótidos. El monómero de ácido nucleico se denomina un nucleótido y se utiliza como una unidad de longitud de cadena (abreviado nt) [1.1].
Un ejemplo de una cadena de ADN de longitud 21 es "ATGCTTCAGAAAGGTCTTACG".
Descripción del problema. Introduzca desde la entrada estándar una cadena s de ADN de longitud máxima 1000 nt (soporte mayúsculas y minúsculas), obtener cuatro enteros (separados por espacios) contando el número respectivo de veces que se producen los símbolos 'A', 'C', 'G' y 'T' en s, por ejemplo:
Entrada:
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC
Salida:
20 12 17 21
a) No es necesario que plantees la pregunta 4 veces.
b) ¿Qué es lo que no sabes hacer? ¿Pedir al usuario una cadena de texto? ¿Comprobar cual es cada una de las letras de la cadena? ¿Contar las veces que aparece una letra? ¿Contar 4 veces? En vez de "copiar y pegar" el enunciado, pregunta lo que no sepas hacer.
Aun así, todas las ideas básicas las tienes en el apartado 5.2 del curso:
http://www.aprendeaprogramar.com/mod/resource/view.php?id=321
tengo este programa, solo me falta ponerle la condicion de cuando se ponga un caracter diferente:
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000
char nt[MAX+1]; /*Contando caracter '\0' */
int main(void)
{
int i, lon, A=0,C=0,G=0,T=0;
setlocale(LC_ALL,"");
puts("Introducir cadena de ADN:");
fgets(nt, MAX+1, stdin);
lon=strlen(nt);
for(i=0; i<lon; ++i)
nt[i]= toupper(nt[i]);
for(i=0; i<lon; ++i){
switch(nt[i]){
case'A': A++;
break;
case'C': C++;
break;
case'G': G++;
break;
case'T': T++;
break;
}
}
printf("%d %d %d %d", A,C,G,T);
return 0;
}
ponerle la condicion de que hay algun error
Yo lo veo perfecto.
No te dicen qué hacer en caso de error, por lo que se deduce que no va a haber caracteres no válidos. Si aun así lo quieres controlar, lo podrías hacer añadiendo un "default" al "case", pero, insisto, yo no lo haría en un ejercicio como éste.
Apenas se le pueden hacer un par de mejoras internas de muy poca importancia: que la cadena de texto sea una variable local, y no convertir a mayúsculas toda la cadena, sino comparar los dos valores, que es de esperar que sea ligeramente más rápido (porque para convertir a mayúsculas debe comprobar si está entre dos valores límite y luego restarle un número):
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000
int main(void)
{
int i, lon, A=0,C=0,G=0,T=0;
char nt[MAX+1]; /*Contando caracter '\0' */
puts("Introducir cadena de ADN:");
fgets(nt, MAX+1, stdin);
lon=strlen(nt);
for(i=0; i<lon; ++i)
{
switch(nt[i])
{
case 'a':
case 'A': A++;
break;
case 'c':
case 'C': C++;
break;
case 'g':
case 'G': G++;
break;
case 't':
case 'T': T++;
break;
}
}
printf("%d %d %d %d", A,C,G,T);
return 0;
}
OK, Muchas gracias , hay disculpa por lo de los 4 mensajes enviados era la primera ves que hacia una pregunta GRACIAS!!
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)