MC-102 Aula 21 Registros

Documentos relacionados
MC-102 Aula 12 Matrizes e Vetores Multidimensionais

MC-102 Aula 19 Registros

MC-102 Aula 20 Ponteiros III

Aula 24 Ponteiros, vetores e structs

Introdução a Programação. Tipos Estruturados de Dados

Linguagem C ponteiros

3. Linguagem de Programação C

MC-102 Aula 19 Ponteiros II

Computação Eletrônica. Aula 08 Estruturas de Dados. Prof: Luciano Barbosa. CIn.ufpe.br

MC-102 Aula 10 Vetores

Algoritmos e Programação

Linguagem de Programação

Algoritmos e Programação

Programação: Vetores

Estrutura de dados 2. Ponteiro. Prof. Jesuliana N. Ulysses

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Fundamentos de Programação

ESTRUTURA DE DADOS VARIÁVEIS E PONTEIROS

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: tipos de dados definidos pelo programador: struct union enum typedef

SSC304 Introdução à Programação Para Engenharias. Estruturas. GE4 Bio

Introdução à Computação MAC0110

Métodos Computacionais. Tipos Estruturados

Princípios de Desenvolvimento de Algoritmos MAC122

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Estrutura de Dados. Struct (Registro) Lais Farias Alves

Algoritmos II Aula 2 Vetores

Prática de Programação. Prof. Tiago A. E. Ferreira Aula 9 Estruturas, Uniões, Enumerações e Tipos Definidos pelo Usuário

Tipos Estruturados. Tipos Estruturados

Aula 11 Oficina de Programação Estruturas. Profa. Elaine Faria UFU

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Programação Estruturada

Linguagem C: Introdução

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Linguagem C: Ponteiros - Alocação Dinâmica

LINGUAGEM C: ESTRUTURAS DEFINIDAS PELO

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Tipos Abstratos de Dados. Estrutura de Dados

Aula 25: Alocação Dinâmica

1/27. Registos (Estruturas - struct)

Aula 24: Ponteiros e Alocação Dinâmica

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Aula 06 Introdução à Programação Matrizes

LINGUAGEM C: PONTEIROS

Matrizes (Vetores Bidimensionais)

C Estruturas. Adriano Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Estruturas. Estruturas. Estruturas. Estruturas. Estruturas. Algoritmos e Lógica de Programação. Estruturas. Uniões Enumerações CANSI

Estrutura de Dados. TAD (Tipo Abstrato de Dados) Criando a primeira estrutura

Ponteiros de Variáveis

Introdução a Programação. Ponteiros para Estruturas, Outros Tipos de Estruturas

Estruturas II UFOP 1/35

C Estruturas. Section Summary. Adriano Cruz 1 de fevereiro de 2016

MC-102 Aula 11 Strings

MC-102 Aula 06 Comandos Repetitivos

MC-102 Aula 24 Arquivos em C e Parâmetros do Programa

Computação 2. Aula 5. Diego Addan Estrutura de Dados Registros (structs)

Capítulo 2 Operadores. A função scanf()

ponteiros INF Programação I Prof. Roberto Azevedo

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

Linguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

Introdução a Computação

Introdução a C. Para saber quais os procedimento ou funções que existem em cada biblioteca, acesse

Arranjos: parâmetros, matrizes.

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

13 Registros (Structs)

Objetivo. Compreender a definição e dominar a implementação de ponteiros em C. Dominar a manipulação de arquivos

MC-102 Aula 04 Expressões Relacionais, Lógicas e Comandos Condicionais

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

8. Tipos estruturados

Linguagem de Programação

Aula 26: Estruturas heterogêneas

# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira

Variáveis, Comandos de Atribuição e Comando de Entrada e Saída

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

3. Linguagem de Programação C

Algoritmos I Aula 13 Linguagem de Programação Java

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Nomes de variáveis Todo nome de variável deve iniciar com uma letra ou sublinha _.

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Java Variáveis e Controle Fluxo

Linguagem C vetores multidimensionais

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Arranjos. David Déharbe

Algoritmos e Estruturas de dados

Programação Estruturada

Funções em Linguagem C Parte II

Estruturas. struct são coleções de dados heterogêneos agrupados em uma mesma estrutura de dados. Ex: armazenar as coordenadas (x,y) de um ponto:

