Redefinição e Conversão de Tipos

Ver Todos os Exercícios

Teoria

Introdução

Eae, tudo beleza? Hoje nós vamos aprender a como redefinir um tipo de variável, de forma a facilitar o nosso trabalho com elas, e a como converter tipos usando uma função própria do C++.

Redefinindo uma variável

Imagine a seguinte situação: você é contratado por uma empresa para desenvolver um software que possa atualizar automaticamente os dados de todos os funcionários dessa empresa. Para isso, você dividiu o seu programa em várias pequenas partes e, numa delas, você irá trabalhar apenas com o ID de cada funcionário. Para isso, você iria ficar definindo variáveis do tipo int para armazenar e ajustar os ID’s:

Com o intuito de tornar a leitura desse código algo mais intuitivo, você resolve redefinir as variáveis do tipo i n t como um I D . Dessa forma, teríamos algo assim:

Com o uso do comando typedef podemos nos referir ao tipo inteiro ( i n t ) por meio do termo escolhido (como um apelido) que, nesse caso, foi i d .

Ou seja, ao escrever i d no código daqui pra frente, o computador sabe que você tá falando de uma variável inteira e te poupa o esforço de sempre indicar isso!

Esse processo de redefinição de tipo pode ser aplicado para qualquer tipo de variável, não apenas o tipo inteiro, e a forma de ser feito segue o seguinte padrão:

t y p e d e f             T i p o D e V a r i a v e l             N o v a R e f e r e n c i a ;

Além disso, ainda é possível usar a referência original dos tipos e manter o criado apenas quando for preciso. Como aqui, onde temos um i n t que não é i d :

Conversão de tipos

Uma conversão de tipo ocorre quando precisamos trabalhar com um tipo diferente daquele que uma expressão é definida inicialmente.

Um exemplo disso seria uma variável que é declarada como um float e, devido a alguma operação, precisamos trabalhar com ela como um tipo inteiro.

Para isso usamos a função static_cast. A forma de usá-la é:

s t a t i c _ c a s t   <   n o v o   t i p o >   (   e x p r e s s ã o   ) ;

Vamos ver um exemplo:

Nesse caso, usamos a função   s t a t i c _ c a s t para converter um valor real num inteiro. Como um inteiro não possui parte decimal, haverá o arrendondamento do número. Com isso, ficamos com a saída:

Algo que precisamos ficar atentos quanto ao uso da função s t a t i c _ c a s t é a quantidade que cada variável pode armazenar. O que aconteceria caso tivéssemos uma variável do tipo d o u b l e com um valor que excedesse o máximo de uma variável i n t e ainda assim quiséssemos fazer a conversão para o tipo inteiro?

Nesse código, nós armazenamos o valor 4 bilhões numa variável do tipo double, o que é válido, pois ela admite esse valor. Em seguida, nós fizemos um c a s t para i n t e armazenamos esse valor numa variável do tipo inteiro, que não suporta esse valor.

Nesse caso, o programa dá erro? Vamos verificar a saída desse programa:

Ele não deu erro. Isso ocorre porque a função static_cast, de forma a não causar um erro quando o programa é iniciado, reinicia a contagem e retorna o menor valor que a variável pode assumir.

Como uma variável do tipo i n t admite como valor mínimo - 2,147,483,648 , o static_cast nos retorna esse valor.

Logo, não é recomendado usar o cast para valores muito grandes que podem exceder o limite aceitável para a variável que será usada.

Com os conhecimentos adquiridos sobre a redefinição e a conversão de tipos, vamos fazer alguns exercícios de fixação!

Conversão de tipos

Exercícios Resolvidos

Exercício Resolvido #1

Explique o que é a conversão de tipo e como usar a função static_cast do C++.

Passo 1

Uma conversão de tipo é quando se faz uma determinada expressão retornar um tipo de variável escolhida.

Mas o que isso significa?

