PUCRS
Faculdade de Informática
Programação para Engenharia II



Exercícios sobre Structs em C++

1. A partir do trecho de código abaixo, complete o programa criando as funções que faltam.


#include <iostream>

using namespace std;

typedef struct{
   int matricula;
   float notas[3];

}Aluno;

int 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

    }
    return 0;
}



2. Crie um programa que permita armazenar o nome 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 de cada pessoa deve ser informado 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:

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);
}

int 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. Definir uma struct que represente uma lista de inteiros.

Esta struct deve armazenar os dados em um vetor de inteiros de tamanho 10.

Deve existir um vetor auxiliar de que indique, na posição Vaux[i], qual o próximo elemento da lista após o elemento que está na posição 'i'.

Na figura abaixo, considere que a lista inicia na posição 3.

No vetor auxiliar, o valor -1 indica que a posição correspondente no vetor 'dados' está vazia. Por sua vez,
o valor -2 indica que a posição correspondente no vetor Dados é o último elemento da lista.

Índice 0 1 2 3 4 5 6 7 8 9 10
Dados 10 1 VAZIO 9 VAZIO 11 34 VAZIO VAZIO VAZIO VAZIO
Vetor Auxiliar(próximo) 5 6 -1 0 -1 1 -2 -1 -1 -1 -1

Ao ser impressa, esta lista deve apresentar os seguintes valores: 9, 10, 11, 1, 34.

A classe de deve ter métodos para:
void imprimeLista(ListaEncadeadaComVetor L)
{
int pos = L.inicio;
printf("
Lista:\n");
printf("Posicao Inicial: %d\n", pos);
for(int i=0; i< TAM; i++)
{
printf("%d (pos:%d)", L.Dados[pos], pos);
pos =
L.Aux[pos];
if (pos == -2)
break;
else
printf(", ");
}
printf("\n");

}

Sugestão para definição da struct:
#include <stdio.h>

const int TAM = 10;

typedef struct ListaEncadeadaComVetor{
int inicio;
int Dados[TAM];
int Aux[TAM];

};

int achaPosUltimo(ListaEncadeadaComVetor L);// Este método faz a busca do último a partir dos
// dados da lista e não a partir do vetor auxiliar

int achaPosLivre(ListaEncadeadaComVetor L); // Este método faz a busca de um espaço lvre
// a partir do vetor auxiliar

int insereDado(ListaEncadeadaComVetor, int D);
int removeDado(ListaEncadeadaComVetor, int D);
void imprimeLista(ListaEncadeadaComVetor);
FIM.