Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem de Programação II STRUCT Objetivos de aprendizagem Ao término desta aula, vocês serão capazes de: • entender o conceito de estruturas de dados heterogêneos, que se diferem completamente de todos os tipos vistos na disciplina anterior; • criar estruturas de dados capazes de armazenar vários tipos de dados diferentes; • conhecer as várias estruturas (variáveis comuns, ponteiros e vetores) que são capazes de manipular structs; • identificar a melhor maneira de manipular essas estruturas de dados. Nesta aula, vamos aprender a criar estruturas de dados heterogêneas: struct. Mas, o que é uma struct? Lembra-se de que os vetores armazenavam vários valores de um mesmo tipo? Agora, veremos como armazenar vários valores de vários tipos com apenas uma variável. Segundo Schildt (1996), uma struct é: Em C, uma estrutura é uma coleção de variáveis referenciadas por um nome, fornecendo uma maneira conveniente de se ter informações relacionadas agrupadas. Uma definição de estrutura forma um modelo que pode ser usado para criar variáveis de estruturas. As variáveis que compreendem a estrutura são chamadas membros da estrutura. (Os membros da estrutura são comumente chamados elementos ou campos) (SCHILDT, 1996, p. 167). Bons estudos! 2º Aula 11 1 – Definir uma struct 2 – Variável da struct 3 – Vetor de struct 4 – Ponteiro para struct 1 -Definir uma struct Algumas vezes, vamos nos deparar com situações em que várias variáveis estão relacionadas entre si como, por exemplo, os dados de um aluno: seu RGM, seu Nome, seu Curso, sua Idade, seu Semestre e assim por diante. A melhor maneira de agrupar esses dados, para evitar que sejam utilizados de maneira errada, é criando uma estrutura com todos eles. Se fossemos criar as variáveis da maneira que vimos até agora, ficaria mais ou menos assim: char RGM[11]; char nome[51]; char curso[41]; int idade; int semestre; Toda struct tem um nome que é definido na sua declaração, para que seja possível acessar os seus dados. Este nome será utilizado para se referir a struct, sempre que for manipular os seus dados. FIGURA 2.1: CRIANDO A STRUCT ALUNO. FONTE: CRIAÇÃO NOSSA REGRA • Sempre depois da chave que fecha a struct, coloque ponto-e-vírgula. struct nome { tipo nome_variavel; tipo outra_variavel; }; Como vimos anteriormente, o protótipo para definição de uma estrutura inicia com a palavra chave struct, a seguir o nome da estrutura e o bloco com a definição dos atributos que fazem parte da estrutura. Seções de estudo SEMPRE DÊ UM NOME À SUA STRUCT QUE SEJA COMPATÍVEL COM A SUA FINALIDADE Assim como as variáveis globais, podemos criar structs que podem ser acessadas de qualquer parte do programa. Para isso, basta criar a struct foram (antes) da main, veja um exemplo: FIGURA 2.1: CRIANDO A STRUCT ENDERECO FORA DA MAIN. Fonte: criação nossa Depois de definida uma estrutura, o seu nome passa a ser um tipo de dado, ou seja, a estrutura pode ser usada da mesma forma que qualquer outro tipo de C/C++. Veja na próxima seção, como criar e usar uma struct de C/C++. 2 - Variável da struct Depois de definida a struct podemos acessar seus dados criando uma variável do tipo dela. Este processo é simples, e existem duas maneiras de o fazer. Vamos ver alguns exemplos a seguir. Sintaxe: struct variavel; Onde: struct -> diz respeito à struct que foi criada variavel -> é o nome da variável que está sendo criada para acessar os dados da struct FIGURA 2.2: DECLARANDO UMA VARIÁVEL DA STRUCT. Fonte: criação nossa Nesse exemplo que acabamos de ver, criamos a variável end_1 do tipo da struct endereco. Observe que a criação da variável da struct é idêntica à criação de variáveis de tipos nativos da linguagem (exemplo: int, float, char). A sintaxe para acessar os dados da struct é bem simples. 12Linguagem de Programação II Usamos o nome da variável da struct (exemplo: end_1), depois colocamos ponto (.) e a seguir o dado que queremos acessar. Sintaxe: variavel.dado Onde: variavel -> é o nome da variável que foi criada do tipo da struct. o ponto (.) -> é utilizado para separar a variável do dado, e neste caso, seu uso é obrigatório (exceto quando usamos ponteiros, mas veremos mais detalhadamente mais a frente). dado -> é o dado que estamos querendo acessar (exemplo: rua, número, complemento) Os dados serão lidos de acordo com seu tipo, portanto para ler um tipo int, faça: scanf(“%d”, &variavel.dado); Veja um programa completo a seguir: FIGURA 2.3: ACESSANDO OS DADOS DA STRUCT. Fonte: criação nossa Explicando o programa: • Linha 14: declarando a variável end_1 do tipo da struct “endereco” • Linha 16: lendo um valor para o dado “rua”. Como este dado foi definido do tipo char de tamanho 40, precisamos utilizar a função fgets para ler valores para ele. • Linha 18: lendo um valor para o dado “numero”. Note que ele é do tipo int, então, usamos a função scanf para ler o seu valor. • Linha 20: lendo um valor para o complemento, que também é do tipo char e por isso usamos fgets. • Linha 22: lendo um valor para a cidade, do tipo char, com a função fgets. • Linha 24: lendo um valor para o estado, do tipo char, com a função fgets. • Linha 26: lendo um valor para o CEP, do tipo char, com a função fgets. Podemos realizar qualquer tipo de operação com os dados da struct, assim como com um dado comum, podemos realizar operações aritméticas, atribuições, enfim, o que for necessário. Exemplo: criar um programa que tenha uma estrutura de um produto. Com os seguintes dados: código, nome, preco, lucro (em porcentagem) e precofinal. O preço final do produto deve ser calculado a partir do preço com o lucro. Veja o programa a seguir. FIGURA 2.4: ACESSANDO OS DADOS DA STRUCT. Fonte: criação nossa Na linha 23, estamos realizando o cálculo do preço final do produto, mas observe que sempre antes de se referir ao dado, é preciso informar a variável da struct ao qual ele pertence. Temos também mais uma função nova neste programa, a função fflush. Essa função vai limpar o buffer do teclado, muitas vezes, quando vamos ler um valor para uma string o programa “passa direto” pela instrução de leitura. Utilizando essa instrução antes do fgets evitamos que isso aconteça. 3 - Vetor de struct Quando criamos uma struct, geralmente é porque surge a necessidade de se ler vários valores de um mesmo tipo: vários alunos, vários produtos, vários clientes e assim por diante. Podemos criar várias variáveis do tipo da struct, da mesma maneira que podemos criar várias variáveis do tipo int, por exemplo. Mas para facilitar, a criação e manipulação dessas variáveis, temos uma opção bem mais simples: criar um vetor da struct. Através do vetor, podemos criar e acessar várias structs de um mesmo tipo. 13 ntaxe: Onde: struct vetor_struct[tamanho]; struct -> diz respeito à struct que foi criada vetor_struct -> é o nome do vetor. Definido para manipular o vetor da struct que foi criado. Vamos ver um exemplo? Exemplo: criar um programa para ler os dados de cinco produtos. Os dados são os seguintes: código, nome, preço, lucro e preço final. FIGURA 2.5: ACESSANDO OS DADOS DE UM VETOR STRUCT. Fonte: criação nossa A ideia principal do programa mostrado anteriormente, é a mesma do programa representado pela figura 2.4. Criamos um vetor da struct e acrescentamos um for para poder percorrer todos os elementos da struct. Os dados dos cinco produtos foram lidos dentro desse for e o cálculo do preço final também, isso porque é preciso calcular os preços finais de cada um dos produtos informados. Como qualquer outro tipo de vetor em C, usando struct precisamos também indicar o índice (exemplo: a variável “i”) que fica dentro dos colchetes. Lembrando que com vetores, os elementos precisam ser manipulados individualmente. 4 - Ponteiros para struct Pode-se criar um ponteiro para uma estrutura, assim como um ponteiro para os tipos de dados existentes na linguagemC. Sintaxe: nome_estrutura * nome_ponteiro; Onde: nome_estrutura -> diz respeito à struct que foi criada nome_ponteiro -> é o nome da variável tipo ponteiro. Vamos ver um exemplo de como criar um ponteiro para uma estrutura. Veja na figura abaixo um programa que cria uma struct, depois cria uma variável desta struct e em seguida, cria um ponteiro para uma struct. Ao final, o ponteiro (p) recebe o endereço de memória da variável do tipo da struct. FIGURA 2.6: CRIANDO UM PONTEIRO PARA UMA VARIÁVEL DO TIPO STRUCT. Fonte: criação nossa Vamos relembrar um pouco do que vimos na aula 2? Retomando a aula 1 - Definir uma struct Aprendemos que quando temos várias variáveis que possuem uma certa relação entre elas, a melhor maneira de manipulá-las é criando uma struct, assim os dados ficam agrupados e é bem menos provável que erros sejam cometidos. 2 - Variável da struct Depois de definida a struct, é preciso manipular os seus dados. Vimos que criamos uma variável, como outra qualquer em C, e depois usamos o nome desta variável, ponto e o nome do dado. Assim, acessamos o conteúdo dos dados. 3 - Vetor de struct Podemos também criar vetores para struct. Quando vamos precisar trabalhar com mais de uma variável do tipo da struct que foi criada. A melhor maneira de fazê-lo é criando um vetor para a struct. 4 - Ponteiro para struct Assim como nos tipos nativos da linguagem C (int, float, char, double), podemos também criar ponteiros para structs 14Linguagem de Programação II quando houver a necessidade para tal. Leia o capítulo 9 do livro Treinamento em Linguagem C – Módulo 2 Vale a pena ler Vale a pena http://www.ime.usp.br/~pf/algoritmos/aulas/stru. html Vale a pena acessar Autoavaliação Veja se aprendeu a Aula 02 respondendo o questionário autoavaliativo. Depois confira o resultado das respostas, disponível na ferramenta Arquivos da plataforma. 1. Structs são meios de agrupar dados que tenham uma relação entre eles. ( ) Verdadeiro ( ) Falso 2. O C++, além de oferecer todos os recursos do C, oferece recursos para programar, utilizando orientação a objetos. ( ) Verdadeiro ( ) Falso 3. Uma struct deve ser criada sempre dentro da main. ( ) Verdadeiro ( ) Falso 4. Para acessar os dados de uma struct temos que criar uma variável do tipo dela, e indicar essa variável seguida de ponto, antes do nome do dado. ( ) Verdadeiro ( ) Falso 5. Vetores de struct podem ser criados quando precisamos manipular mais de uma variável do tipo da struct. ( ) Verdadeiro ( ) Falso 6. Podemos ter várias variáveis do tipo da struct no mesmo programa. ( ) Verdadeiro ( ) Falso 7. Podemos obter o endereço de memória de uma variável do tipo struct, criando um ponteiro de struct. ( ) Verdadeiro ( ) Falso Minhas anotações
Compartilhar