#+title: Curso Básico da Linguagem C #+subtitle: Exercícios #+author: Blau Araujo #+startup: show2levels #+options: toc:3 * Exercícios da aula 3: Tipos de dados - [[../aulas/03-tipos-de-dados/README.org][Anotações da aula]] - [[https://youtu.be/iMiRzZCU7hE][Vídeo]] ** 1. Pesquise e demonstre No programa =quadrado-long.c=, da aula 2, encontre uma forma de demonstrar o tipo do valor avaliado pela expressão =base * base= nesta função: #+begin_src c unsigned long quadrado(long base) { return base * base; /* Qual é o tipo desse expressão? */ } #+end_src ** 2. Desafio: conversão de Fahrenheit para Celsius Criar um programa que converta valores inteiros de -100ºF a 100ºF para Celsius e apresente os resultados no terminal. Fórmula da conversão: =C = 5 × (F - 32) / 9= Os valores em Fahrenheit serão expressos pela variável =i=, declarada no loop =for=. Por exemplo: #+begin_src c for (int i = -100; i <= 100; i++) { /* O código que você achar que deve ser executado... */ } #+end_src ** 3. Pesquise e responda O operador =sizeof(TIPO)= expressa o tamanho em bytes de =TIPO= com o tipo =size_t=. - O que é o tipo =size_t=? - Como utilizá-lo no seu programa sem incluir cabeçalhos? - Em quais cabeçalhos ele é definido? - Qual é o especificador de formatos para ele no =printf=? ** 4. Compile, corrija e responda O programa abaixo deveria imprimir =0.25= no terminal... #+begin_src c #include int main(void) { int valor = 1 / 4; printf("%d\n", valor); return 0; } #+end_src Responda: - Depois de compilado e executado, qual foi o valor impresso? - Por que isso aconteceu? - Como solucionar? ** 5. Analise, pesquise e comente o código Programa =dump.c=: #+begin_src c #include void print_bytes(char *label, void *addr, size_t size); int main(void) { int num = 100000; int sqr_int = num * num; unsigned long sqr_long = (unsigned long)num * num; print_bytes("num ", &num, sizeof(num)); printf("-> %d\n", num); print_bytes("sqr_int ", &sqr_int, sizeof(sqr_int)); printf("-> %d\n", sqr_int); print_bytes("sqr_long", &sqr_long, sizeof(sqr_long)); printf("-> %lu\n", sqr_long); return 0; } void print_bytes(char *label, void *addr, size_t size) { unsigned char *bytes = (unsigned char *)addr; printf("%p - %s - ", bytes, label); for (size_t i = 0; i < 8; i++) printf("%02x ", i > (size - 1) ? 0 : bytes[i]); } #+end_src