| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 01/10/2004 3:04 pm | | | Título: Sugerencias Para Realizar Un Algoritmo |
| hola nuevamente  gracias por su ayuda en el anterior.. ahora necesito hacer un programa en c que ordene en forma creciente y decreciente 5 numeros enteros... me imagino que se puede hacer con un "do" restringiendo. para realizar el algoritmo tengo que crear dos funciones. una llamada "meyor(int, int)" y otra llamada "menor(int, int)", les agradeceria mucho que me dieran sugerencias de como realizar este algoritmo ya que esta muy complicado... gracias!  |
| | Volver arriba | |  | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 02/10/2004 5:50 am | | | Título: Pues se me ocurre algo, a ver si te funciona: |
| Debrias almacenar los 5 numeros en un array, luego definir otros 2 donde se almacenaran los datos ordenados creciente y decrecientemente. Pones un bucle for para comparar el primer numero con los demas (comparas el primero con el segundo y cojes el menor y lo comparas con el tercero y coges el menor, asi hasta el 5) y el menor lo almacenas en la primera posicion del segundo array, y luego haces otro bucle for para q esto te lo haga con los demas numeros y te los almacene en las demas posiciones del segundo array. Y para ordenarlos al reves = lo unico q tienes q poner es el segundo array pero con las posiciones al reves(el 1 pasa al 5, el 2 al 4, etc.)
Salu2
P.D.--->Ya me diras si te ha servido |
| | Volver arriba | |  | kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 02/10/2004 6:28 am | | | Título: Re: Pues se me ocurre algo, a ver si te funciona: |
| hola! no me quedo muy claro lo que me dijiste, pero bueno... ya se sacar el mayor y el menor, eso es lo facil, pero la complicacion esta en sacar los intermedios porque no puedo usar algoritmos muy avanzados.
te escribo como saco el nº mayor y el nº menosr 
| Código: | #include<stdio.h> #include<math.h> #include<conio.h>
int mayor (int a, int b) { if (a>b || a==b) { return(a); } else { return(b); } }
int menor (int a, int b) { if (a>b || a==b) { return(a); } else { return(b); } }
void main() { int n1,n2,n3,n4,n5, p1,p2,p3,p4,p5; printf("\ningrese 5 numeros enteros para su ordenamiento"); scanf("%d",&n1); scanf("%d",&n2); scanf("%d",&n3); scanf("%d",&n4); scanf("%d",&n5); clrscr(); p5=mayor(mayor(mayor(mayor(n1,n2),n3),n4),n5); p1=menor(menor(menor(menor(n1,n2,),n3),n4),n5); /* pero no s sacar los numeros intermedios*/ printf("\n\nlos numeros oredenados de forma crecientes quedas : %d,%d,%d,%d,%d", p1,p2,p3,p4,p5); printf("\n\ny de forma decreciente : %d,%d,%d,%d,%d", p5,p4,p3,p2,p1); printf("\n\nPara continuar presione cualquier tecla "); getch(); }
|
mi problema es que no se me ocurre como sacar los numeros intermedios.
gracias de todos modos  |
| | Volver arriba | |  | | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 02/10/2004 1:57 pm | | | Título: |
| Wenass, antes q nada creo q no se sabes de arrays pero te ahorrais mucho tiempo, si no tienes n idea puedes mirar en el curso de gorka de esta web. Para hacerlo a tu modo sta mu facil, una vez q has sacado el mayor y el menor descartas esos 2 numeros y cojes los otros 3 y vuelves a mirar cual es el mayor y el menor de esos 3, el mayor sera el 2 mayor de los 5 y el menor el 4 y el q keda es el 3.
Salu2 |
| | Volver arriba | |  | kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 02/10/2004 2:02 pm | | | Título: |
| gracias! lo hare como me dices.  |
| | Volver arriba | |  | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 03/10/2004 10:45 am | | | Título: |
| Weno me he picado con el problema y aky te dejo lo q me ha salido al final.
| Código: | #include <stdio.h>
#define numeros 5
int main() {
int i, j; int a[numeros]; int b[numeros]; int c[numeros]; int d[numeros]; int e[numeros];
for (i=0; i<5; i++) { printf("Introduzca el numero %i que quiere ordenar\n", i+1); scanf("%i", &a[i]); }
for(i=0; i<5; i++) { if(a[i]>a[i+1]) { b[i]=a[i]; b[i+1]=a[i+1]; a[i]=b[i]; a[i+1]=b[i+1];
} else { b[i]=a[i+1]; b[i+1]=a[i]; a[i]=b[i]; a[i+1]=b[i+1]; } }
for(i=0; i<5; i++) { if(b[i]>b[i+1]) { c[i]=b[i]; c[i+1]=b[i+1]; b[i]=c[i]; b[i+1]=c[i+1];
} else { c[i]=b[i+1]; c[i+1]=b[i]; b[i]=c[i]; b[i+1]=c[i+1]; } }
for(i=0; i<5; i++) { if(c[i]>c[i+1]) { d[i]=c[i]; d[i+1]=c[i+1]; c[i]=d[i]; c[i+1]=d[i+1];
} else { d[i]=c[i+1]; d[i+1]=c[i]; c[i]=d[i]; c[i+1]=d[i+1]; } }
for(i=0; i<5; i++) { if(d[i]>d[i+1]) { e[i]=d[i]; e[i+1]=d[i+1]; d[i]=e[i]; d[i+1]=e[i+1];
} else { e[i]=d[i+1]; e[i+1]=d[i]; d[i]=e[i]; d[i+1]=e[i+1]; } }
printf("En orden creciente los numeros son:\n");
for (i=0; i<5; i++) { printf("El numero %i es %i\n", i+1, e[i]); }
int f[numeros]={ e[4], e[3], e[2], e[1], e[0]}; printf("En orden decreciente los numeros son:\n");
for (i=0; i<5; i++) { printf("El numero %i es %i\n", i+1, f[i]); }
}
|
Salu2 |
| | Volver arriba | |  | | alp

