Estruturas (Registros) Agrupa conjunto de tipos de dados distintos sob um único nome string string inteiro inteiro inteiro float float Cadastro Pessoal Nome Endereço Telefone Idade Data de Nascimento Peso Altura struct cadastro_pessoal char *nome; char *endereço; int telefone; int idade; int nascimento; float peso; float altura;
Estruturas (Registros) Um pequeno exemplo main( ) struct facil int num; char ch; struct facil var; /*declara variável var do tipo facil */ var.num = 2; var.ch = Z ; printf( var.num = %d, var.ch = %c\n,var.num, var.ch );
Estruturas (Registros) Exercício Crie um programa para cadastrar as notas dos alunos de uma turma. Cada registro do cadastro deve conter: Nome do aluno, 1 a nota, 2 a nota e média final.
Inicializando Estruturas struct livro char titulo[40]; int regnum; struct livro livro1 = Treinamento em Linguagem C - I, 124 struct livro livro2 = Treinamento em Linguagem C - II, 125
Atribuições entre estruturas Na versão original do C, definida por Kernighan e Ritchie, era impossível atribuir o valor de uma variável estrutura a outra do mesmo tipo usando uma simples expressão de atribuição. Nas versões modernas de C, esta forma de atribuição já é possível struct livro char titulo[40]; int regnum; struct livro livro1 = Treinamento em Linguagem C - I, 124 struct livro livro2 = Treinamento em Linguagem C - II, 125 livro1 = livro2;
Estruturas Aninhadas Exatamente como é possível ter matrizes de matrizes, pode-se criar estruturas que contém outras estruturas. struct professor char nome[50]; char disciplina[20]; int carga_horaria; struct aluno char nome[50]; int matricula; struct cadastro_escolar struct professor docentes[100]; struct aluno discente[10000];
Passando estruturas para funções struct livro char titulo[40]; int regnum; main( ) struct livro livro1; struct livro livro2; struct livro novonome( ); livro1 = novonome( ); livro2 = novonome( ); list(livro1); struct livro novonome( ) char numstr[81]; struct livro livr; printf( \ndigite título: ); gets(livr.titulo); printf( Digite registro: ); gets(numstr); livr.regnum=atoi(numstr); return(livr); void list(struct livro livr) printf( \nlivro:\n ); printf( Título: %s\n, livr.titulo); printf( No do registro: %3d\n,livr.regnum);
struct lista char titulo[30]; char autor[30]; int regnum; double preco; Ponteiros para Estruturas main( ) static struct lista livro[2] = C, Edvadno, 102, 70.5, C++, Cláudio, 321, 63.25 struct lista *ptrl; /* ponteiro para estrutura */ Endereço 1: 404 2: 474 Ponteiro 1: 404 2: 474 ptrl->preço: R$ 70.5 (*ptrl).preço: R$ 70.5 ptrl->título: C++ ptrl->autor: Cláudio printf( Endereço 1: %u 2: %u\n, &livro[0], &livro[1]); ptrl = &livro[0]; printf( Ponteiro 1: %u 2: %u\n, ptrl, ptrl+1); printf( ptrl->preço: R$.%2f (*ptrl).preço: R$.%2f\n, ptrl->preço, (*ptrl).preço); ptrl++; /* aponta para a próxima estrutura */ printf( ptrl->título: %s ptrl->autor: %s\n, ptrl->título, ptrl->autor);
Criando Listas Encadeadas 1 o Elemento 2 o Elemento 3 o Elemento valores do valores do valores do registro registro registro Elemento Nulo NULL
Criando uma Lista de Livros struct prs char título[30]; char autor[30]; int regnum; double preço; struct prs * próximo; /* ponteiro para próxima estrutura */ struct prs *ptr_início, *ptr_atual, *ptr_novo; main( ) char ch; ptr_início = (struct prs *) NULL /* sem dados ainda */ while (1) printf( \n Digite n para novos livros e l para listar o acervo ); ch = getche( ); switch(ch) case n : novo( ); break; case l : lista( ); break; default: puts( \n Opção inválida!!! \n Tente novamente. );
novo ( ) char numstr[81]; ptr_novo = (struct prs*) malloc ( sizeof (struct prs) ); if (ptr_início == (struct prs*) NULL ) ptr_início = ptr_atual = ptr_novo; else ptr_atual = ptr_início; while( ptr_atual->próximo!= (struct prs*) NULL) ptr_atual = ptr_autal->próximo; ptr_atual->próximo = ptr_novo; ptr_atual = ptr_novo; printf( Digite Título\n ); gets(ptr_atual->título); printf( Digite autor\n); gets(ptr_atual->autor); printf( Digite número do registro\n ); gets(numstr); ptr_atual->regnum = atoi(numstr); printf( Digite preço\n ); gets(numstr); ptr_atual->preço = atof(numstr); ptr_atual->próximo = (struct prs*) NULL;
lista ( ) if (ptr_início == (struct prs*) NULL) printf(\nlista vazia ); return; ptr_atual = ptr_início; do printf( Título: %s\n,ptr_atual->título); printf( Autor: %s\n,ptr_atual->autor); printf( Registro: %03d\n,ptr_atual->regnum); printf( Preço: %4.2f\n,ptr_atual->preço); ptr_atual = ptr_atual->próximo; while(ptr_atual!= (struct prs*) NULL);