[C con Clase] Ayuda con la salida de la matriz final.
Ali Rincon
alrincon1963 en hotmail.com
Dom Ene 5 00:53:42 CET 2014
El pasado 2014-01-03 23:19:58, Steven Davidson escribió:
SD> Hola Ali,
SD> 2014/1/3 Ali Rincon <alrincon1963 en hotmail.com>
SD> >
SD> > Gracias nuevamente, Steven, por tu ayuda y orientación. Mira, realmente
SD> > tienes razón con respecto a los indices, y concluyo que mi algoritmo no
SD> > sirve para lo que pretendo. Me explico: Inicialmente el código funciona si
SD> > pedimos eliminar las filas donde aparezca el numero 1 (tomado como ejemplo)
SD> > de la matriz del fichero origen escrita como:
SD> >
SD> >
SD> [CORTE]
SD> el código no funciona. Y no funciona por la razón que tu dices. Al llegar a
SD> > la ultima fila k=9, el programa no encuentra la fila k+1. Por esta razón lo
SD> > que escribí no me sirve. Tu idea de almacenar las filas que me interesan
SD> > eliminar (dado el valor por teclado) me parece muy buena. Yo había separado
SD> > la tarea de búsqueda y eliminación, tal cual como a continuación te escribo:
SD> >
SD> El problema está aquí en la eliminación de las filas:
SD> for(i=0; i<indices; i++)
SD> >
SD> Te comenté que necesitas usar la cantidad actual de las filas y no la
SD> cantidad máxima. Escribe:
SD> for( i=0; i<indices-contarFilas; i++ )
SD> Honestamente, no se como copiar las filas que me interesan de una matriz
SD> > dada, donde los indices se almacenan en el vector filasparaeliminar[10]. Me
SD> > puedes dar una idea de como hacer esto, por favor??
SD> >
SD> Podrías eliminar cada fila una a una, que es como lo tenías originalmente,
SD> pero creo que conviene mudar todas las filas en un solo recorrido.
SD> Sugiero implementar el método de inserción, pero usando el mismo array como
SD> origen y destinatario. Recorre el array para buscar un hueco en el que
SD> colocar la siguiente fila (válida). Se representa el "hueco" con el índice
SD> de la fila guardado en el array, 'aFilasParaEliminar'. Necesitas dos
SD> índices: uno para recorrer la matriz y otro para recorrer el array,
SD> 'aFilasParaEliminar';
SD> también necesitamos una variable para indicar el "hueco". Analizando el
SD> comportamiento, podemos tratar la primera fila a eliminar y la última como
SD> casos especiales. Podemos saltarnos las primeras filas de la matriz y
SD> comenzar el algoritmo directamente con la primera fila a eliminar. Por
SD> ejemplo,
SD> int indiceEliminar = 0;
SD> ...
SD> hueco = aFilasParaEliminar[0]; // Podría haber escrito: hueco =
SD> aFilasParaEliminar[indiceEliminar], pero el resultado es el mismo
SD> for( i=hueco+1; i<aFilasParaEliminar[contarFilas-1]; i++ ) // La última
SD> fila: aFilasParaEliminar[contarFilas-1]
SD> {
SD> ...
SD> }
SD> Ahora vamos comprobando cada fila por si se elimina o no. Si no se elimina
SD> la fila, que estamos procesando, entonces la copiamos al "hueco" y
SD> aumentamos el "hueco" para la siguiente comprobación. Si tal fila sí se
SD> elimina, entonces la ignoramos: no se copia, y aumentamos 'indiceEliminar'
SD> para indicar la siguiente fila a eliminar.
SD> Para el caso de la última fila a eliminar, no hace falta comprobar las
SD> filas restantes, porque ya no hay más filas a eliminar. Por lo tanto, sólo
SD> nos queda mudar esas filas restantes. Podemos hacer esto en otro bucle
SD> después del bucle general anterior. Visto de otra manera, tenemos este
SD> esquema:
SD> // Caso general: copia condicionada
SD> for( ... )
SD> {
SD> if( fila a eliminar )
SD> {
SD> ...
SD> }
SD> else // fila a copiar
SD> {
SD> ...
SD> }
SD> }
SD> // Caso especial: copia directa/regular
SD> for( ... )
SD> {
SD> // Copia las demás filas
SD> ...
SD> }
SD> Espero que todo esto te sirva.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Hola Steven. Creo que logre hacer algo en el código que te muestro a continuacion:
#include <stdio.h>
#include <stdlib.h>
//Matrizprueba4.
//Programa que elimina todas las filas donde aparezca el valor dado por
//teclado, de una matriz 10x10 leida de un fichero origen y muestra la
//matriz final reducida.
int main()
//void main()
{
int matriz[10][10];
int filasparaeliminar[10];
int i,j,k,m,n;
int valor,posicion,contarfilas;
int indices=10;
char nombrefichero[40];
FILE *fichero;
//Lectura del fichero origen.
printf("\nIntroduzca el nombre del fichero origen: ");
scanf("%s39[^\n]s",nombrefichero);
printf("\n");
fichero = fopen(nombrefichero, "r");
if (fichero != NULL)
{
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
fscanf(fichero, "%d", &matriz[i][j]);
}
}
//Visualizar la matriz.
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("%4d", matriz[i][j]);
}
printf("\n\n");
}
//Imposicion de la condicion.
printf("Introduzca el numero cuya fila sera eliminada: ");
scanf("%d", &valor);
contarfilas=0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(matriz[i][j] == valor)
{
printf("El valor se encuentra en la fila: %d", i);
printf("\n");
filasparaeliminar[contarfilas++]=i;
//contarfilas=contarfilas+1;
}
}
}
printf("El numero de filas en que se encuentra el numero %d son: %d", valor, contarfilas);
printf("\n");
printf("\nfilasparaeliminar = ");
for(k=0; k<4; k++)
{
printf("%d ",filasparaeliminar[k]);
}
printf("\n\n");
//Remover la fila donde se encuentre el valor introducido por teclado.
m=0;
for(i=0; i<10; i++)
{
if(i != 9)
{
n=0;
for(j=0; j<10; j++)
{
matriz[m][n] = matriz[i][j];
n++;
}
m++;
}
}
//Mostrar la matriz final reducida.
printf("La matriz final sera: \n");
printf("\n");
for(i=0; i<indices-1; i++)
{
for(j=0; j<10; j++)
{
printf("%4d", matriz[i][j]);
}
printf("\n\n");
}
//Cerrar fichero.
fclose(fichero);
}
else
printf("Error al abrir el fichero");
//Fin del programa.
return 0;
}
El programa efectivamente elimina cualquier fila que este en el vector filasparaeliminar[10]. En el caso anterior elimina la fila 9, como te muestro a continuacion:
Introduzca el nombre del fichero origen: c:\matriz4.txt
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 1 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 1 89 90
91 92 93 1 95 96 97 98 99 100
Introduzca el numero cuya fila sera eliminada: 1
El valor se encuentra en la fila: 0
El valor se encuentra en la fila: 3
El valor se encuentra en la fila: 8
El valor se encuentra en la fila: 9
El numero de filas en que se encuentra el numero 1 son: 4
filasparaeliminar = 0 3 8 9
La matriz final sera:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 1 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 1 89 90
Process returned 0 (0x0) execution time : 9.844 s
Press any key to continue.
El problema que tengo, y aqui entras tu, si me puedes ayudar por supuesto, es que no se como hacer para que la sentencia if(i != 9) lea todos los valores que estan contenidos en el vector filasparaeliminar[] cada vez que se repita el bucle:
.
.
.
//Remover la fila donde se encuentre el valor introducido por teclado.
m=0;
for(i=0; i<10; i++)
{
if(i != 9)<--Aqui no se como hacer!!!
{
n=0;
for(j=0; j<10; j++)
{
matriz[m][n] = matriz[i][j];
n++;
}
m++;
}
}
.
.
.
Obviamente los indices en la parte de mostrar matriz deberán modificarse acorde a esto.
De verdad, te agradezco altamente toda la ayuda y orientacion que me has prestado. Mira, si deseas enviarme algun archivo puedes hacerlo a la direccion de correo alrincon1963 en hotmail.com.
Ali Rincon
Más información sobre la lista de distribución Cconclase