Buscar

structs

Prévia do material em texto

PROGRAMAÇÃO ESTRUTURADA
Professora: Luciana Rocha Cardoso
- Objetivo dessa aula: structs
 Structs
Estrutura é um conjunto de variáveis, provavelmente de tipos diferentes, agrupadas e descritas por um único nome. As estruturas permitem uma organização dos dados dividida em campos e registros. Por exemplo, numa folha de pagamento, desejamos guardar diversos registros (ou estruturas) representando funcionários. Cada funcionário, neste caso, possuir alguns atributos, entre eles: nome (string), numero do departamento (inteiro), salário (float), alem de outros. Uma estrutura define um novo tipo composto, contendo diversos tipos básicos (ou compostos).
Uma estrutura  é conhecido como structs (abreviatura de structures).
Para se criar uma estrutura usa-se o comando struct. Sua forma geral é:
struct nome_do_tipo_da_estrutura{
tipo_1 nome_1;
tipo_2 nome_2;
...
tipo_n nome_n;
} variáveis_estrutura;
O nome_do_tipo_da_estrutura é o nome para a estrutura. As variáveis_estrutura são opcionais e seriam nomes de variáveis que o usuário já estaria declarando e que seriam do tipo nome_do_tipo_da_estrutura. Vamos criar uma estrutura de endereço:
struct tipo_endereco        {
        char rua [50];
        int numero;
        char bairro [20];
        char cidade [30];
        char sigla_estado [3];
        long int CEP;
        };
Vamos agora criar uma estrutura chamada ficha com os dados pessoais de uma pessoa:
struct ficha_pessoal        {
        char nome [50];
        long int telefone;
        struct tipo_endereco endereco;
        };
Vemos, pelos exemplos acima, como declarar uma estrutura e que uma estrutura pode fazer parte de outra.
Usando
Vamos agora utilizar as estruturas declaradas na seção anterior para escrever um programa que preencha uma ficha.
#include <stdio.h>
#include <string.h>
struct tipo_endereco        {
        char rua [50];
        int numero;
        char bairro [20];
        char cidade [30];
        char sigla_estado [3];
        long int CEP;
        };
struct ficha_pessoal        {
        char nome [50];
        long int telefone;
        struct tipo_endereco endereco;
        };
main (){
	struct ficha_pessoal ficha;
	strcpy (ficha.nome,"Luiz Osvaldo Silva");
	ficha.telefone=4921234;
	strcpy (ficha.endereco.rua,"Rua das Flores");
	ficha.endereco.numero=10;
	strcpy (ficha.endereco.bairro,"Cidade Velha");
	strcpy (ficha.endereco.cidade,"Belo Horizonte");
	strcpy (ficha.endereco.sigla_estado,"MG");
	ficha.endereco.CEP=31340230;
}
O programa declara uma variável ficha do tipo ficha_pessoal e preenche os seus dados. O exemplo mostra como podemos acessar um elemento de uma estrutura: basta usar o ponto (.).
Matrizes de estruturas
Uma estrutura é como qualquer outro tipo de dado no C. Podemos, portanto, fazer matrizes de estruturas. Vamos ver como ficaria a declaração de uma matriz de 100 fichas pessoais:
struct ficha_pessoal fichas [100];
Poderíamos então acessar a segunda letra da sigla de estado da décima terceira ficha fazendo:
fichas[12].endereco.sigla_estado[1];
Atribuindo
Podemos atribuir duas estruturas que sejam do mesmo tipo. O C irá, neste caso, copiar uma estrutura na outra. Esta operação não apresenta problemas pois quando declaramos
struct ficha_pessoal ficha;
ficha não é um ponteiro, mas uma estrutura. Veja as linhas abaixo:
void main() { 
struct ficha_pessoal primeira, segunda; 
Le_dados(&primeira); 
segunda = primeira; 
Imprime_dados(segunda); 
}
São declaradas duas estruturas do tipo ficha_pessoal, uma chamada primeira e outra chamada segunda. Supondo que haja declarada uma função Le_dados()que faça a leitura de uma estrutura, admitimos que após a execução da segunda linha de main(), a estrutura primeira estará preenchida com dados válidos. Os valores de primeira são copiados em segunda apenas com a expressão de atribuição:
segunda = primeira;
Todos os campos de primeira serão copiados na ficha chamada segunda. Devemos tomar cuidado com a seguinte declaração:
struct ficha_pessoal fichas [100];
pois neste caso fichas é um ponteiro para a primeira ficha. Se quisermos a estrutura completa da n-ésima ficha devemos usar fichas[n-1].
Um outro exemplo:
#include <stdio.h>
#include <stdlib.h>
struct funcionario {
 char nome[50];
 int idade;
};
main () {
 struct funcionario func[3];
 int i = 0;
 for (i=1;i<3;i++)
 {
 printf("\nNome do %uo Funcionario: ", i);
 scanf("%s", &func[ i ].nome);
 printf("Idade do %uo Funcionario: ", i);
 scanf("%u", &func[ i ].idade);
 }
 system("cls");
 for (i=1; i<3; i++)
 {
 printf("-----------------------------------\n");
 printf("Nome do %uo Funcionario: %s ", i, &func[ i ].nome);
 printf("\nIdade do %uo Funcionario: %u \n", i, func[ i ].idade);
 printf("-----------------------------------\n");
 printf("\n");
 }
 system("pause");
}
Um outro exemplo completo, de uma agenda.
#include<string.h>
#include<conio.h>
#include<stdio.h>
struct agenda {
 int cod;
 char nome[30];
 int tel;
 int vazio; //vazio = 0 e disponivel = 1.
}registros[100];
 
