Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: HIDE_95 en 13 Agosto 2015, 18:08 pm



Título: Duda ejercicio manejo de arrays
Publicado por: HIDE_95 en 13 Agosto 2015, 18:08 pm
Buenas tardes. Tengo un problema y llevo un dia intentando solucionarlo pero no hay manera de que encuentre alguna solucion... Se trata de un ejercicio para aprender a moverte por los arrays y los struct . La mayor parte del ejercicio lo tengo resuelto solo me falta un subalgoritmo que al implementarlo no me da el resultado que me pide.
Este es el subalgoritmo que me falta por hacer:
 void all_mostFreqKMers(const string &texto, unsigned k, All_KmerMF &all_kmer_mf);
 que devuelve todos los k-mer mas frecuentes (all kmer mf) de texto . El tipo All KmerMF debe definirse como:

const unsigned MAX_KMERS = 10; // Maximo numero posible de kmers de tamaño k
typedef array <string, MAX_KMERS> KMers; // Array de cadenas para guardar los kmers mas frecuentes.
struct All_KmerMF
{
KMers kmers; // Listado de kmers (cadenas) mas frecuentes de tamaño k
unsigned num_kmers; // Numero de kmers mas frecuentes de tamaño k
unsigned frec; // Frecuencia de los kmers mas frecuentes de tamano k
};

Asi, en el ejemplo anterior, si llamamos al algoritmo all mostFreqKMers con k = 9, debe devolvernos los k-mers:

ATGATCAAG
CTCTTGATC
TCTTGATCA
CTTGATCAT

que tienen una frecuencia de 3 apariciones en el texto.

Aqui os dejo el codigo que he echo me compila bien , lo unico es que me devuelve por pantalla el mismo kmer , es decir , si pongo k = 9 , me devuelve 10 veces "CTTGATCAT" . Espero que me puedan echar una mano.


Código:
Código:
#include <iostream>
#include <string>
#include <tr1/array>

using namespace std ;
using namespace std :: tr1 ;
//Constantes y tipos
const unsigned MAX_KMERS = 10; // Maximo numero posible de kmers de tamaño k

typedef array <string, MAX_KMERS> KMers; // Array de cadenas para guardar los kmers mas frecuentes.

struct KmerMF
{
string kmer;
unsigned frec;
};

struct All_KmerMF
{
KMers kmers; // Listado de kmers (cadenas) mas frecuentes de tamano k
unsigned num_kmers; // Numero de kmers mas frecuentes de tamano k
unsigned frec; // Frecuencia de los kmers mas frecuentes de tamano k
};

//Cabecera subalgorimos
unsigned calc_frec(const string &texto, unsigned pos, const string &kmer) ; //Calcula la frecuencia de aparicion de un kmer en el texto
void mostFreqKMers(const string &texto, unsigned k , KmerMF &kmer_mf) ; //Devuelve el kmer (de longitud k) mas frecuente del texto
void all_mostFreqKMers(const string &texto, unsigned k, All_KmerMF &all_kmer_mf); //Devuelve todos los Kmer mas frecuentes del texto

//Algoritmo principal
int main ()
{

unsigned k ;
string texto = string("ATCAATGATCAACGTAAGCTTCTAAGCATGATCAAGGTGCTCACACAGTTTATCCACAAC") +
         "CTGAGTGGATGACATCAAGATAGGTCGTTGTATCTCCTTCCTCTCGTACTCTCATGACCA"  +
         "CGGAAAGATGATCAAGAGAGGATGATTTCTTGGCCATATCGCAATGAATACTTGTGACTT"  +
         "GTGCTTCCAATTGACATCTTCAGCGCCATATTGCGCTGGCCAAGGTGACGGAGCGGGATT"  +
         "ACGAAAGCATGATCATGGCTGTTGTTCTGTTTATCTTGTTTTGACTGAGACTTGTTAGGA"  +
         "TAGACGGTTTTTCATCACTGACTAGCCAAAGCCTTACTCTGCCTGACATCGACCGTAAAT"  +
         "TGATAATGAATTTACATGCTTCCGCGACGATTTACCTCTTGATCATCGATCCGATTGAAG"  +
         "ATCTTCAATTGTTAATTCTCTTGCCTCGACTCATAGCCATGATGAGCTCTTGATCATGTT"  +
         "TCCTTAACCCTCTATTTTTTACGGAAGAATGATCAAGCTGCTGCTCTTGATCATCGTTTC";

All_KmerMF all_kmer_mf ;

cout << "Introduzca k: " ;
cin >> k ;

all_mostFreqKMers ( texto , k , all_kmer_mf ) ;

for ( unsigned i = 0 ; i < all_kmer_mf.num_kmers ; i++ )
{
cout << "Kmers: " << all_kmer_mf.kmers[i] << endl ;
}

cout <<" ; " << all_kmer_mf.frec << " ; " << all_kmer_mf.num_kmers << endl ;

}


unsigned calc_frec(const string &texto, unsigned pos, const string &kmer)
{
unsigned frec , t , k ;

t = unsigned ( texto.size() ) ;
k = unsigned ( kmer.size() ) ;

frec = 0 ;
for ( unsigned i = pos ; i < t ; i++ )
{
if ( texto.substr ( i,k ) == kmer )
{
frec = frec + 1 ;
}
}

return frec ;

}

void mostFreqKMers(const string &texto, unsigned k, KmerMF &kmer_mf)
{
unsigned frecuencia ;
kmer_mf.frec = 0 ;

for ( unsigned i = 0 ; i < ( int( texto.size() ) -k ) ; i++ )
{

frecuencia = calc_frec ( texto , 0 , texto.substr ( i , k ) ) ;
if ( frecuencia >= kmer_mf.frec )
{
kmer_mf.kmer = texto.substr ( i , k ) ;
kmer_mf.frec = frecuencia ;
}

}

}

void all_mostFreqKMers(const string &texto, unsigned k, All_KmerMF &all_kmer_mf)
{

KmerMF kmer ;

all_kmer_mf.num_kmers = 0 ;

for ( unsigned i = 0 ; i < MAX_KMERS  ; i++ )
{
mostFreqKMers ( texto , k , kmer) ;

all_kmer_mf.kmers[i] = kmer.kmer ;
all_kmer_mf.frec = kmer.frec ;
all_kmer_mf.num_kmers++ ;

}


}