Manipulando Structs

Ver Todos os Exercícios

Teoria

Introdução

Fala aí, aqui é o Guga do Responde Aí! Tudo bem com você?

Apesar de já estarmos um pouco familiarizados com o conceito de struct, nesse tópico nós iremos conversar mais um pouquinho sobre assunto. Porém, dessa vez iremos aprender sobre a manipulação de registros em um programa.

Então, sem perder tempo vamos nessa!

Acessando elementos em uma struct

Uma coisa é certa, antes de nós acessarmos qualquer elemento em uma struct, nós devemos ter uma struct. É justamente por esse motivo que devemos nos contextualizar, para isso vamos considerar executado o seguinte trecho de código:

Com isso, nós acabamos de definir uma estrutura paciente com os campos idade, massa e altura. Posteriormente, um tipo inf_paciente é gerado a partir da struct paciente através do comando typedef (aquele mesmo que nós já vimos). Por fim, um vetor denominado pacientes é alocado com 50 posições.

Ao extrair todas essas informações, podemos criar um ambiente!

Imagine que esse é o programa de um consultório médico que armazena as informações básicas de seus 50 pacientes em um vetor com dados do tipo struct paciente.

Certo, mas até agora só falamos de conceitos já vistos. Vamos entrar em caminhos obscuros agora, o que o programa deveria fazer se um médico solicitasse a massa do primeiro paciente armazenado?

De forma simples, o programa deveria realizar a impressão dessa informação na tela do médico. Para que isso ocorra, o seguinte código deverá ser executado:

Calma, é só isso?

Sim! Basta colocarmos um ponto e o nome do campo que desejamos acessar logo em seguida do nome da variável em que a struct está sendo manipulada, nesse caso a primeira posição do vetor pacientes.

De maneira geral, nós podemos escrever o acesso a um elemento de uma struct da seguinte forma:

Mamão com açúcar, fala sério.

Inserindo elementos em uma struct

Legal, nós já sabemos acessar os campos de uma struct, também sabemos que os campos de uma struct são apenas a união de diversas outras variáveis. A partir disso, para inserir um elemento em uma struct basta nos lembrarmos da inserção padrão em uma variável em conjunto com o acesso a uma struct, em código as coisas ficariam da seguinte forma:

Onde nós acabamos de inserir no paciente de índice 0 as seguintes informações: idade igual a 19 anos, massa de 80,5 Kg e altura de 1,6 metros.

De maneira geral, nós podemos escrever a inserção de dados em uma determinada struct da seguinte forma:

É muito parecido com a maneira com que nós estamos acostumados a atribuir valores, a grande diferença está na especificação do campo que o dado será inserido.

Typedef e structs

A utilização do typedef na definição de structs é uma prática muito comum, pois quando definimos um registro temos a tendência de utilizar essa estrutura na declaração de inúmeras variáveis e não somente em uma. Por esse motivo, “criar” um tipo para a referenciação de uma struct é muito útil e extremamente simples.

Dá uma olhada na imagem a seguir:

Utilizando essa estrutura como base, podemos escrever uma maneira geral de redefinição de tipo para structs da seguinte forma:

Nós temos uma última missão para cumprir, resolver os exercícios de fixação sobre structs para ficarmos craques!

Nem vem! Ela é bem possível sim, te encontro na página aqui do lado.

Inserindo elementos em uma struct

Typedef e structs

Exercícios Resolvidos

Exercício Resolvido #1

Implemente um programa que leia o nome, a idade e o endereço de uma pessoa e armazene esses dados em uma estrutura.

Passo 1

Nós iremos começar o desenvolvimento do nosso programa definindo o seu escopo.

Onde além da comum função main, também devemos declarar um registro chamado i n f P e s s o a i s com os campos n o m e , i d a d e e e n d e r e c o que será responsável por ser uma estrutura base.

Passo 2

Com o escopo definido, podemos agora declarar a variável que nos auxiliará nesse desenvolvimento.

Nesse caso, será apenas uma variável x do tipo p e s s o a , que nada mais é do que o tipo do registro anteriormente definido.

Passo 3

Por fim, basta realizarmos as leituras dos dados de entrada.

Esses dados, por sua vez, devem ser armazenados nos seus respectivos campos da variável x , são eles: n o m e , i d a d e e e n d e r e c o já que a estrutura base dessa variável é o registro i n f P e s s o a i s .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #2

Crie uma estrutura que represente o plano R 3 e utilize ela para implementar um programa que realiza a soma de dois vetores.

Passo 1

Como a grande maioria das vezes, vamos iniciar o nosso programa definindo o seu escopo.

Junto com ele temos o registro que será responsável pela representação do R 3 , que basicamente é uma estrutura com três variáveis do tipo float, são elas: x , y e z .

Passo 2

Tendo o registro já definido, podemos iniciar a declaração das variáveis que irão nos ajudar nesse programa.

