[ Foro de C ]

ayuda con este programa

08-Jun-2014 20:48
MANUEL CHAVIRA
5 Respuestas

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


08-Jun-2014 20:55
Nacho Cabanes (+84)

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


08-Jun-2014 21:58
MANUEL CHAVIRA

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



08-Jun-2014 21:59
MANUEL CHAVIRA

ponerle la condicion de que hay algun error


08-Jun-2014 22:22
Nacho Cabanes (+84)

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



08-Jun-2014 23:22
MANUEL CHAVIRA

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