Disciplina de Algoritmos e Programação

Programação Básica. Estrutura de um algoritmo

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

Aula 02. Prof. Diemesleno Souza Carvalho

Linguagem C. Programação Estruturada. Estrutura de Dados Heterogêneos. Prof. Luis Nícolas de Amorim Trigo

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Transcrição:

MC-102 Aula 21 Registros Instituto de Computação Unicamp 27 de Outubro de 2016

Roteiro 1 Registros Declarando um novo tipo de Registro Acessando os campos de um Registro Lendo e Escrevendo Registros Atribuição e Registros Vetores e Registros Funções e Registros Ponteiros e Registros 2 Exercícios 3 Informações Extras: Redefinição de tipos (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 2 / 29

Registros Um registro é um mecanismo da linguagem C para agrupar várias variáveis, que inclusive podem ser de tipos diferentes, mas que dentro de um contexto, fazem sentido estarem juntas. Exemplos de uso de registros: Registro de alunos para guardar os dados: nome, RA, médias de provas, médias de labs, etc... Registro de pacientes para guardar os dados: nome, endereço, histórico de doenças, etc... (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 3 / 29

Declarando um novo tipo de registro Para criarmos um novo tipo de registro usamos a palavra chave struct da seguinte forma: s t r u c t n o m e r e g i s t r o { t i p o 1 nome campo 1 ; t i p o 2 nome campo 2 ; t i p o 3 nome campo 3 ;... t i p o n nome campo n ; ; Cada nome campo i, é um identificador que será do tipo tipo i (são declarações de variáveis simples). Exemplo: s t r u c t Aluno { c h a r nome [ 8 0 ] ; f l o a t nota ; ; // estamos c r i a n d o um novo t i p o s t r u c t Aluno (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 4 / 29

Declarando um novo tipo de registro A declaração do registro pode ser feita dentro de uma função ou fora dela. Usualmente, ela é feita fora de qualquer função, para que qualquer função possa usar dados do tipo de registro criado. #include <stdio.h> /* Declare tipos registro aqui */ int main () { /* Construa seu programa aqui */ (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 5 / 29

Declarando um registro A próxima etapa é declarar uma variável do tipo struct nome registro, que será usada dentro de seu programa, como no exemplo abaixo: #i n c l u d e <s t d i o. h> s t r u c t Aluno { c h a r nome [ 8 0 ] ; f l o a t nota ; ; i n t main ( ) { s t r u c t Aluno a, b ; // v a r i á v e i s a, b são do t i p o s t r u c t Aluno...... (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 6 / 29

Utilizando os campos de um registro Podemos acessar individualmente os campos de uma determinada variável registro como se fossem variáveis normais. A sintaxe é: v a r i á v e l r e g i s t r o. nome do campo Os campos individuais de um variável registro tem o mesmo comportamento de qualquer variável do tipo do campo. s t r u c t Aluno { c h a r nome [ 4 5 ] ; f l o a t nota ; ; i n t main ( ) { s t r u c t Aluno a, b ; // v a r i á v e i s do t i p o s t r u c t Aluno a. nota = 4. 7 ; b. nota = 2 a. nota ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 7 / 29

Utilizando os campos de um registro #i n c l u d e <s t d i o. h> #i n c l u d e < s t r i n g. h> s t r u c t Aluno { c h a r nome [ 4 5 ] ; f l o a t nota ; ; i n t main ( ) { s t r u c t Aluno a, b ; s t r c p y ( a. nome, Helen ) ; a. nota = 8. 6 ; s t r c p y ( b. nome, D i l b e r t ) ; b. nota = 8. 2 ; p r i n t f ( a. nome = %s, a. nota = %f \n, a. nome, a. nota ) ; p r i n t f ( b. nome = %s, b. nota = %f \n, b. nome, b. nota ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 8 / 29

Lendo e Escrevendo Registros A leitura dos campos de um registro a partir do teclado deve ser feita campo a campo, como se fossem variáveis independentes. A mesma coisa vale para a escrita, que deve ser feita campo a campo. #i n c l u d e <s t d i o. h> #i n c l u d e <s t r i n g. h> s t r u c t Aluno{ c h a r nome [ 8 1 ] ; f l o a t nota ; ; i n t main (){ s t r u c t Aluno a, b ; p r i n t f ( D i g i t e o nome : ) ; f g e t s ( a. nome, 80, s t d i n ) ; a. nome [ s t r l e n ( a. nome ) 1] = \0 ; // remove \ n p r i n t f ( D i g i t e a nota : ) ; s c a n f ( %f, &a. nota ) ; g e t c h a r ( ) ; p r i n t f ( D i g i t e o nome : ) ; f g e t s ( b. nome, 80, s t d i n ) ; b. nome [ s t r l e n ( b. nome ) 1] = \0 ; // remove \ n p r i n t f ( D i g i t e a nota : ) ; s c a n f ( %f, &b. nota ) ; g e t c h a r ( ) ; p r i n t f ( a. nome = %s, a. nota = %.2 f \n, a. nome, a. nota ) ; p r i n t f ( b. nome = %s, b. nota = %.2 f \n, b. nome, b. nota ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 9 / 29

Atribuição de registros Podemos atribuir um registro a outro diretamente: var1_registro = var2_registro; Automaticamente é feito uma cópia de cada campo de var2 para var1. Exemplo: #i n c l u d e <s t d i o. h> #i n c l u d e <s t r i n g. h> s t r u c t Aluno{ c h a r nome [ 8 0 ] ; f l o a t nota ; ; i n t main (){ s t r u c t Aluno a, b ; p r i n t f ( D i g i t e o nome : ) ; f g e t s ( a. nome, 80, s t d i n ) ; a. nome [ s t r l e n ( a. nome ) 1] = \0 ; // remove \ n p r i n t f ( D i g i t e a nota : ) ; s c a n f ( %f, &a. nota ) ; g e t c h a r ( ) ; b = a ; // A t r i b u i ç ã o de r e g i s t r o s p r i n t f ( b. nome = %s, b. nota = %.2 f \n, b. nome, b. nota ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 10 / 29

Vetores e Registros A declaração e uso de vetores de registros se dá da mesma forma que vetores dos tipos básicos vistos anteriormente. Para declarar: Para usar: s t r u c t Aluno turma [ 6 0 ] ; turma [ i n d i c e ]. campo ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 11 / 29

Exemplo de vetor de registro: #i n c l u d e <s t d i o. h> #i n c l u d e < s t r i n g. h> s t r u c t Aluno { c h a r nome [ 8 0 ] ; f l o a t nota ; ; i n t main ( ) { s t r u c t Aluno turma [ 5 ] ; i n t i ; f o r ( i =0; i <5; i ++){ p r i n t f ( D i g i t e o nome : ) ; f g e t s ( turma [ i ]. nome, 80, s t d i n ) ; turma [ i ]. nome [ s t r l e n ( turma [ i ]. nome ) 1] = \0 ; // remove \ n p r i n t f ( D i g i t e a nota : ) ; s c a n f ( %f, &turma [ i ]. nota ) ; g e t c h a r ( ) ; f l o a t media =0; f o r ( i =0; i <5; i ++){ media = media + turma [ i ]. nota ; p r i n t f ( Media da turma = %.2 f \n, media / 5. 0 ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 12 / 29

Registros e Funções Registros podem ser usados tanto como parâmetros em funções bem como em retorno de funções. Neste caso o comportamento de registros é similar ao de tipos básicos. (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 13 / 29

Funções e Registros Exemplo. Vamos criar as seguintes funções: s t r u c t Aluno l e A l u n o ( ) ; Esta função faz a leitura dos dados de um registro Aluno e devolve o registro lido. v o i d imprimealuno ( s t r u c t Aluno a ) ; Esta função recebe como parâmetro um registro Aluno e imprime os dados do registro. v o i d l i s t a r T u r m a ( s t r u c t Aluno turma [ ], i n t n ) ; Esta função recebe como parâmetros um vetor do tipo Aluno representando uma turma, e também um inteiro n indicando o tamanho do vetor. A função imprime os dados de todos os alunos. (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 14 / 29

Funções e Registros Implementação das funções: s t r u c t Aluno l e A l u n o ( ) { s t r u c t Aluno aux ; p r i n t f ( D i g i t e o Nome : ) ; f g e t s ( aux. nome, 80, s t d i n ) ; aux. nome [ s t r l e n ( aux. nome ) 1] = \0 ; // remove \ n p r i n t f ( D i g i t e a Nota : ) ; s c a n f ( %f,& aux. nota ) ; g e t c h a r ( ) ; r e t u r n aux ; v o i d imprimealuno ( s t r u c t Aluno a ){ p r i n t f ( Dados de um a l u n o ) ; p r i n t f ( Nome : %s. Nota : %.2 f \n, a. nome, a. nota ) ; v o i d l i s t a r T u r m a ( s t r u c t Aluno turma [ ], i n t n ){ p r i n t f ( Imprimindo a turma \n ) ; i n t i ; f o r ( i =0; i <n ; i ++) imprimealuno ( turma [ i ] ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 15 / 29

Funções e Registros Com as funções implementadas podemos criar o seguinte exemplo de programa. #i n c l u d e <s t d i o. h> #i n c l u d e < s t r i n g. h> #d e f i n e MAX 4 s t r u c t Aluno { c h a r nome [ 8 0 ] ; f l o a t nota ; ; s t r u c t Aluno l e A l u n o ( ) ; v o i d imprimealuno ( s t r u c t Aluno a ) ; v o i d l i s t a r T u r m a ( s t r u c t Aluno turma [ ], i n t n ) ; i n t main ( ) { i n t i ; s t r u c t Aluno turma [MAX] ; f o r ( i =0; i <MAX; i ++) turma [ i ] = l e A l u n o ( ) ; l i s t a r T u r m a ( turma, MAX) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 16 / 29

Ponteiros e Registros Ao criarmos uma variável de um tipo struct, esta é armazenada na memória como qualquer outra variável, e portanto possui um endereço. É possível então criar um ponteiro para uma variável de um tipo struct! #i n c l u d e <s t d i o. h> s t r u c t Coordenada { d o u b l e x ; d o u b l e y ; ; i n t main ( ) { s t r u c t Coordenada c1, c2, c3 ; c3 = &c1 ;...... (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 17 / 29

Ponteiros e Registros c1 c2 c3 x x 100 y y 100 108 (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 18 / 29

Ponteiros e Registros O que será impresso pelo programa abaixo?? #i n c l u d e <s t d i o. h> s t r u c t Coordenada{ d o u b l e x ; d o u b l e y ; ; i n t main (){ s t r u c t Coordenada c1, c2, c3 ; c3 = &c1 ; c1. x = 1; c1. y = 1.5; c2. x = 2. 5 ; c2. y = 5; c3 = c2 ; p r i n t f ( Coordenadas de c1 : (% l f,% l f )\n, c1. x, c1. y ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 19 / 29

Ponteiros e Registros Para acessarmos os campos de uma variável struct via um ponteiro, podemos utilizar o operador * juntamente com o operador. como de costume: Coordenada c1, c3 ; c3 = &c1 ; ( c3 ). x = 1. 5 ; ( c3 ). y = 1. 5 ; Em C também podemos usar o operador ->, que também é usado para acessar campos de uma estrutura via um ponteiro. Coordenada c1, c3 ; c3 = &c1 ; c3 >x = 1. 5 ; c3 >y = 1. 5 ; Resumindo: Para acessar campos de estruturas via ponteiros use um dos dois: ponteiroestrutura->campo (*ponteiroestrutura).campo (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 20 / 29

Ponteiros e Registros O que será impresso pelo programa abaixo?? #i n c l u d e <s t d i o. h> s t r u c t Coordenada{ d o u b l e x ; d o u b l e y ; ; i n t main (){ s t r u c t Coordenada c1, c2, c3, c4 ; c3 = &c1 ; c4 = &c2 ; c1. x = 1; c1. y = 1.5; c2. x = 2. 5 ; c2. y = 5; ( c3 ). x = 1. 5 ; ( c3 ). y = 1. 5 ; c4 >x = 1; c4 >y = 1; p r i n t f ( Coordenadas de c1 : (% l f,% l f )\n, c1. x, c1. y ) ; p r i n t f ( Coordenadas de c2 : (% l f,% l f )\n, c2. x, c2. y ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 21 / 29

Ponteiros e Registros Podemos fazer alocação dinâmica de um vetor de registros da mesma forma que com tipos simples. s t r u c t Aluno v e t A l u ; v e t A l u = m a l l o c (10 s i z e o f ( s t r u c t Aluno ) ) ; v e t A l u [ 0 ]. nota = 5. 6 ; v e t A l u [ 1 ]. nota = 7. 8 ;... (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 22 / 29

Ponteiros e Registros Utilizando as funções criadas anteriormente podemos executar o exemplo: #i n c l u d e <s t d i o. h> #i n c l u d e <s t r i n g. h> #i n c l u d e <s t d l i b. h> s t r u c t Aluno{ c h a r nome [ 8 0 ] ; f l o a t nota ; ; s t r u c t Aluno l e A l u n o ( ) ; v o i d imprimealuno ( s t r u c t Aluno a ) ; v o i d l i s t a r T u r m a ( s t r u c t Aluno turma [ ], i n t n ) ; i n t main (){ s t r u c t Aluno v e t A l u ; i n t n, i ; p r i n t f ( Numero de a l u n o s : ) ; s c a n f ( %d, &n ) ; g e t c h a r ( ) ; v e t A l u = m a l l o c ( n s i z e o f ( s t r u c t Aluno ) ) ; // Alocação d i n â m i c a do v e t o r de r e g i s t r o s f o r ( i =0; i<n ; i ++){ v e t A l u [ i ] = l e A l u n o ( ) ; l i s t a r T u r m a ( vetalu, n ) ; f r e e ( v e t A l u ) ; // L i b e r a ç ã o de memória a l o c a d a (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 23 / 29

Exercício Crie um novo tipo de registro para armazenar coordenadas no plano cartesiano. Crie uma função para imprimir um ponto do tipo criado. Crie uma função para cada uma destas operações: soma de dois pontos, subtração de dois pontos, multiplicação por um escalar. (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 24 / 29

Informações Extras: Redefinido um tipo Às vezes, por questão de organização, gostaríamos de criar um tipo próprio nosso, que faz exatamente a mesma coisa que um outro tipo já existente. Por exemplo, em um programa onde manipulamos médias de alunos, todas as variáveis que trabalhassem com nota tivessem o tipo nota, e não double. (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 25 / 29

Informações Extras: O comando typedef A forma de se fazer isso é utilizando o comando typedef, seguindo a sintaxe abaixo: typedef <tipo ja existente> <tipo novo>; Usualmente, fazemos essa declaração fora da função main(), embora seja permitido fazer dentro da função também. Ex: typedef float nota; Cria um novo tipo, chamado nota, cujas variáveis desse tipo serão pontos flutuantes. (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 26 / 29

Informações Extras: Exemplo de uso do typedef #i n c l u d e <s t d i o. h> t y p e d e f d o u b l e nota ; i n t main ( ) { nota p1 ; p r i n t f ( D i g i t e a nota : ) ; s c a n f ( %l f,&p1 ) ; p r i n t f ( A nota d i g i t a d a f o i : %l f, p1 ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 27 / 29

Informações Extras: Exemplo de uso do typedef Mas o uso mais comum para o comando typedef é para a redefinição de tipos registro. No nosso exemplo de struct Aluno, poderíamos redefinir este tipo para algo mais simples como simplesmente Aluno: typedef struct Aluno Aluno; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 28 / 29

#i n c l u d e <s t d i o. h> s t r u c t Aluno { i n t r a ; double nota ; ; t y p e d e f s t r u c t Aluno Aluno ; // r e d e f i n i m o s t i p o s t r u c t Aluno como Aluno i n t main (){ Aluno turma [ 1 0 ] ; i n t i ; d o u b l e media ; f o r ( i = 0 ; i < 1 0 ; i ++) { p r i n t f ( D i g i t e o RA do %d o a l u n o :, i ) ; s c a n f ( %d, &turma [ i ]. r a ) ; p r i n t f ( D i g i t e a média do %d o a l u n o :, i ) ; s c a n f ( %l f, &turma [ i ]. nota ) ; // c a l c u l a a media da turma media = 0. 0 ; f o r ( i = 0 ; i < 1 0 ; i ++) { media = media + turma [ i ]. nota ; media = media / 1 0. 0 ; p r i n t f ( \na media da turma é : %l f \n, media ) ; (Instituto de Computação Unicamp) MC-102 Aula 21 27 de Outubro de 2016 29 / 29