void zerar();//zera todo vetor da estrutura agenda
void cadastrar(int cod, int pos);
void consultar();
int verifica_pos();
int verifica_cod(int cod);
void excluir();
main() {
 zerar();
 int op=0, retorno, codaux, posicao;
 
 while(op!=4){
 printf("\n\n\t\t\t\t** AGENDA **\n\n\nMENU\n\n1 - Cadastrar\n2 - Consultar\n3 - Excluir\n4 - Sair\n\nOpcao: ");
 scanf("%d",&op);
 fflush(stdin);
 switch(op) {
 case 1: { 
 // CADASTRAR
 posicao = verifica_pos();//verifica se ha alguma posicao vazia no vetor de registros com retorno != -1 é valido
 if (posicao!=-1) {
 printf("\nEntre com o codigo desejado\n");
 scanf("%d",&codaux);
 fflush(stdin);
 retorno = verifica_cod(codaux);//verifica se nao ha codaux no vetor
 if (retorno==1)
 cadastrar(codaux,posicao);//passa o cod e a posicao 
 else
 printf("\nCodigo ja existente\n");
 } 
 else
 printf("\nA agenda esta cheia\n"); 
 break;
 }
 
 case 2: { 
 // CONSULTAR
 consultar();
 break; 
 }
 
 case 3: {
 excluir();
 break;
 }
 
 case 4: {
 printf("\n\nTchau");
 break;
 }
 
 }
 }
 
 getch(); 
}
void zerar() {
 int cont;
 for (cont=0;cont<=100;cont++)
 registros[cont].vazio=0; 
}
int verifica_pos() {
 int cont=0;
 while (cont<=100) {//tamanho do vetor da estrutura agenda (registros)
 if (registros[cont].vazio==0)
 return(cont);
 cont++; 
 }
 return(-1);
}
//verifica se nao ha duplicacao de cod
int verifica_cod(int cod) {
 int cont=0;
 while (cont<=100) {
 if (registros[cont].cod==cod)
 return(0);
 cont++;
 }return(1);
}
void cadastrar(int cod, int pos) {
 pos = verifica_pos();
 registros[pos].cod = cod;
 printf("\nNome:\n");
 gets(registros[pos].nome);
 printf("\nTelefone\n");
 scanf("%d",&registros[pos].tel);
 registros[pos].vazio = 1;
 printf("\nCadastro Realizado com Sucesso!\n\n");
}
void consultar() {
 int cont=0, cod;
 printf("\nEntre com o codigo\n");
 scanf("%d",&cod);
 while(cont<=100) {
 if (registros[cont].cod == cod) {
 if (registros[cont].vazio == 1) {
 printf("\nNome: %s",registros[cont].nome);
 printf("\nTelefone: %d",registros[cont].tel);
 break;
 }
 }
 cont++;
 if (cont>100)
 printf("\nCodigo nao encontrado\n"); 
 } 
}
void excluir() {
 int cod, cont=0;
 printf("\nEntre com o codigo do registro que deseja excluir\n");
 scanf("%d",&cod);
 while (cont<=100) {
 if (registros[cont].cod == cod)
 if (registros[cont].vazio == 1) {
 registros[cont].vazio = 0;
 printf("\nExclusao feita com sucesso\n");
 break;
 }
 cont++;
 if (cont>100)
 printf("\nCodigo nao encontrado\n");
 }
}
Passando para funções
No exemplo apresentado, vimos o seguinte comando:
strcpy (ficha.nome,"Luiz Osvaldo Silva");
Neste comando um elemento de uma estrutura é passado para uma função. Este tipo de operação pode ser feita sem maiores considerações.
Podemos também passar para uma função uma estrutura inteira. Veja a seguinte função:
void PreencheFicha (struct ficha_pessoal ficha)
{
...
}
Como vemos acima é fácil passar a estrutura como um todo para a função. Devemos observar que, como em qualquer outra função no C, a passagem da estrutura é feita por valor. Isto significa que alterações na estrutura dentro da função não terão efeito na variável fora da função. Mais uma vez podemos contornar este pormenor usando ponteiros e passando para a função um ponteiro para a estrutura.
Atividades 
1) A partir do trecho de código abaixo, complete o programa criando as funções que faltam.
#include <iostream>
typedef struct{
   int matricula;
   float notas[3];
}Aluno;
main(){
    Aluno Turma[5];
    for(i=0; i< 5; i++)    {
        LeAluno(.......);  // função que lê de teclado os dados do aluno
    }
    ImprimeTurma(Turma); //Função que imprime os dados de todos os alunos
    for(i=0; i< 5; i++)    {
        media = CalculaMediaAluno(.......);// função que calcula a média das notas de um aluno
        printf("Aluno %d  - Media = %f\n"); // imprime os dados do aluno
    }
   }
