Daniel: Resolução exercícios Aula 2 #12

Open
opened 2025-05-25 10:29:31 -03:00 by drginfo · 0 comments
  1. Pesquise e responda

    Quais são as finalidades da função printf?
    R: A função printf tem a finalidade de formatar a saída de stream

    Em que cabeçalho da glibc ela é declarada?
    R: stdio.h

===========================================================
Quantos argumentos ela recebe?
R: A função printf não possui números fixos de argumentos, mas sim variáveis
sendo o primeiro argumento, uma string de formato, e o restante são os dados
a serem formatados e impressos.

===========================================================
Como fazer para que a saída imprima quebras de linha?
R: deve se usar o especificador de formato '\n'

===========================================================
Para que servem os especificadores de formato %d, %s, %c e %f?
R: %d = Especificador de formato para impressão de caracteres em notação decimal
%s = Especificador de formato para impressão de cadeias de caracteres texto
%c = Especificador de formato para impressão de cadeias de caracteres específico
%f = Especificador de formato para impressão de cadeias de caracteres de números
de ponto flutuante, casas decimais

===========================================================

  1. 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:

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

===========================================================

#include <stdio.h>

int main(void) {

        int num = 10;
        puts("Resultados de (multiplicação, soma, subtração, divisão e resto da divisão:");

        printf("NUM = %d\n", num);
        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("%d % 5 = %d\n", num, num % 5);

        return 0;
}
  1. 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:

===========================================================

#include ...

// pode ser resolvida incluindo uma constante simbólica '#define CONST valor' como a descrita abaixo

#define PI  3.14

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

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

int main(void) { ... }

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

#include <stdio.h>
#define NUM 10

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);
    printf("%d x %d = %d\n", num1, NUM, num1 * NUM);
    printf("%d x %d = %d\n", num1 + num2, NUM, (num1 + num2) * NUM);
    printf("%d x %d = %d\n", num2, NUM, num2 * NUM);
}
  1. Compile, corrija e responda

