Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: burnssss en 30 Octubre 2013, 14:35 pm



Título: DUDA CODIGO C#
Publicado por: burnssss en 30 Octubre 2013, 14:35 pm
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;
}
 


Título: Re: DUDA CODIGO C#
Publicado por: eferion en 30 Octubre 2013, 14:44 pm
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.


Título: Re: DUDA CODIGO C#
Publicado por: burnssss en 30 Octubre 2013, 15:04 pm
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.


Título: Re: DUDA CODIGO C#
Publicado por: eferion en 30 Octubre 2013, 15:24 pm
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.


Título: Re: DUDA CODIGO C#
Publicado por: burnssss en 30 Octubre 2013, 15:44 pm
He quitado algun comentario.
 
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdlib.h>
  4. #include <vector>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. int main() {
  10. string cadena;
  11. char pr;
  12. // ofstream fo ("entreno.txt");
  13. ifstream fi("entreno.txt");
  14. int numero;
  15. int patron_int;
  16.   }
  17.  
  18. //  fo.close();
  19. getline(fi, cadena);
  20. vector<int>v(cadena.size());
  21. vector<int>patron(4);
  22. vector<long long>patrones(16);
  23. float N;
  24.  
  25. //cout << cadena;
  26. //numero = Int32.Parse(cadena[0]);
  27. //pr=cadena[0].c_str();
  28. //cout << numero;
  29. //cout << cadena[0];
  30. for(int i=0; i<cadena.size(); i++) {
  31. // if (cadena[i]=='1') v[i]=0;
  32. // else if (cadena[i]=='1') v[i]=1;
  33. v[i]=cadena[i]-48;
  34. // cout << v[i];
  35. }
  36.  
  37. for(int i=0;i<v.size()-3;i++) {
  38. for(int j=i;j<v.size()-3;j++) {
  39. patron[3]=v[i];
  40. patron[2]=v[j+1];
  41. patron[1]=v[j+2];
  42. patron[0]=v[j+3];
  43. //cout << patron[3] << patron[2] << patron[1] << patron[0] << endl;
  44. patron_int= patron[0] + patron[1]*2 + patron[2]*4 + patron[3]*8;
  45. //cout << patron_int << endl;
  46. patrones[patron_int]++;
  47. //if(i==v.size()/5) system("pause");
  48.  
  49. //system("pause");
  50. }
  51. N=(100*i)/(v.size()-3);
  52. // cout << N << "%" << endl;
  53.  
  54. }
  55.  
  56. for(int i=0; i<patrones.size(); i++) {
  57. cout << i << " se repite " << patrones[i] << " veces." << endl;
  58. }
  59. //cout << v.size();
  60. system("pause");
  61. fi.close();
  62. return 0;
  63. }
  64.  

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


Título: Re: DUDA CODIGO C#
Publicado por: eferion en 30 Octubre 2013, 17:35 pm
Más bien, primero consigue que funcione y luego piensa en optimizar.

Y para conseguir que funcione, lo primordial es entenderlo.


Título: Re: DUDA CODIGO C#
Publicado por: Slava_TZD en 30 Octubre 2013, 21:42 pm
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.


Título: Re: DUDA CODIGO C#
Publicado por: Spiritdead5 en 30 Octubre 2013, 21:51 pm
foro incorrecto, ese codigo es C++


Título: Re: DUDA CODIGO C#
Publicado por: burnssss en 30 Octubre 2013, 22:15 pm
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.