#+title: Curso Básico da Linguagem C
#+subtitle: Exercícios
#+author: Blau Araujo
#+startup: show2levels
#+options: toc:3

* Exercícios da aula 2: Dados e instruções

- [[../aulas/02-dados-e-instrucoes/README.org][Anotações da aula]]
- [[https://youtu.be/2KsvRJjshQ0][Vídeo]]


** 1. Pesquise e responda

- Quais são as finalidades da função =printf=?
- Em que cabeçalho da =glibc= ela é declarada?
- Quantos argumentos ela recebe?
- Como fazer para que a saída imprima quebras de linha?
- Para que servem os especificadores de formato =%d=, =%s=, =%c= e =%f=?

** 2. Operações aritméticas

Escreva um programa que, dado um valor inteiro associado à variável =num=,
calcule e imprima os resultados das seguintes operações:

- =num= multiplicado por 15;
- =num= somado a =42=;
- =123= menos =num=;
- Divisão de =num= por =5=;
- Resto da divisão de =num= por =5=.

Esquema geral da saída do programa:

#+begin_example
NUM x 15 = VALOR
NUM + 42 = VALOR
123 - NUM = VALOR
NUM / 5 = VALOR
RESTO DE NUM / 5 = VALOR
#+end_example

** 3. Números mágicos

O uso de valores literais sem um significado óbvio (/números mágicos/) é uma
prática indesejável, mas pode ser evitada de várias formas. Sendo assim,
analise as situações abaixo e proponha uma solução.

*Caso 1:* Propriedades de círculos

Meu programa tem funções para calcular a área e o perímetro de um círculo
cujo raio (um inteiro) é recebido como argumento: 

#+begin_src c
#include ...

float circ_perim(int raio) {
    /* Circunferência = 2πr */
    return 2 * 3.14 * raio;
}

double circ_area(int raio) {
    /* Área = πr² */
    return 3.14 * raio * raio;
}

int main(void) { ... }
#+end_src

*Caso 2:* Multiplicador constante

No meu programa, todas as operações aritméticas envolvem a multiplicação
de um valor por =10=.

#+begin_src c
#include <stdio.h>

int main(void) {
    int num1 = 13;
    int num2 = 29;

    printf("%d x %d = %d\n", num1, 10, num1 * 10);
    printf("%d x %d = %d\n", num1 + num2, 10, (num1 + num2) * 10);
    printf("%d x %d = %d\n", num2, 10, num2 * 10);
}
#+end_src

** 4. Compile, corrija e responda

Dado o programa abaixo (por exemplo, =main.c=)...

#+begin_src c
#include <stdio.h>

int main(void) {
    char *fmt = "Circunferência de um círculo de raio %d: %.2f\n";
    printf(fmt, r, circ_perim(r));
    return 0;
}

float circ_perim(int raio) {
    /* Circunferência = 2πr */
    return 2 * 3.14 * raio;
}
#+end_src

- Qual foi o erro encontrado na compilação?
- Por que esse erro aconteceu?
- Qual foi a solução adotada?
- A sua solução é a única possível?
- Se não for, cite outras possibilidades.

** 5. Pesquise e responda

Pesquise, entre as funções da =glibc=, aquelas que podem solucionar os problemas
abaixo e demonstre como elas podem ser utilizadas.

- Pausar a execução do programa por 10 segundos.
- Apenas imprimir uma quebra de linha.
- Ler um número inteiro interativamente e atribuí-lo a uma variável.
- Imprimir um número inteiro decimal em base 8 e base 16.
- Terminar a execução do programa com um valor de estado de término.