Bem, suponha que você possua uma variável chamada numero do tipo int. Esse dado irá somente representar valores inteiros, mas e se precisarmos que o valor que está armazenado nessa variável fosse um número real? Nesse caso, podemos utilizar uma conversão de tipo para que o valor armazenado em numero retorne um dado do tipo float, por exemplo.

No C++, esse processo é realizado por meio da função static_cast, que possui como sintaxe:

s t a t i c _ c a s t   <   n o v o   t i p o >   (   e s p r e s s ã o   ) ;

Resposta

É forçar uma expressão a retornar determinado tipo de dado.

s t a t i c _ c a s t   <   n o v o   t i p o >   (   e s p r e s s ã o   ) ;

Exercício Resolvido #2

Explique como ocorre uma redefinição de tipo no C++.

Passo 1

No C++, uma redefinição de tipo é quando nós definimos um nome (apelido) a se usar para referenciar um determinado tipo de variável. Em outras palavras, criamos uma nova referência. Fazemos a redefinição de tipo utilizando o comando typedef e a sua sintaxe é:

t y p e d e f             T i p o D e V a r i a v e l             N o v o R e f e r e n c i a ;

Como exemplo, caso quiséssemos mudar do tipo de variável i n t para   i n t e i r o , escreveríamos:

t y p e d e f             i n t           i n t e i r o ;

Após esse comando, poderíamos declarar variáveis do tipo i n t como

i n t e i r o         a ;

Nesse caso, declaramos uma variável de nome a e de tipo i n t .

Resposta

Por meio do comando t y p e d e f , onde fornecemos o tipo de variável a ser redefinida e o seu apelido.

Exercício Resolvido #3

Um programador fez um código em C++ no qual há um cast de uma variável do tipo double para uma variável a do tipo int. Durante a execução do seu código, houve um problema, pois, ao imprimir a variável a, o programa passou a imprimir o valor - 2,147,483,648 , que não havia sido atribuído a ela.

Com os seus conhecimentos da função static_cast, descreva um possível motivo para esse problema.

Passo 1

Uma variável do tipo d o u b l e tem uma maior capacidade de armazenamento que uma variável do tipo i n t . Dessa forma, ao se utilizar o comando s t a t i c _ c a s t para fazer uma conversão do tipo d o b l e para o tipo i n t , existe a possibilidade do tipo d o u b l e , nesse momento, estar guardando um valor maior do que aquele suportado por uma variável i n t .

Nessa situação, o comando s t a t i c _ c a s t retorna o menor valor possível para a variável do tipo i n t .

Resposta

A variável do tipo d o u b l e está armazenando um valor maior que o máximo possível de ser suportado por uma variável do tipo i n t .

Exercício Resolvido #4

Suponha que você é contratado para elaborar um programa que melhore o cadastro dos preços de produtos no banco de dados de uma rede de supermercados.

Nesse programa, o valor de cada preço será armazenado numa variável do tipo float.

Para que o seu programa fique de melhor entendimento para os funcionários da rede de supermercados, você opta por apelidar o tipo float com o nome “preco”. Faça a implementação dessa redefinição e mostre como ela fica para os produtos usados no código acima.

Passo 1

Fala aí, pessoal! Nesse exercício, o enunciado já disse o que quer da gente né, que é apelidar o tipo de variável f l o a t com o nome p r e c o . Isso significa fazer uma redefinição de tipo, porque vamos redefinir o tipo f l o a t como p r e c o . E pra fazer redefinição de tipo, usamos o comando typedef:

Depois disso, basta refazer o código anterior, utilizando p r e c o no lugar do f l o a t .

Resposta

Exercício Resolvido #5

Faça um programa que use a função static_cast para converter um número real que o usuário passa para o programa em valor inteiro. Ao fim, imprima o valor inteiro após a seguinte mensagem “A parte inteira do numero digitado e “.

Passo 1

Primeiramente, vamos incluir a biblioteca i o s t r e a m (linha 01), inicializar a função main e declarar as duas variáveis a serem utilizadas: aquela que vai guardar o valor real passado pelo usuário e aquela que vai armazenar a parte inteira (linhas 8 e 9).

