Baixe o app para aproveitar ainda mais
Prévia do material em texto
1/21 Programação Funcional Capítulo 10 Números Aleatórios Argumentos da Linha de Comando Arquivos José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2013.1 2/21 1 Números aleatórios 2 Argumentos da linha de comando 3 Arquivos 3/21 Tópicos 1 Números aleatórios 2 Argumentos da linha de comando 3 Arquivos 4/21 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 de tipos. 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 de E/S que, quando executada, obtém do sistema e retorna o próximo valor aleatório do tipo a, uniformemente distribuído no intervalo [inf,sup]. 5/21 Exemplo: lançamento de dados lancadados.hs module 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/21 Exemplo: lançamento de dados (cont.) Execução do programa: $ ./lancadados Lancamento de dois dados Faces obtidas: 3 e 5 $ ./lancadados Lancamento de dois dados Faces obtidas: 4 e 1 7/21 Atividade: adivinhe o número Escreva um aplicativo para jogar o jogo adivinhe o número como explicado a seguir: O programa escolhe um número a ser adivinhado pelo jogador (usuário) selecionando um inteiro aleatório no intervalo de 1 a 1000. O programa exibe a mensagem Adivinhe um número entre 1 e 1000. O jogador informa o seu palpite. Se o palpite do jogador estiver incorreto: o programa exibe a mensagem Muito alto ou Muito baixo convenientemente para ajudar o jogador a acertar o número nas próximas jogadas. o jogo continua com o programa solicitando o próximo palpite e analisando a resposta do usuário. Quando o jogador insere a resposta correta: o programa exibe a mensagem Parabéns, você adivinhou o número, e permite que o usuário escolha se quer jogar novamente, e joga novamente em caso afirmativo. 8/21 Atividade: adivinhe o número (cont.) Roteiro 1. Em um arquivo adivinha.hs defina o módulo Main exportando a variável main. 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 3. O programa deve permitir ao usuário jogar várias vezes, o que nos leva à necessidade do 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 o item 4) verifica se o usuário deseja jogar novamente (veja o item 5) I se sim, executa jogar recursivamente I se não, não faz nada 9/21 Atividade: adivinhe o número (cont.) Para gerar um número aleatório, utilize a função randomRIO :: Random a => (a, a) -> IO a do módulo System.Random. A classe Random é formada pelos tipos para os quais pode-se gerar valores aleatórios. Os tipos inteiros Int e Integer são instâncias desta classe. A função randomRIO recebe um par de valores como argumento e resulta em uma ação de E/S que, quando executada, gera e retorna um número pseudo-aleatório no intervalo fechado definido pelo par. A ação jogar deve ser usada em main para que o usuário tenha a chance de jogar. 4. Defina uma função acertar que recebe um número a ser adivinhado e resulta em uma 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: I se for igual, exibe uma mensagem parabenizando o usuário por ter adivinhado o número I caso contrário I exibe uma mensagem informando que o número é muito pequeno ou muito grande adequadamente I exibe uma mensagem solicitando ao usuário uma nova tentativa I faz uma nova tentativa através de uma chamada recursiva de acertar 10/21 Atividade: adivinhe o número (cont.) A função acertar deverá ser usada na definição de jogar (veja o item 3). 5. Defina uma função simOuNao que recebe uma string e resulta em uma ação de E/S que, quando executada: exibe a string na saída padrão (com o objetivo de fazer uma pergunta do tipo sim ou não ao usuário) lê a resposta do usuário verifica se a resposta é I s ou S, retornando verdadeiro I n ou N, retornando falso I qualquer outra coisa, chamando simOuNao novamente para que o usuário responda corretamente. Use uma expressão case. Esta função deve ser usada em jogar (veja o item 3) para verificar se o usuário deseja continuar jogando ou não. Todas as definições solicitadas devem ser acompanhadas de uma assinatura de tipo. 11/21 Tópicos 1 Números aleatórios 2 Argumentos da linha de comando 3 Arquivos 12/21 Argumentos da linha de comando getArgs :: IO [String] A ação de E/S getArgs (definida no módulo System.Environment), quando executada, retorna uma lista formada pelos argumentos da linha de comando do programa. getProgName :: IO String A ação de E/S getProgName (definida no módulo System.Environment), quando executada, retorna o nome do programa. 13/21 Exemplo: argumentos do programa args.hs module Main (main) where import System.Environment (getArgs, getProgName) main =do progName <- getProgName putStrLn "The program name is:" putStrLn progName putStrLn "" args <- getArgs putStrLn "The arguments are:" mapM putStrLn args 14/21 Exemplo: argumentos do programa (cont.) Execução do programa: $ ./args a b c -o test The program name is: args The arguments are: a b c -o test 15/21 Atividade: adivinhe o número Tarefa 1 Modifique o programa adivinha.hs de forma que o usuário possa especificar o intervalo a ser utilizado para adivinhar o número através de dois argumentos na linha de comando. Tarefa 2 Modifique o programa adivinha.hs para que seja exibida o número de tentativas feitas pelo usuário. 16/21 Tópicos 1 Números aleatórios 2 Argumentos da linha de comando 3 Arquivos 17/21 Arquivos Haskell possui várias definições para lidar com arquivos. type FilePath = String Tipo usado para representar o caminho do arquivo, incluindo o seu nome. readFile :: FilePath -> IO String Lê 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. 18/21 Exemplo: processar notas em arquivo Criar um programa para ler de um arquivo os dados dos alunos de uma turma – o código, o nome, a nota na primeira avaliação, a nota na segunda avaliação – calcular a média aritmética das notas e determinar a situação de cada aluno, gravando os resultados em outro arquivo. 19/21 Exemplo: processar notas em arquivo (cont.) Arquivo de entrada: 1234 Pedro 1.5 1.7 1111 Carla 6.2 7.0 2121 Rafael 8.1 8.8 4321 Ivan 5.0 5.2 20/21 Exemplo: processar notas em arquivo (cont.) Arquivo de saída: 1234 Pedro 1.5 1.7 1.6 reprovado 1111 Carla 6.2 7.0 6.6 exame especial 2121 Rafael 8.1 8.8 8.45 aprovado 4321 Ivan 5.0 5.2 5.1 exame especial 21/21 Fim Números aleatórios Argumentos da linha de comando Arquivos
Compartilhar