% Rishi Vadher
% http://rishivadher.pt.vu
function [missoes] = apagarmissoes(missoes)
fprintf('\nEsta opção permite-lhe remover uma ou mais análise do ficheiro de registo\natravés da parte do nome do ficheiro ou de um intervalo de datas\n\n');
data_min = input('Introduza parte do nome do ficheiro ou uma data a procurar:','s');
%Converte a string para data
%Retorna tudo; -1 se a data nao estiver correcta
[dmin]=processadata(data_min);
%Se nao for uma data válida
if dmin.ano == -1
%filtra missoes por nome que corresponde a data_min
[rmissoes]=filtrapornome(missoes, data_min);
else
%entra no ciclo, inicialmente
%c variavel de controlo do ciclo
c = 1;
data_max = input ('Introduza outro extremo para o intervalo de datas:','s');
while(c>0)
%tenta retirar data posterior
[dmax] = processadata(data_max);
%compara as duas datas
%se dmax < dmin ou dmax ser invalida, c=1
c = comparadatas(dmin,dmax);
%se se dmin>dmax ou dmax for invalida
if c>0
fprintf('Nao introduziu uma data valida!\n');
data_max = input ('Introduza outro extremo para o intervalo de datas:','s');
end
%retira missoes cuja data esta entre dmin e dmax
[rmissoes] = filtrapordata(missoes,dmin,dmax);
end
end
%se ha missoes a remover
if ~isempty(rmissoes)
fprintf('\n\nFP: Dist: Int: Nome de ficheiro: Efectuado em:\n');
for i = 1: length(rmissoes)
fprintf('%.6f %.2f %.0f %s %s\n',missoes(rmissoes(i)).factor_prioridade, missoes(rmissoes(i)).distancia, missoes(rmissoes(i)).intensidade_min, missoes(rmissoes(i)).nome, missoes(rmissoes(i)).data);
end
fprintf('\nEstas missões serão removidas do ficheiro de missoes processadas')
opcao = input ('\nDeseja confirmar a remoção? (S/N):\n\n','s');
if opcao=='S'||opcao=='s'
%apaga missoes
missoes = removemissoes(missoes,rmissoes);
elseif opcao=='N' || opcao=='n'
fprintf('\nVoltou ao menu principal');
else
fprintf('\nOpçao errada!\nVoltou ao menu principal\n');
end
else
fprintf('\nNao encontrou resultados\nVoltou ao menu principal\n');
end
end
%apaga missoes cujo indice esta em missoes
function [result] = removemissoes(missoes,rmissoes)
j = 1;
%número de missoes a remover
d = length(missoes)-length(rmissoes);
if d == 0
result = [];
else
for i = 1 : length(missoes)
arr = find(rmissoes==i, 1);
if isempty(arr)
%grava a missao correspondente a indice i
result(j) = missoes(i);
j = j+1;
end
end
end
end
%compara duas datas comparacao:
%0 se dmin = dmax
%-1 se dmin<dmax
%1 se dmin>dmax
function [comparacao] = comparadatas (dmin, dmax)
if (dmin.ano == dmax.ano) && (dmin.mes==dmax.mes) && (dmin.dia==dmax.dia)
comparacao = 0;
elseif dmin.ano<dmax.ano || (dmin.ano==dmax.ano && dmin.mes<dmax.mes) || (dmin.ano==dmax.ano && dmin.mes==dmax.mes && dmin.dia<dmax.dia)
comparacao = -1;
else
comparacao = 1;
end
end
%Processadata: recebe uma data como string e tenta converter
%para uma struct com tres inteiros
%d: string com data (dia-mes-ano)
%data: struct com campos dia, mes e ano
%se data for errada: ano = mes=dia = -1
function [data] = processadata(d)
%Representacao textual de meses
meses = {'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'};
%Dias de cada mes
dias = {31,28,31,30,31,30,31,31,31,30,31,30,31};
%Separa campos por '-', retornando cell array de strings
%posicao 1 - dia, posicao 2 - mes, posicao 3 - ano
arr = regexp(d,'-','split');
%se nao tiver tres campos
if length(arr)~=3
data.ano = -1;
data.dia = -1;
data.mes = -1;
else
data.dia = str2double(arr(1));
data.ano = str2double(arr(3));
%associa indice ao mes
a = find(ismember(meses,arr(2)));
%Se nao encontrar mes ou o ano ou o dia nao forem numeros
if length(a)~=1 || isnan(data.ano) || isnan(data.dia)
data.ano = -1;
data.dia = -1;
data.mes = -1;
else
data.mes = a(1);
%testa ano bissexto
%se for fevereiro e ano for multiplo de 4
%mod(ano,4)==0 verifica se ano é multiplo de 4 (bissexto)
if data.mes == 2 && mod(data.ano,4)==0
m = 1;
else
m = 0;
end
%m = numero correcto de dias para o mes respectivo
m = m + dias{data.mes};
%se dia nao estiver correcto
if data.dia<=0 || data.dia > m
data.ano = -1;
data.dia = -1;
data.mes = -1;
end
end
end
end
%Retorna indices de missoes cujo missao.nome e compativel com nome
%rmissoes: indices de missoes correspondentes a nome
function [rmissoes] = filtrapornome(missoes,nome)
j = 1;
for i = 1 : length(missoes)
%tenta encontrar substring nome em missoes(i).nome
a = strfind(missoes(i).nome,nome);
if(~isempty(a))
rmissoes(j) = i;
j = j+1;
end
end
%se nao encontrar missoes
if j == 1
rmissoes = [];
end
end
%retorna i em que dmin<=missao(i).data<=dmax
function [rmissoes] = filtrapordata(missoes,dmin,dmax)
j = 1;
for i = 1 : length(missoes)
%transforma missoes(i).data (uma string) nos tres campos inteiros (ano,
%mes e dia)
data = processadata(missoes(i).data);
%Se dmin<=data<=dmax
if(comparadatas(dmin,data)<1 && comparadatas(data,dmax)<1)
rmissoes(j) = i;
j = j+1;
end
end
if j ==1
rmissoes = [];
end
end