elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
1  Programación / Programación C/C++ / Re: Suma de ascii en: 31 Marzo 2013, 03:16 am
Fíjate que la y sólo la inicializas cuando la declaras, por eso para el primer caso te funciona. Luego vas arrastrando el valor de y en cada solución... Recuerda que sumas los valores ascii de caracteres... (cadena)

Ahora debería funcionar...

Código
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4.  
  5. char cadena[30];
  6. int y;
  7. int i;
  8. int resultado;
  9. int l;
  10. int main() {
  11.  
  12.    int i=0;
  13.    int y;
  14.    char nombreArchivoLectura[10];
  15.    char nombreArchivoEscritura[10];
  16.    FILE *archivoLectura=NULL;
  17.    FILE *archivoEscritura=NULL;
  18.    archivoLectura=fopen("in.txt","r");
  19.    archivoEscritura = fopen("salida.txt","w");
  20.  
  21.    while(!feof(archivoLectura)) {
  22.        y=0;
  23.        fscanf(archivoLectura,"%[^\n]\n",cadena);
  24.        l=strlen(cadena);
  25.        printf("%s: ", cadena);
  26.        for(i=0;i<l+1;i++) y+=(int)cadena[i];
  27.        printf("\n---------------------------------------\n");
  28.        resultado=y%131;
  29.        fprintf(archivoEscritura,"%d\n",resultado);
  30.    }
  31.    fclose(archivoLectura);
  32.    fclose(archivoEscritura);
  33.    return 0;
  34. }
  35.  
2  Programación / Programación C/C++ / Re: [C] Determinante de orden N en: 30 Marzo 2013, 07:05 am
Es que el sistema que utilizan es de "fuerza bruta".

Para hacerlo razonable habría que usar Gauss con/sin pivotes.

Saluditos!, ....