2) Crie um programa que permita armazenar o nome, a altura e da data de nascimento de até 10 pessoas. 
Cada pessoa deve ser representada por uma struct dentro de um vetor. 
A data de nascimento também deve ser uma struct.
O nome e a altura de cada pessoa devem ser informados pelo teclado.
A geração da data de nascimento deve ser feita aleatoriamente através da função abaixo
void CriaData(Data &D) {
 D.Mes = 1 + (rand() % 12);
 D.Ano = 1950 + (rand() % 49);
 D.Dia = 1 + (rand() % 30);
}
O programa deve, na tela de abertura, apresentar opções para:
inserir um nome;
listar todos os nomes e respectivas alturas;
listar os nomes das pessoas que nasceram antes de uma certa data fornecida.
Cada uma destas opções deve ser implementada em uma função separada.
Para realizar o exercício, utilize como base o programa apresentado abaixo.
	#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int dia, mes, ano;
} Data;
typedef struct {
    char nome[30];
    float altura ;
    Data nascimento;
} Pessoa;
void criaData(Data &D){
   D.mes = 1 + (rand() % 12);
   D.ano = 1950 + (rand() % 49);
   D.dia = 1 + (rand() % 30);
}
main(){
    Pessoa povo[10];
    Pessoa p;
    int opcao, qtdPessoas = 0 ;
    Data dia;
    ImprimeTelaDeOpcoes();
    do    {
      opcao = EscolheOpcao();
     if (opcao == 1)     {
        LePessoaDeTeclado(p);
        AdicionaPessoa(povo, p, qtdPessoas);
     }
     if (opcao == 2)     {
        ImprimeTodasAsPessoas(povo, qtdPessoas);
     }
     if (opcao == 3)     {
        LeDataDeTeclado(dia);
        ImprimeMaisVelhos(povo, qtdPessoas, dia);
     } 
    } while (opcao != 4);
}
3) Escreva um programa em C que manipule um vetor de registros com dados de 10 trabalhadores de uma 
empresa, conforme a estrutura a seguir: 
int id; 
char nome[30]; 
char sexo; 
float salario; 
O programa deve ter as seguintes funções: 
a) uma função para ler os dados dos 10 funcionários. 
b) uma função para exibir os dados dos 10 funcionários. 
c) uma função que receba, como parâmetro, um caractere correspondente ao sexo para exibir os dados 
somente dos funcionários do respectivo sexo. 
d) uma função que atualize o salário de todos os funcionários de acordo com o percentual informado 
como parâmetro.
4) Receba a base e a altura de um triângulo e calcule a área. Crie a estrutura para o triângulo. Crie uma função para calcular e retornar a área.
5) Cadastre os dados da folha de pagamento. A ficha do funcionário contém matrícula, nome, salário, data
de admissão. Leia os dados de “N” funcionários e dê relatório no final:
 · Lista de funcionários cadastrados (matrícula,ome, salário e data admissão);
 · Total da folha (soma dos salários);
 · O salário médio;
 · O maior salário;
 · A matrícula, o nome e a data de admissão do funcionário que tem o maior salário.
Use um vetor de estrutura.
6) Faça um programa que leia o nome, idade, renda, endereço, cidade, estado e CEP de um cliente e informe seu crédito na loja (50% da renda). Deverá ter apenas uma variável. Sair quando for digitado “FIM” no nome do cliente.
7) Faça um programa que leia os dados de entrada para um registro com os campos nome, endereço, telefone, e-mail e salário. No final exiba os dados.
Desenvolva um programa que simule uma agenda, em que serão cadastrados os nomes, e-mails e telefones de 50 pessoas. Para isso, defina a estrutura apropriada para o registro e faca um menu de opções para executar as seguintes tarefas:
Cadastrar
Ordenar em ordem crescente os registros com relação ao nome.
Localizar e exibir um registro pelo nome.
Listar todos os registros
Sair do programa.

Continue navegando