Informações sobre as declarações:

  • v 1 e v 2 são variáveis do tipo v e t o r que serão responsáveis por armazenar os elementos dos vetores que serão inseridos como entradas do programa;
  • v S o m a é uma variável, também do tipo v e t o r , que será responsável por armazenar os vetor resultante entre a soma de v 1 e v 2 .

Passo 3

Com as variáveis declaradas, nós podemos requisitar as entradas ao usuário do programa.

Essas entradas nada mais são do que os dois vetores que serão somados.

Passo 4

A lógica do programa consiste em atribuir a cada campo da estrutura v S o m a a soma dos respectivos elementos desse campo das estruturas v 1 e v 2 .

Passo 5

Por fim, só nos resta imprimir o vetor resultante da soma entre v 1 e v 2 , que nesse caso é v S o m a .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #3

Construa uma estrutura a l u n o com número de matrícula e curso. Leia do usuário os dados de 5 alunos, armazene em um vetor dessa estrutura e imprima os dados na tela.

Passo 1

Começaremos esse programa pelo seu escopo.

Observe que declaramos uma estrutura i n f A l u n o com os campos m a t r i c u l a e c u r s o e em seguida utilizamos o comando typedef para apelidar essa estrutura apenas de a l u n o .

Passo 2

Já que nós já temos o escopo desse programa, podemos agora declarar as variáveis que serão essenciais para o funcionamento dele.

Aqui está algumas informações sobre elas:

  • i é uma variável contadora;
  • t u r m a é um vetor de estruturas do tipo a l u n o com cinco posições.

Passo 3

Em relação a lógica do programa, a primeira coisa que nós temos que fazer é realizar a leitura dos dados dos cinco alunos.

Para isso, utilizaremos um laço de repetição for que terá cinco loops e em cada um deles preenchera os campos m a t r i c u l o e c u r s o de uma das posições do vetor t u r m a .

Passo 4

Por fim, basta percorrermos o vetor t u r m a imprimindo cada um dos campos das diferentes estruturas que estão alocadas em suas cinco posições.

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #4

Faça um programa que resolva a operação de soma entre números complexos. Para isso, leia dois números complexos compostos por uma parte real e uma parte imaginária e imprima a soma entre eles na tela.

Passo 1

Iremos começar o desenvolvimento desse programa definindo o seu escopo.

Juntamente com ele devemos declarar uma estrutura c o m p l e x o composta dos campos r e a l e i m a g i n a r i a e em seguida apelidar ela para n u m e r o através do comando typedef.

Passo 2

Em seguida podemos declarar as variáveis que irão nos auxiliar.

Aqui estão algumas informações sobre as declarações:

  • n 1 e n 2 são estruturas do tipo n u m e r o responsáveis por armazenar as partes reais e imaginárias dos números complexos que serão inseridos como entrada;
  • s o m a é uma estrutura do tipo n u m e r o responsável por armazenar a parte real e imaginária do número complexo gerado na soma entre n 1 e n 2 .

Passo 3

Com as estruturas devidamente declaradas, podemos requisitar ao usuário do programa os valores dos números complexos que serão somados.

Esses valores correspondem aos dados referentes as partes reais e imaginárias do números n 1 e n 2 .

Passo 4

A lógica do programa consiste em atribuir aos campos da estrutura s o m a o resultado da soma desses mesmo campos dos números n 1 e n 2 .

Logo, o campo r e a l da estrutura s o m a é a soma dos campos r e a l dos números n 1 e n 2 . Por sua vez, o campo i m a g i n a r i a da estrutura s o m a é a soma dos campos i m a g i n a r i a dos números n 1 e n 2 .

Passo 5

Por último, só nos resta realizar a impressão do número complexo resultante da soma entre os números n 1 e n 2 .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #5

Faça um programa que leia um vetor com os dados de 5 carros: marca (no máximo 15 letras) ano e preço. Leia um valor p e mostre as informações de todos os carros com preço menor que p .

Passo 1

Começaremos o nosso programa pelo seu escopo.

Juntamente com ele declaramos uma estrutura i n f V e i c u l o com os campos mencionados pelo enunciado, são eles: marca, ano e preço. Em seguida, apelidamos esse registro com o nome c a r r o através do comando typedef.

Passo 2

Com o escopo definido, podemos declarar as variáveis essenciais para esse programa.

Informações sobre essas declarações:

  • i é uma variável contadora;
  • p é uma variável do tipo ponto flutuante responsável por armazenar o preço máximo de exibição dos carros;
  • f r o t a é um vetor de estruturas do tipo c a r r o de cinco posições.

Passo 3

Agora que já temos as variáveis necessárias, iremos requisitar ao usuário os dados dos cincos carros que serão lidos.

Vale ressaltar que após os campos das estruturas alocadas no vetor f r o t a s já estejam preenchidas, devemos ler o valor de p .

Passo 4

Por fim, basta percorrermos o vetor f r o t a verificando se o campo p r e c o do carro armazenado na estrutura alocada naquela posição do vetor é menor que p . Caso seja, os restantes dos campos devem ser impressos.

