Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. % Rishi Vadher
  2. % http://rishivadher.pt.vu
  3. function [missoes] = apagarmissoes(missoes)
  4. 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');
  5. data_min = input('Introduza parte do nome do ficheiro ou uma data a procurar:','s');
  6. %Converte a string para data
  7. %Retorna tudo; -1 se a data nao estiver correcta
  8. [dmin]=processadata(data_min);
  9. %Se nao for uma data válida
  10. if dmin.ano == -1
  11.     %filtra missoes por nome que corresponde a data_min
  12.     [rmissoes]=filtrapornome(missoes, data_min);
  13. else
  14.     %entra no ciclo, inicialmente
  15.     %c variavel de controlo do ciclo
  16.     c = 1;
  17.     data_max = input ('Introduza outro extremo para o intervalo de datas:','s');
  18.     while(c>0)
  19.         %tenta retirar data posterior
  20.         [dmax] = processadata(data_max);
  21.         %compara as duas datas
  22.         %se dmax < dmin ou dmax ser invalida, c=1
  23.         c = comparadatas(dmin,dmax);
  24.         %se se dmin>dmax ou dmax for invalida
  25.         if c>0
  26.             fprintf('Nao introduziu uma data valida!\n');
  27.             data_max = input ('Introduza outro extremo para o intervalo de datas:','s');
  28.         end
  29.         %retira missoes cuja data esta entre dmin e dmax
  30.         [rmissoes] = filtrapordata(missoes,dmin,dmax);
  31.     end
  32. end
  33. %se ha missoes a remover
  34. if ~isempty(rmissoes)
  35.     fprintf('\n\nFP:      Dist: Int: Nome de ficheiro:              Efectuado em:\n');
  36.     for i = 1: length(rmissoes)
  37.         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);
  38.     end
  39.     fprintf('\nEstas missões serão removidas do ficheiro de missoes processadas')
  40.     opcao = input ('\nDeseja confirmar a remoção? (S/N):\n\n','s');
  41.     if opcao=='S'||opcao=='s'
  42.         %apaga missoes
  43.         missoes = removemissoes(missoes,rmissoes);
  44.     elseif opcao=='N' || opcao=='n'
  45.         fprintf('\nVoltou ao menu principal');
  46.     else
  47.         fprintf('\nOpçao errada!\nVoltou ao menu principal\n');
  48.     end
  49. else
  50.     fprintf('\nNao encontrou resultados\nVoltou ao menu principal\n');
  51. end
  52. end
  53. %apaga missoes cujo indice esta em missoes
  54. function [result] = removemissoes(missoes,rmissoes)
  55. j = 1;
  56. %número de missoes a remover
  57. d = length(missoes)-length(rmissoes);
  58. if d == 0
  59.     result = [];
  60. else
  61.     for i = 1 : length(missoes)
  62.         arr = find(rmissoes==i, 1);
  63.         if isempty(arr)
  64.             %grava a missao correspondente a indice i
  65.             result(j) = missoes(i);
  66.             j = j+1;
  67.         end
  68.     end
  69. end
  70. end
  71. %compara duas datas comparacao:
  72. %0 se dmin = dmax
  73. %-1 se dmin<dmax
  74. %1 se dmin>dmax
  75. function [comparacao] = comparadatas (dmin, dmax)
  76. if (dmin.ano == dmax.ano) && (dmin.mes==dmax.mes) && (dmin.dia==dmax.dia)
  77.     comparacao = 0;
  78. 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)
  79.     comparacao = -1;
  80. else
  81.     comparacao = 1;
  82. end
  83. end
  84. %Processadata: recebe uma data como string e tenta converter
  85. %para uma struct com tres inteiros
  86. %d: string com data (dia-mes-ano)
  87. %data: struct com campos dia, mes e ano
  88. %se data for errada: ano = mes=dia = -1
  89. function [data] = processadata(d)
  90. %Representacao textual de meses
  91. meses = {'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'};
  92. %Dias de cada mes
  93. dias = {31,28,31,30,31,30,31,31,31,30,31,30,31};
  94. %Separa campos por '-', retornando cell array de strings
  95. %posicao 1 - dia, posicao 2 - mes, posicao 3 - ano
  96. arr = regexp(d,'-','split');
  97. %se nao tiver tres campos
  98. if length(arr)~=3
  99.     data.ano = -1;
  100.     data.dia = -1;
  101.     data.mes = -1;
  102. else
  103.     data.dia = str2double(arr(1));
  104.     data.ano = str2double(arr(3));  
  105.     %associa indice ao mes
  106.     a = find(ismember(meses,arr(2)));
  107.     %Se nao encontrar mes ou o ano ou o dia nao forem numeros
  108.     if length(a)~=1 || isnan(data.ano) || isnan(data.dia)
  109.         data.ano = -1;
  110.         data.dia = -1;
  111.         data.mes = -1;
  112.     else
  113.         data.mes = a(1);
  114.         %testa ano bissexto
  115.         %se for fevereiro e ano for multiplo de 4
  116.         %mod(ano,4)==0 verifica se ano é multiplo de 4 (bissexto)
  117.         if data.mes == 2 && mod(data.ano,4)==0
  118.             m = 1;
  119.         else
  120.             m = 0;
  121.         end
  122.         %m = numero correcto de dias para o mes respectivo
  123.         m = m + dias{data.mes};
  124.         %se dia nao estiver correcto
  125.         if data.dia<=0 || data.dia > m
  126.             data.ano = -1;
  127.             data.dia = -1;
  128.             data.mes = -1;
  129.         end
  130.     end
  131. end
  132. end
  133. %Retorna indices de missoes cujo missao.nome e compativel com nome
  134. %rmissoes: indices de missoes correspondentes a nome
  135. function [rmissoes] = filtrapornome(missoes,nome)
  136. j = 1;
  137. for i = 1 : length(missoes)
  138.     %tenta encontrar substring nome em missoes(i).nome
  139.     a = strfind(missoes(i).nome,nome);
  140.     if(~isempty(a))
  141.         rmissoes(j) = i;
  142.         j = j+1;
  143.     end
  144. end
  145. %se nao encontrar missoes
  146. if j == 1
  147.     rmissoes = [];
  148. end
  149. end
  150. %retorna i em que dmin<=missao(i).data<=dmax
  151. function [rmissoes] = filtrapordata(missoes,dmin,dmax)
  152. j = 1;
  153. for i = 1 : length(missoes)
  154.     %transforma missoes(i).data (uma string) nos tres campos inteiros (ano,
  155.     %mes e dia)
  156.     data = processadata(missoes(i).data);
  157.     %Se dmin<=data<=dmax
  158.     if(comparadatas(dmin,data)<1 && comparadatas(data,dmax)<1)
  159.         rmissoes(j) = i;
  160.         j = j+1;
  161.     end
  162. end
  163. if j ==1
  164.     rmissoes = [];
  165. end
  166. end