Lista de exercícios 05

Assuntos novos: estruturas de dados heterogêneas: struct.

Resumo e exemplos:

Uma estrutura é uma abstração para agregar vários tipos num único modelo. Ela permite criar uma elemento de memória capaz de armazenar valores de vários tipos.

Por exemplo, a estrutura Pauta, a seguir, serve para situações onde há necessidade de trabalhar com a matrícula e a média de um aluno de forma conjunta.

struct Pauta { 
    int matricula; 
    float media; 
};

Observação importante: Pauta é apenas um modelo (uma estrutura) por isso não tem a capacidade de armazenar dados, mas, tem a capacidade de criar variáveis que tenham as características do modelo.

Por exemplo, a variável de estrutura "aluno" tem a capacidade de armazenar um inteiro para matrícula e um float para média:

struct Pauta aluno;

Outra forma de escrever, de forma mais condensada, é:

struct Pauta { 
    int matricula; 
    float media; 
} aluno;

Para acessar um campo da estrutura usa-se o operador seleção “.”
Por exemplo, para acessar a média do aluno:

aluno.media

Exemplo de implementação com a estrutura Pauta:

#include <stdio.h> 
#include <stdlib.h> 
struct Pauta { 
     int matricula; 
     float media; 
}; 
int main() { 
   struct Pauta aluno; 
 
   printf("Entrada de dados para a variavel de estrutura \"aluno\"\n"); 
   printf("Digite a matricula: "); 
   scanf("%d", &aluno.matricula); 
   printf("Digite a media: "); 
   scanf("%f", &aluno.media); 
 
   printf("Saida de dados da variável de estrutura \"aluno\"\n"); 
   printf("Matricula = %d\n", aluno.matricula); 
   printf("Media = %.2f \n", aluno.media); 
   printf("\n\n"); system("pause"); 
   return 0;
}

Outro exemplo: estrutura para representar os dados referentes ao endereço de uma única pessoa:

struct TipoEndereco { 
    char rua [50]; 
    int numero; 
    char complemento[20]; 
    char bairro[40]; 
    char cidade[40]; 
    char sigla_estado[3]; 
    char CEP[9]; 
};
struct TipoEndereco endereco;

Um modelo de ficha com os dados pessoais de uma pessoa:

struct FichaPessoal 
{ 
    char nome[50]; 
    char telefone[15]; 
    struct  TipoEndereco endereco; 
};

Fichas para armazenar os dados de três pessoas:

struct FichaPessoal ficha1, ficha2, ficha3;

Fichas para armazenar os dados de trinta pessoas. Neste caso precisamos de um vetor de estruturas do tipo FichaPessoal:

struct FichaPessoal fichas[30];

Acesso ao nome da quinta ficha:

fichas[4].nome;

Acesso a cidade da quinta pessoa:

fichas[4].endereco.cidade;

Exemplo de uso de estruturas: programa para ler os dados de 200 alunos e em seguida exibi-los. Os dados são nome, quantidade de faltas, 5 notas avaliativas e uma indicação se é bolsista ou não.

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_ALUNOS 200 
struct TipoAluno { 
      char nome[30]; 
      int faltas; 
      float notas[5]; 
      char bolsista; 
}; 
 
int main( ) { 
      struct TipoAluno alunos[MAX_ALUNOS]; 
      int i,n; 
      // entrada dos alunos com os seus dados 
      for(i=0; i<MAX_ALUNOS; i++) {     
            printf("\nAluno %d \nDigite o nome (ENTER sai):", i+1); 
            gets(alunos[i].nome);  
            // verifica se não digitado nome 
            if(strcmp(alunos[i].nome,"")==0) 
                  break; 
            printf("Digite a qtde de faltas: "); 
            scanf("%d", &alunos[i].faltas); 
            // entrada das 5 notas 
            for(n=0; n<5; n++) {     
                  printf("Digite a %1da nota: ", n+1); 
                  scanf("%f", &alunos[i].notas[n]); 
            } 
            fflush(stdin); // é necessário para consumir o salto de linha deixado pela scanf que ficou no buffer 
            printf("Bolsista (s/n): "); 
            scanf("%c", &alunos[i].bolsista); 
            fflush(stdin); // é necessário para consumir o salto de linha que ficou no buffer 
      } 
      int qtdeAlunosCadastrados = i; 
      // exibicao dos dados digitados 
      printf("\n\nExibicao dos dados digitados:\n"); 
      for(i=0; i<qtdeAlunosCadastrados; i++) {     
            printf("Aluno %2d - Nome: %s, faltas: %d, Notas: ", 
                        i+1, alunos[i].nome, alunos[i].faltas); 
            for(n=0; n<5; n++) {     
                  printf("%5.2f", alunos[i].notas[n]); 
            } 
            printf(" - Bolsista: %c \n", alunos[i].bolsista); 
      } 
      system("PAUSE"); 
      return 0; 
}

