Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: marrison en 2 Septiembre 2012, 17:55 pm



Título: ayuda para ordenar en c
Publicado por: marrison en 2 Septiembre 2012, 17:55 pm
 bueno creo que he conseguido algo...
el programa es una base de datos, introduces el nombre, el numero de registro y el numero de serie de un archivo y lo guarda, lo que queria es que se ordenase la lista en funcion del numero de registro, lo que he conseguido es que se ordene el numero de registro, pero no lo demas, me explico:
si introduces nombre: a nº registro:3 nº serie: 5
                  nombre:b nº registro:1 nº serie:6

pues sale asi: nombre a nº registro:1 nº serie 5
                    nombre: b nº registro 3 nº serie: 6

se ordena el numero de registro pero no lo demas, cual es mi error? aqui el codigo:

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];
  9. int numeroFichas=0;
  10. int i;
  11. int opcion;
  12. char textoTemporal[40];
  13. unsigned long numeroTemporal;
  14. int j;
  15. int temp;
  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.-Ordenar por numero de archivo\n");
  27. printf("7.- Ver datos de un fichero\n");
  28. printf("8.- Salir\n");
  29. gets (textoTemporal);
  30. sscanf(textoTemporal, "%d", &opcion);
  31. switch(opcion){
  32. case 1:
  33. if (numeroFichas < 1000000) {
  34. printf("Introduce el nombre del fichero: ");
  35. gets(fichas[numeroFichas].nombreFich);
  36. printf("Introduce el numero de registro: ");
  37. gets(textoTemporal);
  38. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
  39. printf("Introduce el numero de serie: ");
  40. gets(textoTemporal);
  41. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
  42. numeroFichas++;
  43. } else
  44. printf("Máximo de fichas alcanzado (1000000)!\n");
  45. break;
  46. case 2:
  47. for (i=0; i<numeroFichas; i++)
  48. printf("Nombre: %s; Nº Registro: %ld; Nº Registro: \n",
  49. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  50. break;
  51. case 3:
  52. printf("¿A partir de que nº de registro quieres que se muestre?");
  53. gets(textoTemporal);
  54. sscanf(textoTemporal, "%ld", &numeroTemporal);
  55. for (i=0; i<numeroFichas; i++)
  56. if (fichas[i].numeroregistro >= numeroTemporal)
  57. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  58. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  59. break;
  60. case 4:
  61. printf("¿A partir de que nº de serir quieres que se muestre?");
  62. gets(textoTemporal);
  63. sscanf(textoTemporal, "%ld", &numeroTemporal);
  64. for (i=0; i<numeroFichas; i++)
  65. if (fichas[i].numeroserie >= numeroTemporal)
  66. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  67. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  68. break;
  69. case 5:
  70. for(i=0; i<(numeroFichas-1); i++) {
  71. for (j=i+1; j<numeroFichas; j++) {
  72. if(fichas[j].numeroregistro<fichas[i].numeroregistro) {
  73. temp = fichas[j].numeroregistro;
  74. fichas[j].numeroregistro = fichas[i].numeroregistro;
  75. fichas[i].numeroregistro = temp;
  76. }
  77. }
  78. }
  79. for(i=0; i<numeroFichas ; i++) {
  80. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  81. }
  82. break;
  83. case 6:
  84. for(i=0; i<(numeroFichas-1); i++) {
  85. for (j=i+1; j<numeroFichas; j++) {
  86. if(fichas[j].numeroserie<fichas[i].numeroserie) {
  87. temp = fichas[j].numeroregistro;
  88. fichas[j].numeroserie = fichas[i].numeroserie;
  89. fichas[i].numeroserie = temp;
  90. }
  91. }
  92. }
  93. for(i=0; i<numeroFichas ; i++) {
  94. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroserie, fichas[i].numeroserie);
  95. }
  96. break;
  97. case 7:
  98. printf("¿De qué fichero quiere ver todos los datos?");
  99. gets(textoTemporal);
  100. for (i=0; i<numeroFichas; i++)
  101. if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
  102. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
  103. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  104. for (i=0; i<numeroFichas; i++)
  105. if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
  106. if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
  107. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
  108. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  109. break;
  110. case 8:
  111. printf("Fin del programa\n");
  112. break;
  113. default:
  114. printf("Opción desconocida!\n");
  115. break;
  116. }
  117. }
  118. while (opcion != 8);
  119.  
  120. }
  121.  
  122.  


