Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: marrison en 22 Diciembre 2012, 14:28 pm



Título: necesito ayuda para ordenar en c
Publicado por: marrison en 22 Diciembre 2012, 14:28 pm
Hola buenas, estoy aprendiendo a programar en c, y estoy haciendo una base de datos, que coje 3 datos de un archivo, nombre, nº de registro y nº de serie.

Bueno el problema es que al querer ordenarlo, usando el metodo de burbuja, que es el unico que se, solo me ordena uno de los valores, me explico, yo pido los datos, el usuario los teclea y se guardan en 3 variables distintas, y al ordenarlo solo me ordena una de ella, pero las otras se quedan igual, y lo que quiero es que a partir de cada una de las variables se me ordenen todas, tambien las otras dos, bueno no se si eso es posible, he pensado que a lo mejor habria que crear otra variable con todos los datos de cada archivo, pero no se muy bien como programarlo...

Aqui os dejo el codigo del programa para ver si me podeis ayudar...

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. struct{
  4. char nombreFich[41];
  5. unsigned long numeroregistro;
  6. unsigned long numeroserie;
  7. } fichas[1000000];
  8. int numeroFichas=0;
  9. int i;
  10. int opcion;
  11. char textoTemporal[40];
  12. unsigned long numeroTemporal;
  13.  
  14. main()
  15. {
  16. do {
  17. printf("Escoja una opción: (Teclee el numero de la opcion)\n");
  18. printf("1.- Añadir datos de un nuevo fichero\n");
  19. printf("2.- Mostrar todos los ficheros\n");
  20. printf("3.- Mostrar ficheros a partir de un cierto numero de registro\n");
  21. printf("4.- Mostrar ficheros a partir de un cierto numero de serie\n");
  22. printf("5.- Ver datos de un fichero\n");
  23. printf("6.- Salir\n");
  24. gets (textoTemporal);
  25. sscanf(textoTemporal, "%d", &opcion);
  26. switch(opcion){
  27. case 1:
  28. if (numeroFichas < 1000000) {
  29. printf("Introduce el nombre del fichero: ");
  30. gets(fichas[numeroFichas].nombreFich);
  31. printf("Introduce el numero de registro(si el valor no es un numero no aparecera o aparecera 0): ");
  32. gets(textoTemporal);
  33. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
  34. printf("Introduce el numero de serie(si el valor no es un numero no aparecera o aparecera 0): ");
  35. gets(textoTemporal);
  36. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
  37. numeroFichas++;
  38. } else
  39. printf("Máximo de fichas alcanzado (1000000)!\n");
  40. break;
  41. case 2:
  42. for (i=0; i<numeroFichas; i++)
  43. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: \n",
  44. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  45. break;
  46. case 3:
  47. printf("¿A partir de que nº de registro quieres que se muestre?");
  48. gets(textoTemporal);
  49. sscanf(textoTemporal, "%ld", &numeroTemporal);
  50. for (i=0; i<numeroFichas; i++)
  51. if (fichas[i].numeroregistro >= numeroTemporal)
  52. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  53. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  54. else printf("No hay ficheros o no hay ficheros con un nº de registro mayor que el introducido.\n");
  55. break;
  56. case 4:
  57. printf("¿A partir de que nº de serie quieres que se muestre?");
  58. gets(textoTemporal);
  59. sscanf(textoTemporal, "%ld", &numeroTemporal);
  60. for (i=0; i<numeroFichas; i++)
  61. if (fichas[i].numeroserie >= numeroTemporal)
  62. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  63. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  64. else printf("No hay ficheros o no hay ficheros con un nº de serie mayor que el introducido.\n");
  65. break;
  66. case 5:
  67. printf("¿De qué fichero quiere ver todos los datos?");
  68. gets(textoTemporal);
  69. for (i=0; i<numeroFichas; i++)
  70. if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
  71. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
  72. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  73. for (i=0; i<numeroFichas; i++)
  74. if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
  75. if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
  76. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
  77. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  78. break;
  79. case 6:
  80. printf("Fin del programa\n");
  81. break;
  82. default:
  83. printf("Opción desconocida!\n");
  84. break;
  85. }
  86. } while (opcion != 6);
  87. }
  88.  