Registrado: 12 Abr 2004 Mensajes: 413
| Publicado: 03/10/2004 3:36 pm | | | Título: |
| Hola. Creo que os complicais demasiado la vida. Hay muchos métodos de ordenación. El más simple es el de la burbuja (aunque es el más lento). Te pongo un ejemplo:
| Código: | #include<stdio.h>
void ordena_crec(int *num, int n_elem) { int i, j, temp;
for (i = 0; i < n_elem; i++) for (j = i+1; j < n_elem; j++) if (num[i] > num[j]) { temp = num[i]; num[i] = num[j]; num[j] = temp; } }
void ordena_dec(int *num, int n_elem) { int i, j, temp;
for (i = 0; i < n_elem; i++) for (j = i+1; j < n_elem; j++) if (num[i] < num[j]) { temp = num[i]; num[i] = num[j]; num[j] = temp; } }
void imprime_vector(int *num, int n_elem) { int i; for (i = 0; i < n_elem; i++) printf("%i\t",num[i]); }
int main() { int i; int numeros[] = { 3, 1, 7, 9, 5, 2, 14, 4}; int n_elementos;
n_elementos = sizeof(numeros)/sizeof(int);
printf("\nCreciente:\n"); ordena_crec(numeros, n_elementos); imprime_vector(numeros, n_elementos);
printf("\n\nDecreciente:\n"); ordena_dec(numeros, n_elementos); imprime_vector(numeros, n_elementos);
return 0; } |
Un saludo. |
| | Volver arriba | |  | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 04/10/2004 12:52 am | | | Título: |
| Wenass, nos complicamos la vida xq somos principiantes (por lo menos yo) y antes q buscar x ahi algun metodo de ordenacion ya creado prefiero intentar comerme la cabeza, aunke el programa sea peor o algo tosco, aun asi, yo lo intente con 2 for pero no lo consegui xq me lie un poco.
Salu2
P.D.--->De todas maneras gracias, aunke, sabrias como puedo agrupar todos los for q he puesto a mi manera??? |
| | Volver arriba | |  | kykyou
Registrado: 02 Sep 2004 Mensajes: 67 Ubicación: santiago, Chile..
| Publicado: 04/10/2004 2:06 am | | | Título: |
| hola!!! ya lo hice  a mi, por el consejo que me dio demidam, me salio asi y funciona!!!!
| Código: |
#include<stdio.h> #include<math.h> #include<conio.h>
int mayor (int a, int b) { if (a>b || a==b) { return(a); } else { return(b); } }
int menor (int a, int b) { if (a<b || a==b) { return(a); } else { return(b); } }
int m(int a, int x) { if(a>=x) { return(0); } else { return(a); } }
void main() { int n1,n2,n3,n4,n5, p1,p2,p3,p4,p5; printf("\ningrese 5 numeros enteros para su ordenamiento"); scanf("%d",&n1); scanf("%d",&n2); scanf("%d",&n3); scanf("%d",&n4); scanf("%d",&n5); clrscr(); p5=mayor(mayor(mayor(mayor(n1,n2),n3),n4),n5); p4=mayor(mayor(mayor(mayor(m(n1,p5),m(n2,p5)),m(n3,p5)),m(n4,p
5)),m(n5,p5)); p3=mayor(mayor(mayor(mayor(m(n1,p4),m(n2,p4)),m(n3,p4)),m(n4,p
4)),m(n5,p4)); p2=mayor(mayor(mayor(mayor(m(n1,p3),m(n2,p3)),m(n3,p3)),m(n4,p
3)),m(n5,p3)); p1=menor(menor(menor(menor(n1,n2),n3),n4),n5);
printf("\n\nlos numeros oredenados de forma crecientes quedas :
%d,%d,%d,%d,%d", p1,p2,p3,p4,p5); printf("\n\ny de forma decreciente : %d,%d,%d,%d,%d", p5,p4,p3
,p2,p1); printf("\n\nPara continuar presione cualquier tecla "); getch();
}
|
bueno...se que la funcion m podria perfectamente remaplasar a la funcion mayor, pero en estos momentos no tengo tiempo para cambiarlo  gracias por ayudarme  |
| | Volver arriba | |  | | alp

