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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  necesito ayuda para ordenar en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: necesito ayuda para ordenar en c  (Leído 1,275 veces)
marrison

Desconectado Desconectado

Mensajes: 179



Ver Perfil
necesito ayuda para ordenar en c
« 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  :)


En línea

"Es genial trabajar con ordenadores. No discuten, lo recuerdan todo y no se beben tu cerveza" (Paul Leary)

"Controlar la complejidad es la esencia de la programación" (Brian Kernigan)

"Primero resuelve el problema. Entonces, escribe el código" (John Johnson)

"640K deberían ser suficientes para todo el mundo" (Bill Gates, 1981)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: necesito ayuda para ordenar en c
« Respuesta #1 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
marrison

Desconectado Desconectado

Mensajes: 179



Ver Perfil
Re: necesito ayuda para ordenar en c
« Respuesta #2 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.  
« Última modificación: 23 Diciembre 2012, 12:46 pm por marrison » En línea

"Es genial trabajar con ordenadores. No discuten, lo recuerdan todo y no se beben tu cerveza" (Paul Leary)

"Controlar la complejidad es la esencia de la programación" (Brian Kernigan)

"Primero resuelve el problema. Entonces, escribe el código" (John Johnson)

"640K deberían ser suficientes para todo el mundo" (Bill Gates, 1981)
marrison

Desconectado Desconectado

Mensajes: 179



Ver Perfil
Re: necesito ayuda para ordenar en c
« Respuesta #3 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 :)
En línea

"Es genial trabajar con ordenadores. No discuten, lo recuerdan todo y no se beben tu cerveza" (Paul Leary)

"Controlar la complejidad es la esencia de la programación" (Brian Kernigan)

"Primero resuelve el problema. Entonces, escribe el código" (John Johnson)

"640K deberían ser suficientes para todo el mundo" (Bill Gates, 1981)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda ordenar y eliminar palabras texto
Programación C/C++
Fire_Hugo12 9 5,844 Último mensaje 18 Diciembre 2012, 03:01 am
por rir3760
Ayuda ordenar ejes
Programación C/C++
majojimu 3 1,413 Último mensaje 4 Julio 2013, 09:37 am
por eferion
Necesito agregar a mi archivo un metodo para ordenar - JAVA
Java
JAZzZ 1 1,555 Último mensaje 5 Agosto 2017, 21:40 pm
por ivancea96
ayuda para ordenar datos de un archivo en c
Programación C/C++
jkomarcelino 0 677 Último mensaje 3 Agosto 2018, 03:54 am
por jkomarcelino
Necesito ayuda para ordenar unos valores al mostrarse
Desarrollo Web
DancingMonki 2 966 Último mensaje 3 Noviembre 2020, 12:53 pm
por DancingMonki
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines