| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
fires

Registrado: 25 Dic 2006 Mensajes: 76 Ubicación: Asuncion
| | | Volver arriba | |  | mamntc02
Registrado: 30 Abr 2007 Mensajes: 242
| Publicado: 23/08/2007 12:56 am | | | Título: |
| Hola,
No sé cual es exactamente el problema, más q nada q no recuerdo nada de algoritmos de ordenación , pero hay cosas q creo q no estan muy bien:- Es cierto q un for y un while son intercambiables, pero si existen ambos es por algo. Estos whiles q tienes en el método de ordenación lían mucho, pq necesitas varias instrucciones para hacer lo q en un for haces en una, además de quedar mucho más centralizados los incrementos de variables. Es decir, en mi opinión te recomendaría usar for.
- No tienes ningún control sobre variables como j ó fila. De hecho ahí tienes un problema pq al ir aumentando j sin ningún control te acabas saliendo de los límites de la matriz. He hecho una prueba y llega a la posición [1][1059] de la matriz!!! Lo q me extraña es q no haga otro casque, pq te sales tres pueblos de la memoria.
- Lo arrays (simples o multidimensionales) empiezan por la posición 0. No estoy seguro pero creo q nunca comparas con las posciones [0][0], [0][j], ni [i][0], y llegan hasta el tamaño -1. Es decir en tu ejemplo las filas corren desde 0 hasta TAMANIO_MATRIZ - 1, y lo mismo para las columnas. Ten en cuenta esto en las codiciones de los for ó while, y sobretodo al acceder a elementos del tipo [i][j+1].
- Te has dado cuenta q siempre te genera la misma matriz?

