DUDA CODIGO C#

Iniciado por burnssss, 30 Octubre 2013, 14:35 PM

0 Miembros y 2 Visitantes están viendo este tema.

burnssss

Tengo una duda.
El siguiente codigo me calcula cuantas veces se repite una subcadena a partir de una cadena binaria.
La longitud de las subcadenas en este ejemplo es de 4. ¿ Como modificaria el codigo para obtener subcadenas de longitud desde 5 a 20?


#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <string>

using namespace std;

int main() {
   string cadena;
   char pr;
//   ofstream fo ("entreno.txt");
   ifstream fi("entreno.txt");
   int numero;
   int patron_int;
   //vector<int> v(1050000);
//   for (int i=0; i<170000; i++) {
//      //cout << v;
//      num=rand()%2;
//      fo<<num;
//   }
//  fo.close();
   getline(fi, cadena);
   vector<int>v(cadena.size());
   vector<int>patron(4);
   vector<long long>patrones(16);
   float N;

   //cout << cadena;
   //numero = Int32.Parse(cadena[0]);
   //pr=cadena[0].c_str();
   //cout << numero;
   //cout << cadena[0];
   for(int i=0; i<cadena.size(); i++) {
//      if (cadena=='1') v=0;
//      else if (cadena=='1') v=1;
      v=cadena-48;
//      cout << v;
   }

   for(int i=0;i<v.size()-3;i++) {
      for(int j=i;j<v.size()-3;j++) {
         patron[3]=v;
         patron[2]=v[j+1];
         patron[1]=v[j+2];
         patron[0]=v[j+3];
         //cout << patron[3] << patron[2] << patron[1] << patron[0] << endl;
         patron_int= patron[0] + patron[1]*2 + patron[2]*4 + patron[3]*8;
         //cout << patron_int << endl;
         patrones[patron_int]++;
         //if(i==v.size()/5) system("pause");

         //system("pause");
      }
      N=(100*i)/(v.size()-3);
   //   cout << N << "%" << endl;

   }

   for(int i=0; i<patrones.size(); i++) {
      cout << i << " se repite " << patrones << " veces." << endl;   
   }
   //cout << v.size();   
   system("pause");
   fi.close();
   return 0;
}

eferion

1. Lo lógico es que pongas un título de mensaje acorde a tu pregunta. Para empezar C# es un lenguaje y C++, que es el que estás poniendo aquí, otro distinto.

2. El código deberías ponerlo con las etiquetas de código correspndiente ( mira el combobox que dice "GeSHi" )

3. No se hacen tareas.

4. ¿He dicho que no se hacen tareas?

5. La clase vector de c++ no está limitada a 4, se pueden añadir bastantes elementos más.

6. El código que has puesto y tu pregunta me dan a entender que no lo has hecho tú. Intenta adaptar tú el código y comenta aquí tus dudas. Te lo comento porque, no se si lo sabes, no se hacen tareas.

burnssss

Perdon por el desorden. Efectivamente el codigo no lo he hecho yo. Yo he intentado implantar estas operaciones en Matlab pero no he podido. Entonces recurrí a C++. No tengo mucha idea de C++. Todo lo que hice con este código es entender su funcionamiento y ahora intentar desarrollarlo. El problema que se me habia planteado es que en matlab al crear las subcuerdas, el numero de datos es tan grande que al final no me hace el recuento de los patrones. He probado este codigo y si me hace el recuento. Creo que basicamente lo que hace es representar cada patron mediante un numero entero, y apartir de ahi hace el recuento de enteros, que corresponden a un patron binario. Como he dicho, quizas sea más facil implantarlo en C++ que en matlab. Asi que si puedes ayudarme en algo te lo agradecería.

eferion

Deberías al menos quitar los comentarios que estén demás... hay líneas que son absurdas y otras que no queda claro si son necesarias para el código o no.

Y ya que lo haces aprovecha para poner el código entre etiquetas (code=cpp) y (/code) sustituyendo paréntesis por corchetes.

burnssss

He quitado algun comentario.
Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <string>

using namespace std;

int main() {
string cadena;
char pr;
// ofstream fo ("entreno.txt");
ifstream fi("entreno.txt");
int numero;
int patron_int;
   }
   
//  fo.close();
getline(fi, cadena);
vector<int>v(cadena.size());
vector<int>patron(4);
vector<long long>patrones(16);
float N;

//cout << cadena;
//numero = Int32.Parse(cadena[0]);
//pr=cadena[0].c_str();
//cout << numero;
//cout << cadena[0];
for(int i=0; i<cadena.size(); i++) {
// if (cadena[i]=='1') v[i]=0;
// else if (cadena[i]=='1') v[i]=1;
v[i]=cadena[i]-48;
// cout << v[i];
}

for(int i=0;i<v.size()-3;i++) {
for(int j=i;j<v.size()-3;j++) {
patron[3]=v[i];
patron[2]=v[j+1];
patron[1]=v[j+2];
patron[0]=v[j+3];
//cout << patron[3] << patron[2] << patron[1] << patron[0] << endl;
patron_int= patron[0] + patron[1]*2 + patron[2]*4 + patron[3]*8;
//cout << patron_int << endl;
patrones[patron_int]++;
//if(i==v.size()/5) system("pause");

//system("pause");
}
N=(100*i)/(v.size()-3);
// cout << N << "%" << endl;

}

for(int i=0; i<patrones.size(); i++) {
cout << i << " se repite " << patrones[i] << " veces." << endl;
}
//cout << v.size();
system("pause");
fi.close();
return 0;
}


