diff --git a/exercicios/07/README.org b/exercicios/07/README.org new file mode 100644 index 0000000..2b4a3e0 --- /dev/null +++ b/exercicios/07/README.org @@ -0,0 +1,138 @@ +#+title: Curso Básico da Linguagem C +#+subtitle: Exercícios +#+author: Blau Araujo +#+startup: show2levels +#+options: toc:3 + +* Exercícios da aula 6: Vetores, ponteiros e strings + +- [[../../aulas/07-vps/README.org][Anotações da aula]] +- [[https://youtu.be/hhySl3ClTLE][Vídeo]] + +** 1. Desafio: Função =str_blen= + +Crie uma função que retorne um inteiro correspondente ao comprimento em bytes de +uma string sem incluir o terminador nulo. + +*Exemplo de teste...* + +#+begin_src c +#include + +int main(void) { + + char *str = "Olá, mundo!"; + + /* \042 é o caractere " em octal na tabela ASCII. */ + printf("A string \042%s\042 tem %d bytes.\n", str, str_blen(????????)); + + return 0; +} +#+end_src + +** 2. Pesquise e analise o código + +No último exercício, você obteve um número de bytes maior do que a quantidade +de caracteres do texto em =*str=. Isso acontece porque caracteres acentuados +são compostos por mais de um byte (caracteres /multibyte/). + +O código abaixo implementa a função =str_mblen=, para retornar o número de +caracteres contando caracteres multibyte como um único caractere: + +#+begin_src c +#include +#include +#include +#include + +int str_mblen(const char *str) { + setlocale(LC_ALL, ""); + int count = 0; + int len; + + while (*str) { + len = mblen(str, MB_CUR_MAX); + if (len < 1) break; + str += len; + count++; + } + + return count; +} + +int main() { + const char *txt = "Olá, mundo!"; + + printf("Número de caracteres: %d\n", str_mblen(txt)); + + return 0; +} +#+end_src + +Seu objetivo é explicar: + +- Como a função =str_mblen= funciona? +- Como a função =mblen= é utilizada? +- O que é a macro =MB_CUR_MAX=? +- Por que foi necessário definir =setlocale=? +- O que está sendo testado no /loop/ =while (*str)=? + +** 3. Desafio: Palavras invertidas + +Escreva uma função que inverta a ordem dos caracteres de cada palavra em +uma string, mas preservando a ordem das palavras. + +*Exemplo:* + +#+begin_example +Original --> Maria das Couves +Inversão --> airaM sad sevuoC +#+end_example + +** 4. Desafio: Função =array_isort= + +Escreva a função =array_sort= para organizar, em ordem crescente, os valores em um +dado vetor de inteiros. + +*Vetor para testes...* + +#+begin_src c +int num[] = {3, 7, 5, 9, 3, 2, 0, 4, 1, 6, 8}; +#+end_src + +** 5. Desafio: codificador e decodificador ROT13 + +O método de codificação ROT13 desloca em 13 caracteres à frente no alfabeto cada +um dos caracteres de um texto. + +*Exemplos...* + +#+begin_example +a => n +b => o +c => p +e => r +t => g (depois de 'z', continua em 'a') +#+end_example + +Seu objetivo é criar as funções =rot13_encode= e =rot13_decode= para, respectivamente, +codificar e decodificar uma string no método ROT13. + +*Requisitos...* + +- Não alterar caracteres multibyte. +- As funções devem apenas imprimir os resultados. + +*Referência...* + +As suas funções devem se comportar como os comandos abaixo: + +#+begin_example +:~$ echo abacate | tr 'A-Za-z' 'N-ZA-Mn-za-m' +nonpngr +:~$ echo avião | tr 'A-Za-z' 'N-ZA-Mn-za-m' +nivãb +:~$ echo cvgnatn | tr 'A-Za-z' 'N-ZA-Mn-za-m' +pitanga +#+end_example +