Saludos. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 24/08/2007 10:10 pm | | | Título: |
| Aparte de lo ya comentado por mamntc02 una parte que esta mal en tu programa es la generacion de los numeros aleatorios ya que este bloque es ineficiente:
| Código: | /* se generan los numeros aleatorios entre 10 y 90 */ for (i = 0; i < TAMANIO_MATRIZ; i++){ for(j = 0; j < TAMANIO_MATRIZ; j++){ do { numero_generado = rand(); }while (numero_generado < 10 || numero_generado > 91); matriz[i][j] = numero_generado; } } |
Para obtener numeros en el rango 10 a 90 solo tienes que utilizar "10 + rand() % 91", de esta forma:
| Código: | /* se generan los numeros aleatorios entre 10 y 90 */ for (i = 0; i < TAMANIO_MATRIZ; i++) for(j = 0; j < TAMANIO_MATRIZ; j++) matriz[i][j] = 10 + rand() % 91; |
Un programa sencillo de ejemplo que ordena un array mediante el metodo de la burbuja es (C estandar):
| Código: | #include <stdio.h> #include <stdlib.h> #include <time.h>
#define NUM_REGISTROS 16
typedef struct st_registro { int prin; /* campo principal */ int sec; /* campo secundario */ } Registro;
int main(void) { Registro reg[NUM_REGISTROS]; Registro aux; int i, j, intercambio; srand((unsigned) time(NULL)); puts("Registros ordenados en base al campo secundario:"); for (i = 0; i < NUM_REGISTROS; i++){ reg[i].prin = rand() % (NUM_REGISTROS / 2); reg[i].sec = i + 1; printf("%02d.%02d\n", reg[i].prin, reg[i].sec); } /* Ordenacion mediante el metodo burbuja (BubbleSort) */ for (i = NUM_REGISTROS - 1; i > 0; i--){ intercambio = 0; for (j = 0; j < i; j++) if (reg[j].prin > reg[j + 1].prin){ aux = reg[j]; reg[j] = reg[j + 1]; reg[j + 1] = aux; intercambio = 1; } if (!intercambio) break; } puts("----\nRegistros ordenados en base al campo principal:"); for (i = 0; i < NUM_REGISTROS; i++) printf("%02d.%02d\n", reg[i].prin, reg[i].sec); return EXIT_SUCCESS; } |
Y un ejemplo un poco mas complicado implementando una funcion de ordenacion generica similar a la funcion qsort de la biblioteca estandar de C:
| Código: | #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>
#define NUM_REGISTROS 16
typedef struct st_registro { int prin; /* campo principal */ int sec; /* campo secundario */ } Registro;
typedef int (*pfn_cmp)(void const *pa, void const *pb);
int cmp(void const *pa, void const *pb); void bsort(void *elem, size_t num, size_t tam, pfn_cmp cmp);
int main(void) { Registro reg[NUM_REGISTROS]; int i; srand((unsigned) time(NULL)); puts("Registros ordenados en base al campo secundario:"); for (i = 0; i < NUM_REGISTROS; i++){ reg[i].prin = rand() % (NUM_REGISTROS / 2); reg[i].sec = i + 1; printf("%02d.%02d\n", reg[i].prin, reg[i].sec); } bsort(reg, NUM_REGISTROS, sizeof reg[0], cmp); puts("----\nRegistros ordenados en base al campo principal:"); for (i = 0; i < NUM_REGISTROS; i++) printf("%02d.%02d\n", reg[i].prin, reg[i].sec); return EXIT_SUCCESS; }
/* ** Funcion de soporte que compara los campos principales de dos registros ** y cuyo valor de retorno es positivo, cero o negativo, si el campo principal ** del primer registro (a) es mayor, igual o menor que el campo principal del ** segundo registro (b), respectivamente. */ int cmp(void const *pa, void const *pb) { Registro const *p = pa; Registro const *q = pb; return (p->prin > q->prin) - (p->prin < q->prin); }
/* ** Funcion que utiliza el algoritmo de ordenacion "Burbuja" (BubbleSort) ** para ordenar una lista de elementos sin importar su tipo, de forma similar ** a la funcion qsort de la biblioteca estandar de C. */ void bsort(void *elem, size_t num, size_t tam, pfn_cmp cmp) { char *base = elem; void *aux; size_t i; size_t j; size_t num_bytes; int intercambio; if (base == NULL || num < 2 || tam == 0) return; if ((aux = malloc(tam)) == NULL) return; /* Numero total de bytes utilizados por el array a ordenar */ num_bytes = num * tam; /* Ordenar los ultimos num-1 elementos */ for (i = num_bytes - tam; i > 0; i -= tam){ intercambio = 0; for (j = 0; j < i; j += tam) if (cmp(base + j, base + j + tam) > 0){ memmove(aux, base + j, tam); memmove(base + j, base + j + tam, tam); memmove(base + j + tam, aux, tam); intercambio = 1; } if (!intercambio) break; } free(aux); } |
La idea es que tomes esos dos programados como orientacion para corregir tu programa, la parte mas engorrosa a modificar es el calculo en base a un solo contador (como en mis dos programas) de los indices de fila y columna de la "matriz" (como en tu programa), esto se soluciona utilizando los operadores de division y modulo.
Para explicarlo mejor con un ejemplo donde se utiliza un solo contador y en base a este se rellena una "matriz" de 5x5:
| Código: | #include <stdio.h> #include <stdlib.h> #include <time.h>
#define NUM_FILAS 5 #define NUM_COLS (NUM_FILAS)
#define FILA(i) ((i) / NUM_FILAS) #define COL(i) ((i) % NUM_COLS)
int main(void) { int matriz[NUM_FILAS][NUM_COLS]; int i; srand((unsigned) time(NULL)); for (i = 0; i < NUM_FILAS * NUM_COLS; i++) matriz[FILA(i)][COL(i)] = rand() % (NUM_FILAS * NUM_COLS); for (i = 0; i < NUM_FILAS * NUM_COLS; i++){ printf("%3d", matriz[FILA(i)][COL(i)]); putchar((i + 1) % NUM_FILAS != 0 ? ' ' : '\n'); }
return EXIT_SUCCESS; } |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | fires

