Estou de volta!
Para aqueles que estavam ansiosos por mais uma aula preparatória para competições de programação (principalmente OBI, pois já está próxima), venho aqui para isso! A aula de hoje não será tão grande, contudo tem uma importância extrema (quem viu a prova da 2ª fase da OAH 2008 perceberá a importância desse assunto) e, como sempre, virá seguida de exercícios.
Eu sei que muitos podem estar achando os exercícios complicados, e realmente são, mas preciso informá-los que a persistência é o melhor remédio, pois eu estava empacado em um deles a mais de semana, só que ontem consegui receber um “Accepted” no site da UVa Online Judge! =) Vamos, então, à batalha!
Aula 3 – Strings
Conteúdo: visão geral de como tratar strings, desde o modo em que elas aparecem nas diversas linguagens, até os principais métodos para lidar com elas.
Strings são estruturas fundamentais de crescente importância. Vocês verão que os problemas apresentados nessa aula são um pouco mais fáceis do que o passado, todavia eles revelam a forma de como strings e caracteres são representados, além dos melhores algoritmos para manipular esse tipo de dado.
Códigos dos caracteres: Os caracteres são apenas códigos os quais o computador associa a um símbolo, por esse motivo linguagens como C, C++ e Pascal tratam o tipo char como alguma coisa de 1 byte, nada mais do que isso. O American Standard Code for Information Interchange (ASCII), ou Código Padrão Americano para Troca de Informações, representa o caracter por 1 byte, tendo um total de 2^7 = 128 tipos diferentes. Eles não foram ordenados ao acaso, possuindo algumas propriedades interessantes para o programador:
- Todos os caracteres não-imprimíveis possuem os 3 primeiros bits iguais a 0 (zero) ou os 7 menos sigficativos iguais a 1;
- As letras minúsculas e maiúsculas aparecem ambas ordenadas sequencialmente, o que nos permite a criação de loops do primeiro (“a”) ao último (“z”);
- Além do loop, podemos ver qual a posição apenas subtraindo pelo valor do início: “I” – “A” = 8;
- Podemos converter de maiúscula para minúscula com operações simples como: “C” – “A” + “a”. Analogamente uma letra será maiúscula se estiver entre “A” e “Z”;
- Ao ordenar um texto, estaremos simplesmente ordenando o seu código ASCII.
Códigos mais modernos, como Unicode, utilizam 2 ou até 3 bytes para representar um caracter, abrangendo qualquer língua do planeta.
Representando strings: aqui apenas diferenciarei os modos de linguagens básicas tratarem as strings.
- Vetores terminados com NULO: C/C++ tratam strings apenas como vetores de caracteres, terminando com o “” (zero ASCII). A não colocação desse último caracter pode gerar muita confusão no decorrer do programa, pois seria uma string “infinita”. Vantagem: pode-se acessar cada valor apenas indexando-os, assim como vetores.
- Vetor mais tamanho: Outro modo usual é utilizar o primeiro elemento do vetor para o tamanho da string, o que dispensa a utilização do caracter NULO. Essa forma é utilizada internamente pelo Java, apesar de ser mostrado ao programador como um objeto.
Manipulando strings: Para a sua manipulação será necessário o conhecimento de como sua linguagem trata esse dado, contudo para uma simplificação, iremos exemplificar com o suporte feito em C.
- Computando o tamanho de uma String: Varre os caracteres, até encontrar o NULO, com um contador para o cálculo;
- Copiando uma String: Ao menos que sua linguagem de programação suporte igualar dois vetores de uma só vez, você terá que copiar elemento por elemento. OBS: não esqueça de criar o caracter NULO no fim!;
- String ao contrário: Se não for necessário manter a string original é preciso apenas trocar os elementos, num loop até a metade do tamanho. Caso seja preciso a primeira, então copia-se para outra string, só que da direita para a esquerda. OBS: novamente, não esqueça de criar o caracter NULO no fim!;
- Por último, será apresentado um algoritmo, pouco eficaz, diga-se de passagem, mas SIMPLES, para contar quantas vezes alguma string p aparece em outra t.

