\documentclass{article}
\usepackage{helvet}
\usepackage[portuguese]{babel}
\usepackage[utf8]{inputenc}
\usepackage[margin=2.54cm]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[L]{MATLAB — Exercício 2}
\fancyhead[R]{Bibliotecas Digitais}

\usepackage{url}
\usepackage{setspace}
\onehalfspacing
\usepackage{indentfirst}
\usepackage{graphicx}
\usepackage{pdfcolmk}
\usepackage{caption}
\usepackage{titlesec}
\usepackage{amsmath}

\usepackage{appendix}
\renewcommand{\appendixname}{Anexos}
\renewcommand{\appendixtocname}{Anexos}
\renewcommand{\appendixpagename}{Anexos}

\begin{document}
\newpage

\section{Contagem de ocorrência da palavra}

{\vspace{0.5cm}}

De forma a contar o número de ocorrências da palavra {\tt text} — enquanto {\it string} e não apenas como sequência de caracteres —, começou-se por declarar um contador ({\tt counter}), inicializado a zero. De seguida, abriu-se o ficheiro {\tt .txt} através do comando {\tt fopen}, operação cuja execução retorna um inteiro ({\tt fid}), utilizado nas rotinas seguintes como identificador do ficheiro. Por intermédio de um ciclo {\it while}, implementou-se um conjunto de acções a executar até que se atingisse o final do ficheiro — altura em que {\tt feof(fid) == 1} —, iniciado com a leitura do ficheiro (linha a linha). Numa primeira instância, utilizou-se o comando {\tt fgetl} para o efeito, o que resultou na emissão da seguinte mensagem de erro na consola:

\begin{verbatim}
Error using textscan
First input can not be empty.
\end{verbatim}

Assim, concluiu-se que a função mais adequada, neste caso específico, seria a {\tt fgets}, uma vez que, contrariamente à anterior, esta não remove os caracteres de nova linha, colmatando a questão de {\it inputs} vazios explicitada na mensagem de erro. Posteriormente, tornou-se necessário proceder à leitura dos dados de texto para um {\it array}, utilizando \verb+%s+ como especificador de conversão e assegurando, assim, a segregação de cada uma das {\it substrings} em células distintas. De forma a assegurar que as palavras associadas a caracteres especiais eram igualmente contabilizadas, construiu-se uma função com o intuito de eliminá-los. Devido ao facto de o código ter sido testado em versões do {\tt MATLAB} e sistemas operativos distintos, este ponto divergiu obrigatoriamente entre duas construções distintas (com uma ligeira variação na parte inicial do código), uma vez que não foi possível validar ambas em todos os sistemas, simultaneamente. Assim, considerem-se:

\begin{enumerate}
\item \verb+fline = textscan(fid,'%','delimiter',{' ', '.', ',', ';','"','/','\b','\t','\t'},'M+

\verb+ultipleDelimsAsOne',1);+

\item \verb+fline(~isstrprop(fline,'alphanum')) = ' ';+
\end{enumerate}

O passo seguinte passou por veicular a comparação, utilizando o comando {\tt strcmpi}, das {\it strings} contidas no {\it array} com a {\it string} cuja ocorrência se pretende contabilizar, sendo que se especificou a variante do comando que permite ignorar a {\it case}, no sentido de possibilitar a identificação das {\it strings} não obstante o seu tipo de escrita. Os valores lógicos de ocorrência foram somados através da função {\tt sum} e incrementados de forma iterativa ao contador, de forma a obter a contagem pretendida, quando é atingido o final do ficheiro. Por último, computou-se o fecho do ficheiro, através do comando {\tt fclose}, com a respectiva identificação ({\tt fid}) passada como atributo.

A primeira parte do problema proposto foi então resolvida recorrendo às sequências de código abaixo indicadas, ambas retornando o número esperado de ocorrências da palavra pretendida — 43.

\begin{enumerate}
\item {\bf MATLAB R2012a (Mac OS X)}
\begin{verbatim}
counter = 0;

fid = fopen('BD2.txt' , 'rt');

while feof(fid) == 0

     fline = fgets(fid);
     
     fline(~isstrprop(fline,'alphanum')) = ' ';
     
     splitstring = textscan(fline, '%s');
     
     splitstring = splitstring{1};
     
     matches = sum(strcmpi('text', splitstring));
     
     if matches > 0
     
           counter = counter + matches;
     
     end;
     
end;

fclose(fid);

counter

counter =

    43
\end{verbatim}
\item {\bf MATLAB R2012b (Windows)}
\begin{verbatim}
counter = 0;

fid = fopen('BD2.txt','rt');

     while feof(fid) == 0

     scanned = textscan(fid,'%s','delimiter',{' ','.',',',';','"','/','\b','\t','\t'},'M\end{verbatim}
     \begin{verbatim}ultipleDelimsAsOne',1);

     scanned = scanned{1};

     matches = sum(strcmpi('text',scanned));

     if matches > 0

           counter = counter + matches;
     end;

end;

fclose(fid);

counter

counter =

    43
\end{verbatim}
\end{enumerate}

\newpage
\section{Contagem de ocorrência do padrão}

A segunda parte do enunciado pressupunha a identificação de todas as ocorrências da sequência de caracteres {\tt 'text'} o que, contrariamente ao caso anterior, inclui também {\it strings} que contenham a referida sequência como {\it substring}. Atendendo a esta especificidade, começou-se igualmente por declarar um contador e abrir o ficheiro, iniciando-se um ciclo a executar até que surgisse o final do mesmo. Porém, a leitura foi efectuada recorrendo ao comando {\tt fgetl}, contando que não se mostrou relevante eliminar os caracteres de nova linha, e o método utilizado para encontrar as ocorrências da sequência socorreu-se do comando {\tt strfind} — que permite a procura com base num padrão, neste caso {\tt 'text'} —, aplicado a um {\it array} modificado de forma a que o seu conteúdo não apresentasse variações de {\it case}. A incrementação do contador foi feita com base no comprimento dos {\it arrays} assim obtidos, sendo que, no final, a contagem ascendeu às esperadas 45 ocorrências (43 + {\tt textfile} + {\tt texting}). Apresenta-se, de seguida, o trecho de código que levou à resolução da segunda parte do problema proposto.

\begin{verbatim}
counter = 0;

fid = fopen('BD2.txt', 'rt');

while feof(fid) == 0

     tline = fgetl(fid);

     matches = strfind(lower(tline), 'text');

     num = length(matches);

     if num > 0

           counter = counter + num;

     end;

end;

fclose(fid);

counter

counter =

    45
\end{verbatim}

\end{document}