\documentclass[a4paper, oneside, 10pt]{article}
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{listings}
\date{\today}
\title{}
\author{}
\begin{document}

\lstset{frame=single}
\begin{lstlisting}

universidades.sp <-  function (categoria.univ, cursos.pret, periodo, aval.mec, mensalidade){

  library(readxl)
  
  Cursos_SP <- read_excel("cursos_sp.xlsx") 
  #1 Lendo o banco de dados "cursos_sp.xlsx".
  Cursos_SP <- Cursos_SP[,1:4] 
  #2 Para garantir que só sejam utilizadas as 4 primeiras colunas.
  Notas_MEC <- read_excel("notas_mec.xlsx") 
  #3 Lendo o banco de dados "notas_mec.xlsx".
  Notas_MEC <- Notas_MEC[,1:3] 
  #4 Para garantir que só sejam utilizadas as 3 primeiras colunas.
  
  Notas_MEC$Nota_MEC <- as.numeric(Notas_MEC$Nota_MEC) 
  #5 Para garantir que a coluna Nota_MEC seja interpretada como números. 
  
  #VERIFICANDO OS PARAMETROS DA FUNCAO#

  if(categoria.univ != "Pública" && categoria.univ != "Particular") 
  #6 Verifica se "categoria.univ" foi inserido corretamente.
  {
    stop("A categoria da universidade deve ser pública ou particular") 
    #7 Se não foi, interrompe a funcao e exibe uma mensagem para o usuario.
  }
  if(periodo != "Matutino" && periodo != "Vespertino" && periodo != "Integral" && periodo != "Noturno") 
  #8 Verifica se "periodo" foi inserido corretamente.
  {
    stop("O período deve ser igual a matutino, vespertino, integral ou noturno") 
    #9 Se não foi, interrompe a funcao e exibe uma mensagem para o usuario.
  }
  if(aval.mec != round(aval.mec) || aval.mec <= 0 || aval.mec > 5) 
  #10 Verifica se " aval.mec " e um numero inteiro maior do que zero e menor ou igual a cinco.
  {
    stop ("aval.mec deve conter apenas um número inteiro maior do que 0 e menor ou igual a 5 ") 
    #11 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }
  if(categoria.univ != "Pública" && (is.na(mensalidade) || mensalidade <=0)) 
  #12 Verifica se o preenchimento de "mensalidade" foi feito corretamente para a categoria 'Particular'.
  {
    stop ("Para universidades particulares, é necessário o preenchimento da mensalidade aproximadamente desejada ") 
    #13 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }
  if(categoria.univ != "Pública" &&  (mensalidade != round(mensalidade) || mensalidade <= 0)) 
  #14 Verifica se 'mensalidade' e um numero inteiro e maior que zero.
  {
    stop ("Mensalidade deve ser um número inteiro e >0 ") 
    #15 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }
  
  #FUNCAO BUSCA DE UNIVERSIDADES#
  
  df.uniao.bases <- merge(Cursos_SP,Notas_MEC, by = c("Nome_Universidade")) 
  #16 Junta as bases de dados usando a coluna 'Nome_Universidade'
  
  
  #17 Buscar todas as linhas da base que atendam aos criterios acima, separando a questão da mensalidade
  if(categoria.univ=="Pública")
  {
    linhas.selecionadas <- which(df.uniao.bases$Categoria==categoria.univ & 
                                   df.uniao.bases$Nota_MEC==aval.mec &
                                   df.uniao.bases$Curso_Pretendido==cursos.pret &
                                   df.uniao.bases$Periodo==periodo)  
  }else{
    linhas.selecionadas <- which(df.uniao.bases$Categoria==categoria.univ & 
                                   df.uniao.bases$Nota_MEC==aval.mec &
                                   df.uniao.bases$Curso_Pretendido==cursos.pret &
                                   df.uniao.bases$Periodo==periodo &
                                   (abs(df.uniao.bases$Valor_Mensalidade-mensalidade)<=1000)) 
                                   
                                   #18 Retorna todas as universidades que tenham valor proximo da mensalidade desejada.
    
  }
  
  if(length(linhas.selecionadas)==0) 
  #19 Verifica se a busca retornou vazio.
  {
    stop ("Não foi encontrada nenhuma universidade com os requisitos escolhidos ") 
    #20 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }else{
    universidade <- df.uniao.bases[linhas.selecionadas,] 
    #21 Filtra o dataframe somente com a linhas que seguem os criterios.
  }
  
  if(categoria.univ=="Particular"){ 
  #22 Caso a categoria seja particular, é possível criar um ranking da mais barata para mais cara
    universidade <- universidade[order(universidade$Valor_Mensalidade),] 
    #23 Ordena de acordo com menor mensalidade.
    ranking <- seq(1,nrow(universidade)) 
    #24 Cria sequencia de numeros para serem usados como ranking baseado na mensalidade.
    universidade$ranking <- ranking 
    #25 Adiciona ranking no dataframe
  }
  
  
  return(universidade)
  
}
\end{lstlisting}



\end{document}
