Resolução exercícios Aula_#3 #18

Open
opened 2025-06-02 07:29:34 -03:00 by drginfo · 0 comments
  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:

unsigned long quadrado(long base) {
    return base * base; /* Qual é o tipo desse expressão? */
}

Resposta com o código completo:

#include <stdio.h>

unsigned long int quadrado(long int base) {
        return base * base;
        }

int main(void) {
        long int num;
        puts("Digite um número interio qualquer:");
        scanf("%ld", &num);
        printf("O quadrado de %ld ^ 2 = %lu\n", num, quadrado(num));
        printf("O tipo do valor avaliado de 'num' é: %zu bytes\n", sizeof(num));
        printf("O tipo do valor avaliado para a expressão quadrado é: %zu bytes\n", sizeof(quadrado(num)));
        printf("O tipo do valor avaliado pela expressão quadrado é: %zu bytes\n", sizeof(num * num));
        return 0;
}
  1. 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.

Resposta no código abaixo:

#include <stdio.h>

int main(void) {
        // C = 5 x (F - 32) / 9
        //puts("Fahrenheit (ºF) <==> Celsius (ºC)");
        for (float i = -100; i <= 100; i++) {
                printf("%0.2f ºF <==> %0.2f ºC\n", i, ((i * 9) / 5) + 32);
        }
        return 0;
}
  1. 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?
    R: é um tipo de dados inteiro sem sinal, que é definido para
       representar o tamanho de objetos em bytes
Como utilizá-lo no seu programa sem incluir cabeçalhos?
    R:
#include <stdio.h>
#include <string.h>

typedef unsigned long size_t;

int main (void) {

        char frase[] = "Salve, Simpatia!";
        printf("%s\n", frase);
        size_t qtd_caracteres = strlen(frase);
        size_t tamanho_int = sizeof(int);       // 4 bytes (int)
        size_t tamanho_long = sizeof(long);     // 8 bytes (long)
        printf("Quantidade de caracteres na string é: %d\n", qtd_caracteres);
        printf("O tamanho (int) é: %zu bytes\n", tamanho_int);
        printf("O tamanho (long) é: %zu bytes\n", tamanho_long);

        return 0;
}

Em quais cabeçalhos ele é definido?
    R: <stddef.h>, <stdio.h>
Qual é o especificador de formatos para ele no printf?
    R: %zu (sem sinal), %zd(com sinal)
  1. Compile, corrija e responda

O programa abaixo deveria imprimir 0.25 no terminal…

#include <stdio.h>

int main(void) {
    int valor = 1 / 4;

    printf("%d\n", valor);
        
    return 0;
}

Responda:

Depois de compilado e executado, qual foi o valor impresso?
    R: 0
Por que isso aconteceu?
    R: Porque os tipos referenciados para operação de numeros com casas decimais, foram declarados com INT e não FLOAT, e pelo menos um dos valores associados, deve está em formato decimal.

Como solucionar?
    R:
#include <stdio.h>

int main(void) {
    float valor = 1.0 / 4;      // pelo menos um dos numeros com casa decimal

    printf("%0.2f\n", valor);   // %0.2f especificador de formato (%f) com (0.2)  duas
                                // casas decimais, numeros de ponto flutuante.

    return 0;
}
  1. Analise, pesquise e comente o código

Programa dump.c:

#include <stdio.h>
// declara a função print_bytes, que está definida no final do código
void print_bytes(char *label, void *addr, size_t size);