Registrado: 25 Dic 2006 Mensajes: 76 Ubicación: Asuncion
| Publicado: 27/08/2007 5:35 pm | | | Título: |
| logre hacer... aqui esta el codigo y sale... use el ide dev c++.la ultima version
| Código: | /* 9- Generar 49 números comprendidos entre 10 y 99. Cargar en una matriz. Ordenar e imprimir la matriz, el mayor, el menor, el promedio y la diagonal. */
#include <stdio.h> #include <stdlib.h> #define TAMANIO_MATRIZ 7 //el tamaño de la matriz
/* Variables Globales */ int matriz[TAMANIO_MATRIZ][TAMANIO_MATRIZ]; // la matriz
//Buscar el elemento mayor de la matriz void BuscarElementoMayor(void) { //declarar e inicializar las variables int i, j, mayor; mayor = matriz[TAMANIO_MATRIZ - 1][TAMANIO_MATRIZ - 1]; printf("\nEl mayor elemento de la matriz es: %d",mayor); }
//Buscar el elemento menor de la matriz void BuscarElementoMenor(void) { //declarar e inicializar las variables int i, j, menor; menor = matriz[0][0]; printf("\nEl menor elemento de la matriz es: %d", menor); }
// Funcion Ordenar MatrizBurbuja void OrdenarMatrizBurbuja(void) { //declarar las variables locales de la funcion Ordenar MatrizBurbuja int i,j; //indices para la matriz int fila_aux; //indice auxiliar para las filas de las matrices int cont; //contador int aux; //auxiliar para poder cambiar las elementos de la matriz int veces; //contador de las veces que se hace el metodo de la burbuja //inicializar las variables i = 0; j = 0; fila_aux = 0; cont = 0; veces = 0; while(veces < (TAMANIO_MATRIZ * TAMANIO_MATRIZ)) { while(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ)) { while(j < (TAMANIO_MATRIZ - 1)) { if(matriz[i][j] > matriz[i][j + 1]) { aux = matriz[i][j]; matriz[i][j] = matriz[i][j + 1]; matriz[i][j + 1] = aux; } j++; cont++; } fila_aux++; if(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ -1)) { if(matriz[i][j] > matriz[fila_aux][0]) { aux = matriz[i][j]; matriz[i][j] = matriz[fila_aux][0]; matriz[fila_aux][0] = aux; } } cont++; i++; j = 0; if(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ)) { while(j < (TAMANIO_MATRIZ - 1)) { if(matriz[i][j] > matriz[i][j + 1]) { aux = matriz[i][j]; matriz[i][j] = matriz[i][j + 1]; matriz[i][j + 1] = aux; } j++; cont++; } fila_aux++; } if(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ)) { if(matriz[i][j] > matriz[fila_aux][0]) { aux = matriz[i][j]; matriz[i][j] = matriz[fila_aux][0]; matriz[fila_aux][0] = aux; } } i++; j = 0; cont++; } veces++; i = 0; j = 0; fila_aux = 0; cont = 0; } }
void GenerarNumerosAleatorios(void) { // declarar e inicializar las variables locales de la funcion Generar Numeros Aleatorios int i,j; // indices para la matriz int numero_generado; // el numero que se genera atravez de rand //se generan los numeros aleatorios entre 10 y 99 for (i = 0; i < TAMANIO_MATRIZ; i++) { for(j = 0; j < TAMANIO_MATRIZ; j++) { do { numero_generado = rand(); }while((numero_generado < 10) || (numero_generado > 99)); matriz[i][j] = numero_generado; } } }
// Funcion Imprimir Matriz void ImprimirMatrizGeneral(void) { // declarar e inicializar las variables locales de la funcion Imprimir Matriz General int i, j; for(i = 0; i < TAMANIO_MATRIZ; i++) { for(j = 0; j < TAMANIO_MATRIZ; j++) { printf("%d ",matriz[i][j]); } printf("\n"); //salto de linea } }
//Funcion Imprimir Diagonal void ImprimirDiagonal(void) { // declarar e inicializar las variables locales de la funcion Imprimir Diagonal int i, j; printf("\n\n\nLa diagonal es: \n"); for(i = 0; i < TAMANIO_MATRIZ; i++) { for(j = 0; j < TAMANIO_MATRIZ; j++) { if(i == j) printf("%d ",matriz[i][j]); } } }
//Funcion para hallar el promedio de los elementos de la matriz float promedio_elementos_matriz(void) { // declarar e inicializar las variables locales de la funcion Imprimir Diagonal int i, j; //indices de la matriz float promedio; //promedio de los elementos de la matriz int suma; //suma de los elementos de la matriz int cont; //contador de los elementos de la matriz cont = 0; suma = 0; for(i = 0; i < TAMANIO_MATRIZ; i++) { for(j = 0; j < TAMANIO_MATRIZ; j++) { suma += matriz[i][j]; cont++; } } promedio = (float)suma / cont; return (promedio); }
//Programa Principal int main(void) { GenerarNumerosAleatorios(); printf("\n\n\nLa matriz Generada es: \n"); ImprimirMatrizGeneral(); OrdenarMatrizBurbuja(); printf("\n\n\nLa matriz Ordenada es: \n"); ImprimirMatrizGeneral(); ImprimirDiagonal(); BuscarElementoMenor(); BuscarElementoMayor(); printf("\nEl promedio de los elementos de la matriz es: %.2f",promedio_elementos_matriz()); getch(); return(0); }
|
muchas gracias a todos por su ayuda... acabo de ver lo que me pusiseron de ejemplo..y lo voy a tener en cuenta...muchas gracias.. _________________ Es mejor estar callado y parecer tonto, que hablar y despejar las dudas definitivamente. |
| | 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
|
|
| |