Registrado: 12 Abr 2004 Mensajes: 413
| Publicado: 04/10/2004 10:45 am | | | Título: |
| Hola de nuevo. Veamos cómo agrupar los for. Si observas detenidamente el código, los bucles for utilizan los arrays sucesivos, es decir, el primero, utiliza a y b, el segundo, b y c. Por otro lado, son 5 arrays, puesto que pedimos 5 números. Juntemos todos los arrays en uno sólo: en lugar de hacer
| Código: | int a[numeros]; int b[numeros]; int c[numeros]; int d[numeros]; int e[numeros]; |
Utilizamos el siquiente array:
| Código: | int valores[numeros][numeros]; |
El primer índice, corresponde a cada array; así, valores[0] corresponde al array "a", valores[1] corresponde al array "b", etc.
Podemos utilizar dos bucles for: El primero (externo), recorre los arrays, y el segundo (interno) los elementos. El código quedaría así:
| Código: | int na; /* numero de array */
for (na = 0; na < 4; na++) for(i=0; i<5; i++) { if(valores[na][i]>valores[na][i+1]) { valores[na+1][i]=valores[na][i]; valores[na+1][i+1]=valores[na][i+1]; valores[na][i]=valores[na+1][i]; valores[na][i+1]=valores[na+1][i+1];
} else { valores[na+1][i]=valores[na][i+1]; valores[na+1][i+1]=valores[na][i]; valores[na][i]=valores[na+1][i]; valores[na][i+1]=valores[na+1][i+1]; } } |
El resultado es algo enrevesado y difícil de leer. Podemos utilizar #defines para simplificar el código, y darle más legibilidad:
| Código: | #define A valores[na] #define B valores[na+1] int na; /* numero de array */
for (na = 0; na < 4; na++) for(i=0; i<5; i++) { if(A[i]>A[i+1]) { B[i]=A[i]; B[i+1]=A[i+1]; A[i]=B[i]; A[i+1]=B[i+1];
} else { B[i]=A[i+1]; B[i+1]=A[i]; A[i]=B[i]; A[i+1]=B[i+1]; } } |
He probado el programa (sin modificarlo), pero la ordenación no funciona bien. Prueba con los siguientes números: 4, 8, 96, 5, 1. El resultado que me da es:
| Cita: | En orden creciente los numeros son: El numero 1 es 1 El numero 2 es 8 El numero 3 es 96 El numero 4 es 5 El numero 5 es 4 En orden decreciente los numeros son: El numero 1 es 4 El numero 2 es 5 El numero 3 es 96 El numero 4 es 8 El numero 5 es 1
|
Habría que darle un repasillo.
Un saludo. |
| | Volver arriba | |  | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 04/10/2004 12:26 pm | | | Título: |
| Lo primero gracias x contestar, acabo de leer el capitulo de arrays multidimensionales(toy siguiendo el curso de gorka) y mas o menos lo entiendo. Lo de los numeros, los he probado con mi algoritmo y me va perfectamente, a lo mejor es q has puesto algo mal, no se, a ver si lo miro mañana q hoy no tengo tiempo.
Salu2 |
| | Volver arriba | |  | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 07/10/2004 4:38 am | | | Título: |
| He intentado agrupar todos los for pero el resultado me dan numeros raros, a ver si me podeis decir donde sta el error q no lo encuentro:
| Código: | #include <stdio.h>
#define numeros 5
int main() {
int i, j; int a[numeros][numeros];
for (i=0; i<5; i++) { printf("Introduzca el numero %i que quiere ordenar\n", i+1); scanf("%i", &a[1][i]); }
for(j=0; j<4; j++) { for(i=0; i<5; i++) { if(a[j][i]>a[j][i+1]) { a[j+1][i]=a[j][i]; a[j+1][i+1]=a[j][i+1]; a[j][i]=a[j+1][i]; a[j][i+1]=a[j+1][i+1]; }
else { a[j+1][i]=a[j][i+1]; a[j+1][i+1]=a[j][i]; a[j][i]=a[j+1][i]; a[j][i+1]=a[j+1][i+1]; } } }
printf("En orden creciente los numeros son:\n");
for (i=0; i<5; i++) { printf("El numero %i es %i\n", i+1, a[4][i]); }
int f[numeros]={ a[4][4], a[4][3], a[4][2], a[4][1], a[4][0]}; printf("En orden decreciente los numeros son:\n");
for (i=0; i<5; i++) { printf("El numero %i es %i\n", i+1, f[i]); }
}
|
Salu2 |
| | Volver arriba | |  | | alp