// início
int main(void) {

// declaração das variáveis, com seus respectivos tipos e valores:
// num: tipo inteiro
// sqr_int: tipo inteiro
// srq_long: tipo inteiro longo sem sinal
    int num = 100000;

    int sqr_int = num * num;

// aqui faz uma tribuição, fazendo um typecast de unsigned long de um tipo int
// no trecho de código: (unsigned long)num
    unsigned long sqr_long = (unsigned long)num * num;

// chama a função print_bytes, declarando e definindo seus valores:
// 'num' = label, &num = endereço associado a num e sizeof(num) = seu tamnaho em bytes
// sem quebra de linha.
    print_bytes("num     ", &num, sizeof(num));
    printf("-> %d\n", num);     // e aqui o valor de num, com um quebra de linha

// chama a função print_bytes, declarando e definindo seus valores:
// 'sqr_int' = label, &sqr_int = endereço associado a sqr_int,
// sizeof(sqr_int) = seu tamnaho em bytes, e sem quebra de linha.
    print_bytes("sqr_int ", &sqr_int, sizeof(sqr_int));
    printf("-> %d\n", sqr_int); // e aqui o valor de sqr_int, com um quebra de linha


// chama a função print_bytes, declarando e definindo seus valores:
// 'sqr_long' = label, &sqr_long = endereço associado a sqr_long,
// sizeof(sqr_long) = seu tamnaho em bytes, e sem quebra de linha.
    print_bytes("sqr_long", &sqr_long, sizeof(sqr_long));
        printf("-> %lu\n", sqr_long); // valor de sqr_long, com o especificador de formato '%lu'
        
    return 0;
}

// Função que recebe como parâmetros:
// um rótulo do tipo char 1byte: 'char *label'
// um ponteiro do tipo void=indeterminado: 'void *addr'
// e um tamanho do tipo size_t=unsigned log: 'size_t size'