No, ya, ya. diagonalizar la matriz para obtener la solución con el producto de los elementos de la diagonal principal xD Pero para diagonalizar la matriz... xD No sabría como hacerlo de forma eficiente. Aunque bueno, debería tratar de pensarlo para afirmar eso xD
3  Programación / Programación C/C++ / [C] Determinante de orden N en: 29 Marzo 2013, 20:57 pm
A partir del título de este post ( http://foro.elhacker.net/programacion_cc/determinante_matriz_de_orden_n-t352910.0.html )  me entró la curiosidad de resolverlo de manera dinámica. Y la manera que se me ocurría para un algoritmo sencillo pues es la regla de Laplace o el desarrollo por menores complementarios de manera recursiva:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define N 4
  6.  
  7. /* DETERMINANTE DE UNA MATRIZ de orden N - por MAFH */
  8.  
  9. typedef int ** matriz;
  10.  
  11. void visualizar_matriz (matriz matrix, int m, int n) {
  12.    int i,j;
  13.    for (i=0; i<m; i++) {
  14.        for(j=0; j<n; j++) {
  15.            printf("%d ", matrix[i][j]);
  16.        }
  17.        printf("\n");
  18.    }
  19. }
  20.  
  21. matriz generar_matriz (int m, int n) {
  22.    int i;
  23.    matriz temp;
  24.    if ((temp = (matriz) malloc(m*sizeof(int*))) == NULL)
  25.        return NULL;
  26.    for (i=0; i<m; i++)
  27.        if ((temp[i] = (int *)malloc(n*sizeof(int))) == NULL)
  28.            return NULL;
  29.    return temp;
  30. }
  31.  
  32. matriz copiar_matriz (matriz matrix, int m, int n) {
  33.    int i,j;
  34.    matriz temp = (matriz) generar_matriz(m,n);
  35.    if (temp != NULL) {
  36. for (i=0; i<m; i++)
  37. for (j=0; j<n; j++)
  38. temp[i][j] = matrix[i][j];
  39.    }
  40.    return temp;
  41. }
  42.  
  43. void liberar_matriz (matriz matrix, int m) {
  44.    int i;
  45.    for (i=0; i<m; i++)
  46.        free(matrix[i]);
  47.    free(matrix);
  48. }
  49.  
  50. void rellenar_matriz (matriz matrix, int m, int n) {
  51.    int i,j;
  52.    for (i=0; i<m; i++)
  53.        for(j=0; j<n; j++) {
  54.            printf("Valor de matrix[%d,%d] = ", i, j);
  55.            scanf("%d", &(matrix[i][j]));
  56.        }
  57. }
  58.  
  59. matriz adjunto_matriz (matriz matrix, int fila, int columna, int n) {
  60.    matriz adjunto = (matriz) generar_matriz(n-1,n-1);
  61.    if (adjunto != NULL) {
  62. int i, j, k=0, l=0;
  63. for (i=0; i<n; i++)
  64. for (j=0; j<n; j++) {
  65. if ((i != fila) && (j != columna)) {
  66. adjunto[k][l] = matrix[i][j];
  67. if (++l == n-1) {
  68. l=0;
  69. k++;
  70. }
  71. }
  72. }
  73.    }
  74.    return adjunto;
  75. }
  76.  
  77. int determinante (matriz matrix, int n) {
  78.    if (n == 1) {
  79.        return matrix[0][0];
  80.    } else {
  81.        int j;
  82.        int res = 0;
  83.        for (j=0; j<n; j++){
  84.            matriz adjunto = (matriz) adjunto_matriz(matrix, 0, j, n);
  85.            if (adjunto == NULL) exit(1);
  86.            res += pow(-1, (j%2))*matrix[0][j]*determinante(adjunto, n-1);
  87.            liberar_matriz(adjunto,n-1);
  88.        }
  89.        return res;
  90.    }
  91. }
  92.  
  93.  
  94. int main (int argc, char ** argv) {
  95.    matriz m = (matriz) generar_matriz(N,N);
  96.    rellenar_matriz(m,N,N);
  97.    visualizar_matriz(m,N,N);
  98.    printf("|M| = %d\n", determinante(m,N));
  99.    liberar_matriz(m,N);
  100.    return 0;
  101. }
  102.  

Aunque tenemos la constante N para el orden de la matriz, podemos utilizar una variable para que el usuario introduzca el orden, evidentemente.

Una ejecución del código con Valgrind:
Citar
pyxolo@ubuntu:~/Escritorio$ gcc -o det determinanteN.c -lm
pyxolo@ubuntu:~/Escritorio$ valgrind ./det -all
==4938== Memcheck, a memory error detector
==4938== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==4938== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==4938== Command: ./det -all
==4938==
Valor de matrix[0,0] = 2
Valor de matrix[0,1] = 3
Valor de matrix[0,2] = -4
Valor de matrix[0,3] = 2
Valor de matrix[1,0] = 9
Valor de matrix[1,1] = 11
Valor de matrix[1,2] = 0
Valor de matrix[1,3] = 3
Valor de matrix[2,0] = 2
Valor de matrix[2,1] = -4
Valor de matrix[2,2] = -5
Valor de matrix[2,3] = -6
Valor de matrix[3,0] = 21
Valor de matrix[3,1] = 100
Valor de matrix[3,2] = 2
Valor de matrix[3,3] = 3
2 3 -4 2
9 11 0 3
2 -4 -5 -6
21 100 2 3
|M| = -23240
==4938==
==4938== HEAP SUMMARY:
==4938==     in use at exit: 0 bytes in 0 blocks
==4938==   total heap usage: 105 allocs, 105 frees, 752 bytes allocated
==4938==
==4938== All heap blocks were freed -- no leaks are possible
==4938==
==4938== For counts of detected and suppressed errors, rerun with: -v
==4938== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Conclusión del desarrollo por menores:

Orden 1:
1 de orden 1
no llamadas recursivas

Orden 2:
2 de orden 1
2 = 2 llamadas recursivas

Orden 3:
3 de orden 2
2 de orden 1
3*2 = 6 llamadas recursivas

Orden 4:
4 de orden 3
3 de orden 2
2 de orden 1
4*3*2 = 24 llamadas recursivas

Orden 5:
5 de orden 4
4 de orden 3
3 de orden 2
2 de orden 1
5*4*3*2 = 120 llamadas recursivas

Orden n:
n de orden n-1
n-1 de orden n-2
.... de orden ...
3 de orden 2
2 de orden 1
n*(n-1)*(n-2)*(n-3)*...*(n-n+1) = (productorio desde i=n hasta 2 de i) = n! llamadas recursivas

Como conclusión a los resultados expuestos obtenemos que el número de llamadas recursivas que se realizan viene dado por:

Nº llamadas recursivas = Permutaciones(Orden) = Orden!


Como bien había dicho ghastlyX en respuesta al tema arriba enlazado.



Edit:

He tratado de lanzar el código con un determinante de orden 13 y evidentemente "no terminaba"...
Nº llamadas recursivas = P(13) = 13! = 6227020800

T(n) es exponencial y encima con los alojos y desalojos de memoria... Para morirse xD

Por otra parte, convendría generar los adjuntos con la misma matriz que se usa o de alguna manera sin generar otra matriz de tamaño n-1 para cada adjunto ._.
4  Programación / Programación C/C++ / Re: Ayuda - Iniciandome en C++ en: 24 Febrero 2013, 16:27 pm
yo tengo problema con esta parte de un codigo en c++
for(int i=0;i<cant;i++){   
      string n="";
      cout<<i+1<<": ";
      cin>>n;so
      j[ i ].setNombre(n);
      cout<<endl;
   }
parece que no esta cargando el valor recibido por teclado al string del vector j... que estoy haciendo mal? porque me tira "Unhandled Exception"

Con ese código no podemos saber por qué. Pero se supone que es por el IndexOutOfBounds del for. ¿Qué valor tiene cant? Posiblemente sea deberías situar cant-1; ya que desde 0 hasta cant-1 van cant posiciones.

Por otra parte, UML es un estándar para representar diagramas de programas.

Los diagramas de flujo son los que nos permiten representar algoritmos de manera gráfica como bien dice Anastacio.

En definitiva que es muy útil (necesario en la vida real) hacer diagramas sobre nuestros programas. Para hacer una depuración más sencilla y efectiva. Poder realizar cambios a nuestros programas con mayor facilidad y en definitiva hacernos la vifda más fácil.
5  Programación / Java / Re: Problema programa simple: NULL en: 24 Febrero 2013, 16:15 pm
Código
  1. caracter=br.readLine();
  2.            Palabra pal = null;
  3.            while(caracter != null){
  4.  
  5.                if (pal.soloVocales(caracter)){
  6.                    pw2.print(caracter);
  7.                }
  8.                if (pal.soloConsonantes(caracter)){
  9.                    pw1.print(caracter);
  10.                }
  11.                else if(pal.soloConsonantes(caracter)&&pal.soloVocales(caracter)){
  12.                    pw3.print(caracter);
  13.                }
  14.            }

Fíjate que declararas pal pero no creas una instancia y luego tratas a acceder a un método de instancia...

Código
  1. caracter=br.readLine();
  2.            Palabra pal = new Palabra();
  3.            while(caracter != null){
  4.  
  5.                if (pal.soloVocales(caracter)){
  6.                    pw2.print(caracter);
  7.                }
  8.                if (pal.soloConsonantes(caracter)){
  9.                    pw1.print(caracter);
  10.                }
  11.                else if(pal.soloConsonantes(caracter)&&pal.soloVocales(caracter)){
  12.                    pw3.print(caracter);
  13.                }
  14.            }

PD: con readLine lees hasta el '\n' no char a char.
6  Programación / Programación C/C++ / Re: Ayuda - Iniciandome en C++ en: 24 Febrero 2013, 00:08 am
No sé, yo no aprendería a programar con C++ ya que mezcla diferentes tipos de programación. Muchos usuarios de la red menosprecian el lenguaje Pascal. Pascal es un lenguaje muy didáctico que enseña las técnicas básicas de programación de manera sencilla.
7  Programación / Java / Re: Ayuda Matriz en java en: 22 Febrero 2013, 16:39 pm
Generalmente el término Matriz se refiere a un vector bidimensional pero para el problema que propones creo que te refieres a una matriz fila (o matriz unidimensional, un array).

De todas formas si es bidimensional, puedes aplicar la misma idea que si fuera unidimensional.

Si quieres ordenar cualquier elemento (Objeto) debes establecer un criterio por el cual ordenar una serie de elementos homogéneos.

Para tu ejemplo: "Personas" tienes que decidir cual es la propiedad por la cual quieres ordenar a esos objetos (personas)

Por ejemplo, la altura, el peso, la edad, el salario...

Estamos impacientes de ver lo que has programado.
8  Programación / Programación C/C++ / Re: [C] Paso de arreglos bidimensionales a funciones. (?) en: 20 Febrero 2013, 23:51 pm
Te pego una práctica que hice hará 2 meses o así para que veas más o menos el manejo de arrays bidimensionales en C.

Código
  1. /*
  2.  
  3. FIC - 2º GRADO - Algortimos
  4. Practica 4
  5. Maquina donde se han testado los algoritmos:
  6. Equipo portatil personal. Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz x64
  7.  
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <sys/time.h>
  13. #include <limits.h>
  14. #include <math.h>
  15. #include "lista.h"
  16.  
  17. typedef int ** matriz;
  18.  
  19. // algoritmo de prim
  20. lista prim(matriz m, int tam) {
  21.    int min, i, j, r, k=0;
  22.    arista a;
  23.    lista l;
  24.    int *masProximo = (int *) malloc(tam*sizeof(int));
  25.    int *distanciaMinima = (int *) malloc(tam*sizeof(int));
  26.    crear_lista(&l);
  27.    distanciaMinima[0] = -1;
  28.    for(i = 1; i < tam; i++) {
  29.        masProximo[i] = 0;
  30.        distanciaMinima[i] = m[i][0];
  31.    }
  32.    for (r=1; r<tam; r++) { /* bucle voraz */
  33.        min = INT_MAX;
  34.        for (j=1;j<tam;j++) {
  35.            if (0<=distanciaMinima[j] && distanciaMinima[j]<min) {
  36.                min = distanciaMinima[j];
  37.                k = j;
  38.            }
  39.        }
  40. a.x = masProximo[k]; a.y = k; a.peso = min;
  41. insertar(a,&l);
  42. distanciaMinima[k] = -1;
  43. for (j=1;j<tam;j++) {
  44. if (m[j][k] < distanciaMinima[j]) {
  45. distanciaMinima[j] = m[j][k];
  46. masProximo[j] = k;
  47. }
  48. }
  49.    }
  50.    free(masProximo);
  51.    free(distanciaMinima);
  52.    return l;
  53. }
  54.  
  55. // crea una matriz
  56. matriz crear_matriz(int n) {
  57.    int i;
  58.    matriz aux;
  59.    if ((aux = (int **) malloc(n*sizeof(int *))) == NULL)
  60.        return NULL;
  61.    for (i=0; i<n; i++)
  62.        if ((aux[i] = (int *) malloc(n*sizeof(int))) == NULL)
  63.            return NULL;
  64.    return aux;
  65. }
  66.  
  67. // genera la matriz del primer ejemplo
  68. matriz matriz_primer_ejemplo() {
  69. int i,j;
  70. matriz m = (matriz)crear_matriz(5);
  71. m[0][1] = 1; m[0][2] = 8; m[0][3] = 4; m[0][4] = 7;
  72. m[1][2] = 2; m[1][3] = 6; m[1][4] = 5;
  73. m[2][3] = 9; m[2][4] = 5;
  74. m[3][4] = 3;
  75. for (i=0; i<5; i++)
  76. for (j=0; j<=i; j++)
  77. if (i==j)
  78. m[i][j] = 0;
  79. else
  80. m[i][j] = m[j][i];
  81. return m;
  82. }
  83.  
  84. // genera la matriz del segundo ejemplo
  85. matriz matriz_segundo_ejemplo() {
  86. int i,j;
  87. matriz m = (matriz)crear_matriz(4);
  88. m[0][1] = 1; m[0][2] = 4; m[0][3] = 7;
  89. m[1][2] = 2; m[1][3] = 8;
  90. m[2][3] = 3;
  91. for (i=0; i<4; i++)
  92. for (j=0; j<=i; j++)
  93. if (i==j)
  94. m[i][j] = 0;
  95. else
  96. m[i][j] = m[j][i];
  97.  
  98. return m;
  99. }
  100.  
  101. // genera la matriz del tercer ejemplo
  102. matriz matriz_tercer_ejemplo() {
  103. int i,j;
  104. matriz m = (matriz)crear_matriz(7);
  105. m[0][1] = 7; m[0][2] = 99; m[0][3] = 5; m[0][4] = 99; m[0][5] = 99; m[0][6] = 99;
  106. m[1][2] = 8; m[1][3] = 9; m[1][4] = 7; m[1][5] = 99; m[1][6] = 99;
  107. m[2][3] = 99; m[2][4] = 5; m[2][5] = 99; m[2][6] = 99;
  108. m[3][4] = 15; m[3][5] = 6; m[3][6] = 99;
  109. m[4][5] = 8; m[4][6] = 9;
  110. m[5][6] = 11;
  111. for (i=0; i<7; i++)
  112. for (j=0; j<=i; j++)
  113. if (i==j)
  114. m[i][j] = 0;
  115. else
  116. m[i][j] = m[j][i];
  117. return m;
  118. }
  119.  
  120. void inicializar_matriz(matriz m, int n) {
  121.    /* Crea un grafo completo no dirigido con pesos aleatorios entre 1 y n */
  122.    int i, j;
  123.    for (i=0; i<n; i++)
  124.        for (j=i+1; j<n; j++)
  125.            m[i][j] = rand() % n + 1;
  126.    for (i=0; i<n; i++)
  127.        for (j=0; j<=i; j++)
  128.            if (i==j)
  129.                m[i][j] = 0;
  130.            else
  131.                m[i][j] = m[j][i];
  132. }
  133.  
  134. void liberar_matriz(matriz m, int n) {
  135.    int i;
  136.    for (i=0; i<n; i++)
  137.        free(m[i]);
  138.    free(m);
  139. }
  140.  
  141. void solucion(lista l) {
  142.  
  143.    pnodo it = primera(l);
  144.    int peso_total = 0;
  145.    printf("Aristas: ");
  146.    while (it != NULL) {
  147.        printf("(%d, %d) ", it->elemento.x, it->elemento.y);
  148.        peso_total += it->elemento.peso;
  149.        it = siguiente(it);
  150.    }
  151.    printf("\nPeso total minimo: %d\n", peso_total);
  152.    eliminar_lista(&l);
  153. }
  154.  
  155. void test () {
  156. printf("\n- test para probar el correcto funcionamiento del algoritmo -\n\n");
  157. matriz m = matriz_primer_ejemplo();
  158. matriz n = matriz_segundo_ejemplo();
  159. matriz o = matriz_tercer_ejemplo();
  160. printf("Primer ejemplo.\n");
  161. solucion(prim(m,5));
  162. printf("\nSegundo ejemplo.\n");
  163. solucion(prim(n,4));
  164. printf("\nTercer ejemplo.\n");
  165. solucion(prim(o,7));
  166. printf("\n");
  167. liberar_matriz(m,5);
  168. liberar_matriz(n,4);
  169. liberar_matriz(o,7);
  170. }
  171.  
  172. double microsegundos() {
  173. struct timeval t;
  174. if (gettimeofday(&t, NULL) < 0 )
  175. return 0.0;
  176. return (t.tv_usec + t.tv_sec * 1000000.0);
  177. }
  178.  
  179. double obtener_tiempo(int N, int *umbral){
  180. #define ITER 1000
  181. int i;
  182. double t1, t2, t3, t4, t5, t6, t;
  183. matriz M = crear_matriz(N);
  184. inicializar_matriz(M,N);
  185. t1 = microsegundos();
  186. prim(M,N);
  187. t2 = microsegundos();
  188. t = t2-t1;
  189. liberar_matriz(M,N);
  190. *umbral = 0; // t < 500us
  191. if (t<500) {
  192. *umbral = 1; // t >= 500us
  193. matriz A = crear_matriz(N);
  194. // t3 = tiempo de inicializacion + tiempo prim
  195. for (i=1; i<=ITER; i++) {
  196. t1 = microsegundos();
  197. inicializar_matriz(A,N);
  198. prim(A,N);
  199. t2 = microsegundos();
  200. t3 += (t2-t1);
  201. }
  202. // t6 = tiempo de inicializacion
  203. for (i=1; i<=ITER; i++) {
  204. t4 = microsegundos();
  205. inicializar_matriz(A,N);
  206. t5 = microsegundos();
  207. t6 += (t5-t4);
  208. }
  209. t = (t3-t6) / ITER;
  210. liberar_matriz(A,N);
  211. }
  212. return (t<0 ? -t : t);
  213. }
  214.  
  215. void medicion_tiempos() {
  216.  
  217. #define REPS 6
  218. int n, N, it; // variables para control de bucles y parámetros de entrada
  219. int umbral; // umbral de tiempo de ejecucion (500 us) { 1 = Supera umbral, 0 = No supera umbral }
  220. double t; // tiempo de ejecucion
  221. double h, g, f; // valores para acotar
  222.  
  223. printf("- Medicion de tiempos del algoritmo -\n\n");
  224.  
  225. printf("-> h(n) = cota subestimada\n");
  226. printf("-> g(n) = cota ajustada\n");
  227. printf("-> f(n) = cota sobrestimada\n");
  228. printf("\n-------------------------------------------------------------------------\n");
  229. printf("\n%9s%13s%13s%13s%13s%10s\n","n", "t(n)", "t(n)/h(n)", "t(n)/g(n)", "t(n)/f(n)", "Umbral"); // encabezado
  230.  
  231. n = 16;
  232. for (it=1; it<=REPS; it++) {
  233. n = n*2-1;
  234. N = (int)sqrt(n);
  235. t = obtener_tiempo(N, &umbral);
  236. h = t / pow(N*N, 1.8); // t(n)/h(n)
  237. g = t / pow(N*N, 2); // t(n)/g(n)
  238. f = t / pow(N*N, 2.2); // t(n)/f(n)
  239. printf("%9d%13.6f%12.6f%13.6f%13.6f%8d\n", N*N, t, h, g, f, umbral);
  240. }
  241. printf("\n-------------------------------------------------------------------------\n");
  242.  
  243. }
  244.  
  245. int main () {
  246.  
  247. printf("\nPractica 4: Analisis del algortimo de Prim.\n");
  248. test();
  249. medicion_tiempos();
  250.  
  251. }
  252.  
9  Programación / Programación C/C++ / Re: Help! Calcular máximo de 3 numeros usando función en: 18 Febrero 2013, 23:34 pm
Para un caso general (n datos) el problema se puede resolver con distintos algoritmos. Unos con unas ventajas y desventajas y otros con otras... Como ocurre siempre :P
10  Programación / Programación C/C++ / Re: Fracciones en C [Ayuda] en: 18 Febrero 2013, 23:22 pm
@leosansan, te dejo un truco de preprocesador que he usado mas de una vez aqui para limpiar la pantalla:

Código
  1. #ifdef __unix__ /* Estamos en *nix */
  2. #define clscr() system("clear");
  3. #elif defined __WIN32 /* Estamos en windows */
  4. #define clscr() system("cls");
  5. #else
  6. #warning Missing clear screen function
  7. #endif
  8.  
  9. /* En el codigo puedes usar clscr() tranquilamente para limpiar la pantalla */
  10.  
  11.  

¿Y Para Mac OS? *.* xD
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines