Buscar

SegundaListadeP1

Prévia do material em texto

Roleta invertida (2,5 pts)
Uma roleta será representada por um array onde a última posição será continuada com a primeira posição.                                 
Além de receber como entrada um número N representando o tamanho do array, o programa deve receber                                 
um número P (que deve estar entre 0 e N­1) para representar a posição inicial do ponteiro. E um número Q                                         
que representará a quantidade de vezes que o ponteiro irá andar.
Agora resta fazer uma chamada recursiva a função girarPonteiro() que será responsável por andar Q                             
posições com o ponteiro. Onde o ponteiro parar, deve ser eliminado aquela posição e com os que sobraram                                   
deve ser chamado novamente a função até retornar apenas uma posição. Imprima a posição que sobrou.
Obs.: As posições que forem sendo marcadas não são mais consideradas pela função recursiva                           
girarPonteiro() nas próximas giradas.
Exemplo:
Entrada:
Digite o N, P e Q:
8 2 3
Saída:
O número selecionado foi 1.
Imagem ilustrativa do processo.
Tabela de dispersão (2,5 pts)
Em ciência da computação, uma tabela de dispersão (também conhecida por tabela de espalhamento ou                             
tabela hash, do inglês hashtable) é uma estrutura de dados especial, que associa chaves de pesquisa a                                 
valores. Seu objetivo é, a partir de uma chave simples, fazer uma busca rápida e obter o valor desejado.
Você deverá criar um programa que, através da manipulação de um arquivo chamado Dicionario.txt, seja                             
possível consultar e adicionar novas palavras nesse dicionário. Caso esse arquivo não exista, você deverá                             
lançar uma exceção do tipo DicionarioNaoEncontradoException, exibir uma mensagem ao usuário e                       
interromper o fluxo do programa.
Obs.: Por simplicidade, considere que as palavras a serem inseridas serão constituídas apenas pelas 26                             
letras minúsculas 'abcdefghijklmnopqrstuvwxyz'. Caso haja algum caracter acentuado, considere a sua                     
contraparte sem acentuação.
No módulo de inserção, a posição de cada palavra nesse dicionário é determinada por uma função de                                 
dispersão que é a responsável por espalhar os valores dentro da hashtable. Quando há um choque de                                 
valores numa hashtable, uma das formas de resolver essa colisão, é através do linear probing (ou                               
sondagem linear) que é, basicamente, procurar o próximo índice disponível.
Caso o usuário tente inserir a mesma palavra mais de uma vez, você deverá lançar uma exceção do tipo                                     
PalavraJaIndexadaException e permitir que seja tentado uma nova inserção.
Quando o fator de carga da tabela ultrapassa o limiar permitido (considere o valor de 0.80 no seu algoritmo),                                     
deverá ser lançada uma exceção do tipo HashtableCheiaException e será feito um rehash. Nessa ação, o                               
valor da hash é duplicada e os valores existentes nela são reindexados.
Obs.: fator de carga = quantidade de índices preenchidos / tamanho da tabela.
Ex.:  Tamanho da hash = 10 posições
Posições ocupadas = 8 posições
A função de dispersão será implementada através de uma subrotina chamada disperseFunction() que                         
recebe como parâmetro uma palavra (String) e retorna a posição na qual a palavra será indexada. O cálculo                                   
dessa posição deve obedecer a função descrita a seguir:
int disperseFunction(String word) {
    posicao = 0;
    soma = 0;
    for  i=0,..., n­1 {
        soma = soma + findPosAtDicio(word.charAt(i));
    }
    posicao = soma % 26;
    return posicao;
}
Você deve implementar a função findPosAtDicio() para encontrar o valor da letra dentro do alfabeto                             
alfanumérico. Dica: você pode utilizar o método indexOf da classe String para localizar a letra dentro de                                 
uma outra String.
Obs.: Ao fim do processo de inserção, o arquivo Dicionario.txt deve ser atualizado.
Já no módulo de consulta, você deverá informar ao usuário qual a posição da palavra consultada dentro da                                   
hashtable. Após cada consulta, você deverá salvá­las num arquivo chamado Consultas.txt com sua posição                           
correspondente. Caso a palavra não exista na tabela, deverá ser informado o resultado ­1.
Exemplo:
Digite 1 para habilitar o modo de inserção:
Digite 2 para habilitar o modo de consulta:
1
Informe a palavra a ser inserida: teste
Palavra inserida com sucesso!
Deseja continuar inserindo novas palavras? N
Digite 1 para habilitar o modo de inserção:
Digite 2 para habilitar o modo de consulta:
2
Informe a palavra: teste
A palavra teste se encontra na 1ª posição da tabela.
Deseja continuar procurando novas palavras? S
Informe a palavra: fulano
A palavra fulano não foi encontrada.
Deseja continuar procurando novas palavras? N
Biblioteca (2,5 pts)
Usando a classe Biblioteca10, faça um programa que gerencie uma biblioteca que tem espaço para apenas 
10 livros.
Crie uma classe contendo um método main que ficará responsável pelo início do programa.
Crie uma subrotina chamada imprimirMenu() que deverá listar as seguintes opções:
1. Adicionar Livro
2. Procurar Livro
3. Remover Livro
4. Fechar Biblioteca
Quando o usuário selecionar uma das opções disponíveis, seu programa deverá chamar a subrotina                           
correspondente para executar a ação desejada. Ou seja, ao selecionar a opção 1, será feito uma chamada                                 
ao método adicionarLivro(). Na opção 2, o método invocado será o procurarLivro(), na opção 3, será                               
chamado removerLivro() e, finalmente, na opção 4, fecharBiblioteca().
Quando a biblioteca esteja cheia for tentado a inserção de um novo livro, o programa deverá lançar uma 
exceção do tipo BibliotecaLotadaException.
Obs.: Ao ser \tada a exceção mencionada, o usuário deve receber uma mensagem específica. Ex.: 
Atenção: A biblioteca está cheia!
Exemplo:
Digite a opção desejada:
1 – Adicionar Livro;
2 – Procurar Livro;
3 – Remover Livro;
4 – Fechar Biblioteca.
 
