1/22
Programação Funcional
Capítulo 9
Números AleatóriosArgumentos da Linha de Comando
Arquivos
José Romildo Malaquias
Departamento de ComputaçãoUniversidade Federal de Ouro Preto
2012.1
2/22
1 Números aleatórios
2 Argumentos da linha de comando
3 Arquivos
3/22
Tópicos
1 Números aleatórios
2 Argumentos da linha de comando
3 Arquivos
4/22
Números aleatórios
Para gerar um número pseudo-aleatório em Haskell podemos usar o móduloSystem.Random.
Atavés da classe Random é possível obter valores aleatórios de uma variedade detipos.
A função randomRIO:
randomRIO :: Random a => (a, a) -> IO a
Esta função recebe um par de valores (inf,sup) e resulta em uma operação deE/S que, quando executada, obtém e retorna o próximo valor aleatório do tipo auniformemente distribuído no intervalo [inf,sup].
5/22
Exemplo: lançamento de dados
lancadados.hsmodule Main (main) where
import System.Random (randomRIO)
main :: IO ()main =
do putStrLn "Lançamento de dois dados"x <- randomRIO (1,6::Int)y <- randomRIO (1,6::Int)putStrLn ("Faces obtidas: " ++ show x ++ " e " ++ show y)
6/22
Exemplo: lançamento de dados (cont.)
Execução do programa:
$ ./lancadadosLancamento de dois dadosFaces obtidas: 3 e 5
$ ./lancadadosLancamento de dois dadosFaces obtidas: 4 e 1
7/22
Atividade: adivinhe o número
Escreva um aplicativo que execute adivinhe o número como mostrado a seguir.
Seu programa escolhe o número a ser adivinhado selecionando um inteiroaleatório no intervalo de 1 a 1.000.
O aplicativo exibe o prompt Adivinhe um número entre 1 e 1000.
O jogador insere uma primeira suposição.
Se o palpite do jogador estiver incorreto, seu programa deve exibir Muito alto.Tente novamente ou Muito baixo. Tente novamente para ajudar o jogador a zerarmediante uma resposta correta.
O programa deve solicitar ao usuário o próximo palpite.
Quando o usuário insere a resposta correta, exiba Parabéns, você adivinhou onúmero, e permita que o usuário escolha se quer jogar novamente.
8/22
Atividade: adivinhe o número (cont.)
Tarefa 1
Em um arquivo adivinha.hs defina o módulo Main exportando a variável main.
Tarefa 2
Defina main como uma ação de E/S que, quando executada:
configura o sistema para não realizar bufferização da saída de dados padrão.
exibe uma mensagem identificando o programa e sua versão
9/22
Atividade: adivinhe o número (cont.)
Tarefa 3
O programa deve permitir ao usuário jogar várias vezes, o que nos leva à necessidadedo uso de recursão.Defina uma ação de E/S jogar que, quando executada
gera um número inteiro aleatório entre 1 e 1000, inclusive
interage com o usuário até que o usuário acerte o número (veja a tarefa 4)
verifica se o usuário deseja jogar novamente (veja a tarefa 5)se sim, executa jogar recursivamentese não, não faz nada
A ação jogar deve ser usada em main para que o usuário tenha a chance de jogar.
10/22
Atividade: adivinhe o número (cont.)
Tarefa 4
Defina uma função acertar que recebe um número a ser adivinhado e resulta emuma ação de E/S que, quando executada:
exibe uma mensagem solicitando um número entre 1 e 1000
lê o número informado pelo usuário
compara o número informado com o número a ser adivinhado:se for igual, exibe uma mensagem parabenizando o usuário por ter adivinhado onúmerocaso contrário
I exibe uma mensagem informando que o número é muito pequeno ou muito grandeadequadamente
I exibe uma mensagem solicitando ao usuário uma nova tentativaI faz uma nova tentativa através de uma chamada recursiva de acertar
11/22
Atividade: adivinhe o número (cont.)
Tarefa 5
Defina uma função simOuNao que recebe uma string e resulta em uma ação de E/Sque, quando executada:
exibe a string na saída padrão (com o objetivo de fazer uma pergunta do tipo simou não ao usuário)
lê a resposta do usuário
verifica se a resposta és ou S, retornando verdadeiron ou N, retornando falsoqualquer outra coisa, chamando simOuNao novamente
Use uma expressão case.
Esta função deve ser usada em jogar para verificar se o usuário deseja continuarjogando ou não.
12/22
Tópicos
1 Números aleatórios
2 Argumentos da linha de comando
3 Arquivos
13/22
Argumentos da linha de comando
getArgs :: IO [String]A ação de E/S getArgs (definida no módulo System.Environment), quandoexecutada, retorna uma lista formada pelos argumentos da linha de comando doprograma.
getProgName :: IO StringA ação de E/S getProgName (definida no módulo System.Environment), quandoexecutada, retorna o nome do programa.
14/22
Exemplo: argumentos do programa
args.hsmodule Main (main) where
import System.Environment (getArgs, getProgName)
main =do progName <- getProgName
putStrLn "The program name is:"putStrLn progNameputStrLn ""args <- getArgsputStrLn "The arguments are:"mapM putStrLn args
15/22
Exemplo: argumentos do programa (cont.)
Execução do programa:
$ ./args a b c -o testThe program name is:args
The arguments are:abc-otest
16/22
Atividade: adivinhe o número
Tarefa 6
Modifique o programa adivinha.hs de forma que o usuário possa especificar ointervalo a ser utilizado para adivinhar o número através de dois argumentos na linhade comando.
Tarefa 7
Modifique o programa adivinha.hs para que seja exibida o número de tentativasfeitas pelo usuário.
17/22
Tópicos
1 Números aleatórios
2 Argumentos da linha de comando
3 Arquivos
18/22
Arquivos
Haskell possui várias definições para lidar com arquivos.
type FilePath = StringTipo usado para representar o caminho do arquivo, incluindo o seu nome.
readFile :: FilePath -> IO StringLê o conteúdo de um arquivo como uma única string.
writeFile :: FilePath -> String -> IO ()Escreve uma string em um arquivo.
appendFile :: FilePath -> String -> IO ()Acrescenta uma string no final de um arquivo.
19/22
Exemplo: processar notas em arquivo
Criar um programa para ler de um arquivo os dados dos alunos de uma turma – ocódigo, o nome, a nota na primeira avaliação, a nota na segunda avaliação – calcular amédia aritmética das notas e determinar a situação de cada aluno, gravando osresultados em outro arquivo.
20/22
Exemplo: processar notas em arquivo (cont.)
Arquivo de entrada:
1234 Pedro 1.5 1.71111 Carla 6.2 7.02121 Rafael 8.1 8.84321 Ivan 5.0 5.2
21/22
Exemplo: processar notas em arquivo (cont.)
Arquivo de saída:
1234 Pedro 1.5 1.7 1.6 reprovado1111 Carla 6.2 7.0 6.6 exame especial2121 Rafael 8.1 8.8 8.45 aprovado4321 Ivan 5.0 5.2 5.1 exame especial
22/22
Fim