Y aqui os dejo la forma de la que lo ordeno, para ver si se puede hacer algo:

Código
  1. for(i=0; i<(numeroFichas-1); i++) {
  2. for (j=i+1; j<numeroFichas; j++) {
  3. if(fichas[j].numeroregistro<fichas[i].numeroregistro) {
  4. temp = fichas[j].numeroregistro;
  5. fichas[j].numeroregistro = fichas[i].numeroregistro;
  6. fichas[i].numeroregistro = temp;
  7. }
  8. if(fichas[j].numeroregistro<fichas[i].numeroregistro) {
  9. temp = fichas[j].numeroserie;
  10. fichas[j].numeroserie = fichas[i].numeroserie;
  11. fichas[i].numeroserie = temp;
  12. }
  13. }
  14. }
  15. for(i=0; i<numeroFichas ; i++) {
  16. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  17. }

Muchas gracias de antemano, Feliz Navidad y Feliz año  :)


Título: Re: necesito ayuda para ordenar en c
Publicado por: rir3760 en 23 Diciembre 2012, 02:34 am
Cuando tengas problemas con un programa por favor publicalo completo, no en partes.

Para empezar el algoritmo que utilizas no es Burbuja, es Selección.

En cuanto a este un problema es que solo intercambias el campo "numeroregistro" cuando deberías intercambiar los elementos (estructuras). Ese fragmento con los cambios:
Código
  1. struct {
  2.   char nombreFich[41];
  3.   unsigned long numeroregistro;
  4.   unsigned long numeroserie;
  5. } fichas[10], temp; /* temp debe ser del mismo tipo */
  6.  
  7. /* ... */
  8.  
  9. for (i = 0; i < numeroFichas - 1; i++)
  10.   for (j = i + 1; j < numeroFichas; j++) {
  11.      if (fichas[j].numeroregistro < fichas[i].numeroregistro){
  12.         temp = fichas[j];
  13.         fichas[j] = fichas[i];
  14.         fichas[i] = temp;
  15.      }
Así debe funcionar correctamente siempre y cuando no haya otros errores en la parte del programa que no publicaste (de ahí la recomendación de publicar el código fuente completo).

Un saludo


Título: Re: necesito ayuda para ordenar en c
Publicado por: marrison en 23 Diciembre 2012, 12:23 pm
Cuando tengas problemas con un programa por favor publicalo completo, no en partes.

Para empezar el algoritmo que utilizas no es Burbuja, es Selección.

En cuanto a este un problema es que solo intercambias el campo "numeroregistro" cuando deberías intercambiar los elementos (estructuras). Ese fragmento con los cambios:
Código
  1. struct {
  2.   char nombreFich[41];
  3.   unsigned long numeroregistro;
  4.   unsigned long numeroserie;
  5. } fichas[10], temp; /* temp debe ser del mismo tipo */
  6.  
  7. /* ... */
  8.  
  9. for (i = 0; i < numeroFichas - 1; i++)
  10.   for (j = i + 1; j < numeroFichas; j++) {
  11.      if (fichas[j].numeroregistro < fichas[i].numeroregistro){
  12.         temp = fichas[j];
  13.         fichas[j] = fichas[i];
  14.         fichas[i] = temp;
  15.      }
Así debe funcionar correctamente siempre y cuando no haya otros errores en la parte del programa que no publicaste (de ahí la recomendación de publicar el código fuente completo).

Un saludo

Lo primero gracias por contestar amigo,

Decirte que el codigo del programa esta entero, es la primera parte, lo segundo es lo que añado pero no va, pero el codigo es el mismo, con una opcion mas y dos variables, pero no cambia nada.

He probado el codigo e ir va, me aparecen ordenadas, todas, menos la primera que no apareec, es decir, si pongo 10 fichas, la primera que escriba no aparece, por que puede ser?

Aqui os dejo el codigo con la parte modificada tambien, es decir completo.
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct{
  5. char nombreFich[41];
  6. unsigned long numeroregistro;
  7. unsigned long numeroserie;
  8. } fichas[1000000], temp;
  9. int numeroFichas=0;
  10. int i;
  11. int opcion;
  12. char textoTemporal[40];
  13. unsigned long numeroTemporal;
  14. int j;
  15.  
  16.  
  17. main()
  18. {
  19. do {
  20. printf("Escoja una opción: (Teclee el numero de la opcion)\n");
  21. printf("1.- Añadir datos de un nuevo fichero\n");
  22. printf("2.- Mostrar los nombres de todos los ficheros\n");
  23. printf("3.- Mostrar ficheros a partir de un cierto numero de registro\n");
  24. printf("4.- Mostrar ficheros a partir de un cierto numero de serie\n");
  25. printf("5.- Ordenar por numero de registro\n");
  26. printf("6.- Ver datos de un fichero\n");
  27. printf("7.- Salir\n");
  28. gets (textoTemporal);
  29. sscanf(textoTemporal, "%d", &opcion);
  30. switch(opcion){
  31. case 1:
  32. if (numeroFichas < 1000000) {
  33. printf("Introduce el nombre del fichero: ");
  34. gets(fichas[numeroFichas].nombreFich);
  35. printf("Introduce el numero de registro: ");
  36. gets(textoTemporal);
  37. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
  38. printf("Introduce el numero de serie: ");
  39. gets(textoTemporal);
  40. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
  41. numeroFichas++;
  42. } else
  43. printf("Máximo de fichas alcanzado (1000000)!\n");
  44. break;
  45. case 2:
  46. for (i=0; i<numeroFichas; i++)
  47. printf("Nombre: %s; Nº Registro: %ld; Nº Registro: \n",
  48. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  49. break;
  50. case 3:
  51. printf("¿A partir de que nº de registro quieres que se muestre?");
  52. gets(textoTemporal);
  53. sscanf(textoTemporal, "%ld", &numeroTemporal);
  54. for (i=0; i<numeroFichas; i++)
  55. if (fichas[i].numeroregistro >= numeroTemporal)
  56. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  57. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  58. break;
  59. case 4:
  60. printf("¿A partir de que nº de serir quieres que se muestre?");
  61. gets(textoTemporal);
  62. sscanf(textoTemporal, "%ld", &numeroTemporal);
  63. for (i=0; i<numeroFichas; i++)
  64. if (fichas[i].numeroserie >= numeroTemporal)
  65. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  66. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  67. break;
  68. case 5:
  69. for(i=0; i<(numeroFichas-1); i++) {
  70.  for(j=i+1; j<numeroFichas; j++) {
  71.     if (fichas[j].numeroregistro<fichas[i].numeroregistro) {
  72.        temp = fichas[j];
  73.        fichas[j] = fichas[i];
  74.        fichas[i] = temp;
  75.  
  76. }
  77. }
  78. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  79. }
  80. break;
  81. case 6:
  82. printf("¿De qué fichero quiere ver todos los datos?");
  83. gets(textoTemporal);
  84. for (i=0; i<numeroFichas; i++)
  85. if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
  86. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
  87. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  88. for (i=0; i<numeroFichas; i++)
  89. if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
  90. if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
  91. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
  92. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  93. break;
  94. case 7:
  95. printf("Fin del programa\n");
  96. break;
  97. default:
  98. printf("Opción desconocida!\n");
  99. break;
  100. }
  101. }
  102. while (opcion != 7);
  103. }
  104.  


Título: Re: necesito ayuda para ordenar en c
Publicado por: marrison en 23 Diciembre 2012, 13:08 pm
Bueno ya lo he arreglado :D

El problema estaba aqui:
Código
  1. case 5:
  2. for(i=0; i<(numeroFichas-1); i++) {
  3.  for(j=i+1; j<numeroFichas; j++) {
  4.     if (fichas[j].numeroregistro<fichas[i].numeroregistro) {
  5.        temp = fichas[j];
  6.        fichas[j] = fichas[i];
  7.        fichas[i] = temp;
  8.  
  9. }
  10. }
  11. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  12. }
  13. break;

En el primer for he suprimido el -1 de numeroFichas-1 de manera que quedaria asi:

Código
  1. case 5:
  2. for(i=0; i<(numeroFichas); i++) {
  3.  for(j=i+1; j<numeroFichas; j++) {
  4.     if (fichas[j].numeroregistro<fichas[i].numeroregistro) {
  5.        temp = fichas[j];
  6.        fichas[j] = fichas[i];
  7.        fichas[i] = temp;
  8.  
  9. }
  10. }
  11. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  12. }
  13. break;

Y el codigo completo:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct{
  5. char nombreFich[41];
  6. unsigned long numeroregistro;
  7. unsigned long numeroserie;
  8. } fichas[1000000], temp;
  9. int numeroFichas=0;
  10. int i;
  11. int opcion;
  12. char textoTemporal[40];
  13. unsigned long numeroTemporal;
  14. int j;
  15.  
  16.  
  17. main()
  18. {
  19. do {
  20. printf("Escoja una opción: (Teclee el numero de la opcion)\n");
  21. printf("1.- Añadir datos de un nuevo fichero\n");
  22. printf("2.- Mostrar los nombres de todos los ficheros\n");
  23. printf("3.- Mostrar ficheros a partir de un cierto numero de registro\n");
  24. printf("4.- Mostrar ficheros a partir de un cierto numero de serie\n");
  25. printf("5.- Ordenar por numero de registro\n");
  26. printf("6.- Ver datos de un fichero\n");
  27. printf("7.- Salir\n");
  28. gets (textoTemporal);
  29. sscanf(textoTemporal, "%d", &opcion);
  30. switch(opcion){
  31. case 1:
  32. if (numeroFichas < 1000000) {
  33. printf("Introduce el nombre del fichero: ");
  34. gets(fichas[numeroFichas].nombreFich);
  35. printf("Introduce el numero de registro: ");
  36. gets(textoTemporal);
  37. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
  38. printf("Introduce el numero de serie: ");
  39. gets(textoTemporal);
  40. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
  41. numeroFichas++;
  42. } else
  43. printf("Máximo de fichas alcanzado (1000000)!\n");
  44. break;
  45. case 2:
  46. for (i=0; i<numeroFichas; i++)
  47. printf("Nombre: %s; Nº Registro: %ld; Nº Registro: \n",
  48. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  49. break;
  50. case 3:
  51. printf("¿A partir de que nº de registro quieres que se muestre?");
  52. gets(textoTemporal);
  53. sscanf(textoTemporal, "%ld", &numeroTemporal);
  54. for (i=0; i<numeroFichas; i++)
  55. if (fichas[i].numeroregistro >= numeroTemporal)
  56. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  57. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  58. break;
  59. case 4:
  60. printf("¿A partir de que nº de serir quieres que se muestre?");
  61. gets(textoTemporal);
  62. sscanf(textoTemporal, "%ld", &numeroTemporal);
  63. for (i=0; i<numeroFichas; i++)
  64. if (fichas[i].numeroserie >= numeroTemporal)
  65. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  66. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  67. break;
  68. case 5:
  69. for(i=0; i<(numeroFichas); i++) {
  70.  for(j=i+1; j<numeroFichas; j++) {
  71.     if (fichas[j].numeroregistro<fichas[i].numeroregistro) {
  72.        temp = fichas[j];
  73.        fichas[j] = fichas[i];
  74.        fichas[i] = temp;
  75.  
  76. }
  77. }
  78. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  79. }
  80. break;
  81. case 6:
  82. printf("¿De qué fichero quiere ver todos los datos?");
  83. gets(textoTemporal);
  84. for (i=0; i<numeroFichas; i++)
  85. if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
  86. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
  87. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  88. for (i=0; i<numeroFichas; i++)
  89. if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
  90. if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
  91. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
  92. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  93. break;
  94. case 7:
  95. printf("Fin del programa\n");
  96. break;
  97. default:
  98. printf("Opción desconocida!\n");
  99. break;
  100. }
  101. }
  102. while (opcion != 7);
  103. }
  104.  

Ahora voy a añadir una opcion para ordenarlo por nº de serie (la otra variable) e intentare ordenarlo por orden alfabetico, aunque nose porque me da que por orden alfabetico me va a costar mas  ;D

Muchas gracias por tu ayuda, Un saludo, feliz navidad y Feliz Año :)