forked from blau_araujo/cblc
Resolução dos exercícios aula 1 e 2
This commit is contained in:
parent
3efbda0330
commit
3188fe3d4a
18 changed files with 338 additions and 0 deletions
BIN
exercicios/01/.01_pesquise_responda.md.swp
Normal file
BIN
exercicios/01/.01_pesquise_responda.md.swp
Normal file
Binary file not shown.
22
exercicios/01/01_pesquise_responda.md
Normal file
22
exercicios/01/01_pesquise_responda.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
## 1. Pesquise e explique
|
||||
|
||||
## As classificações abaixo são utilizadas para descrever as características da linguagem C: pesquise e explique cada uma delas.
|
||||
|
||||
### - Linguagem de alto nível;
|
||||
Uma linguagem de alto nível é caracterizada pela proximidade com a linguagem humana e a distância da linguagem de máquina. Como no C, elas foram criadas para facilitar a vida do programador e usuário do programa. É utilizada uma sintaxe mais próxima do inglês no caso, com palavras reservadas.
|
||||
|
||||
### - Linguagem compilada;
|
||||
|
||||
Uma linguagem compilada passa pelo processo de compilação na qual o código fonte é transformado em código de máquina(binário) antes de sua execução.
|
||||
|
||||
### - Linguagem procedural;
|
||||
|
||||
Uma linguagem procedural é um paradigma de programação que organiza o código em procedimentos ou funções. ELes são blocos de código que realizam tarefas especifícas.
|
||||
|
||||
### - Linguagem imperativa;
|
||||
|
||||
Uma linguagem imperativa também é um paradigma de programação na qual uma sequência de comandas alteram o estado de um programa. As instruções modificam variáveis e estruturas de dados.
|
||||
|
||||
### - Linguagem estruturada.
|
||||
|
||||
Uma linguagem estruturada também é um paradigma de programação que enfatiza a organização lógica do código em blocos hierárquicos e estruturas de controle. Assim, melhora a legibilidade, manutenção e reduz erros.
|
28
exercicios/01/02_analise_programa.md
Normal file
28
exercicios/01/02_analise_programa.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
# 2. Analise o programa
|
||||
|
||||
Dado o programa abaixo (salve.c), explique cada uma perguntas nos comentários.
|
||||
|
||||
~~~C
|
||||
|
||||
|
||||
#include <stdio.h> // O que é isso e para que serve?
|
||||
|
||||
// Por que todo o programma é escrito na função 'main()'?
|
||||
int main(void) {
|
||||
|
||||
puts("Salve, simpatia!"); // O que faz e como se usa a função 'puts()'?
|
||||
|
||||
return 0; // Para que serve esta instrução?
|
||||
}
|
||||
|
||||
~~~
|
||||
|
||||
_#include <stdio.h>_ é o cabeçalho de nosso programa. Aqui estão incluídas bibliotecas padrão da linguagem C que contém funções específicas. No caso, temos a biblioteca padrão.
|
||||
|
||||
_main()_ é a função padrão onde se inicia efetivamente a execuçã ode um programa em C. Tratra-se de uma convenção do compilador e sistema operacional e um padrão da Linguagem C.
|
||||
|
||||
_puts()_ a função imprime uma string e uma quebra de linha na saída padrão do programa, no caso a nosso console/terminal/monitor.
|
||||
Ao contrário de _printf_, ela imprime apenas strings e não aceita outros formatos e especificadores.
|
||||
|
||||
Por padrão, a função _main()_ deve retornar um tipo _int_. Por isso, a função _return 0;_ funciona como um código de status(exit status) para o sistema operacional ou ambiente que o programa foi executado com sucesso. _return 0;_, significa sucesso e qualquer valor diferente de 0 indica um erro.
|
||||
|
9
exercicios/01/03_compile_corrija.c
Normal file
9
exercicios/01/03_compile_corrija.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void) {
|
||||
puts("Salve, simpatia!");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
34
exercicios/01/03_compile_corrija.md
Normal file
34
exercicios/01/03_compile_corrija.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
# 3. Compile, encontre, explique e corrija os bugs
|
||||
|
||||
O uso de números mágicos (valores literais que não dão pistas de seus significados) é desaconselhado porque dificultam a leitura semântica do código. Sendo assim, nós utilizaremos a constante simbólica EXIT_SUCCESS, definida na biblioteca padrão com valor 0, em vez do inteiro literal 0 como argumento da instrução return:
|
||||
|
||||
~~~C
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
puts("Salve, simpatia!");
|
||||
return EXIT_SUCCESS
|
||||
}
|
||||
|
||||
~~~
|
||||
|
||||
Observe o resultado da compilação:
|
||||
~~~bash
|
||||
:~$ gcc salve.c -o salve
|
||||
~~~
|
||||
|
||||
|
||||
## Quantos erros foram encontrados e quais são eles?
|
||||
|
||||
_EXIT_SUCESS_ não foi declarado no retorno da linha 5;
|
||||
É esperado ponto e vírgula após _EXIT_SUCESS_.
|
||||
|
||||
## Quais são as correções sugeridas pelo gcc?
|
||||
|
||||
Ele sugere a inclusão da biblioteca/cabeçalho _<stdlib.h>_;
|
||||
|
||||
## Como ficou o código corrigido?
|
||||
|
||||
Praticamente igual, somente teve a inclusão da biblioteca no começalho;
|
27
exercicios/01/04_compile_responda.md
Normal file
27
exercicios/01/04_compile_responda.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
# compile, pesquise e responda:
|
||||
|
||||
Dado o código:
|
||||
|
||||
~~~C
|
||||
|
||||
|
||||
#define EXIT_SUCCESS 0
|
||||
|
||||
int puts(const char *string);
|
||||
|
||||
int main(void) {
|
||||
puts("Salve, simpatia!");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
~~~
|
||||
## Nenhum erro foi reportado. Por quê?
|
||||
|
||||
Porque o protótipo funciona e o EXIT_SUCCESS foi definido com valor válido do inteiro 0. Apesar da não inclusão da biblioteca padrão _<stdio.h>_ o compilador busca a biblioteca padrão libc e encontra a função _puts)_;
|
||||
|
||||
A prática não é recomendada pois em outros pode gerar resultados inconstantes.
|
||||
|
||||
## Como você executaria o binário resultante?
|
||||
|
||||
Normalmente, Com o comando _./main.c_.
|
||||
|
13
exercicios/01/05_pesquise_responda.md
Normal file
13
exercicios/01/05_pesquise_responda.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
# 5. Pesquise e responda
|
||||
|
||||
Quando não explicitamos a especificação utilizada para compilar o nosso programa (opção -std=PADRÃO do gcc), qual será o padrão utilizado e como podemos confirmar isso pela linha de comandos?
|
||||
|
||||
O comando _gcc version_ dá somente a versão do nosso compilador mas não mostra o padrão utilizado. Encontrei no _man gcc_ como definir a saída , mas não consegui encontrar o padrão utilizado.
|
||||
|
||||
A única maneira que imaginei seria compilar algum programa com algum paramêtro que jogue a saída de pipe grep std para um arquivo ou terminal, , mas não consegui fazer sozinho.
|
||||
|
||||
O DeepSeek deu uma sugestão parecida:
|
||||
|
||||
~~~bash
|
||||
gcc -v -x c /dev/null -o /dev/null 2>&1 | grep "std="
|
||||
~~~
|
BIN
exercicios/01/compile_corrija
Executable file
BIN
exercicios/01/compile_corrija
Executable file
Binary file not shown.
10
exercicios/01/main.c
Normal file
10
exercicios/01/main.c
Normal file
|
@ -0,0 +1,10 @@
|
|||
#define EXIT_SUCCESS 0
|
||||
|
||||
int puts(const char *string);
|
||||
|
||||
int main(void) {
|
||||
puts("Salve, simpatia!");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
BIN
exercicios/02/.04_pesquise_responda.md.swp
Normal file
BIN
exercicios/02/.04_pesquise_responda.md.swp
Normal file
Binary file not shown.
19
exercicios/02/01_pesquise_responda.md
Normal file
19
exercicios/02/01_pesquise_responda.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Pesquise e responmda
|
||||
|
||||
## Quais são as finalidades da função printf?
|
||||
|
||||
Formata e imprime uma saída (para a saída padrão) com o controle da formatação de strings que especificam os elementos a serem convertidos.
|
||||
|
||||
## Em que cabeçalho da glibc ela é declarada?
|
||||
<stdio.h>
|
||||
## Quantos argumentos ela recebe?
|
||||
|
||||
Recebe um mínimo de 1 argumento e pode receber vários argumentos como as variáveis e seus especificadores. Não encontrei um limite.
|
||||
|
||||
## Como fazer para que a saída imprima quebras de linha?
|
||||
\n
|
||||
|
||||
## Para que servem os especificadores de formato %d, %s, %c e %f?
|
||||
|
||||
Para a conversão de valores determinados ao tipo.
|
||||
|
13
exercicios/02/02op_artimeticas.c
Normal file
13
exercicios/02/02op_artimeticas.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
|
||||
int num = 10;
|
||||
printf("%d x 15 = %d\n", num, num * 15);
|
||||
printf("%d + 42 = %d\n", num, num + 42);
|
||||
printf("123 - %d = %d\n",num, 123 - num);
|
||||
printf("%d / 5 = %d\n", num, num / 5);
|
||||
printf("Resto de %d / 5= %d\n", num, num % 5);
|
||||
return 0;
|
||||
|
||||
}
|
16
exercicios/02/04_compile_corrija.c
Normal file
16
exercicios/02/04_compile_corrija.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
#include <stdio.h>
|
||||
|
||||
float circ_perim(int raio) {
|
||||
/* Circunferência = 2πr */
|
||||
return 2 * 3.14 * raio;
|
||||
}
|
||||
int main(void) {
|
||||
int r = 22;
|
||||
char *fmt = "Circunferência de um círculo de raio %d: %.2f\n";
|
||||
printf(fmt, r, circ_perim(r));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
52
exercicios/02/04_compile_corrija.md
Normal file
52
exercicios/02/04_compile_corrija.md
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Compile, corrija e responda
|
||||
|
||||
~~~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;
|
||||
}
|
||||
|
||||
~~~
|
||||
|
||||
## Qual foi o erro encontrado na compilação?
|
||||
|
||||
A variável _r_ não foi declarada antes do uso. A função circ_perim, por ser declarada depois da função _main_ estava sendo reconhecida como valores _int_ e não _float_;
|
||||
|
||||
## Por quê esse erro aconteceu?
|
||||
|
||||
Variável não declarada não é reconhecida. A função criada não é reconhecida também pelo compilador e retorna um _int_;
|
||||
|
||||
## Qual foi a solução adotada?
|
||||
|
||||
Arquivo 04_compile_corrija.c :
|
||||
|
||||
~~~C
|
||||
#include <stdio.h>
|
||||
|
||||
float circ_perim(int raio) {
|
||||
/* Circunferência = 2πr */
|
||||
return 2 * 3.14 * raio;
|
||||
}
|
||||
int main(void) {
|
||||
int r = 22;
|
||||
char *fmt = "Circunferência de um círculo de raio %d: %.2f\n";
|
||||
printf(format: fmt, r, circ_perim(raio: r));
|
||||
return 0;
|
||||
}
|
||||
~~~
|
||||
|
||||
## A sua solução é a única possível? Cite outras possibilidades
|
||||
|
||||
Não. Acredito que existem várias soluções para o problema. Mas a princípio só consigo enxergar que a variável _r_ pode ser definida como uma variável global.
|
||||
|
||||
|
57
exercicios/02/05_pesquise_responda.md
Normal file
57
exercicios/02/05_pesquise_responda.md
Normal file
|
@ -0,0 +1,57 @@
|
|||
## Pausar a execução de um programa por dez segundos
|
||||
|
||||
~~~bash
|
||||
$ man -k "pause"
|
||||
sleep (3) - sleep for a specified number of seconds
|
||||
$ man 3 sleep
|
||||
~~~
|
||||
|
||||
A função _sleep()_, da _<unistd.h>_ permite a pausa da execução de um programa até o número especificado de segundos terminar.
|
||||
|
||||
## Apenas imprimir uma quebra de linha
|
||||
|
||||
~~~bash
|
||||
$ man -k "print"
|
||||
puts (3) - output of characters and strings
|
||||
$ man 3 puts
|
||||
~~~
|
||||
|
||||
A função _puts()_ imprime a string e uma quebra de linha para _stdout_
|
||||
Eu posso utilizar a função sem argumento para imprimir uma quebra de linha.
|
||||
~~~C
|
||||
puts("");
|
||||
~~~
|
||||
|
||||
## Ler um número inteiro interativamente e atribuí-lo a uma variável
|
||||
|
||||
~~~bash
|
||||
$ man -k "input" | grep -i "scan"
|
||||
fscanf (3) - input FILE format conversion
|
||||
scanf (3) - input FILE format conversion
|
||||
sscanf (3) - input string format conversion
|
||||
vfscanf (3) - input FILE format conversion
|
||||
vscanf (3) - input FILE format conversion
|
||||
vsscanf (3) - input string format conversion
|
||||
$ man 3 scanf
|
||||
~~~
|
||||
|
||||
As funções da família _scanf_ podem ler entradas formatadas. A função _scanf()_ lê a a entrada de dados padrão.
|
||||
|
||||
~~~C
|
||||
int a;
|
||||
printf("Insira um número inteiro:\n",)
|
||||
scanf ("%d", &a);
|
||||
~~~
|
||||
|
||||
## Ler um número inteiro decimal e atribuí-lo a uma variável
|
||||
|
||||
Podemos utilizar a função _printf_ para converter os mesmos valores utilizando os especificadores de número octais e hexagonais.
|
||||
|
||||
~~~C
|
||||
int a = 3;
|
||||
printf("decimal %d, base 8 %o, base 16 %x\n",a , a, a);
|
||||
~~~
|
||||
|
||||
## Terminar a execução de um programa com um valor de estado de término
|
||||
|
||||
Podemos utilizar a função exit(), segundo _man 3 exit_, a função causa término do processo e o valor de status -0377 retorna para o parente. Ou seja, podemos utilizar qualquer número inteiro como atributo e o sistema irá utilizar somente enxerga 0-255.
|
14
exercicios/02/3_1_num_magicos.c
Normal file
14
exercicios/02/3_1_num_magicos.c
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#define MULT 10
|
||||
|
||||
int main(void) {
|
||||
int num1 = 13;
|
||||
int num2 = 29;
|
||||
|
||||
printf("%d x %d = %d\n", num1, MULT, num1 * MULT);
|
||||
printf("%d x %d = %d\n", num1 + num2, MULT, (num1 + num2) * MULT);
|
||||
printf("%d x %d = %d\n", num2, MULT, num2 * MULT);
|
||||
}
|
||||
|
||||
|
24
exercicios/02/3_num_magicos.c
Normal file
24
exercicios/02/3_num_magicos.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include <stdio.h>
|
||||
|
||||
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) {
|
||||
int raio;
|
||||
printf("Insira o raio do círculo:");
|
||||
scanf("%d", &raio);
|
||||
|
||||
printf("O círculo do raio é %f\n", circ_perim(raio));
|
||||
printf("A área do círculo é %lf\n", circ_area(raio));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
BIN
exercicios/02/a.out
Executable file
BIN
exercicios/02/a.out
Executable file
Binary file not shown.
Loading…
Add table
Reference in a new issue