Ahora voy a ir preguntando sobre este codigo. Primero decirme que mas cambiar para ponerlo optimo y despues preguntare dudas

eferion

Más bien, primero consigue que funcione y luego piensa en optimizar.

Y para conseguir que funcione, lo primordial es entenderlo.

Slava_TZD

20!=2432902008176640000
4!=24

20!/4!=1.0137092e+17

Cuando sepas que hace el código, lo comentas y lo pones, así los tontos como yo nos enteramos de que hace sin tener que mirarlo 20! horas xD Vaya berenjenal.


The fact is, even if you were to stop bombing us, imprisoning us, torturing us, vilifying us, and usurping our lands, we would continue to hate you because our primary reason for hating you will not cease to exist until you embrace Islam.

Spiritdead5

foro incorrecto, ese codigo es C++

burnssss

Entender entiendo lo que hace.
A partir de una secuencia binaria intento extraer subsecuencias de longitud 4. Pero debido a la cantidad de datos, los patrones binarios se convierten a enteros y a partir de ahi se hace el recuento de patrones.

Un ejemplo matematico seria el siguiente:

SUCESION BINARIA

1 (1), 0 (2), 1 (3), 1 (4), 0 (5), 0 (6), 1 (7), 0 (8), 0 (9), 1 (10), 1 (11), 1 (12), 1 (13), 0 (14), 0 (15), 0 (16), 1 (17), 1 (18), 1 (19), 0 (20).

SOLUCION

1) 1 (1) 0 (2) 1 (3) 1 (4)
2) 1 (1) 1 (3) 0 (5) 1 (7)
3) 1 (1) 1 (4) 1 (7) 1 (10)
4) 1 (1) 0 (5) 0 (9) 1 (13)
5) 1 (1) 0 (6) 1 (11) 0 (16)
6) 1 (1) 1 (7) 1 (13) 1 (19)
7) 0 (2) 1 (3) 1 (4) 0 (5)
8) 0 (2) 1 (4) 0 (6) 0 (8)
9) 0 (2) 0 (5) 0 (8) 1 (11)
10) 0 (2) 0 (6) 1 (10) 0 (14)
11) 0 (2) 1 (7) 1 (12) 1 (17)
12) 0 (2) 0 (8) 0 (14) 0 (20)
13) 1 (3) 1 (4) 0 (5) 0 (6)
14) 1 (3) 0 (5) 1 (7) 0 (9)
15) 1 (3) 0 (6) 0 (9) 1 (12)
16) 1 (3) 1 (7) 1 (11) 0 (15)
17) 1 (3) 0 (8) 1 (13) 1 (18)
18) 1 (4) 0 (5) 0 (6) 1 (7)
19) 1 (4) 0 (6) 0 (8) 1 (10)
20) 1 (4) 1 (7) 1 (10) 1 (13)
21) 1 (4) 0 (8) 1 (12) 0 (16)
22) 1 (4) 0 (9) 0 (14) 1 (19)
23) 0 (5) 0 (6) 1 (7) 0 (8)
24) 0 (5) 1 (7) 0 (9) 1 (11)
25) 0 (5) 0 (8) 1 (11) 0 (14)
26) 0 (5) 0 (9) 1 (13) 1 (17)
27) 0 (5) 1 (10) 0 (15) 0 (20)
28) 0 (6) 1 (7) 0 (8) 0 (9)
29) 0 (6) 0 (8) 1 (10) 1 (12)
30) 0 (6) 0 (9) 1 (12) 0 (15)
31) 0 (6) 1 (10) 0 (14) 1 (18)
32) 1 (7) 0 (8) 0 (9) 1 (10)
33) 1 (7) 0 (9) 1 (11) 1 (13)
34) 1 (7) 1 (10) 1 (13) 0 (16)
35) 1 (7) 1 (11) 0 (15) 1 (19)
36) 0 (8) 0 (9) 1 (10) 1 (11)
37) 0 (8) 1 (10) 1 (12) 0 (14)
38) 0 (8) 1 (11) 0 (14) 1 (17)
39) 0 (8) 1 (12) 0 (16) 0 (20)
40) 0 (9) 1 (10) 1 (11) 1 (12)
41) 0 (9) 1 (11) 1 (13) 0 (15)
42) 0 (9) 1 (12) 0 (15) 1 (18)
43) 1 (10) 1 (11) 1 (12) 1 (13)
44) 1 (10) 1 (12) 0 (14) 0 (16)
45) 1 (10) 1 (13) 0 (16) 1 (19)
46) 1 (11) 1 (12) 1 (13) 0 (14)
47) 1 (11) 1 (13) 0 (15) 1 (17)
48) 1 (11) 0 (14) 1 (17) 0 (20)
49) 1 (12) 1 (13) 0 (14) 0 (15)
50) 1 (12) 0 (14) 0 (16) 1 (18)
51) 1 (13) 0 (14) 0 (15) 0 (16)
52) 1 (13) 0 (15) 1 (17) 1 (19)
53) 0 (14) 0 (15) 0 (16) 1 (17)
54) 0 (14) 0 (16) 1 (18) 0 (20)
55) 0 (15) 0 (16) 1 (17) 1 (18)
56) 0 (16) 1 (17) 1 (18) 1 (19)
57) 1 (17) 1 (18) 1 (19) 0 (20)

Los numeros entre parentesis indican el orden que deben tener.
A partir de ahi se hace un recuento de patrones con la frecuencia relativa.
Funcionar , el codigo funciona correctamente. Me indica patrones en enteros y el numero de veces que se repiten.