: 1
 
Digite o nome do Livro
: Pai Rico Pai Pobre
Digite o nome da editora do Livro
: Campus
 
 
Digite a opção desejada:
1 – Adicionar Livro;
2 – Procurar Livro;
3 – Remover Livro;
4 – Fechar Biblioteca.
 
: 2
 
Digite o nome do Livro que deseja procurar
: A Cabana
O livro A Cabana não se encontra na biblioteca.
/*Caso o livro esteja na biblioteca, retornar nome e editora*/
 
Digite a opção desejada:
1 – Adicionar Livro;
2 – Procurar Livro;
3 – Remover Livro;
4 – Fechar Biblioteca.
 
: 3
 
Digite o nome do livro que deseja deletar
: Pai Rico Pai Pobre
Livro removido com sucesso!
/*Caso o livro não esteja na biblioteca, informar ao usuário*/
 
Digite a opção desejada:
1 – Adicionar Livro;
2 – Procurar Livro;
3 – Remover Livro;
4 – Fechar Biblioteca.
 
: 4
 
Obrigado por utilizar nossa Biblioteca 10!
Controle de senha (2,5 pts)
O Active Directory é uma implementação de serviço de diretório no protocolo LDAP que armazena                             
informações sobre objetos em rede de computadores e disponibiliza essas informações a usuários e                           
administradores desta rede. É um software da Microsoft utilizado em ambientes Windows. Essa ferramenta                           
é bastante utilizada em ambientes corporativos devido a sua relativa facilidade na configuração e                           
manutenção.
Sendo assim, vocêirá criar um programa que permite o reset da senha do usuário. Para isso você deverá                                     
utilizar um arquivo texto chamado Senhas.txt (que funcionará como um banco de dados do LDAP).
Nesse arquivo estarão uma série de registros com as informações do usuário:
● Login;
● CPF;
● RG;
● Credencial de acesso (ADM ­ para usuários administradores e COM ­ Comuns) e senha cifrada do                               
usuário.
Seu programa deverá ter uma subrotina chamada preencherDados() que deverá carregar todas as                         
informações num array de registros (tabela). Lembre que essa tabela é, na verdade, um array de registros                                 
cujo tamanho deverá ser especificado por você. Caso a quantidade de registros existente no arquivo                             
Senhas.txt seja maior do que o array criado, você deverá redimensioná­lo. Essa tabela será o mecanismo                               
em memória que você utilizará para checar as informações pessoais do usuário (login, CPF e RG) e após                                   
essa validação será permitida a troca da senha. 
Observação: o campo CPF deve aceitar apenas caracteres númericos e ter um tamanho de 11 dígitos. Já o                                   
campo RG deve aceitar apenas caracteres númericos. O programa deve aceitar tanto a informação do CPF                               
quanto a do RG com seus separadores.
Ex.: CPF: 111.111.111­11 (válido)
       CPF: 11111111111 (válido)
       CPF: 111­111­111­11 (inválido)
       RG: 1.111.111 (válido)
              1111111 (válido)
              1­111­111  (inválido)