Bibliotecas de funções para strings: Já estamos no final da aula, mas deixaremos para vocês dicas de algumas bibliotecas já presentes nas linguagens, para o tratamento de strings:
- C => <ctype.h> Manipulação de caracteres; <string.h> Manipulação de strings;
- C++ => as mesmas do C, além de uma classe string, a qual possui algumas funcionalidades interessantes. MAIS;
- Java => A classe String, com diversas operações avançadas em java.text;
- Pascal => Nativo do SysUtils, portanto todas as funções estão a sua disposição. MAIS.
Bem pessoal, o conteúdo era esse, agora vamos praticar! OBS: Novamente eu lembro que todos os exercícios dispostos abaixo estão no UVa Online Judge e eles possuem todos os direitos sobres os problemas.
- WERTYU – Nível 1
- Where’s Waldorf? – Nível 2
- Common Permutation – Nível 1
- Crypt Kicker II – Nível 2
- Automated Judge Script – Nível 1
- File Fragmentation – Nível 2
- Doublets – Nível 3
- Fmt – Nível 2
Posts interessantes:
- Programando melhor: Aula 2 – Estrutura de Dados
- Programando melhor: Aula 1 – Começando
- Cursos grátis na Internet – MIT
- OAH 2008
Nossa primeira batalha está por vir, se preparem, porque a OBI vem aí! Vão treinando com esses exercícios e os da seção pratique da OBI que na prova será moleza! Qualquer dúvida e/ou sugestão postem! Vamos lá! Comentem!
Helton de Melo Duarte
“Sonda-me, ó Deus, e conhece o meu coração; prova-me e conhece os meus pensamentos. E vê se há em mim algum caminho mau e guia-me pelo caminho eterno.” Salmos 139.23,24


março 3rd, 2009 at 17:10
Mto baum! me fez pensar!
março 3rd, 2009 at 19:44
Oiiiiiiiiiiiiiiiiiiiii……….!!!
Parabéns!!!!!!!!!!!
bjos!
março 6th, 2009 at 13:47
Olá!
Me chamo Diego, e curti essa sua idéia sobre estudo dirigido a competição.
Tenho umas dúvidas. Vc pode me ajudar?
É o seguinte, já me cadastrei no UVa Online Judge. Blz.
Resolvi o primeiro problema do seu primeiro post 3n+1 em C++ (Visual C++ 2008).
1o – Eu tenho que proteger o código de toda a entrada invalida com base no problema proposto?
2o – Tipo no problema 3n+1 é informada a entrada 1 10 e saída tem que ser 1 10 20. Isso é direto na chamada do executável ou posso pedir as informações dentro do código. Ex. no Dos: executável 1 10 ou executo o código e dentro entro com a primeira entrada e depois com a segunda.
Valeu
Diego
Floripa-SC
março 7th, 2009 at 17:12
Olá Diego,
É claro que posso lhe ajudar, sempre, na medida do possível, responderei as dúvidas dos leitores.
1- Não. Se ele fala que a entrada vai ser de 0 a 1 milhão, então você NÃO precisa fazer um IF para testar isso, a não ser quando ele fale “A entrada acontecerá até que o valor 0 apareça”, aí será um (while x != 0), // código.
Entendeu?
2- As entradas são lidas dentro do código, com cin << x no caso do seu C++. Blz?
Valeu.
Qualquer outra dúvida podem perguntar!
março 7th, 2009 at 17:42
Olá!
Valeu Pela Ajuda.
Uma outra dúvida ainda sobre a interpretação.
Quando o problema (no caso o primeiro 3m+1), não deixa claro quando entradas vão ocorrer. Tipo ele fala que são dois número tipo 1 10 e a saída 1 10 20. Mas isso é para cada vez que o problema é executado, ou ele deve ficar esperando entradas e gerando saídas indefinidamente?
Estou perguntando por que meu código foi reprovado, por que diz o site que não resolveu o problema.
Tks for all.
Cy. []‘z
março 7th, 2009 at 18:03
Bem cara, não sei muito bem nas outras linguagens, pq tô mais por dentro de C, ultimamente, contudo no 3n+1 eu fiz um while (scanf (“%d %d”, &x, &y) == 2), ou seja, ele irá ler as entradas sempre que existirem e só irá parar quando tentar ler alguma coisa e não tiver nada…
Entendeu?
PS: a função scanf retorna quantos números ela conseguiu ler e esse é o motivo daquele meu teste. =)
março 7th, 2009 at 19:36
[...] Programando melhor: Aula 3 – Strings [...]
março 9th, 2009 at 10:19
Olá
Seguinte já submeti meu código 6 vezes no UVa e todas reprovaram.
A principio ele faz o que promete.
Vc poderia dar uma olhada nele? Como posso mandar?
Valeu.
março 9th, 2009 at 10:47
Olha Diego,
Manda para o meu e-mail, blz? É -> hm underline duarte arroba hotmail ponto com (para que eu não comece a receber milhões de SPAMs).
Aih eu dou uma avaliada. =D
Valeu.
março 9th, 2009 at 16:19
[...] Leia mais >> [...]
março 11th, 2009 at 12:25
[...] Programando melhor: Aula 3 – Strings [...]
março 27th, 2009 at 22:02
[...] Programando melhor: Aula 3 – Strings [...]
abril 9th, 2009 at 14:46
[...] Programando melhor: Aula 3 – Strings [...]
maio 23rd, 2009 at 22:09
[...] « Programando melhor: Aula 3 – Strings Programando melhor: Aula 4 – Ordenação [...]
maio 23rd, 2009 at 22:17
[...] Programando melhor: Aula 3 – Strings [...]