===========================================================
Dado o programa abaixo (por exemplo, main.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?
R: uso de uma variável 'r' não declarada, a função 'circ_perim'
foi declarada depois da função main principal

===========================================================
Por que esse erro aconteceu?
R: Porque faltou declarar a variável 'r'
e declarar a função 'cir_perim', antes da função 'main'

===========================================================

Qual foi a solução adotada?
R:
float circ_perim(int raio) {
    // Circunferência = 2πr
    return 2 * 3.14 * raio;
}

int r = 2;

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

===========================================================

A sua solução é a única possível?
R: Não

Se não for, cite outras possibilidades.
R: A variável 'r' poderia ter sido declarada dentro da função main
   A variável PI, poderia ter sido declarada como uma constante simbólica

===========================================================

  1. 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.
R: sleep(10)
   Lembrando de declarar a diretiva de pré-processamento #include <unistd.h>,
   que contem a função 'sleep'

===========================================================

Apenas imprimir uma quebra de linha.
R: putchar('\n');

===========================================================

Ler um número inteiro interativamente e atribuí-lo a uma variável.
R:
#include <stdio.h>

int main(void){

        int num;

        printf("O valor inicial da variável num é: %d,\n\
Provavelmente un numero qualquer armazenado no endereço\n\
de memória: %p.\n", num, &num);
        puts("=====================================");
        puts("Digite um número inteiro: ");
        scanf("%d", &num);
        printf("O número digitado foi: %d\n", num);
        puts("=====================================");
        printf("Agora o valor da variável num é: %d\n\
e o endereço de &num é: %p\n", num, &num);

        return 0;
}

===========================================================

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.

converte10base2-8-16.c

#include <stdio.h>


int main(void){

        int num;

        puts("Digite um numero inteiro qualquer: ");
        scanf("%d", &num);
        
        // converte o numero digitado em base 8 e base 16
        
        printf("O número %d em:\n\
        base(2) binário é: %b\n\
        base(8) octal é: %o\n\
        base (16) hexadecimal é: %#x\n\
        base (16) hexadecimal em caixa alta: %X\n", num, num, num, num, num);

// ou com vários 'printf'

        //printf("O número: %d em base(8) octal é: %o\n", num, num);
        //printf("O número: %d em base(16) hexadecimal é: %#x\n",num , num);
        //printf("O número: %d em base(16) hexadecimal em letras MAIUSCULAS é: %X\n",num , num);

        return 10;
}
1. Pesquise e responda Quais são as finalidades da função printf? R: A função printf tem a finalidade de formatar a saída de stream Em que cabeçalho da glibc ela é declarada? R: stdio.h =========================================================== Quantos argumentos ela recebe? R: A função printf não possui números fixos de argumentos, mas sim variáveis sendo o primeiro argumento, uma string de formato, e o restante são os dados a serem formatados e impressos. =========================================================== Como fazer para que a saída imprima quebras de linha? R: deve se usar o especificador de formato '\n' =========================================================== Para que servem os especificadores de formato %d, %s, %c e %f? R: %d = Especificador de formato para impressão de caracteres em notação decimal %s = Especificador de formato para impressão de cadeias de caracteres texto %c = Especificador de formato para impressão de cadeias de caracteres específico %f = Especificador de formato para impressão de cadeias de caracteres de números de ponto flutuante, casas decimais =========================================================== 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: NUM x 15 = VALOR NUM + 42 = VALOR 123 - NUM = VALOR NUM / 5 = VALOR RESTO DE NUM / 5 = VALOR =========================================================== ``` #include <stdio.h> int main(void) { int num = 10; puts("Resultados de (multiplicação, soma, subtração, divisão e resto da divisão:"); printf("NUM = %d\n", num); 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("%d % 5 = %d\n", num, num % 5); return 0; } ``` 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: =========================================================== ``` #include ... // pode ser resolvida incluindo uma constante simbólica '#define CONST valor' como a descrita abaixo #define PI 3.14 float circ_perim(int raio) { /* Circunferência = 2πr */ return 2 * 3.14 * raio; // substitui 3.14 por PI: return 2 * PI * raio; } double circ_area(int raio) { /* Área = πr² */ return 3.14 * raio * raio; // substitui 3.14 por PI: return PI * raio * raio; } int main(void) { ... } ``` =========================================================== Caso 2: Multiplicador constante No meu programa, todas as operações aritméticas envolvem a multiplicação de um valor por 10. ``` #include <stdio.h> #define NUM 10 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); printf("%d x %d = %d\n", num1, NUM, num1 * NUM); printf("%d x %d = %d\n", num1 + num2, NUM, (num1 + num2) * NUM); printf("%d x %d = %d\n", num2, NUM, num2 * NUM); } ``` 4. Compile, corrija e responda =========================================================== Dado o programa abaixo (por exemplo, main.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? R: uso de uma variável 'r' não declarada, a função 'circ_perim' foi declarada depois da função main principal =========================================================== Por que esse erro aconteceu? R: Porque faltou declarar a variável 'r' e declarar a função 'cir_perim', antes da função 'main' =========================================================== Qual foi a solução adotada? R: ``` float circ_perim(int raio) { // Circunferência = 2πr return 2 * 3.14 * raio; } int r = 2; int main(void) { char *fmt = "Circunferência de um círculo de raio %d: %.2f\n"; printf(fmt, r, circ_perim(r)); return 0; } ``` =========================================================== A sua solução é a única possível? R: Não Se não for, cite outras possibilidades. R: A variável 'r' poderia ter sido declarada dentro da função main A variável PI, poderia ter sido declarada como uma constante simbólica =========================================================== 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. R: sleep(10) Lembrando de declarar a diretiva de pré-processamento #include <unistd.h>, que contem a função 'sleep' =========================================================== Apenas imprimir uma quebra de linha. R: putchar('\n'); =========================================================== Ler um número inteiro interativamente e atribuí-lo a uma variável. R: ``` #include <stdio.h> int main(void){ int num; printf("O valor inicial da variável num é: %d,\n\ Provavelmente un numero qualquer armazenado no endereço\n\ de memória: %p.\n", num, &num); puts("====================================="); puts("Digite um número inteiro: "); scanf("%d", &num); printf("O número digitado foi: %d\n", num); puts("====================================="); printf("Agora o valor da variável num é: %d\n\ e o endereço de &num é: %p\n", num, &num); return 0; } ``` =========================================================== 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. converte10base2-8-16.c ``` #include <stdio.h> int main(void){ int num; puts("Digite um numero inteiro qualquer: "); scanf("%d", &num); // converte o numero digitado em base 8 e base 16 printf("O número %d em:\n\ base(2) binário é: %b\n\ base(8) octal é: %o\n\ base (16) hexadecimal é: %#x\n\ base (16) hexadecimal em caixa alta: %X\n", num, num, num, num, num); // ou com vários 'printf' //printf("O número: %d em base(8) octal é: %o\n", num, num); //printf("O número: %d em base(16) hexadecimal é: %#x\n",num , num); //printf("O número: %d em base(16) hexadecimal em letras MAIUSCULAS é: %X\n",num , num); return 10; } ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/cblc#12
No description provided.