O algoritmo de cifragem da senha é baseado na Cifra de César. É um tipo de cifra de substituição na qual                                         
cada letra do texto é substituída por outra, que se apresenta no alfabeto abaixo dela um número fixo de                                     
vezes. Por exemplo, com uma troca de três posições, A seria substituído por D, B se tornaria E, e assim                                       
por diante.
Ex.: smrg 111.111.111­24 2424169 erqhtxlfkdhxvrx COM
Você deverá implementar essa forma de criptografia através de uma subrotina chamada cifraDeCesar() na 
qual ela recebe como parâmetro o texto a ser cifrado e retorna o texto criptografado.
Importante: a chave da Cifra de César deverá ser uma constante no seu algoritmo de forma que a 
cifra seja uniforme tanto na encriptação quanto na descriptação.
Observação: Caso o usuário utilize números ou caracteres especiais, você deverá criar seu próprio                           
dicionário de cifragem.
Exemplo com os números:
Dicionário númerico: 0123456789 (ordem crescente)
Senha original: 1026958
Senha cifrada:  4359281
Exemplo com caracteres especiais:
Dicionário especial: !@#$%&*()+=|\/?<> (somente alguns para fins de exemplo)
Senha original: @#$%
Senha cifrada: %&*(
Você deve limitar o uso de caracteres especiais utilizados pelo usuário, permitindo apenas os caracteres 
existentes no seu dicionário. Ou seja, caso o usuário use um caracter não registrado, você deverá lançar 
uma exceção do tipo SenhaInvalidaException e forçar que o mesmo digite uma senha válida novamente.
Exemplo:
Bem­vindo ao sistema PassHelper 2014
Caso você seja administrador, digite 1.
Caso você seja um usuário padrão, digite 2:
2
Digite suas credenciais:
Login: ctlls
CPF: 111.111.111­11
RG: 1.111.111
Informe a nova senha: *******
Confirme a nova senha: *******
Senha trocada com sucesso!
Deseja continuar? (S/N): S
Caso você seja administrador, digite 1.
Caso você seja um usuário padrão, digite 2:
2
Digite suas credenciais:
Login: kld
CPF: 123.123.123­12
RG: 123.123
Informe a nova senha: *******
Confirme a nova senha: *******
Senha informada inválida!
Informe a nova senha: *******
Confirme a nova senha: *******
Senha trocada com sucesso!
Deseja continuar? (S/N): S
Caso você seja administrador, digite 1.
Caso você seja um usuário padrão, digite 2:
1
Digite suas credenciais:
Login: ams2
CPF: 111.111.111­11
RG: 1.111.111
Senha: ********
Olá, administrador!
Informe os dados do usuário para alterar a senha:
Login: kld
Informe a nova senha: *******
Confirme a nova senha: *******
Senha trocada com sucesso!
Deseja continuar? (S/N): N
Avaliador de Expressão (1 ponto) ­ EXTRA
O programa deve receber expressões lógicas de um arquivo chamado Arquivo.in e retornar um arquivo 
chamado Arquivo.out.
Para cada linha de expressão lida, informar uma linha com o resultado lógico (true ou false) no Arquivo.out.
Para facilitar, a entrada sempre será uma expressão com sintaxe correta;
Para cada operador, deve existir um par de parentes o envolvendo (observe as cores do exemplo);
Além dos operadores e parenteses, será usado apenas 1 (true) e 0 (false) como premissas;
Elementos:
1 TRUE
0 FALSE
* AND
+ OR
­ NEGAÇÃO
Cada expressão irá conter no máximo 100 caracteres.
Obs: essa questão pode ser facilmente resolvida por recursão :)
Exemplo:
Arquivo.in
(((1*0)+(0+0))*(­0))
1
(1+1)
(0*(1+(0+1)))
(­0)
Arquivo.out
A expressão retorna FALSE.
A expressão retorna TRUE.
A expressão retorna TRUE.
A expressão retorna FALSE.
A expressão retorna TRUE.

Continue navegando