void print_bytes(char *label, void *addr, size_t size) {

// em seguida declara um ponteiro '*bytes', definindo seu tipo
// (unsigned char *)addr <- declarado em print_bytes
    unsigned char *bytes  = (unsigned char *)addr;

// em seguida imprime através da função printf
// o endereço de 'bytes' com o especificador de formato '%p',
// seguido do rótulo label, que por enquanto não está definido aqui
// com o especificador de formato '%s', e sem quebrar a linha.
    printf("%p - %s - ", bytes, label);

// em seguida faz uma iteração com o loop for, comparando o tamanho
// definido em size (que aqui é 4 bytes = 8 bits), em seguida imprime
// em formato hexadecimal '%02x' o valor que está atribuído ao byte
// na posição i, que vai variar de 0 a 7 (8 bits) bytes[i], que se, a
// expressão ternária 'i > (size -1) ? 0 : bytes[i]', resultar 'verdadeiro'
// será impresso em %02x' o valor de bytes[i], caso resulte em 'falso', receberá o valor '0'
    for (size_t i = 0; i < 8; i++)
        printf("%02x ", i > (size - 1) ? 0 : bytes[i]);
}

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: ``` unsigned long quadrado(long base) { return base * base; /* Qual é o tipo desse expressão? */ } ``` Resposta com o código completo: ``` #include <stdio.h> unsigned long int quadrado(long int base) { return base * base; } int main(void) { long int num; puts("Digite um número interio qualquer:"); scanf("%ld", &num); printf("O quadrado de %ld ^ 2 = %lu\n", num, quadrado(num)); printf("O tipo do valor avaliado de 'num' é: %zu bytes\n", sizeof(num)); printf("O tipo do valor avaliado para a expressão quadrado é: %zu bytes\n", sizeof(quadrado(num))); printf("O tipo do valor avaliado pela expressão quadrado é: %zu bytes\n", sizeof(num * num)); return 0; } ``` 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. Resposta no código abaixo: ``` #include <stdio.h> int main(void) { // C = 5 x (F - 32) / 9 //puts("Fahrenheit (ºF) <==> Celsius (ºC)"); for (float i = -100; i <= 100; i++) { printf("%0.2f ºF <==> %0.2f ºC\n", i, ((i * 9) / 5) + 32); } return 0; } ``` 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? R: é um tipo de dados inteiro sem sinal, que é definido para representar o tamanho de objetos em bytes Como utilizá-lo no seu programa sem incluir cabeçalhos? R: ``` #include <stdio.h> #include <string.h> typedef unsigned long size_t; int main (void) { char frase[] = "Salve, Simpatia!"; printf("%s\n", frase); size_t qtd_caracteres = strlen(frase); size_t tamanho_int = sizeof(int); // 4 bytes (int) size_t tamanho_long = sizeof(long); // 8 bytes (long) printf("Quantidade de caracteres na string é: %d\n", qtd_caracteres); printf("O tamanho (int) é: %zu bytes\n", tamanho_int); printf("O tamanho (long) é: %zu bytes\n", tamanho_long); return 0; } ``` Em quais cabeçalhos ele é definido? R: <stddef.h>, <stdio.h> Qual é o especificador de formatos para ele no printf? R: %zu (sem sinal), %zd(com sinal) 4. Compile, corrija e responda O programa abaixo deveria imprimir 0.25 no terminal… ``` #include <stdio.h> int main(void) { int valor = 1 / 4; printf("%d\n", valor); return 0; } ``` Responda: Depois de compilado e executado, qual foi o valor impresso? R: 0 Por que isso aconteceu? R: Porque os tipos referenciados para operação de numeros com casas decimais, foram declarados com INT e não FLOAT, e pelo menos um dos valores associados, deve está em formato decimal. Como solucionar? R: ``` #include <stdio.h> int main(void) { float valor = 1.0 / 4; // pelo menos um dos numeros com casa decimal printf("%0.2f\n", valor); // %0.2f especificador de formato (%f) com (0.2) duas // casas decimais, numeros de ponto flutuante. return 0; } ``` 5. Analise, pesquise e comente o código Programa dump.c: ``` #include <stdio.h> // declara a função print_bytes, que está definida no final do código void print_bytes(char *label, void *addr, size_t size); // início int main(void) { // declaração das variáveis, com seus respectivos tipos e valores: // num: tipo inteiro // sqr_int: tipo inteiro // srq_long: tipo inteiro longo sem sinal int num = 100000; int sqr_int = num * num; // aqui faz uma tribuição, fazendo um typecast de unsigned long de um tipo int // no trecho de código: (unsigned long)num unsigned long sqr_long = (unsigned long)num * num; // chama a função print_bytes, declarando e definindo seus valores: // 'num' = label, &num = endereço associado a num e sizeof(num) = seu tamnaho em bytes // sem quebra de linha. print_bytes("num ", &num, sizeof(num)); printf("-> %d\n", num); // e aqui o valor de num, com um quebra de linha // chama a função print_bytes, declarando e definindo seus valores: // 'sqr_int' = label, &sqr_int = endereço associado a sqr_int, // sizeof(sqr_int) = seu tamnaho em bytes, e sem quebra de linha. print_bytes("sqr_int ", &sqr_int, sizeof(sqr_int)); printf("-> %d\n", sqr_int); // e aqui o valor de sqr_int, com um quebra de linha // chama a função print_bytes, declarando e definindo seus valores: // 'sqr_long' = label, &sqr_long = endereço associado a sqr_long, // sizeof(sqr_long) = seu tamnaho em bytes, e sem quebra de linha. print_bytes("sqr_long", &sqr_long, sizeof(sqr_long)); printf("-> %lu\n", sqr_long); // valor de sqr_long, com o especificador de formato '%lu' return 0; } // Função que recebe como parâmetros: // um rótulo do tipo char 1byte: 'char *label' // um ponteiro do tipo void=indeterminado: 'void *addr' // e um tamanho do tipo size_t=unsigned log: 'size_t size' void print_bytes(char *label, void *addr, size_t size) { // em seguida declara um ponteiro '*bytes', definindo seu tipo // (unsigned char *)addr <- declarado em print_bytes unsigned char *bytes = (unsigned char *)addr; // em seguida imprime através da função printf // o endereço de 'bytes' com o especificador de formato '%p', // seguido do rótulo label, que por enquanto não está definido aqui // com o especificador de formato '%s', e sem quebrar a linha. printf("%p - %s - ", bytes, label); // em seguida faz uma iteração com o loop for, comparando o tamanho // definido em size (que aqui é 4 bytes = 8 bits), em seguida imprime // em formato hexadecimal '%02x' o valor que está atribuído ao byte // na posição i, que vai variar de 0 a 7 (8 bits) bytes[i], que se, a // expressão ternária 'i > (size -1) ? 0 : bytes[i]', resultar 'verdadeiro' // será impresso em %02x' o valor de bytes[i], caso resulte em 'falso', receberá o valor '0' for (size_t i = 0; i < 8; i++) printf("%02x ", i > (size - 1) ? 0 : bytes[i]); } ```
drginfo changed title from Resolução exercícios Aula #3 to Resolução exercícios Aula_#3 2025-06-02 08:36:56 -03:00
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#18
No description provided.