Título: Re: ayuda para ordenar en c
Publicado por: xiruko en 2 Septiembre 2012, 18:03 pm
hola, antes de que intentemos ayudarte deberias ayudarnos tu un poco. el codigo asi es muy molesto de leer, podrias editarlo y ponerlo entre las etiquetas geshi? ademas podrias indentarlo correctamente y ya seria perfecto.

un saludo!


Título: Re: ayuda para ordenar en c
Publicado por: marrison en 2 Septiembre 2012, 18:17 pm
hola, antes de que intentemos ayudarte deberias ayudarnos tu un poco. el codigo asi es muy molesto de leer, podrias editarlo y ponerlo entre las etiquetas geshi? ademas podrias indentarlo correctamente y ya seria perfecto.

un saludo!

asi te refieres o como?


Título: Re: ayuda para ordenar en c
Publicado por: facunvd en 2 Septiembre 2012, 23:19 pm
Supongo que lo que necesitas es ordenar un array de estructuras. Bien, aquí aplico el método de selección. El método es algo simple, supongamos la siguiente lista:

10 | 5 | 4 | 3

El método aplicado sería:

10 | 5 | 4 | 3
 |-->|
5 | 10 | 4 | 3
|------>|
4 | 10 | 5 | 3
|---------->|
3 | 10 | 5 | 4
      |-->|
3 | 5 | 10 | 4
     |------>|
3 | 4 | 10 | 5
           |-->|
3 | 4 | 5 | 10

Y terminado. Espero lo hayas podido entender.

En fin, tenemos lo siguiente:

Código:
facu@nvd:~$ clang ordenamiento.c 
facu@nvd:~$ ./a.out
Name: fooA
Age: 10
Name: fooB
Age: 50
Name: fooC
Age: 5
SORTED PEOPLE
Name: fooC
Age: 5
Name: fooA
Age: 10
Name: fooB
Age: 50
 

Donde ordenamiento.c es:

Código:
#include <stdio.h>
#include <string.h>

// We have a person
struct stPerson
{
char name[20];
int age;
};

// We show a person
void print_person(struct stPerson P)
{
printf("Name: %s \n", P.name);
printf("Age: %d \n", P.age);
}

// We show people
void show_people(struct stPerson *PEOPLE, const int N)
{
int i;
for(i = 0; i < N; i++)
print_person(PEOPLE[i]);
}

// We try to sort
void sort_people(struct stPerson *PEOPLE, const int N)
{
struct stPerson tmp;
int i, j;
for(i = 0; i < N; i++)
for(j = i + 1; j < N; j++)
if(PEOPLE[i].age > PEOPLE[j].age)
{
tmp = PEOPLE[i];
PEOPLE[i] = PEOPLE[j];
PEOPLE[j] = tmp;
}
}

int main()
{
struct stPerson A;
strcpy(A.name, "fooA");
A.age = 10;

struct stPerson B;
strcpy(B.name, "fooB");
B.age = 50;


struct stPerson C;
strcpy(C.name, "fooC");
C.age = 5;

struct stPerson list[3] = {A, B, C};

show_people(list, 3);

sort_people(list, 3);

puts("SORTED PEOPLE");

show_people(list, 3);
return 0;
}



Título: Re: ayuda para ordenar en c
Publicado por: durasno en 2 Septiembre 2012, 23:40 pm
Citar
fichas[1000000];
guaww.... compila con esa cantidad???


Título: Re: ayuda para ordenar en c
Publicado por: avesudra en 3 Septiembre 2012, 00:16 am
guaww.... compila con esa cantidad???
Cada estructura ocupa:
52 bytes lo he calculado con sizeof porque el compilador las alinea para que sean óptimas según la arquitectura x86 o x64.
Un millon de estructutras de 52 bytes son 52.000.000 bytes.
Entre 1024 son 50781,25 Kilobytes.
Entre 1024 son 49,591064453125  megabytes de uso en memoria.

Eso y mucho más es posible para los ordenadores de hoy en día.

¡Un saludo!


Título: Re: ayuda para ordenar en c
Publicado por: marrison en 3 Septiembre 2012, 11:37 am
Supongo que lo que necesitas es ordenar un array de estructuras. Bien, aquí aplico el método de selección. El método es algo simple, supongamos la siguiente lista:

