2025-04-01 09:02:34 -03:00
|
|
|
#+title: Curso Básico da Linguagem C
|
|
|
|
#+subtitle: Exercícios
|
|
|
|
#+author: Blau Araujo
|
|
|
|
#+startup: show2levels
|
|
|
|
#+options: toc:3
|
|
|
|
|
2025-04-01 09:46:17 -03:00
|
|
|
* Exercícios da aula 7: Vetores, ponteiros e strings
|
2025-04-01 09:02:34 -03:00
|
|
|
|
|
|
|
- [[../../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 <stdio.h>
|
|
|
|
|
|
|
|
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 <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <wchar.h>
|
|
|
|
#include <locale.h>
|
|
|
|
|
|
|
|
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
|
|
|
|
|