ayuda para ordenar en c

Iniciado por marrison, 2 Septiembre 2012, 17:55 PM

0 Miembros y 1 Visitante están viendo este tema.

marrison

 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:

#include <stdio.h>
#include <string.h>

struct{
char nombreFich[41];
unsigned long numeroregistro;
unsigned long numeroserie;
} fichas[1000000];
int numeroFichas=0;
int i;
int opcion;
char textoTemporal[40];
unsigned long numeroTemporal;
int j;
int temp;

main()
{
do {
printf("Escoja una opción: (Teclee el numero de la opcion)\n");
printf("1.- Añadir datos de un nuevo fichero\n");
printf("2.- Mostrar los nombres de todos los ficheros\n");
printf("3.- Mostrar ficheros a partir de un cierto numero de registro\n");
printf("4.- Mostrar ficheros a partir de un cierto numero de serie\n");
printf("5.- Ordenar por numero de registro\n");
printf("6.-Ordenar por numero de archivo\n");
printf("7.- Ver datos de un fichero\n");
printf("8.- Salir\n");
gets (textoTemporal);
sscanf(textoTemporal, "%d", &opcion);
switch(opcion){
case 1:
if (numeroFichas < 1000000) {
printf("Introduce el nombre del fichero: ");
gets(fichas[numeroFichas].nombreFich);
printf("Introduce el numero de registro: ");
gets(textoTemporal);
sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
printf("Introduce el numero de serie: ");
gets(textoTemporal);
sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
numeroFichas++;
} else
printf("Máximo de fichas alcanzado (1000000)!\n");
break;
case 2:
for (i=0; i<numeroFichas; i++)
printf("Nombre: %s; Nº Registro: %ld; Nº Registro: \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 3:
printf("¿A partir de que nº de registro quieres que se muestre?");
gets(textoTemporal);
sscanf(textoTemporal, "%ld", &numeroTemporal);
for (i=0; i<numeroFichas; i++)
if (fichas[i].numeroregistro >= numeroTemporal)
printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 4:
printf("¿A partir de que nº de serir quieres que se muestre?");
gets(textoTemporal);
sscanf(textoTemporal, "%ld", &numeroTemporal);
for (i=0; i<numeroFichas; i++)
if (fichas[i].numeroserie >= numeroTemporal)
printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 5:
for(i=0; i<(numeroFichas-1); i++) {
for (j=i+1; j<numeroFichas; j++) {
if(fichas[j].numeroregistro<fichas[i].numeroregistro) {
temp = fichas[j].numeroregistro;
fichas[j].numeroregistro = fichas[i].numeroregistro;
fichas[i].numeroregistro = temp;
}
}
}
for(i=0; i<numeroFichas ; i++) {
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
}
break;
case 6:
for(i=0; i<(numeroFichas-1); i++) {
for (j=i+1; j<numeroFichas; j++) {
if(fichas[j].numeroserie<fichas[i].numeroserie) {
temp = fichas[j].numeroregistro;
fichas[j].numeroserie = fichas[i].numeroserie;
fichas[i].numeroserie = temp;
}
}
}
for(i=0; i<numeroFichas ; i++) {
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroserie, fichas[i].numeroserie);
}
break;
case 7:
printf("¿De qué fichero quiere ver todos los datos?");
gets(textoTemporal);
for (i=0; i<numeroFichas; i++)
if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
for (i=0; i<numeroFichas; i++)
if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 8:
printf("Fin del programa\n");
break;
default:
printf("Opción desconocida!\n");
break;
}
}
while (opcion != 8);

}

"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)

xiruko

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!

marrison

Cita de: 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!

asi te refieres o como?
"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)

facunvd

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:

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:

#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;
}



durasno

Citarfichas[1000000];
guaww.... compila con esa cantidad???
Ahorrate una pregunta, lee el man

avesudra

#5
Cita de: durasno en  2 Septiembre 2012, 23:40 PM
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!
Regístrate en

marrison

Cita de: 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:

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:

#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...
"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

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:[code]#include <stdio.h>
#include <string.h>

