Rellenar matriz con ceros

De Ejercicios

Contenido

Enunciado

Implementa un programa que dado como entrada el nombre de un fichero de texto lea desde éste una matriz cuadrada de tamaño n de números enteros, la transforme sustituyendo los ceros por un valor que indique el número de valores distintos de cero que hay en la fila y escriba la matriz transformada en otro fichero llamado resultado.txt. El fichero de salida ha de tener el mismo formato que el fichero de entrada.

Haz una descomposición modular del problema de forma que el programa enlace tres funciones: una que lea los dados desde el archivo y devuelva la matriz, otra que transforme la matriz dada y la última que reciba de entrada la matriz resultado y la escriba en el fichero.

El formato del fichero de entrada es el siguiente: en la primera línea la dimensión de la matriz, y en las siguientes líneas cada una de las filas de la matriz.

Ejemplo: Archivo de entrada

5				
5	0	7	0	0
4	2	7	0	0
0	0	0	0	9
8	2	6	5	0
1	4	4	8	6

Ejemplo: Archivo de salida

5				
5	2	7	2	2
4	2	7	3	3
1	1	1	1	9
8	2	6	5	4
1	4	4	8	6

Soluciones

Programa en Matlab

Función que lee el fichero

function m = leeFich(nombre)
% Función m = leeFich(nombre)
% Descripción: Extrae una matriz cuadrada de enteros almacenada en
%              un fichero de texto
% Parámetros de entrada:
%   nombre: CADENA DE CARACTERES; nombre del fichero de texto 
%      que contiene la matriz. El formato del fichero es el 
%      siguiente. En la primera fila un entero indica la
%      dimensión de la matriz. Cada una de las líneas siguientes 
%      contiene una fila de la matriz, con los elementos
%      separados por espacios en blanco.
% Parámetros de salida:
%   m: ARRAY BIDIMENSIONAL DE REALES; la matriz leída. Si no 
%      se pudo abrir el fichero la matriz estará vacía.
m = [];
idf = fopen (nombre, 'r');
if idf ~= -1
    dim = fscanf(idf, '%d', 1);
    m = fscanf(idf,'%d', [dim,dim]);
    m = m';
    fclose(idf);
end

Función que transforma la matriz

function s = transforma(m)
% Función s = transforma(m)
% Descripción: Dada una matriz, construye otra en la que se 
%              sustituyen los ceros por el número de valores
%              distintos de cero en la fila
% Parámetros de entrada:
%   m: ARRAY BIDIMENSIONAL DE REALES; matriz de datos
% Parámetros de salida:
%   s: ARRAY BIDIMENSIONAL DE REALES; matriz transformada
[nf,nc] = size (m);
for f = 1:nf
    nonulos = 0;
    for c = 1:nc
        if m(f,c) ~= 0
            nonulos = nonulos + 1;
        end
    end
    for c = 1:nc
        if m(f,c) == 0
            m(f,c) = nonulos;
        end
    end
end
s = m;

Función que escribe en el fichero

function escribeFich(m)
% Función escribeFich(m)
% Descripción: Escribe una matriz de enteros en un fichero llamado
%              'resultado.txt'. El formato del fichero es igual
%              al especificado en la función leeFich
% Parámetros de entrada:
%   m: ARRAY BIDIMENSIONAL DE REALES; la matriz a escribir
idf = fopen ('resultado.txt', 'w');
if idf ~= -1
    [nf,nc] = size (m);
    fprintf(idf,'%d\n',nf);
    for f = 1:nf
        for c = 1:nc
            fprintf(idf,'%d ', m(f,c));
        end
        fprintf(idf,'\n');
    end
    fclose(idf);
end

Programa principal

% Programa TransformaMatriz
% Entradas:
%    - Nombre del fichero donde se encuentra la matriz a transformar
% Salidas:
%    - Fichero 'resultado.txt' con la matriz transformada
% Variables:
%    nombre: CADENA DE CARACTERES
%    m,t: ARRAYS BIDIMENSIONALES DE REALES
 
nombre = input('Introduzca el nombre del fichero de entrada: ','s');
m = leeFich(nombre);
t = transforma(m);
escribeFich(t);
Tipos de soluciones
Navegación
Tipos de soluciones
Herramientas