Vamos adotar r e a l como nome para a primeira variável e i n t e i r o como nome para a segunda.

Após isso, vamos printar uma mensagem para indicar que o usuário deve digitar um número real (linha 11) e, logo em seguida, vamos fazer a leitura desse número e atribuí-lo a variável r e a l (linha 12).

Passo 2

Agora, vamos implementar o comando s t a t i c _ c a s t para que a variável i n t e i r o receba o valor passado ao programa como um i n t . Fazemos isso na linha 14.

Agora, basta imprimir na tela a mensagem que está no enunciado, com o comando cout (linhas 16 a 18).

Resposta

Exercício Resolvido #6

O programa acima foi escrito com a intenção de apresentar a seguinte saída:

5 dividido por 2 e igual a 2.5

No entanto, no lugar de 2.5 , o código está imprimindo 2 . Corrija o código para que ele apresente a saída correta.

Passo 1

Eai, tudo beleza?

Inicialmente, vamos analisar o código que foi dado. Ele inicia a função m a i n declarando duas variáveis, a e b , sendo a primeira do tipo inteiro e com valor inicial 5 e a segunda do tipo f l o a t e assume como valor iniciar a variável a dividida por 2 . Logo em seguida, é feita a impressão na tela da mensagem de saída do código.

O problema aqui está em como foi passado o valor para a variável b . Quando fazemos a / 2 , como a é um inteiro, essa operação vai resultar num inteiro também, ou seja, vai resultar na parte inteira da divisão, que seria 2 .

Passo 2

Para corrigirmos esse erro, devemos utilizar o s t a t i c _ c a s t para fazer com que o valor de a ao ser passado para b seja do tipo f l o a t :

Dessa forma, a operação de divisão vai nos retornar o valor 2.5 .

Resposta

Exercício Resolvido #7

Suponha que você foi contratado para desenvolver um programa que auxilia o cadastro de pacientes num programa de nutrição.

Para realizar o cadastro de um paciente, são necessárias as informações sobre o ID, o peso e a altura do paciente. Como o seu programa vai ser utilizado por pessoas leigas em programação, você acreditou ser uma boa ideia redefinir os tipos de dados para facilitar o uso.

Sabendo que o ID é representado por um número inteiro, o peso e a altura são números reais, redefina os tipos i n t como I D e f l o a t como p e s o e a l t u r a .

Passo 1

Eai, tudo beleza?

Nessa questão, precisamos fazer a redefinição de alguns tipos para facilitar o uso do nosso programa, o que é na prática, dar um apelido para um tipo de dado.

Para isso, vamos utilizar o comando t y p e d e f para fazer as redefinições pedidas, seguindo a seguinte estrutura:

t y p e d e f             T i p o D e V a r i a v e l             N o v a R e f e r e n c i a ;

Aplicando ao nosso problema, temos:

Passo 2

Para finalizar, vamos fazer um exemplo de cadastro de paciente.

Vamos declarar um ID, um peso e uma altura, sem precisar indicar os respectivos tipos:

Resposta

Exercício Resolvido #8

Um engenheiro eletrônico está programando um firmware e precisa separar diferentes tipos de dados de acordo com a quantidade de bytes que eles ocupam na memória. Com os seus conhecimentos em redefinição de tipo, você resolve ajudar o engenheiro redefinindo os tipos c h a r , s h o r t   i n t , i n t e d o u b l e para a quantidade de bytes que eles ocupam na memória ram do computador. Desenvolta essa redefinição em C++.

Passo 1

Eai, tudo beleza?

Nessa questão, temos que fazer apelidar alguns tipos de dados com base na quantidade de memória que eles ocupam. Para isso, vamos fazer uma tabela com a quantidade de memória que cada tipo de dado que foi dito para redefinir ocupa:

Passo 2

Agora, basta utilizarmos o comando t y p e d e f para apelidar cada tipo de dado de acordo com a tabela:

Resposta