Академический Документы
Профессиональный Документы
Культура Документы
Vers ao 2000.1
Estas notas de aula n ao devem ser usadas como u nica fonte de estudo. O aluno deve ler outros livros dispon veis na literatura. Nenhuma parte destas notas pode ser reproduzida, qualquer que seja a forma ou o meio, sem a permiss ao dos autores. Os autores concedem a permiss ao expl cita para a utilizac a o e reproduc a o deste material no contexto do ensino de disciplinas regulares dos cursos de graduac a o sob a responsabilidade do Instituto de Computac a o da UNICAMP.
c Copyright 2000
Instituto de Computac a o UNICAMP Caixa Postal 6176 13083970 CampinasSP fkm,tomasz @ic.unicamp.br
ii
Na declarac a o de vari aveis e tipos usaremos colchetes com o devido tamanho da string. Na passagem de par ametros daremos prioridade para a sintaxe usando a palavra string. No caso onde a rotina tem funcionalidade xa para um determinado tipo usaremos o nome do tipo no lugar da palavra string. A seguir apresentamos algumas rotinas para manipulac a o de strings. Func a o Length SetLength Pos ! Concat " ###$ Copy 1324 Insert "!%325 Delete 1324 Resultado Retorna a quantidade de caracteres da string Redene a quantidade de caracteres em uso como Retorna a posic a o da cadeia na cadeia ! (0 se n ao ocorre) Retorna a concatenac a o de %### (equivale a '&(!)&0### ) Retorna a cadeia formada pelos caracteres a partir da posic a o 2 Insere em a partir da posic a o 2 Remove os caracteres a partir da posic a o 2
79
Exemplo 8.1 Descreva uma implementac a a o em pascal da func o Pos. function Pos(var s1,s2: String): Integer; var n1,n2,d,i,j : Integer; achou, cont: Boolean; begin n1 : 6 Length(s1); n2 : 6 Length(s2); d : 6 n2 7 n1 & 1; achou : 6 False; i : 6 1; while (not achou) and (i 86 d) do begin j : 6 1; cont : 6 True; while cont and (j 96 n1) do begin cont : 6 (s1[j]6 s2[i & j 7 1]); inc(j) end; achou : 6 cont; inc(i); end; if achou then Pos : 6 i 7 1 else Pos : 6 0 end; Pos Exemplo 8.2 Descreva uma implementac a a o em pascal da func o Insert. function Insert( var s1,s2: String; p: Integer); Insere os caracteres de s1 que couberem em s2 const ComprMax 6 255; var n1,n2,d,i : Integer; begin n1 : 6 Length(s1); n2 : 6 Length(s2); if (n1& n2) @ ComprMax then d : 6 ComprMax 7 n2 else d : 6 n1; i : 6 1; for i: 6 n2 downto n2 7 d & 1 do s2[i& d] : 6 s[i]; for i: 6 1 to d do s2[p& i 7 1] : 6 s1[i]; & d) SetLength(s2,n2 end; Insere Exemplo 8.3 Uma cadeia de caracteres e ndrome se a seq ue dita ser pal ncia dos caracteres da cadeia da esquerda para a direita e ue igual a seq ncia de caracteres da direita para a esquerda. Por exemplo: As seguintes cadeias de caracteres s ao pal ndromes: ABC12321CBA, ACCA, XYZ6.6ZYX. Fac a uma func a ametro e ndrome. o que retorna verdadeiro se a cadeia de caracteres enviada como par pal
80
function Palindrome(var s: String): Boolean; var i,m,n : Integer; p: Boolean; begin p : 6 True; n : 6 Length(s); m : 6 n div 2; i : 6 1; while p and (i 96 m) do begin p : 6 (s[i] 6 s[n 7 i & 1]); inc(i); end; Palindrome :6 p end; Palindrome
81
program acentos; function SemAcento(caracter : char):char; begin case caracter of a : SemAcento:6 a; A : SemAcento:6 E : SemAcento:6 E; : SemAcento:6 o : SemAcento:6 o; O : SemAcento:6 U : SemAcento:6 U; ` a : SemAcento:6 a : SemAcento:6 a; A : SemAcento:6 E : SemAcento:6 E; o : SemAcento:6 A : SemAcento:6 a : SemAcento:6 a; O : SemAcento:6 O; u : SemAcento:6 c : SemAcento:6 c; C : SemAcento:6 else SemAcento:6 caracter; end; case end; var c : char; begin a; writeln(A letra ,c, sem acento c: 6 c: 6 e; writeln(A letra ,c, sem acento c: 6 a; writeln(A letra ,c, sem acento c: 6 o; writeln(A letra ,c, sem acento end.
A; i; O; a; A; o; A; u; C;
e; I; u; A; e; O; o; U;
Exerc cio 8.1 Fac a uma func a ametro uma cadeia de caracteres e retorna a mesma cadeia sem o que tem como par acentos.
82
program ProgramMaiusculas; type TipoTexto 6 string[1000]; procedure Maiuscula(var texto : TipoTexto); var i,tam : integer; begin tam : 6 length(texto); for i: 6 1 to tam do if (a 96 texto[i]) and (texto[i] 96 z) then texto[i] : 6 chr( ord(A) & ord(texto[i]) 7 ord(a)); end; var Cadeia : TipoTexto; begin write(Entre com um texto: ); readln(cadeia); Maiuscula(cadeia); writeln(O texto em mai usculo e :,cadeia); end. Exerc cio 8.2 Fac a um programa an alogo ao apresentado acima, mas para tranformar uma cadeia em min usculas.
83
string[1000]; 6 string[50];
Retorna a posic a ndice onde comec a o padrao, 0 caso n ao exista. o do function BuscaPadrao(var texto : TipoString; var Padrao:TipoPadrao): integer; var i,j,TamTexto,TamPadrao : integer; achou,SubsequenciaIgual : boolean; begin TamTexto : 6 length(texto); TamPadrao : 6 length(padrao); i : 6 0; achou : 6 false; while (not achou) and (i 86 TamTexto 7 TamPadrao) do begin i: 6 i & 1; j: 6 1; SubSequenciaIgual : 6 true; while (j 96 TamPadrao) and (SubsequenciaIgual6 true) do if (Padrao[j]6 Texto[i & j 7 1]) then j: 6 j & 1 else SubSequenciaIgual : 6 false; achou : 6 SubSequenciaIgual; end; if (achou) then BuscaPadrao : 6 i else BuscaPadrao : 6 0; end; BuscaPadrao var texto : TipoString; padrao : TipoPadrao; pos : integer; begin write(Entre com um texto: ); readln(texto); write(Entre com um padrao: ); readln(padrao); pos : 6 BuscaPadrao(texto,padrao); if (pos6 0) then writeln(Padrao n ao encontrado. ) else writeln(Padrao encontrado na posic ao ,pos); end.
Obs.: Existem outros algoritmos para fazer busca de padr oes que s ao computacionalmente mais ecientes, como o algoritmo de Knuth, Morris e Pratt e o algoritmo de Boyer e Moore.
84
Cifra de C esar Um caso particular do m etodo de substituic a o e o seguinte. Considere um alfabeto pt6u3Awv%FA "###!FAyx5y com s mbolos. Considere um inteiro , 7D (chamado de chave). Uma func a o de criptograa %spp e sua 5 inversa (para decriptografar) s ao dadas a seguir:
%3AyX)60A ed fdgih%j x 5 3AkUl6mA! n dox fdg9hj x
a func a o transforma r
Este tipo de criptograa tamb em e chamado de cifra de C esar, porque J ulio C esar usou com 6 . A seguir apresentamos um programa que criptografa um texto, com o alfabeto das letras min usculas, usando este tipo de criptograa, transformando apenas as letras e deixando os demais s mbolos intactos. program progcifracesar; 6 type tipostring string[100]; procedure criptocesar(var texto,cifra : tipostring; k:integer); var i,tam : integer; begin cifra : 6 ; tam : 6 length(texto); for i: 6 1 to tam do begin if (texto[i] @96 a) and (texto[i] 96 z) then cifra : 6 cifra & chr((ord(texto[i]) 7 ord(a) & k) mod 26 & ord(a)) else cifra : 6 cifra & texto[i]; end ; end; criptocesar var Texto,Cripto : tipostring; begin write(Entre com uma cadeia de caracteres: ); readln(texto); criptocesar(texto,cripto,3); writeln(A texto criptografado e: , cripto); end.
85
Exerc cio 8.3 Fac a um procedimento para decriptografar tendo como dados de entrada a cadeia de caracteres criptografada pelo programa acima e o valor usado de . Os m etodos de substituic a o s ao r apidos, mas pouco seguros. Em geral, cada l ngua possui freq ue ncias diferentes para as ocorr encias de cada letra. Exemplo 8.5 Em um texto em ingl es, temos em geral as seguintes freq ue ncias esperadas para as letras:
r6mF1 t6D% ui6mF1 v6dF1 x6D"F1 y6mF1 {i6D% }6mF1 6m 60Y 60Y 6 6mF1 6mF1 6F1 6F1 6mY 6m 6mF1 06mF1 m6F1 6D%F1 6D% 6mY 6mF1 060Y
Assim, para decriptografar um texto, onde o original e es, calculamos as freq ue mbolos no texto em ingl ncias dos s criptografado e em seguida relacionamos com as freq ue mbolos ncias acima. Isto permite que possamos relacionar os s com os caracteres originais mais prov aveis. Exerc cio 8.4 Fac a um programa que l e um n umero inteiro , (D e escreve seu valor por extenso. Exemplos:
1 = um 19 = dezenove 20 = vinte 21 = vinte e um 100 = cem 111 = cento e onze 1000 = mil 2345 = dois mil trezentos e quarenta e cinco 9012 = nove mil e doze 12900 = doze mil e novecentos 100101 = cem mil cento e um 110600 = cento e dez mil e seiscentos 999999 = novecentos e noventa e nove mil novecentos e noventa e nove 1000000 = um milh ao
at e9 at e 19 at e 99 at e 999 at e um milh ao
Note que as func o o es para intervalos maiores podem usar as func es para intervalos menores. Pense com cuidado na l ogica do uso da conjunc a o e.
86
function criptografa(str : string; k:integer):tipostring; function decriptografa(str : string; k:integer):tipostring; function maiuscula(str : string):tipostring; function minuscula(str : string):tipostring; function semacentos(str : string):tipostring; function cadeialivre(str : string):tipostring; type tipostring=string[255];
onde tipostring e denido como: As func o es criptografa e decriptografa s ao para criptografar e decriptografar usando a cifra de C esar, com deslousculas. As func o es mai uscula e min uscula s ao para retornar a func a o dada camento e o alfabeto das letras min em mai usculo e min usculo. A func a o semacentos retorna a cadeia de caracteres str sem as letras dos acentos (ela preserva mai usculas e min usculas). A func a o cadeia livre transforma a cadeia de caracteres str em uma cadeia sem acentos e com todos as letras em min usculo. O programa deve ler uma cadeia de caracteres e uma opc a o para uma das seis operac o es acima. Caso a opc a o seja para criptografar ou decriptografar, o par ametro tamb em deve ser lido. Ap os a execuc a o de uma opc a o, a cadeia de caracteres resultante deve ser impressa.
87