Resolução dos exercícios aula 1 e 2

This commit is contained in:
Victor Marinho 2025-06-01 20:28:08 -03:00
parent 3efbda0330
commit 3188fe3d4a
18 changed files with 338 additions and 0 deletions

Binary file not shown.

View 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.

View 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.

View file

@ -0,0 +1,9 @@
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("Salve, simpatia!");
return EXIT_SUCCESS;
}

View 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;

View 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_.

View 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

Binary file not shown.

10
exercicios/01/main.c Normal file
View file

@ -0,0 +1,10 @@
#define EXIT_SUCCESS 0
int puts(const char *string);
int main(void) {
puts("Salve, simpatia!");
return EXIT_SUCCESS;
}

Binary file not shown.

View 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.

View 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;
}

View 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;
}

View 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.

View 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.

View 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);
}

View 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

Binary file not shown.