Exercícios:

1. Declare uma estrutura (struct) capaz de criar variáveis para armazenar os seguintes dados: um funcionário composto de:

  • nome com no máximo 30 caracteres,
  • código de matrícula com exatamente 8 caracteres,
  • código do seu cargo profissional com exatamente 2 caracteres,
  • número de dependentes,
  • salário.

2. Declare estruturas e variáveis capazes de armazenar: uma agenda composta de 50 contatos. Cada contato possui o nome da empresa (máximo de 30 caracteres), o nome da pessoa responsável (máximo de 40 caracteres) e uma lista com até 10 telefones com DDD.

3. Um ponto é formado por duas cordenadas: x e y. Uma figura formada por retas no plano cartesiano (considere apenas o 1º quadrante) possui vários pontos para determinação destas retas. Cada ponto deste deve ter a indicação da ordem em que é desenhado. Sabe-se que cada figura tem entre 2 a 400 pontos. Crie uma modelagem de dados (usando structs e vetores) para armazenar 50 figuras.

4. Implemente um programa para cadastrar as informações para uma variável de estrutura do 1º exercício. Em seguida faça a exibição de todos os dados.

5. Implemente um programa para cadastrar as informações para a agenda da 2ª questão, e em seguida exibir todas elas.

6. Usando a estrutura fornecida, referente a atletas, elabore um programa para ler os dados de 15 atletas de uma equipe, calcular a média das idades e das alturas, e finalmente, exibir os dados lidos e as duas médias calculadas.

struct TipoAtleta{
     int  matricula;
     int  idade;
     float altura; 
};

7. Usando a estrutura TipoAtleta do exercício anterior, crie um vetor para armazenar os dados dos 15 atletas da equipe. Crie também uma estrutura para representar os dados de uma equipe: a relação de 15 atletas, o nome fantasia da equipe, e a data em que ela foi fundada. Para armazenamento da data, crie uma estrutura contendo dia, mês e ano. São ao todo 10 equipes.

Desenvolva um programa para realizar o cadastro e em seguida a exibição destes dados. Use #define para criação de contantes que permitam a modificação do número de atletas das equipes e o número de equipes.

8. Faça um programa para ler o nome e a média de 5 alunos. Ao final exiba o nome do aluno que possui a maior média. Use uma estrutura para representar os dados do aluno.

9. Desenvolva um programa para armazenar os dados de 100 equipamentos elétricos digitados pelo usuário. Cada equipamento é caracterizado pelas seguintes informações: a sua descrição (máximo de 30 caracteres), a sua potência em watts (número real) e a quantidade de fases elétricas necessárias (número inteiro).
Após o cadastro exiba o nome dos equipamentos que usam duas fases.
Obs.: use uma estrutura para o armazenamento dos dados do equipamento elétrico.

10. Elabore um programa para armazenar os dados de 80 pessoas digitadas pelo usuário. Cada pessoa é caracterizada pelas seguintes informações: o seu nome (máximo de 30 caracteres), o seu peso e a sua idade.
Após o cadastro exiba o nome dos adolescentes, ou seja, pessoas com idade de 12 a 17 anos.
Obs.: use uma estrutura para o armazenamento dos dados de cada pessoa.

11. Elabore um programa para armazenar os dados de várias equações do 2º grau. Use uma struct para representar os coeficientes da equação. Após o armazenamento, exiba as equações, formatadas, e as suas raizes ou ainda informe que a equação não possui raizes reais.
Exemplo de formato de uma equação: 5x2 + 3x - 2 = 0