Registrado: 12 Abr 2004 Mensajes: 413
| Publicado: 07/10/2004 9:29 am | | | Título: |
| ¿Cómo funciona el algoritmo? Con tantos índices y subíndices me pierdo...
Un saludo |
| | Volver arriba | |  | Demidam
Registrado: 07 Ago 2004 Mensajes: 59
| Publicado: 07/10/2004 1:56 pm | | | Título: |
| Lo siento, pero no suelo poner comentarios, a ver si me acostumbro. El primer subindice, en teoria, es para sustituir a los arrays a,b,c,d y e y agruparlos en 1 y el segundo son los 5 numeros q ingresas. Entonces lo q he echo, es coger el primer bucle y donde ponia b he puesto j+1 y donde ponia a he puesto j.
Salu2 |
| | Volver arriba | |  | alp

Registrado: 12 Abr 2004 Mensajes: 413
| Publicado: 08/10/2004 8:38 am | | | Título: |
| Ok. Eso lo entiendo. Lo que me refiero es a que expliques el funcionamiento dle algoritmo. Por ejemplo, el método de la burbuja funciona así: comparas el primer elemento con los restantes, del array, y compruebas si es mayor que el valor que comparas; si es así, intercambias los valores. Cuando has terminado de comparar el primer elemento con los otros, el primer elemento es el menor del conjunto. Seguidamente, comparas el segundo con los restantes, y realizamos el mismo proceso. Luego con el tercero, el cuarto, etc. De este modo, los valores se van ordenando en el mismo array. Se le conoce como método de la burbuja porque los valores van "subiendo" posiciones igualmente que las burbujas suben en los líquidos.
Este método es el más simple, pero es muy lento, ya que se recorre el array muchas veces y se realizan muchas comparaciones.
Un saludo. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|