#+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