Resultados de la carrera

De Ejercicios

Contenido

Enunciado

A la salida de una carrera se anotan en un fichero el número total de corredores que participan, así como los dorsales de los mismos en el orden en el que efectúan la salida. A medida que éstos van llegando a la meta se anota en una nueva línea de ese mismo fichero el número de dorsal, en el orden de llegada.

Implementa las siguientes funciones:

Apartado 1. Función a la que se le pase como entrada el nombre del fichero con los datos, lea su contenido y devuelva dos vectores: uno con los dorsales en el orden de salida y otro con los dorsales en el orden de llegada.
Apartado 2. Función que reciba como entrada un número y un vector, y devuelva la posición en la que está (si el número está en el vector) o -1 en caso contrario.
Apartado 3. Función a la que se le pasen como parámetros de entrada los dos vectores con los dorsales de salida y llegada, y devuelva en un nuevo vector los números de los dorsales de los corredores que hayan abandonado la carrera sin llegar a la meta.
Apartado 4. Programa principal que pida al usuario el nombre del fichero con los datos de entrada, lo lea, averigüe los corredores que han abandonado y por último guarde en un fichero (su nombre se pedirá también al usuario) los dorsales de dichos corredores.
Por ejemplo si el fichero de entrada es el siguiente:
  8
  10 20 30 40 50 60 70 80
  70 40 50 20 80
el programa escribiría en el fichero de salida:
  Los dorsales de los corredores que han abandonado son: 10 30 60.

Soluciones

Programa en Matlab

Apartado 1

function [salida,llegada]=Lectura(nombre)
%Parámetros de entrada:
%  nombre: nombre del fichero donde están los datos.
%     Formato --> línea1 - número total de corredores que participan,
%                 línea2 - dorsales de los mismos en el orden en el que efectúan la salida
%                 línea3 - dorsales en el orden de llegada
%Parámetros de salida:
%  salida: vector con los dorsales de los corredores en la salida
%  llegada: vector con los dorsales de los corredores que llegan a meta
fich=fopen(nombre,'r');
if (fich~=-1)
  n=fscanf(fich,'%d',1);
  salida=fscanf(fich,'%d',n);
  salida=salida';
  llegada=fscanf(fich,'%d',inf);
  llegada=llegada';
  fclose(fich);
else
  salida=[];
  llegada=[];
end

Apartado 2

function posicion=Busca(v,x)
%Parámetros de entrada:
%  v: vector de números
%  x: elemento a buscar en v
%Parámetros de salida
%  posicion: posición que ocupa x en v, -1 si no está
posicion=-1;
t=length(v);
h=1;
while (h<=t && posicion==-1)
  if (x==v(h))
    posicion=h;
  else
    h=h+1;
  end
end

Apartado 3

function vabandonos=Abandono(salida,llegada)
%Parámetros de entrada:
%  salida: vector con los dorsales de los corredores en la salida
%  llegada: vector con los dorsales de los corredores que llegan a meta
%Parámetros de salida:
%  vabandonos: vector con los dorsales de los corredores que abandonan la carrera
tsalida=length(salida);
tllega=length(llegada);
vabandonos=[];
if (tsalida~=tllega) % si son iguales no ha habido ningún abandono
  for x=1:tsalida
    p=Busca(llegada,salida(x)); %Utilizamos el módulo del apartado 2
    if p==-1
      %corredor que sale y no llega a meta
      vabandonos=[vabandonos salida(x)];
    end
  end
end

Apartado 4

%Programa Principal
%Entradas:
%  Nombre fichero con los datos dorsales de los corredores en la salida y los dorsales de los corredores que llegan a meta.
%  Nombre fichero donde guardar la salida
%Salida:
%  Guarda en un fichero los dorsales de los corredores que abandonan la carrera
 
fichE=input('Nombre del fichero con los datos de entrada: ','s');
[vS,vLl]=Lectura(fichE);
if (length(vS)==0 || length(vLl)==0)
  disp('Error en el fichero de entrada');
else
  fichS=input('Nombre del fichero de salida: ','s');
  fich=fopen(fichS,'w');
  if fich==-1
    disp('Error en el fichero de salida');
  else
    vA=Abandono(vS,vLl);
    t=length(vA);
    fprintf(fich,'Los dorsales de los corredores que han abandonado la carrera son: ');
    if t==0
      fprintf(fich,'Ninguno');
    else
      fprintf(fich,'%d ',vA);
    end
    fclose(fich);
  end
end
Tipos de soluciones