SlideShare uma empresa Scribd logo
1 de 10
Baixar para ler offline
TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados
Semana 01Semana 01
Cadeia de Caracteres (Cadeia de Caracteres (StringsStrings)) &&&& Manipulação deManipulação de StringsStrings
ObjetivoObjetivo
Introduzir a criptografa a partir da→ Cifra de CésarCifra de César
Consolidar o conteúdo sobre cadeias de caracteres→
Leitura ComplementarLeitura Complementar
→ Cífra de CésarCífra de César: http://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar
AvaliaçãoAvaliação
→ Exatidão:Exatidão: o programa apresenta a saída desejada?
→ Estilo:Estilo: o código-fonte segue as boas práticas?
ComeçandoComeçando
A criptografacriptografa é a ciência e o estudo dos princípios e das técnicas pelas quais um texto legível pode ser
escrito de forma secreta (i.e. cifradocifrado). Um texto cifradocifrado somente é compreendido se aplicado a chave de
decifragemdecifragem. O processo de transformação é conhecido como ciframentociframento e a transformação inversa é
conhecida como deciframentodeciframento. Uma texto não cifrado é claro (plaintextplaintext) e pode ser interceptado e lido
por pessoas não autorizadas, por isso da necessidade de cifrá-lo.
As primeiras formas de criptografa usavam o método da substituiçãosubstituição. Esse tipo de criptografa era comum
no ensino fundamental, lembram :-):-) ? As meninas se comunicavam por meio de papéis com escrita cifrada
para que os meninos não interpretar o conteúdo. A cifra era feita trocando as letras do alfabeto (e.g. a
letra AA correspondia à letra CC). Naturalmente, a colega (destinatária da mensagem) conhecia a chave e o
método de ciframento e aplicava o deciframento do texto.
O estudo da criptografa cobre bem mais do que apenas a cifragemcifragem e decifragemdecifragem, pois é uma ciência que
envolve teoria da informação e matemática. Com o advento da computação, a criptografa evoluiu para o
estudo de algoritmos criptográfcos implementados por sistemas computacionais. Atualmente existem
diversos algorimtos de criptografa, alguns com objetivos bem específcos e outros com objetivos mais
gerais. Independente disso, a ideia não é estudar os algorimtos de criptografa, mas desenvolver o
conteúdo de cadeia de caracterescadeia de caracteres a partir de métodos de substituição.
Cifra de CésarCifra de César
A Cifra de CésarCifra de César é uma das mais simples e conhecidas técnicas de criptografa. É um tipo de
cifra de substituiçãocifra de substituição em que cada letra do texto é substituída por outra, satisfazendo uma relação
de..parade..para (A→C, B→D, C→E, etc.).
Considere um alfabetoalfabeto A=(s0,s1,…,sn-1) com nn símbolos e um valor inteiro kk (chavechave), onde 0≤k≤n-10≤k≤n-1.
Considere também as funções de cifragemcifragem Ck(si)=s(i+k) mod n e sua função inversa de decifragemdecifragem
Dk(si)=s(i-k+n) mod n, onde
s(i-k+n) mod n é o símbolo referente à posição do resultado da operação de resto da divisão
Ck(si) é a cifragemcifragem com a chave k do símbolo da posição i
Dk(si) é a decifragemdecifragem com a chave k do símbolo da posição i
Pg.Pg. 11//44
Para aplicar as funções supracitadas é necessário representar os símbolos do alfabeto em formato decimal.
Na computação essa representação pode ser feita através da tabela ASCII. Assim, as funções cifragemcifragem e
decifragemdecifragem devem considerar o alfabeto a partir do intervalo decimal (0..255) da tabela ASCII.
Considere o subalfabeto As=(A..Z) (65..90) da tabela ASCII.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
As A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Cada símbolo do alfabeto (si) é representado por um valor decimal (e.g. s65=A, s66=B, etc.). É importante
ressaltar que o valor inicial do subalfabeto As é 65 e não 0, por isso, as funções de cifragemcifragem e decifragemdecifragem
devem considerar essa diferença
Ck(si)=s(i-p+k) mod n+p
Dk(si)=s(i-p-k+n) mod n+p
, sendo p o valor decimal inicial do subalfabeto As. Caso o valor decimal do alfabeto inicie em 0,
p pode ser omitido.
Agora vamos aplicar a defnição acima em um exemplo prático. Para isso, considere a chave com valor 3
(k=3k=3), as funções de cifragem CC33((si)) e decifragem DD33((si)), e os valores decimais do subalfabeto As.
Aplicando a função de cifragem Ck(si)=s(i-p+k) mod n+p na cadeia de caracteres "STRING"
S C3(83)=s(83-65+3) mod 26 + 65 => 86 => V
T C3(84)=s(84-65+3) mod 26 + 65 => 87 => W
R C3(82)=s(82-65+3) mod 26 + 65 => 85 => U
I C3(73)=s(73-65+3) mod 26 + 65 => 76 => L
N C3(78)=s(78-65+3) mod 26 + 65 => 66 => Q
G C3(71)=s(78-65+3) mod 26 + 65 => 73 => J
temos como saída a cadeia de caracteres "VWULQJ".
Aplicando a função de decifragem Dk(si)=s(i-p-k+n) mod n+p no texto cifrado "VWULQJ".
V C3(86)=s(86-65-3+26) mod 26 + 65 => 86 => S
W C3(87)=s(87-65-3+26) mod 26 + 65 => 84 => T
U C3(85)=s(85-65-3+26) mod 26 + 65 => 82 => R
L C3(76)=s(76-65-3+26) mod 26 + 65 => 73 => I
Q C3(66)=s(66-65-3+26) mod 26 + 65 => 78 => N
J C3(73)=s(73-65-3+26) mod 26 + 65 => 71 => G
temos como saída a cadeia de caracteres "STRING".
Implementando a funçãoImplementando a função Ck do alfabetodo alfabeto As
A implementação das funções Ck e Dk faz uso de funções de manipulação de strings, pois, a partir de
um string, manipula caracteres ASCII e os concatena em uma nova str string cifrada.
O código-fonte abaixo refere-se a função de cifragemcifragem Ck.
Pg.Pg. 22//44
1. String text = new String("STRING");
2. String cipherText = new String();
3. int k = 3;
4.
5. if(cipherText.isEmpty()) {
6. for(int i = 0; i < text.length(); i++) {
7. int ascii = Integer.valueOf(text.charAt(i)).intValue();
8. ascii = ((ascii - 65 + k) % 26) + 65;
9. cipherText = cipherText.concat(String.valueOf((char) ascii));
10. }
11. }
12.
13. System.out.print(cipherText);
Nas linhas 1 e 2 são criadas as strings que receberão, respectivamente, o texto original (text) e o
texto cifrado (cipherText). É uma boa prática e convenção da linguagem de programação Java que
nomes compostos de variáveis possuam a primeira palavra em minúsculo e a segunda palavra somente
com a primeira letra em maiúscula.
O texto original recebe a palavra "STRING" para ser cifrado, enquanto o texto cifrado é criado sem valor.
Na linha 5 é realizado um teste condicional para verifcar se o texto cifrado está nulo. Se o resultado do
teste condiconal for verdadeiro, então se inicia a verredura na string texto para cifrá-la.
A variável ascii (linha 7) é cirada a cada iteração da estrutura de repetição, recebendo a conversão de
uma posição específca da string para inteiro. Após obter o valor inteiro o cálculo da cifragem é
aplicado (linha 8). Por conseguinte, o texto cifrado é concatenado com a conversão do valor da variável
ascii para string (linha 9). Por fm, o texto cifrado é exibido (linha 13).
Para testar o código-fonte crie uma classe principal denominada CaesarCipherHandler.javaCaesarCipherHandler.java. Em
seguida, insira o código-fonte dentro do método principal.
ExercitandoExercitando
1. Considere a implementação da função de cifragemcifragem Ck no arquivo CaesarCipherHandler.javaCaesarCipherHandler.java e:
Implemente a função→ Dk do alfabeto As no mesmo código-fonte. Utilize a variável cipherText
como entrada do processo de decifragemdecifragem.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2. As normas para a formatação bibliográfca de documentos acadêmicos (artigo científco, monografa,
livro, texto, etc.) preconizam que o nome do autor seja escrito no formato: último sobrenome emúltimo sobrenome em
maiúsculo + vírgula + espaço + sequência das primeiras letras do nome e dos demais sobrenomes,maiúsculo + vírgula + espaço + sequência das primeiras letras do nome e dos demais sobrenomes,
seguidas de ponto fnalseguidas de ponto fnal. Por exemplo, John Ronald Reuel TolkienJohn Ronald Reuel Tolkien deve ser referenciado como TOLKIEN, J.TOLKIEN, J.
R. R.R. R..
Codifque um programa em Java que leia um nome e apresente-o no formato bibliográfco→
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pg.Pg. 33//44
3. É prática em documentos cartoriais como AVISOS, DECLARAÇÕES, CERTIDÕES, etc., que os títulos
sejam grafados com as letras separadas por um espaço em branco.
Codifque um programa em Java que receba uma frase e a retorne com suas letras separadas→
por um espaço em branco. Se houver espaço na frase, substitua por dois espaços
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4. Um histogramahistograma é a representação gráfca, em colunascolunas ou linhaslinhas, de um conjunto de dados previamente
tabulado e dividido em classes uniformes. A base da coluna ou linha representa uma classeclasse e a altura
representa a quantidadequantidade ou frequência com que o valor dessa classe ocorreu. A construção de
histogramas tem caráter preliminar em qualquer estudo e é um importante indicador da distribuição de
dados. Com base na breve defnição de histograma:
Codifque um programa que recebe uma linha de texto e apresente o histograma das vogais,→
ignorando a condição case sensetive. Exemplo:
"Histograma das vogais!"
a: ****
e:
i: **
o: **
u:
Após apresentar o histograma das vogais exiba a vogal com maior frequência→
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5. Elabore um programa em Java que dada uma datadata no formato "DD/MM/AAAA" a tranforme para o
formato "AAAA-MM-DD".
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6. Elabore um programa em Java que dado um número real qualquer (e.g. 85.54, 865.1, etc.) exiba o
número de dígitos da parte inteira e o número de dígitos da parte fracionária.
Pg.Pg. 44//44
TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados
Semana 02Semana 02
Ordenação Interna – Parte IOrdenação Interna – Parte I &&&& Leitura de ArquivoLeitura de Arquivo
ObjetivoObjetivo
Introdução à leitura de arquivos com a classe→ Scanner()
Consolidar os métodos de ordenação→ Insertion SortInsertion Sort, Bubble SortBubble Sort e Selection SortSelection Sort
Leitura ComplementarLeitura Complementar
→ The JavaThe JavaTMTM
Tutorials:Tutorials: http://docs.oracle.com/javase/tutorial/essential/io/scanning.html
AvaliaçãoAvaliação
→ Exatidão:Exatidão: o programa apresenta a saída desejada?
→ Estilo:Estilo: o código-fonte segue as boas práticas?
ComeçandoComeçando
A manipulação de arquivos é um dos recursos das linguagens de programação úteis para criar arquivos de
configuração, evitando modificações do código-fonte para diferentes cenários. Além disso, é comum o
uso de arquivos para realizar o inputinput e outputoutput de dados em sistemas computacionais (e.g. para a entrada e
saída de algoritmos).
Na linguagem de programação Java existem várias formas de realizar a leitura de um arquivo de dados,
contudo, neste pSetpSet o objetivo é obter dados de um arquivo de textoobter dados de um arquivo de texto utilizando a classe Scanner. Com
os dados carregados em memória primária, métodos de ordenação serão aplicados sobre esse conjunto
de dados.
A classe Scanner permite separar uma entrada de texto em blocos a partir de um delimitadordelimitador. Os valores
dos blocos podem ser convertidos em valores de tipos primitivos (int, float, double, etc.) ou objetos
(String, etc.) - dependendo do método utilizado na classe Scanner. Por exemplo, o arquivo
price.txtprice.txt, disponível com este pSet, possui uma lista de valores separados por uma quebra de linha n,
ou seja, um valor por linha. Neste exemplo o delimitador é a quebra de linha n.
Analise o código abaixo:
1. Scanner scanner = null;
2. try {
3. scanner = new Scanner(new FileReader("prices.txt")).useDelimiter("n");
4. } catch (FileNotFoundException e) {
5. e.printStackTrace();
6. }
7.
8. while (scanner.hasNext()) {
9. Double price = scanner.nextDouble();
10. System.out.println(price);
11. }
Na linha 1 é criado um objeto Scanner atribuindo o valor nullnull. Na linha 3 é criado um objeto de leitura
de arquivo (usando a classe FileReader) e definindo como delimitador a quebra de linha n. As
intruções try..catch() (linhas 2, 4-6) identificam e exibem possíveis exceções (erros) de abertura de
arquivo.
Pg.Pg. 11//33
A linha 8 percorre o objeto scanner enquanto existir blocos de texto – uma analogia é percorrer o
arquivo linha a linha ou um vetor índice a índice. A linha 9 lê o valor e o converte para o tipo floatfloat,
atribuindo o valor convertido na variável priceprice. A linha 10 exibe o conteúdo da variável priceprice na saída
padrão (console).
Ordenando os dados do arquivoOrdenando os dados do arquivo price.txtprice.txt com a classecom a classe ScannerScanner
Como a quantidade de dados do arquivo prices.txtprices.txt é incerta, é necessário utilizar uma estrutura
dinâmica para obter os valores do arquivo. A classe ArrayList oferece métodos para isso, conforme o
exemplo:
1. Scanner scanner = null;
2. try {
3. scanner = new Scanner(new FileReader("prices.txt")).useDelimiter("n");
4. } catch (FileNotFoundException e) {
5. e.printStackTrace();
6. }
7.
8. ArrayList<Double> arrayDbl = new ArrayList<Double>();
9.
10. while (scanner.hasNext()) {
11. Double price = scanner.nextDouble();
12. arrayDbl.add(price);
13. }
Ao invés de exibir os valores do objeto scannerscanner, o código-fonte acima adiciona o valor ao objeto
ArrayList arrayDblarrayDbl através do método .add().add().
Ao criar o objeto da inner class MySortingClassMySortingClass na classe SortingHandlerSortingHandler, envie para o método
construtor o array de objetosarray de objetos por meio do método arrayDbl.toArray()arrayDbl.toArray().
MySortingClass arraySort = new MySortingClass(arrayDbl.toArray());
Em seguida é só invocar os métodos disponíveis na inner class MySortingClassMySortingClass: print(),
insertionSort(), bubbleSort() e selectionSort().
ExercitandoExercitando
1. Considere a função principal da classe SortingHandlerSortingHandler e a inner class MySortingClassMySortingClass. Crie
um vetor com os valores {"sidgley", "Alexandre", "fabio", "Lucas", "eduardo"}. Em
seguida, invoque os métodos de ordenação Insertion SortInsertion Sort, Selection SortSelection Sort e Bubble SortBubble Sort. As saídas dos
algoritmos estão corretas?
Perceba que os algoritmos são case sensitivecase sensitive, ou seja, diferenciam maiúsculas e minúsculas. As letras
maiúsculas possuem valor ASCII ou UNICODE menor, consequentemente os nomes não são ordenados
adequadamente. No terminal do GNU-Linux execute:
$man ascii
Observe o valor decimal dos símbolos da tabela ASCII. Das letras “a” e “A”, qual possui o maior valor?
Pg.Pg. 22//33
Sua tarefa é:
Altere a classe→ MySortingClassMySortingClass para cosiderar igualmenteigualmente letras maiúsculas e minúsculas –
torne a comparação ignoreignore case sensitivecase sensitive em relação a objetos String. Salve o arquivo como
IISortingHandler.javaSortingHandler.java.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2. Altere o código-fonte do arquivo IISortingHandler.javaSortingHandler.java para medir e comparar o tempo de
execução dos algoritmos de ordenação Insertion SortInsertion Sort, Selection SortSelection Sort e Bubble SortBubble Sort. Para tanto, realize as
seguintes alterações:
Utilize o método→ System.nanoTime() para medir o tempo de execução de cada algoritmo
de ordenação. Imprima esse tempo na tela. IMPORTANTE: Note que, após a aplicação de um dos
métodos de ordenação, é necessário restaurar os valores originais do vetor (caso contrário, o
vetor já estará ordenado e as medições de tempo serão prejudicadas). Crie um novo método para
realizar essa restauração. Utilize, para tanto, um novo atributo (vetor auxiliar) que armazena o estado
inicial do vetor.
1. long startTime, endTime;
2. startTime = System.nanoTime();
3. /* coloque aqui a chamada a um dos algoritmos de ordenação */
4. endTime = System.nanoTime();
5. /* neste caso, o tempo decorrido da operação é (endtime – startTime) */
Imprima na tela os tempos de execução de cada algoritmo.→
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3. Utilizando a classe Scanner, crie um objeto ArrayList<String> com os dados do arquivo
names.txtnames.txt. Em seguida ordene os dados através dos métodos de ordenação insertionSort(),
bubbleSort() e selectionSort().
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4. Defina um vetor de inteiros para demonstrar que o algoritmo selectionSort()selectionSort() é um método instável.
Exiba os passos da execução do algoritmo até que a estabilidade é violada. Dica! Quanto menor for o
vetor, mais rápido resolverá a questão.
Pg.Pg. 33//33
TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados
Semana 03Semana 03
Ordenação Interna – Parte IIOrdenação Interna – Parte II &&&& Análise ExperimentalAnálise Experimental
ObjetivoObjetivo
Consolidar os métodos de ordenação→ Merge SortMerge Sort, Quick SortQuick Sort e Shell SortShell Sort
→ Introdução à análise experimental de algoritmos
AvaliaçãoAvaliação
→ Exatidão:Exatidão: o programa apresenta a saída desejada?
→ Estilo:Estilo: o código-fonte segue as boas práticas?
ComeçandoComeçando
Em muitas situações podem existir vários algoritmos para resolver o mesmo problema, sendo necessário
escolher aquele que resolve o problema de forma mais eficiente. Vários critérios podem ser adotados
para analisar a eficiência e robustez de um algortimo. Comumente, o tempo de processamentotempo de processamento como
função da entrada, o espaço de memóriaespaço de memória máximo ou total requerido para os dados e o tratamento detratamento de
entradas errôneas ou inesperadasentradas errôneas ou inesperadas são exemplos desses critérios em análises experimentais.
Em geral, o custo da execução de um algoritmo depende principalmente do tamanho da entradatamanho da entrada dos
dados. Por isso, é comum considerar o tempo de processamentotempo de processamento de um programa como critério de
eficiência em experimentos usando computadores. Entretanto, para alguns algoritmos o tempo detempo de
processamentoprocessamento é próximo ou alterna entre os algoritmos da mesma classe. Neste caso, outros critérios
devem ser adotados nas análises experimentais, tais como, o número de execuções da operaçãooperação
dominantedominante (também denominada operação fundamental).
Em relação à análise experimental, o número de execuções da operação dominanteexecuções da operação dominante pode ser considerado
um critério complementar. A operação dominanteoperação dominante deve ser tal que a contagem do número de execuções
expresse a quantidade real de trabalho ou custo do algoritmo. Em caso de duas ou mais operaçõesoperações
dominantesdominantes é necessário definir pesos (iguais ou diferentes) dependendo do custo de cada operação.
Como exemplo de operações dominantesoperações dominantes na análise experimental tem-se as comparaçõescomparações e trocastrocas dos
algoritmos de ordenação.
Observe o código-fonte em Java do algoritmo de ordenação insertionSort()insertionSort(), especificado no
arquivo SortingHandler.javaSortingHandler.java:
1. public void insertionSort() {
2. int i, j;
3. Object key;
4.
5. for (i = 1; i < array.length; i++) {
6. key = array[i];
7. j = i - 1;
8. while ((j >= 0) && (!isGreater(key, array[j]))) {
9. array[j+1] = array[j];
10. j--;
11. }
12. array[j+1] = key;
13. }
14. }
Pg.Pg. 11//33
Considere as operações de comparação !isGreater(key, array[j]) (linha 8) e troca array[j+1] =
array[j]; (linha 9) como operações dominantesoperações dominantes, pois são responsáveis pelo maior trabalho do algoritmo.
Variáveis podem ser adicionadas ao algoritmo para verificar o número de execuções de cada operaçãooperação
dominantedominante. Observe o novo código-fonte em Java do mesmo algoritmo:
1. public void insertionSort() {
2. int i, j;
3. Object key;
4.4. cmpCount = swpCount = 0;cmpCount = swpCount = 0;
5. for (i = 1; i < array.length; i++) {
6. key = array[i];
7. j = i – 1;
8.8. cmpCount++;cmpCount++;
9. while ((j >= 0) && (!isGreater(key, array[j]))) {
10.10. swpCount++;swpCount++;
11. array[j+1] = array[j];
12. j--;
13. }
14. array[j+1] = key;
15. }
16. }
As variáveis cmpCountcmpCount e swpCountswpCount contabilizam as execuções das operações dominantes comparaçãocomparação e
trocatroca. A linha 8 incrementa o número de comparações (cmpCountcmpCount) a cada comparação realizada na linha
9. A linha 10 incrementa a variável swpCountswpCount a cada permuta realizada na linha 11. Ao final da execução
as variáveis cmpCountcmpCount e swpCountswpCount possuirão, respectivamente, o custo das operações comparaçãocomparação e
trocatroca.
Análise experimental do métodoAnálise experimental do método insertionSort()insertionSort() para a entradapara a entrada names.txtnames.txt
Na classe MySortingMySorting do arquivo SortingHandler.javaSortingHandler.java defina as variáveis cmpCountcmpCount e swpCountswpCount:
1. class MySortingClass {
2. // array de objetos (tipos primitivos ou Strings)
3. private Object[] array = null;
4.
5. long cmpCount = 0, swpCount = 0;
6.
7. // contrutor de classe para alimentar o array
8. public MySortingClass(Object[] array) {
9. this.array = array;
10. }
11. // restante do código-fonte (veja SortingHandler.java)
Altere o método print()print() da classe MysortingMysorting de forma a exibir os custos das operações de
comparação e troca:
1. public void print() {
2. int i;
3. for (i = 0; i < array.length; i++)
4. System.out.print(array[i] + " ");
5. System.out.println();
6. System.out.format("cmpCount: %dtswpCount: %dnn",cmpCount, swpCount);
7. }
Pg.Pg. 22//33
Considerando as alterações na classe MySortingMySorting e no método insertionSort()insertionSort(), e a entrada
names.txtnames.txt, o custo das operações dominantes (comparação e troca) é:
cmpCount: 106 swpCount: 2719
Por que realizar análise experimental?Por que realizar análise experimental?
O fato de um algoritmo resolver um problema não significa que seja aceitável na prática, pois os recursos
de tempotempo e espaçoespaço requeridos têm grande importância em casos práticos – quando o algoritmo é
implementado e executado em um computador.
Considerando uma classe de algoritmos para resolução de um problema em específico, nem sempre o
algoritmo mais imediato é viável na prática. Assim, análises experimentais são importantes para validar
algoritmos.
O problema da análise experimentalO problema da análise experimental
Existem diversos fatores que afetam o tempo de processamento de um programa. Dentre eles estão: o
próprio algoritmoalgoritmo, os dados de entradadados de entrada e o sistema computacionalsistema computacional utilizado para rodar o programa. Uma
análise considerando esses fatores é difícil, além da interferência rápida das mudanças tecnológicas (e.g.
hardware, linguagem de programação, compilador/interpretador, sistema operacional, etc.).
Nesse contexto, uma análise através de um formalismo matemáticoformalismo matemático é adequado para mitigar o impacto
desses fatores. Esse tipo de análise torna-se imparcial em relaçãoà tecnologia e preocupa-se somente
com a representação das operações dominantes, desconsiderando operações que não refletirão custo
considerável ao algoritmo. A análise por meio de formalismo matemática será tema da próxima aula, bem
como desafio do pSet04pSet04.
ExercitandoExercitando
1. Considere os algoritmos vistos em sala de aula: insertionSort()insertionSort(); selectionSort()selectionSort();
bubbleSort()bubbleSort(); mergeSort()mergeSort(); shellSort()shellSort(); heapSort()heapSort(); e quickSort()quickSort(), utilize os arquivos
price.txtprice.txt e names.txtnames.txt como entradas para:
Determinar experimentalmente o número de→ comparaçõescomparações e trocastrocas para cada método de
ordenação.
Determinar experimentalmente o→ tempo de execuçãotempo de execução de cada um dos métodos de ordenação .
Preencher o quadro abaixo e analisar o melhor algoritmo para os arquivos de entrada→
Algoritmo
Custo
comparações
Custo
trocas
Tempo
execução (ms)
insertionSort()insertionSort()
selectionSort()selectionSort()
bubbleSort()bubbleSort()
mergeSort()mergeSort()
shellSort()shellSort()
heapSort()heapSort()
quickSort()quickSort()
Pg.Pg. 33//33

Mais conteúdo relacionado

Mais procurados

8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoriaRicardo Bolanho
 
Sessão 8 Codificação Lempel-Ziv
Sessão 8 Codificação Lempel-ZivSessão 8 Codificação Lempel-Ziv
Sessão 8 Codificação Lempel-ZivPedro De Almeida
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Expressões regulares
Expressões regularesExpressões regulares
Expressões regularesRicardo Paiva
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Elaine Cecília Gatto
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Karoline Tavares
 
Expressões Regulares e Python
Expressões Regulares e PythonExpressões Regulares e Python
Expressões Regulares e PythonMarcel Caraciolo
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsortFlávio Freitas
 
Estrutura de Dados - Aula 03
Estrutura de Dados - Aula 03Estrutura de Dados - Aula 03
Estrutura de Dados - Aula 03thomasdacosta
 
Strings e manipulação de variáveis
Strings e manipulação de variáveisStrings e manipulação de variáveis
Strings e manipulação de variáveis111111119
 

Mais procurados (18)

8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
 
Sessão 8 Codificação Lempel-Ziv
Sessão 8 Codificação Lempel-ZivSessão 8 Codificação Lempel-Ziv
Sessão 8 Codificação Lempel-Ziv
 
Ativ complementar etapa 02
Ativ complementar etapa 02Ativ complementar etapa 02
Ativ complementar etapa 02
 
Linguagem C 09 Ponteiros
Linguagem C 09 PonteirosLinguagem C 09 Ponteiros
Linguagem C 09 Ponteiros
 
Minicurso de Expressões Regulares
Minicurso de Expressões RegularesMinicurso de Expressões Regulares
Minicurso de Expressões Regulares
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Expressões regulares
Expressões regularesExpressões regulares
Expressões regulares
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 
Expressões Regulares e Python
Expressões Regulares e PythonExpressões Regulares e Python
Expressões Regulares e Python
 
Linguagem C - Strings
Linguagem C - StringsLinguagem C - Strings
Linguagem C - Strings
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Linguagem C 07 Registros
Linguagem C 07 RegistrosLinguagem C 07 Registros
Linguagem C 07 Registros
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsort
 
Estrutura de Dados - Aula 03
Estrutura de Dados - Aula 03Estrutura de Dados - Aula 03
Estrutura de Dados - Aula 03
 
Iteraveis e geradores
Iteraveis e geradoresIteraveis e geradores
Iteraveis e geradores
 
Strings e manipulação de variáveis
Strings e manipulação de variáveisStrings e manipulação de variáveis
Strings e manipulação de variáveis
 
Java Básico
Java BásicoJava Básico
Java Básico
 

Semelhante a Criptografia César

Aula 14 - Entrada e Saida em linguagem C.pdf
Aula 14 - Entrada e Saida em linguagem C.pdfAula 14 - Entrada e Saida em linguagem C.pdf
Aula 14 - Entrada e Saida em linguagem C.pdfvictorlopes714651
 
Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...
Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...
Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...Os Fantasmas !
 
unidade04-c3-handout.pdf
unidade04-c3-handout.pdfunidade04-c3-handout.pdf
unidade04-c3-handout.pdfAlexSouza974126
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...Marcio Machado Pereira
 
Aula 02 operadores aritiméticos
Aula 02   operadores aritiméticosAula 02   operadores aritiméticos
Aula 02 operadores aritiméticosTácito Graça
 
Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Rafael Liberato
 
Nota de aula seguranca da informacao - criptografia
Nota de aula   seguranca da informacao - criptografiaNota de aula   seguranca da informacao - criptografia
Nota de aula seguranca da informacao - criptografiafelipetsi
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em CElaine Cecília Gatto
 
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de códigoAula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de códigossusere36c31
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkFelipe
 
Criptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetoniCriptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetonidrbetoni
 

Semelhante a Criptografia César (20)

Aula 14 - Entrada e Saida em linguagem C.pdf
Aula 14 - Entrada e Saida em linguagem C.pdfAula 14 - Entrada e Saida em linguagem C.pdf
Aula 14 - Entrada e Saida em linguagem C.pdf
 
Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...
Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...
Capítulo 12 Livro Algoritmos e Programação de Computadores Autores JR., Diler...
 
unidade04-c3-handout.pdf
unidade04-c3-handout.pdfunidade04-c3-handout.pdf
unidade04-c3-handout.pdf
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 
Minicurso Java && Cl
Minicurso Java && ClMinicurso Java && Cl
Minicurso Java && Cl
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
 
programação c 10 aula
programação c 10 aulaprogramação c 10 aula
programação c 10 aula
 
Aula 02 operadores aritiméticos
Aula 02   operadores aritiméticosAula 02   operadores aritiméticos
Aula 02 operadores aritiméticos
 
Ud2
Ud2Ud2
Ud2
 
Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 
Nota de aula seguranca da informacao - criptografia
Nota de aula   seguranca da informacao - criptografiaNota de aula   seguranca da informacao - criptografia
Nota de aula seguranca da informacao - criptografia
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em C
 
Algoritmo
AlgoritmoAlgoritmo
Algoritmo
 
Curso Ruby
Curso RubyCurso Ruby
Curso Ruby
 
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de códigoAula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
Aula 10 de algoritmos com raciocínio lógico e desenvolvimento de código
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache Spark
 
Java4
Java4Java4
Java4
 
Criptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetoniCriptografia com curva_eliptica_dbetoni
Criptografia com curva_eliptica_dbetoni
 

Mais de Federal University of Technology - Paraná/Brazil (UTFPR)

Mais de Federal University of Technology - Paraná/Brazil (UTFPR) (8)

Situational awareness in social media: lessons learned using information entr...
Situational awareness in social media: lessons learned using information entr...Situational awareness in social media: lessons learned using information entr...
Situational awareness in social media: lessons learned using information entr...
 
Does keyword noise change over space and time? A case study of flood- and rai...
Does keyword noise change over space and time? A case study of flood- and rai...Does keyword noise change over space and time? A case study of flood- and rai...
Does keyword noise change over space and time? A case study of flood- and rai...
 
Mining rainfall spatio-temporal patterns in Twitter: a temporal approach
Mining rainfall spatio-temporal patterns in Twitter: a temporal approachMining rainfall spatio-temporal patterns in Twitter: a temporal approach
Mining rainfall spatio-temporal patterns in Twitter: a temporal approach
 
An Introduction to Metric Learning for Clustering
An Introduction to Metric Learning for ClusteringAn Introduction to Metric Learning for Clustering
An Introduction to Metric Learning for Clustering
 
An introduction to automated analysis of feature models through propositional...
An introduction to automated analysis of feature models through propositional...An introduction to automated analysis of feature models through propositional...
An introduction to automated analysis of feature models through propositional...
 
Aulas TSI32B - Estrutura, Pesquisa e Ordenação de Dados (TSI UTFPR-Toledo)
Aulas TSI32B - Estrutura, Pesquisa e Ordenação de Dados (TSI UTFPR-Toledo)Aulas TSI32B - Estrutura, Pesquisa e Ordenação de Dados (TSI UTFPR-Toledo)
Aulas TSI32B - Estrutura, Pesquisa e Ordenação de Dados (TSI UTFPR-Toledo)
 
pSets TSI33A - Banco de Dados I (TSI UTFPR-Toledo)
pSets TSI33A - Banco de Dados I (TSI UTFPR-Toledo)pSets TSI33A - Banco de Dados I (TSI UTFPR-Toledo)
pSets TSI33A - Banco de Dados I (TSI UTFPR-Toledo)
 
Aulas TSI33A - Banco de Dados I (TSI UTFPR-Toledo)
Aulas TSI33A - Banco de Dados I (TSI UTFPR-Toledo)Aulas TSI33A - Banco de Dados I (TSI UTFPR-Toledo)
Aulas TSI33A - Banco de Dados I (TSI UTFPR-Toledo)
 

Criptografia César

  • 1. TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados Semana 01Semana 01 Cadeia de Caracteres (Cadeia de Caracteres (StringsStrings)) &&&& Manipulação deManipulação de StringsStrings ObjetivoObjetivo Introduzir a criptografa a partir da→ Cifra de CésarCifra de César Consolidar o conteúdo sobre cadeias de caracteres→ Leitura ComplementarLeitura Complementar → Cífra de CésarCífra de César: http://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar AvaliaçãoAvaliação → Exatidão:Exatidão: o programa apresenta a saída desejada? → Estilo:Estilo: o código-fonte segue as boas práticas? ComeçandoComeçando A criptografacriptografa é a ciência e o estudo dos princípios e das técnicas pelas quais um texto legível pode ser escrito de forma secreta (i.e. cifradocifrado). Um texto cifradocifrado somente é compreendido se aplicado a chave de decifragemdecifragem. O processo de transformação é conhecido como ciframentociframento e a transformação inversa é conhecida como deciframentodeciframento. Uma texto não cifrado é claro (plaintextplaintext) e pode ser interceptado e lido por pessoas não autorizadas, por isso da necessidade de cifrá-lo. As primeiras formas de criptografa usavam o método da substituiçãosubstituição. Esse tipo de criptografa era comum no ensino fundamental, lembram :-):-) ? As meninas se comunicavam por meio de papéis com escrita cifrada para que os meninos não interpretar o conteúdo. A cifra era feita trocando as letras do alfabeto (e.g. a letra AA correspondia à letra CC). Naturalmente, a colega (destinatária da mensagem) conhecia a chave e o método de ciframento e aplicava o deciframento do texto. O estudo da criptografa cobre bem mais do que apenas a cifragemcifragem e decifragemdecifragem, pois é uma ciência que envolve teoria da informação e matemática. Com o advento da computação, a criptografa evoluiu para o estudo de algoritmos criptográfcos implementados por sistemas computacionais. Atualmente existem diversos algorimtos de criptografa, alguns com objetivos bem específcos e outros com objetivos mais gerais. Independente disso, a ideia não é estudar os algorimtos de criptografa, mas desenvolver o conteúdo de cadeia de caracterescadeia de caracteres a partir de métodos de substituição. Cifra de CésarCifra de César A Cifra de CésarCifra de César é uma das mais simples e conhecidas técnicas de criptografa. É um tipo de cifra de substituiçãocifra de substituição em que cada letra do texto é substituída por outra, satisfazendo uma relação de..parade..para (A→C, B→D, C→E, etc.). Considere um alfabetoalfabeto A=(s0,s1,…,sn-1) com nn símbolos e um valor inteiro kk (chavechave), onde 0≤k≤n-10≤k≤n-1. Considere também as funções de cifragemcifragem Ck(si)=s(i+k) mod n e sua função inversa de decifragemdecifragem Dk(si)=s(i-k+n) mod n, onde s(i-k+n) mod n é o símbolo referente à posição do resultado da operação de resto da divisão Ck(si) é a cifragemcifragem com a chave k do símbolo da posição i Dk(si) é a decifragemdecifragem com a chave k do símbolo da posição i Pg.Pg. 11//44
  • 2. Para aplicar as funções supracitadas é necessário representar os símbolos do alfabeto em formato decimal. Na computação essa representação pode ser feita através da tabela ASCII. Assim, as funções cifragemcifragem e decifragemdecifragem devem considerar o alfabeto a partir do intervalo decimal (0..255) da tabela ASCII. Considere o subalfabeto As=(A..Z) (65..90) da tabela ASCII. 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 As A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Cada símbolo do alfabeto (si) é representado por um valor decimal (e.g. s65=A, s66=B, etc.). É importante ressaltar que o valor inicial do subalfabeto As é 65 e não 0, por isso, as funções de cifragemcifragem e decifragemdecifragem devem considerar essa diferença Ck(si)=s(i-p+k) mod n+p Dk(si)=s(i-p-k+n) mod n+p , sendo p o valor decimal inicial do subalfabeto As. Caso o valor decimal do alfabeto inicie em 0, p pode ser omitido. Agora vamos aplicar a defnição acima em um exemplo prático. Para isso, considere a chave com valor 3 (k=3k=3), as funções de cifragem CC33((si)) e decifragem DD33((si)), e os valores decimais do subalfabeto As. Aplicando a função de cifragem Ck(si)=s(i-p+k) mod n+p na cadeia de caracteres "STRING" S C3(83)=s(83-65+3) mod 26 + 65 => 86 => V T C3(84)=s(84-65+3) mod 26 + 65 => 87 => W R C3(82)=s(82-65+3) mod 26 + 65 => 85 => U I C3(73)=s(73-65+3) mod 26 + 65 => 76 => L N C3(78)=s(78-65+3) mod 26 + 65 => 66 => Q G C3(71)=s(78-65+3) mod 26 + 65 => 73 => J temos como saída a cadeia de caracteres "VWULQJ". Aplicando a função de decifragem Dk(si)=s(i-p-k+n) mod n+p no texto cifrado "VWULQJ". V C3(86)=s(86-65-3+26) mod 26 + 65 => 86 => S W C3(87)=s(87-65-3+26) mod 26 + 65 => 84 => T U C3(85)=s(85-65-3+26) mod 26 + 65 => 82 => R L C3(76)=s(76-65-3+26) mod 26 + 65 => 73 => I Q C3(66)=s(66-65-3+26) mod 26 + 65 => 78 => N J C3(73)=s(73-65-3+26) mod 26 + 65 => 71 => G temos como saída a cadeia de caracteres "STRING". Implementando a funçãoImplementando a função Ck do alfabetodo alfabeto As A implementação das funções Ck e Dk faz uso de funções de manipulação de strings, pois, a partir de um string, manipula caracteres ASCII e os concatena em uma nova str string cifrada. O código-fonte abaixo refere-se a função de cifragemcifragem Ck. Pg.Pg. 22//44
  • 3. 1. String text = new String("STRING"); 2. String cipherText = new String(); 3. int k = 3; 4. 5. if(cipherText.isEmpty()) { 6. for(int i = 0; i < text.length(); i++) { 7. int ascii = Integer.valueOf(text.charAt(i)).intValue(); 8. ascii = ((ascii - 65 + k) % 26) + 65; 9. cipherText = cipherText.concat(String.valueOf((char) ascii)); 10. } 11. } 12. 13. System.out.print(cipherText); Nas linhas 1 e 2 são criadas as strings que receberão, respectivamente, o texto original (text) e o texto cifrado (cipherText). É uma boa prática e convenção da linguagem de programação Java que nomes compostos de variáveis possuam a primeira palavra em minúsculo e a segunda palavra somente com a primeira letra em maiúscula. O texto original recebe a palavra "STRING" para ser cifrado, enquanto o texto cifrado é criado sem valor. Na linha 5 é realizado um teste condicional para verifcar se o texto cifrado está nulo. Se o resultado do teste condiconal for verdadeiro, então se inicia a verredura na string texto para cifrá-la. A variável ascii (linha 7) é cirada a cada iteração da estrutura de repetição, recebendo a conversão de uma posição específca da string para inteiro. Após obter o valor inteiro o cálculo da cifragem é aplicado (linha 8). Por conseguinte, o texto cifrado é concatenado com a conversão do valor da variável ascii para string (linha 9). Por fm, o texto cifrado é exibido (linha 13). Para testar o código-fonte crie uma classe principal denominada CaesarCipherHandler.javaCaesarCipherHandler.java. Em seguida, insira o código-fonte dentro do método principal. ExercitandoExercitando 1. Considere a implementação da função de cifragemcifragem Ck no arquivo CaesarCipherHandler.javaCaesarCipherHandler.java e: Implemente a função→ Dk do alfabeto As no mesmo código-fonte. Utilize a variável cipherText como entrada do processo de decifragemdecifragem. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2. As normas para a formatação bibliográfca de documentos acadêmicos (artigo científco, monografa, livro, texto, etc.) preconizam que o nome do autor seja escrito no formato: último sobrenome emúltimo sobrenome em maiúsculo + vírgula + espaço + sequência das primeiras letras do nome e dos demais sobrenomes,maiúsculo + vírgula + espaço + sequência das primeiras letras do nome e dos demais sobrenomes, seguidas de ponto fnalseguidas de ponto fnal. Por exemplo, John Ronald Reuel TolkienJohn Ronald Reuel Tolkien deve ser referenciado como TOLKIEN, J.TOLKIEN, J. R. R.R. R.. Codifque um programa em Java que leia um nome e apresente-o no formato bibliográfco→ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pg.Pg. 33//44
  • 4. 3. É prática em documentos cartoriais como AVISOS, DECLARAÇÕES, CERTIDÕES, etc., que os títulos sejam grafados com as letras separadas por um espaço em branco. Codifque um programa em Java que receba uma frase e a retorne com suas letras separadas→ por um espaço em branco. Se houver espaço na frase, substitua por dois espaços - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4. Um histogramahistograma é a representação gráfca, em colunascolunas ou linhaslinhas, de um conjunto de dados previamente tabulado e dividido em classes uniformes. A base da coluna ou linha representa uma classeclasse e a altura representa a quantidadequantidade ou frequência com que o valor dessa classe ocorreu. A construção de histogramas tem caráter preliminar em qualquer estudo e é um importante indicador da distribuição de dados. Com base na breve defnição de histograma: Codifque um programa que recebe uma linha de texto e apresente o histograma das vogais,→ ignorando a condição case sensetive. Exemplo: "Histograma das vogais!" a: **** e: i: ** o: ** u: Após apresentar o histograma das vogais exiba a vogal com maior frequência→ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5. Elabore um programa em Java que dada uma datadata no formato "DD/MM/AAAA" a tranforme para o formato "AAAA-MM-DD". - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6. Elabore um programa em Java que dado um número real qualquer (e.g. 85.54, 865.1, etc.) exiba o número de dígitos da parte inteira e o número de dígitos da parte fracionária. Pg.Pg. 44//44
  • 5. TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados Semana 02Semana 02 Ordenação Interna – Parte IOrdenação Interna – Parte I &&&& Leitura de ArquivoLeitura de Arquivo ObjetivoObjetivo Introdução à leitura de arquivos com a classe→ Scanner() Consolidar os métodos de ordenação→ Insertion SortInsertion Sort, Bubble SortBubble Sort e Selection SortSelection Sort Leitura ComplementarLeitura Complementar → The JavaThe JavaTMTM Tutorials:Tutorials: http://docs.oracle.com/javase/tutorial/essential/io/scanning.html AvaliaçãoAvaliação → Exatidão:Exatidão: o programa apresenta a saída desejada? → Estilo:Estilo: o código-fonte segue as boas práticas? ComeçandoComeçando A manipulação de arquivos é um dos recursos das linguagens de programação úteis para criar arquivos de configuração, evitando modificações do código-fonte para diferentes cenários. Além disso, é comum o uso de arquivos para realizar o inputinput e outputoutput de dados em sistemas computacionais (e.g. para a entrada e saída de algoritmos). Na linguagem de programação Java existem várias formas de realizar a leitura de um arquivo de dados, contudo, neste pSetpSet o objetivo é obter dados de um arquivo de textoobter dados de um arquivo de texto utilizando a classe Scanner. Com os dados carregados em memória primária, métodos de ordenação serão aplicados sobre esse conjunto de dados. A classe Scanner permite separar uma entrada de texto em blocos a partir de um delimitadordelimitador. Os valores dos blocos podem ser convertidos em valores de tipos primitivos (int, float, double, etc.) ou objetos (String, etc.) - dependendo do método utilizado na classe Scanner. Por exemplo, o arquivo price.txtprice.txt, disponível com este pSet, possui uma lista de valores separados por uma quebra de linha n, ou seja, um valor por linha. Neste exemplo o delimitador é a quebra de linha n. Analise o código abaixo: 1. Scanner scanner = null; 2. try { 3. scanner = new Scanner(new FileReader("prices.txt")).useDelimiter("n"); 4. } catch (FileNotFoundException e) { 5. e.printStackTrace(); 6. } 7. 8. while (scanner.hasNext()) { 9. Double price = scanner.nextDouble(); 10. System.out.println(price); 11. } Na linha 1 é criado um objeto Scanner atribuindo o valor nullnull. Na linha 3 é criado um objeto de leitura de arquivo (usando a classe FileReader) e definindo como delimitador a quebra de linha n. As intruções try..catch() (linhas 2, 4-6) identificam e exibem possíveis exceções (erros) de abertura de arquivo. Pg.Pg. 11//33
  • 6. A linha 8 percorre o objeto scanner enquanto existir blocos de texto – uma analogia é percorrer o arquivo linha a linha ou um vetor índice a índice. A linha 9 lê o valor e o converte para o tipo floatfloat, atribuindo o valor convertido na variável priceprice. A linha 10 exibe o conteúdo da variável priceprice na saída padrão (console). Ordenando os dados do arquivoOrdenando os dados do arquivo price.txtprice.txt com a classecom a classe ScannerScanner Como a quantidade de dados do arquivo prices.txtprices.txt é incerta, é necessário utilizar uma estrutura dinâmica para obter os valores do arquivo. A classe ArrayList oferece métodos para isso, conforme o exemplo: 1. Scanner scanner = null; 2. try { 3. scanner = new Scanner(new FileReader("prices.txt")).useDelimiter("n"); 4. } catch (FileNotFoundException e) { 5. e.printStackTrace(); 6. } 7. 8. ArrayList<Double> arrayDbl = new ArrayList<Double>(); 9. 10. while (scanner.hasNext()) { 11. Double price = scanner.nextDouble(); 12. arrayDbl.add(price); 13. } Ao invés de exibir os valores do objeto scannerscanner, o código-fonte acima adiciona o valor ao objeto ArrayList arrayDblarrayDbl através do método .add().add(). Ao criar o objeto da inner class MySortingClassMySortingClass na classe SortingHandlerSortingHandler, envie para o método construtor o array de objetosarray de objetos por meio do método arrayDbl.toArray()arrayDbl.toArray(). MySortingClass arraySort = new MySortingClass(arrayDbl.toArray()); Em seguida é só invocar os métodos disponíveis na inner class MySortingClassMySortingClass: print(), insertionSort(), bubbleSort() e selectionSort(). ExercitandoExercitando 1. Considere a função principal da classe SortingHandlerSortingHandler e a inner class MySortingClassMySortingClass. Crie um vetor com os valores {"sidgley", "Alexandre", "fabio", "Lucas", "eduardo"}. Em seguida, invoque os métodos de ordenação Insertion SortInsertion Sort, Selection SortSelection Sort e Bubble SortBubble Sort. As saídas dos algoritmos estão corretas? Perceba que os algoritmos são case sensitivecase sensitive, ou seja, diferenciam maiúsculas e minúsculas. As letras maiúsculas possuem valor ASCII ou UNICODE menor, consequentemente os nomes não são ordenados adequadamente. No terminal do GNU-Linux execute: $man ascii Observe o valor decimal dos símbolos da tabela ASCII. Das letras “a” e “A”, qual possui o maior valor? Pg.Pg. 22//33
  • 7. Sua tarefa é: Altere a classe→ MySortingClassMySortingClass para cosiderar igualmenteigualmente letras maiúsculas e minúsculas – torne a comparação ignoreignore case sensitivecase sensitive em relação a objetos String. Salve o arquivo como IISortingHandler.javaSortingHandler.java. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2. Altere o código-fonte do arquivo IISortingHandler.javaSortingHandler.java para medir e comparar o tempo de execução dos algoritmos de ordenação Insertion SortInsertion Sort, Selection SortSelection Sort e Bubble SortBubble Sort. Para tanto, realize as seguintes alterações: Utilize o método→ System.nanoTime() para medir o tempo de execução de cada algoritmo de ordenação. Imprima esse tempo na tela. IMPORTANTE: Note que, após a aplicação de um dos métodos de ordenação, é necessário restaurar os valores originais do vetor (caso contrário, o vetor já estará ordenado e as medições de tempo serão prejudicadas). Crie um novo método para realizar essa restauração. Utilize, para tanto, um novo atributo (vetor auxiliar) que armazena o estado inicial do vetor. 1. long startTime, endTime; 2. startTime = System.nanoTime(); 3. /* coloque aqui a chamada a um dos algoritmos de ordenação */ 4. endTime = System.nanoTime(); 5. /* neste caso, o tempo decorrido da operação é (endtime – startTime) */ Imprima na tela os tempos de execução de cada algoritmo.→ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3. Utilizando a classe Scanner, crie um objeto ArrayList<String> com os dados do arquivo names.txtnames.txt. Em seguida ordene os dados através dos métodos de ordenação insertionSort(), bubbleSort() e selectionSort(). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4. Defina um vetor de inteiros para demonstrar que o algoritmo selectionSort()selectionSort() é um método instável. Exiba os passos da execução do algoritmo até que a estabilidade é violada. Dica! Quanto menor for o vetor, mais rápido resolverá a questão. Pg.Pg. 33//33
  • 8. TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados Semana 03Semana 03 Ordenação Interna – Parte IIOrdenação Interna – Parte II &&&& Análise ExperimentalAnálise Experimental ObjetivoObjetivo Consolidar os métodos de ordenação→ Merge SortMerge Sort, Quick SortQuick Sort e Shell SortShell Sort → Introdução à análise experimental de algoritmos AvaliaçãoAvaliação → Exatidão:Exatidão: o programa apresenta a saída desejada? → Estilo:Estilo: o código-fonte segue as boas práticas? ComeçandoComeçando Em muitas situações podem existir vários algoritmos para resolver o mesmo problema, sendo necessário escolher aquele que resolve o problema de forma mais eficiente. Vários critérios podem ser adotados para analisar a eficiência e robustez de um algortimo. Comumente, o tempo de processamentotempo de processamento como função da entrada, o espaço de memóriaespaço de memória máximo ou total requerido para os dados e o tratamento detratamento de entradas errôneas ou inesperadasentradas errôneas ou inesperadas são exemplos desses critérios em análises experimentais. Em geral, o custo da execução de um algoritmo depende principalmente do tamanho da entradatamanho da entrada dos dados. Por isso, é comum considerar o tempo de processamentotempo de processamento de um programa como critério de eficiência em experimentos usando computadores. Entretanto, para alguns algoritmos o tempo detempo de processamentoprocessamento é próximo ou alterna entre os algoritmos da mesma classe. Neste caso, outros critérios devem ser adotados nas análises experimentais, tais como, o número de execuções da operaçãooperação dominantedominante (também denominada operação fundamental). Em relação à análise experimental, o número de execuções da operação dominanteexecuções da operação dominante pode ser considerado um critério complementar. A operação dominanteoperação dominante deve ser tal que a contagem do número de execuções expresse a quantidade real de trabalho ou custo do algoritmo. Em caso de duas ou mais operaçõesoperações dominantesdominantes é necessário definir pesos (iguais ou diferentes) dependendo do custo de cada operação. Como exemplo de operações dominantesoperações dominantes na análise experimental tem-se as comparaçõescomparações e trocastrocas dos algoritmos de ordenação. Observe o código-fonte em Java do algoritmo de ordenação insertionSort()insertionSort(), especificado no arquivo SortingHandler.javaSortingHandler.java: 1. public void insertionSort() { 2. int i, j; 3. Object key; 4. 5. for (i = 1; i < array.length; i++) { 6. key = array[i]; 7. j = i - 1; 8. while ((j >= 0) && (!isGreater(key, array[j]))) { 9. array[j+1] = array[j]; 10. j--; 11. } 12. array[j+1] = key; 13. } 14. } Pg.Pg. 11//33
  • 9. Considere as operações de comparação !isGreater(key, array[j]) (linha 8) e troca array[j+1] = array[j]; (linha 9) como operações dominantesoperações dominantes, pois são responsáveis pelo maior trabalho do algoritmo. Variáveis podem ser adicionadas ao algoritmo para verificar o número de execuções de cada operaçãooperação dominantedominante. Observe o novo código-fonte em Java do mesmo algoritmo: 1. public void insertionSort() { 2. int i, j; 3. Object key; 4.4. cmpCount = swpCount = 0;cmpCount = swpCount = 0; 5. for (i = 1; i < array.length; i++) { 6. key = array[i]; 7. j = i – 1; 8.8. cmpCount++;cmpCount++; 9. while ((j >= 0) && (!isGreater(key, array[j]))) { 10.10. swpCount++;swpCount++; 11. array[j+1] = array[j]; 12. j--; 13. } 14. array[j+1] = key; 15. } 16. } As variáveis cmpCountcmpCount e swpCountswpCount contabilizam as execuções das operações dominantes comparaçãocomparação e trocatroca. A linha 8 incrementa o número de comparações (cmpCountcmpCount) a cada comparação realizada na linha 9. A linha 10 incrementa a variável swpCountswpCount a cada permuta realizada na linha 11. Ao final da execução as variáveis cmpCountcmpCount e swpCountswpCount possuirão, respectivamente, o custo das operações comparaçãocomparação e trocatroca. Análise experimental do métodoAnálise experimental do método insertionSort()insertionSort() para a entradapara a entrada names.txtnames.txt Na classe MySortingMySorting do arquivo SortingHandler.javaSortingHandler.java defina as variáveis cmpCountcmpCount e swpCountswpCount: 1. class MySortingClass { 2. // array de objetos (tipos primitivos ou Strings) 3. private Object[] array = null; 4. 5. long cmpCount = 0, swpCount = 0; 6. 7. // contrutor de classe para alimentar o array 8. public MySortingClass(Object[] array) { 9. this.array = array; 10. } 11. // restante do código-fonte (veja SortingHandler.java) Altere o método print()print() da classe MysortingMysorting de forma a exibir os custos das operações de comparação e troca: 1. public void print() { 2. int i; 3. for (i = 0; i < array.length; i++) 4. System.out.print(array[i] + " "); 5. System.out.println(); 6. System.out.format("cmpCount: %dtswpCount: %dnn",cmpCount, swpCount); 7. } Pg.Pg. 22//33
  • 10. Considerando as alterações na classe MySortingMySorting e no método insertionSort()insertionSort(), e a entrada names.txtnames.txt, o custo das operações dominantes (comparação e troca) é: cmpCount: 106 swpCount: 2719 Por que realizar análise experimental?Por que realizar análise experimental? O fato de um algoritmo resolver um problema não significa que seja aceitável na prática, pois os recursos de tempotempo e espaçoespaço requeridos têm grande importância em casos práticos – quando o algoritmo é implementado e executado em um computador. Considerando uma classe de algoritmos para resolução de um problema em específico, nem sempre o algoritmo mais imediato é viável na prática. Assim, análises experimentais são importantes para validar algoritmos. O problema da análise experimentalO problema da análise experimental Existem diversos fatores que afetam o tempo de processamento de um programa. Dentre eles estão: o próprio algoritmoalgoritmo, os dados de entradadados de entrada e o sistema computacionalsistema computacional utilizado para rodar o programa. Uma análise considerando esses fatores é difícil, além da interferência rápida das mudanças tecnológicas (e.g. hardware, linguagem de programação, compilador/interpretador, sistema operacional, etc.). Nesse contexto, uma análise através de um formalismo matemáticoformalismo matemático é adequado para mitigar o impacto desses fatores. Esse tipo de análise torna-se imparcial em relaçãoà tecnologia e preocupa-se somente com a representação das operações dominantes, desconsiderando operações que não refletirão custo considerável ao algoritmo. A análise por meio de formalismo matemática será tema da próxima aula, bem como desafio do pSet04pSet04. ExercitandoExercitando 1. Considere os algoritmos vistos em sala de aula: insertionSort()insertionSort(); selectionSort()selectionSort(); bubbleSort()bubbleSort(); mergeSort()mergeSort(); shellSort()shellSort(); heapSort()heapSort(); e quickSort()quickSort(), utilize os arquivos price.txtprice.txt e names.txtnames.txt como entradas para: Determinar experimentalmente o número de→ comparaçõescomparações e trocastrocas para cada método de ordenação. Determinar experimentalmente o→ tempo de execuçãotempo de execução de cada um dos métodos de ordenação . Preencher o quadro abaixo e analisar o melhor algoritmo para os arquivos de entrada→ Algoritmo Custo comparações Custo trocas Tempo execução (ms) insertionSort()insertionSort() selectionSort()selectionSort() bubbleSort()bubbleSort() mergeSort()mergeSort() shellSort()shellSort() heapSort()heapSort() quickSort()quickSort() Pg.Pg. 33//33