10 | 5 | 4 | 3

El método aplicado sería:

10 | 5 | 4 | 3
 |-->|
5 | 10 | 4 | 3
|------>|
4 | 10 | 5 | 3
|---------->|
3 | 10 | 5 | 4
      |-->|
3 | 5 | 10 | 4
     |------>|
3 | 4 | 10 | 5
           |-->|
3 | 4 | 5 | 10

Y terminado. Espero lo hayas podido entender.

En fin, tenemos lo siguiente:

Código:
facu@nvd:~$ clang ordenamiento.c 
facu@nvd:~$ ./a.out
Name: fooA
Age: 10
Name: fooB
Age: 50
Name: fooC
Age: 5
SORTED PEOPLE
Name: fooC
Age: 5
Name: fooA
Age: 10
Name: fooB
Age: 50
 

Donde ordenamiento.c es:

Código:
#include <stdio.h>
#include <string.h>

// We have a person
struct stPerson
{
char name[20];
int age;
};

// We show a person
void print_person(struct stPerson P)
{
printf("Name: %s \n", P.name);
printf("Age: %d \n", P.age);
}

// We show people
void show_people(struct stPerson *PEOPLE, const int N)
{
int i;
for(i = 0; i < N; i++)
print_person(PEOPLE[i]);
}

// We try to sort
void sort_people(struct stPerson *PEOPLE, const int N)
{
struct stPerson tmp;
int i, j;
for(i = 0; i < N; i++)
for(j = i + 1; j < N; j++)
if(PEOPLE[i].age > PEOPLE[j].age)
{
tmp = PEOPLE[i];
PEOPLE[i] = PEOPLE[j];
PEOPLE[j] = tmp;
}
}

int main()
{
struct stPerson A;
strcpy(A.name, "fooA");
A.age = 10;

struct stPerson B;
strcpy(B.name, "fooB");
B.age = 50;


struct stPerson C;
strcpy(C.name, "fooC");
C.age = 5;

struct stPerson list[3] = {A, B, C};

show_people(list, 3);

sort_people(list, 3);

puts("SORTED PEOPLE");

show_people(list, 3);
return 0;
}



bueno lo primero gracias por responder,

eso era lo que buscaba, entonces, un "metodo burbuja" es una anidacion de for?
sigo sin entenderlo muy bien, podrias explicarmelo mejor? no he usado nunca void y con eso ya me pierdo...

perdon por las molestias, soy un novato en esto y no entiendo mucho...


Título: Re: ayuda para ordenar en c
Publicado por: marrison en 3 Septiembre 2012, 14:09 pm
bueno creo que he conseguido algo...
el programa es una base de datos, introduces el nombre, el numero de registro y el numero de serie de un archivo y lo guarda, lo que queria es que se ordenase la lista en funcion del numero de registro, lo que he conseguido es que se ordene el numero de registro, pero no lo demas, me explico:
si introduces nombre: a nº registro:3 nº serie: 5
                  nombre:b nº registro:1 nº serie:6

pues sale asi: nombre a nº registro:1 nº serie 5
                    nombre: b nº registro 3 nº serie: 6