Se a condição de exibição das informações do carro não forem verdadeiras, o programa irá seguir com o laço de repetição até percorrer as cinco posições do vetor f r o t a .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #6

Faça um programa para armazenar um livro de receitas. Para isso, crie um vetor com cinco receitas compostas por: nome (máximo de 25 letras), quantidade de ingredientes e ingredientes. Então, crie e leia o vetor de receitas e procure pelo nome de uma, caso ela exista no vetor os seus ingredientes devem ser impressos.

Passo 1

Começaremos esse programa pela definição do seu escopo.

Observe que como devemos realizar uma busca por uma receita, devemos comparar a igualdade entre o nome de duas strings, por esse motivo incluiremos a biblioteca string. Além disso, criamos uma estrutura chamada i n f R e c e i t a com os campos n o m e , q t d I n g r e d i e n t e s e i n g r e d i e n t e s . Essa estrutura, por sua vez, foi apelidada de r e c e i t a com a utilização do comando typedef.

Passo 2

Com o escopo definido, nós podemos declarar as variáveis que são essenciais para o desenvolvimento do programa.

Aqui podemos ver algumas informações sobre elas:

  • i é uma variável contadora;
  • l i v r o é um vetor de estruturas do tipo r e c e i t a de cinco posições;
  • b u s c a é um vetor de caracteres de 25 posições responsável por armazenar a cadeia de caracteres que servirá de base para a busca de uma receita.

Passo 3

Já que nós já declaramos as variáveis, podemos agora requisitar ao usuário os dados de entrada do programa.

Que consiste no nome, quantidade de ingredientes e os próprios ingredientes de cinco receitas, seguidas da string que deverá ser buscada no vetor.

Passo 4

Por fim, basta percorrermos o vetor l i v r o verificando se o campo nome armazenado na estrutura alocada naquela posição é igual ao nome da receita pesquisada. Caso verdadeira, devemos imprimir o campo i n g r e d i e n t e s da estrutura dessa posição.

Para realizar a comparação de igualdade entre strings utilizamos o comando strcmp da biblioteca string.

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #7

Escreva um programa que receba dois structs do tipo “dma” (dd/mm/aa), cada um representando uma data válida e calcule o número de dia, meses e anos que decorreram entre as duas datas.

Passo 1

Começaremos esse programa definindo o seu escopo.

Observe que juntamente declaramos a estrutura d m a com os campos d i a , m e s e a n o . Essa, por sua vez, foi apelidada com o nome d a t a através do comando typedef.

Passo 2

Com o escopo definido, nós podemos declarar agora as variáveis que são essenciais para o desenvolvimento desse programa.

Aqui podemos analisar algumas informações sobre elas:

  • d 1 e d 2 são estruturas do tipo d a t a responsáveis por armazenar as datas que serão inseridas pelo usuário do programa;
  • d i f é uma estrutura do tipo d a t a responsável por armazenar em seus campos a diferença de dias, meses e anos das datas d 1 e d 2 .

Passo 3

Com tudo aquilo que será necessário já declarado, podemos requisitar ao usuário as duas datas que terão o seu intervalo contabilizado.

Passo 4

Tendo as datas armazenadas, basta realizarmos uma subtração entre os respectivos campos de d 1 e d 2 e atribuirmos o resultado a esse mesmo campo de d i f .

Passo 5

Por fim, basta realizarmos a impressão dos campos da estrutura d i f .

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #8

Faça um programa que controla o consumo de energia dos eletrodomésticos de uma casa. Crie e leia cinco eletrodomésticos compostos por: nome (máximo de 15 letras), potência (em KW) e tempo ativo por dia. Após isso, leia um tempo t (em dia) e calcule e mostre o consumo total.

Passo 1

É uma ótima ideia começarmos esse programa pelo seu escopo.

Juntamente com ele declaramos uma estrutura p r o d u t o com os campos n o m e , p o t e n c i a e t e m p o A t i v o . Essa, por sua vez, foi apelidada de e l e t r o .

Passo 2

Com o escopo definido, podemos iniciar a declaração das variáveis.

As informações sobre elas nós podemos encontrar aqui:

  • i é uma variável contadora;
  • t é uma variável inteira responsável por armazenar a quantidade de dias passados;
  • c o i n j u n t o é um vetor de estruturas do tipo e l e t r o responsável por armazenar em seus campos os dados dos cinco eletrodomésticos inseridos como entrada.

Passo 3

Com as variáveis já declaradas, requisitaremos ao usuário o preenchimento do vetor de estruturas do tipo e l e t r o com os dados de cada eletrodoméstico.

Em seguida, também efetuaremos a leitura da quantidade de dias t que se passaram.

Passo 4

Por fim, basta percorrermos o vetor c o n j u n t o calculando o consumo total de cada eletrodoméstico e imprimindo essa informação na tela.

O consumo total, por sua vez, é calculado pela multiplicação da potência do aparelho, o seu tempo ativo por dia e a quantidade de dias que se passaram. Esse valor é dado em KW/h.

Resposta

Ei, a resposta está no passo a passo :)