Autor
|
Tema: ayuda para ordenar en c (Leído 3,512 veces)
|
marrison
Desconectado
Mensajes: 179
|
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"); 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: "); sscanf(textoTemporal ,"%ld",&fichas [numeroFichas ]. numeroregistro); printf("Introduce el numero de serie: "); 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?"); 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?"); 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?"); 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: break; default: printf("Opción desconocida!\n"); break; } } while (opcion != 8); }
|
|
« Última modificación: 3 Septiembre 2012, 14:10 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)
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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!
|
|
|
En línea
|
|
|
|
marrison
Desconectado
Mensajes: 179
|
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?
|
|
|
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)
|
|
|
facunvd
Desconectado
Mensajes: 3
|
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; }
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
fichas[1000000]; guaww.... compila con esa cantidad???
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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!
|
|
« Última modificación: 3 Septiembre 2012, 00:31 am por avesudra »
|
En línea
|
Regístrate en
|
|
|
marrison
Desconectado
Mensajes: 179
|
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...
|
|
|
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
Mensajes: 179
|
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"); 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: "); sscanf(textoTemporal ,"%ld",&fichas [numeroFichas ]. numeroregistro); printf("Introduce el numero de serie: "); 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?"); 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?"); 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?"); 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: break; default: printf("Opción desconocida!\n"); break; } } while (opcion != 8); }
[/code]
|
|
|
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)
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! 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) no he usado nunca void y con eso ya me pierdo... si aun no viste funciones es normal que no entiendas que indica void. 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
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
marrison
Desconectado
Mensajes: 179
|
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,
|
|
|
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)
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
AYUDA ORDENAR LISTA SIMPLE[C]
Programación C/C++
|
HRSLASH
|
0
|
9,307
|
23 Abril 2011, 04:22 am
por HRSLASH
|
|
|
Tips para ordenar mejor el code
Programación C/C++
|
Caster
|
6
|
3,435
|
20 Febrero 2012, 01:12 am
por x64core
|
|
|
Ayuda ordenar ejes
Programación C/C++
|
majojimu
|
3
|
2,289
|
4 Julio 2013, 09:37 am
por eferion
|
|
|
ayuda ordenar la catidad de letras repetidas en un string [C]
Programación C/C++
|
Xiray
|
1
|
2,316
|
19 Marzo 2016, 18:37 pm
por bengy
|
|
|
ayuda para ordenar datos de un archivo en c
Programación C/C++
|
jkomarcelino
|
0
|
1,680
|
3 Agosto 2018, 03:54 am
por jkomarcelino
|
|