se ordena el numero de registro pero no lo demas, cual es mi error? aqui el codigo:
Código
  1. [code]#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];
  9. int numeroFichas=0;
  10. int i;
  11. int opcion;
  12. char textoTemporal[40];
  13. unsigned long numeroTemporal;
  14. int j;
  15. int temp;
  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.-Ordenar por numero de archivo\n");
  27. printf("7.- Ver datos de un fichero\n");
  28. printf("8.- Salir\n");
  29. gets (textoTemporal);
  30. sscanf(textoTemporal, "%d", &opcion);
  31. switch(opcion){
  32. case 1:
  33. if (numeroFichas < 1000000) {
  34. printf("Introduce el nombre del fichero: ");
  35. gets(fichas[numeroFichas].nombreFich);
  36. printf("Introduce el numero de registro: ");
  37. gets(textoTemporal);
  38. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
  39. printf("Introduce el numero de serie: ");
  40. gets(textoTemporal);
  41. sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
  42. numeroFichas++;
  43. } else
  44. printf("Máximo de fichas alcanzado (1000000)!\n");
  45. break;
  46. case 2:
  47. for (i=0; i<numeroFichas; i++)
  48. printf("Nombre: %s; Nº Registro: %ld; Nº Registro: \n",
  49. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  50. break;
  51. case 3:
  52. printf("¿A partir de que nº de registro quieres que se muestre?");
  53. gets(textoTemporal);
  54. sscanf(textoTemporal, "%ld", &numeroTemporal);
  55. for (i=0; i<numeroFichas; i++)
  56. if (fichas[i].numeroregistro >= numeroTemporal)
  57. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  58. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  59. break;
  60. case 4:
  61. printf("¿A partir de que nº de serir quieres que se muestre?");
  62. gets(textoTemporal);
  63. sscanf(textoTemporal, "%ld", &numeroTemporal);
  64. for (i=0; i<numeroFichas; i++)
  65. if (fichas[i].numeroserie >= numeroTemporal)
  66. printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
  67. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  68. break;
  69. case 5:
  70. for(i=0; i<(numeroFichas-1); i++) {
  71. for (j=i+1; j<numeroFichas; j++) {
  72. if(fichas[j].numeroregistro<fichas[i].numeroregistro) {
  73. temp = fichas[j].numeroregistro;
  74. fichas[j].numeroregistro = fichas[i].numeroregistro;
  75. fichas[i].numeroregistro = temp;
  76. }
  77. }
  78. }
  79. for(i=0; i<numeroFichas ; i++) {
  80. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  81. }
  82. break;
  83. case 6:
  84. for(i=0; i<(numeroFichas-1); i++) {
  85. for (j=i+1; j<numeroFichas; j++) {
  86. if(fichas[j].numeroserie<fichas[i].numeroserie) {
  87. temp = fichas[j].numeroregistro;
  88. fichas[j].numeroserie = fichas[i].numeroserie;
  89. fichas[i].numeroserie = temp;
  90. }
  91. }
  92. }
  93. for(i=0; i<numeroFichas ; i++) {
  94. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroserie, fichas[i].numeroserie);
  95. }
  96. break;
  97. case 7:
  98. printf("¿De qué fichero quiere ver todos los datos?");
  99. gets(textoTemporal);
  100. for (i=0; i<numeroFichas; i++)
  101. if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
  102. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
  103. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  104. for (i=0; i<numeroFichas; i++)
  105. if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
  106. if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
  107. printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
  108. fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
  109. break;
  110. case 8:
  111. printf("Fin del programa\n");
  112. break;
  113. default:
  114. printf("Opción desconocida!\n");
  115. break;
  116. }
  117. }
  118. while (opcion != 8);
  119.  
  120. }
  121.  
  122.  
[/code]



Título: Re: ayuda para ordenar en c
Publicado por: durasno en 4 Septiembre 2012, 03:56 am
Hola!
Citar
eso era lo que buscaba, entonces, un "metodo burbuja" es una anidacion de for?
sigo sin entenderlo muy bien, podrias explicarmelo mejor?
Para que lo entiendas mejor, me parece que lo mas conveniente es que vos mismo hagas la secuencia de los dos for en una hoja a traves de un grafico(ó googlear que hay mucha info)


Citar
no he usado nunca void y con eso ya me pierdo...
si aun no viste funciones es normal que no entiendas que indica void.


Citar
se ordena el numero de registro pero no lo demas, cual es mi error?
El problema es que ordenas(moves) la variable numeroregistro pero para este caso lo que tenes que cambiar es toda la estructura. Es decir en vez de que tmp sea de tipo int(lo cual esta mal ya que numeroregistro es long), tenes que declarar tmp del tipo de la estructura para hacer el swap


Saludos


Título: Re: ayuda para ordenar en c
Publicado por: marrison en 4 Septiembre 2012, 16:10 pm
Hola!Para que lo entiendas mejor, me parece que lo mas conveniente es que vos mismo hagas la secuencia de los dos for en una hoja a traves de un grafico(ó googlear que hay mucha info)

si aun no viste funciones es normal que no entiendas que indica void.

El problema es que ordenas(moves) la variable numeroregistro pero para este caso lo que tenes que cambiar es toda la estructura. Es decir en vez de que tmp sea de tipo int(lo cual esta mal ya que numeroregistro es long), tenes que declarar tmp del tipo de la estructura para hacer el swap


Saludos

vale, muchas gracias! voy a seguir probando y ya te cuento, muchas gracias,