struct{
char nombreFich[41];
unsigned long numeroregistro;
unsigned long numeroserie;
} fichas[1000000];
int numeroFichas=0;
int i;
int opcion;
char textoTemporal[40];
unsigned long numeroTemporal;
int j;
int temp;

main()
{
do {
printf("Escoja una opción: (Teclee el numero de la opcion)\n");
printf("1.- Añadir datos de un nuevo fichero\n");
printf("2.- Mostrar los nombres de todos los ficheros\n");
printf("3.- Mostrar ficheros a partir de un cierto numero de registro\n");
printf("4.- Mostrar ficheros a partir de un cierto numero de serie\n");
printf("5.- Ordenar por numero de registro\n");
printf("6.-Ordenar por numero de archivo\n");
printf("7.- Ver datos de un fichero\n");
printf("8.- Salir\n");
gets (textoTemporal);
sscanf(textoTemporal, "%d", &opcion);
switch(opcion){
case 1:
if (numeroFichas < 1000000) {
printf("Introduce el nombre del fichero: ");
gets(fichas[numeroFichas].nombreFich);
printf("Introduce el numero de registro: ");
gets(textoTemporal);
sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroregistro);
printf("Introduce el numero de serie: ");
gets(textoTemporal);
sscanf(textoTemporal,"%ld",&fichas[numeroFichas].numeroserie);
numeroFichas++;
} else
printf("Máximo de fichas alcanzado (1000000)!\n");
break;
case 2:
for (i=0; i<numeroFichas; i++)
printf("Nombre: %s; Nº Registro: %ld; Nº Registro: \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 3:
printf("¿A partir de que nº de registro quieres que se muestre?");
gets(textoTemporal);
sscanf(textoTemporal, "%ld", &numeroTemporal);
for (i=0; i<numeroFichas; i++)
if (fichas[i].numeroregistro >= numeroTemporal)
printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 4:
printf("¿A partir de que nº de serir quieres que se muestre?");
gets(textoTemporal);
sscanf(textoTemporal, "%ld", &numeroTemporal);
for (i=0; i<numeroFichas; i++)
if (fichas[i].numeroserie >= numeroTemporal)
printf("Nombre: %s; Nº Registro: %ld; Nº Serie: %1d; \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 5:
for(i=0; i<(numeroFichas-1); i++) {
for (j=i+1; j<numeroFichas; j++) {
if(fichas[j].numeroregistro<fichas[i].numeroregistro) {
temp = fichas[j].numeroregistro;
fichas[j].numeroregistro = fichas[i].numeroregistro;
fichas[i].numeroregistro = temp;
}
}
}
for(i=0; i<numeroFichas ; i++) {
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
}
break;
case 6:
for(i=0; i<(numeroFichas-1); i++) {
for (j=i+1; j<numeroFichas; j++) {
if(fichas[j].numeroserie<fichas[i].numeroserie) {
temp = fichas[j].numeroregistro;
fichas[j].numeroserie = fichas[i].numeroserie;
fichas[i].numeroserie = temp;
}
}
}
for(i=0; i<numeroFichas ; i++) {
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d\n", fichas[i].nombreFich, fichas[i].numeroserie, fichas[i].numeroserie);
}
break;
case 7:
printf("¿De qué fichero quiere ver todos los datos?");
gets(textoTemporal);
for (i=0; i<numeroFichas; i++)
if (strcmp(fichas[i].nombreFich, textoTemporal) == 0)
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d \n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
for (i=0; i<numeroFichas; i++)
if (strcmp(fichas[i].nombreFich, textoTemporal) != 0)
if (strstr (fichas[i].nombreFich, textoTemporal) != NULL)
printf("Nombre: %s; Nº registro: %ld; Nº serie: %1d (Busqueda a partir de la palabra tecleada, archivos coincidentes)\n",
fichas[i].nombreFich, fichas[i].numeroregistro, fichas[i].numeroserie);
break;
case 8:
printf("Fin del programa\n");
break;
default:
printf("Opción desconocida!\n");
break;
}
}
while (opcion != 8);

}

[/code]

"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)

durasno

Hola!
Citareso 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)


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


Citarse 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
Ahorrate una pregunta, lee el man

marrison

Cita de: durasno en  4 Septiembre 2012, 03:56 AM
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,
"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)