Lista de Exercícios 7 (Extra 1)
Estruturas de Dados Heterogêneas e Tipos Definidos pelo Usuário
Nessa atividade, você deverá realizar alterações no sistema acadêmico desenvolvido para o Centro de Treinamentos, a fim de
contemplar a definição de estruturas de dados heterogêneas (struct na linguagem C) e de tipos definidos pelo usuário
(typedef).
O Centro de Treinamentos é o mesmo, oferecendo cursos de capacitação de curta duração, onde cada curso possui um código
identificador, sendo ofertada apenas uma turma por semestre, com número de vagas limitados, conforme definido na tabela a
seguir (p. ex. existe uma turma 2014/02 do curso Programação Avançada de Computadores - código 03, a qual possui
limitação de 15 vagas):
Cursos
Código
01
02
03
Nome
Programação Básica de Computadores
Redes de Computadores
Programação Avançada de Computadores
Qt. Vagas/Semestre
15
10
15
Como definido anteriormente, o sistema deve possibilitar a identificação automática de um aluno, a partir do seu número de
matrícula: qual é o nome do aluno, qual sua turma, qual o semestre que este ingressou no Centro de Treinamentos e o curso
em que está matriculado. Veja alguns exemplos de registros de alunos matriculados no Centro de Treinamentos:
N° de Matrícula
2015010101
2015010102
2014020301
Formulário de Matrícula
Nome
Ano de entrada
CPF
Luiz Fernando
2015
11122233344
Andre Riveiro
2015
44433322211
Felizberto Pacífico
2014
55566677788
…
…
…
…
Mês de entrada
03
04
07
...
Também continua valendo a regra de formação do número de matrícula:
2014 02 03 01
2014 – Ano de início de uma turma do curso.
02 – Semestre de início de turma do curso.
03 – Curso que o aluno está matriculado.
01 – Número sequencial de alunos matriculados na turma, auto incrementável.
Portanto, para realizar a matrícula de um novo aluno em um dos cursos oferecido pelo Centro de Treinamentos, o sistema
deve realizar as seguintes leituras e validações:
• o nome completo e o CPF do aluno;
• código do curso (precisa ser validado – verificar se é um código válido);
• a data de início do curso (apenas mês e ano – validar o mês para valores entre 1 e 12).
Com esses dados, é necessário verificar se ainda existe vaga disponível para matricular um novo aluno naquela turma
específica do curso (lembre-se que há limite do número de vagas para as turmas semestrais de cada curso oferecido pelo
Centro de Treinamentos). Em seguida o sistema deve gerar um número de matrícula para o aluno, p. ex. 2014020301,
seguindo o padrão especificado acima (lembre-se que é necessário transformar o mês em semestre).
Usando os novos conhecimentos adquiridos sobre estruturação de dados (estruturas de dados heterogêneas e tipos definidos
pelo usuário), os dados do sistema deverão ser reorganizados respeitando a seguinte estrutura:
vetAlunos
[0]
[1]
[2]
matricula.ano = 2015
matricula.semestre = 01
matricula.curso = 01
matricula.sequencia = 01
nome = “Luiz Fernando”
cpf = “11122233344”
matricula.ano = 2015
matricula.semestre = 01
matricula.curso = 01
matricula.sequencia = 02
nome = “Andre Riveiro”
cpf = “44433322211”
matricula.ano = 2014
matricula.semestre = 02
matricula.curso = 03
matricula.sequencia = 01
nome = “Felizberto Pacífico”
cpf = “55566677788”
[3]
[98]
...
[99]
Usando essa forma de estruturação dos dados, o sistema deve continuar oferecendo as seguintes funcionalidades para o
usuário:
i. efetuar a matrícula de um novo aluno em uma turma de um curso;
ii. a partir da indicação da turma de um curso (ano + semestre + código_curso), informar quantos alunos estão
matriculados;
iii. a partir de um número de matrícula, informar o nome e o CPF de um aluno;
iv. a partir de um CPF, informar os números de matrículas do aluno;
Esta atividade tem como objetivo exercitar o uso de estruturação de dados (estruturas de dados heterogêneas e tipos definidos
pelo usuário) usando a linguagem C, de forma complementar ao uso de arrays e modularização (subprogramas). Como
definido anteriormente, em uma próxima fase serão desenvolvidas novas funcionalidades para que o sistema armazene e leia
informações a partir de arquivos. O plano é que até o final do curso você seja capaz de gerar uma aplicação com diversas
outras funcionalidades e uma estruturação de dados adequada, explorando os diversos recursos tratados durante as aulas da
disciplina.
Uma estrutura básica é apresentada a seguir para auxiliá-lo no desenvolvimento de seu próprio código. Ressaltando que você
poderá alterá-lo, acrescentando outras funcionalidades que julgar necessárias.
Ao final da especificação da atividade, estão explicados alguns recursos (funcionalidades) disponíveis nas bibliotecas da
linguagem C e que você poderá incorporar em seu código de acordo com a necessidade.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxMatriculas 100 // Numero maximo de matriculas suportadas pelo sistema
#define MaxNomeLength 50 // Tamanho maximo das strings com nomes dos alunos
#define MaxCPFLength 12 // Tamanho maximo das strings com CPFs = 11 caracteres + '\0'
#define LimVagasPBC 15 // 15 vagas semestrais para o curso 1 - Programação Básica de Computadores
#define LimVagasRC 10 // 10 vagas semestrais para o curso 2 - Redes de Computadores
#define LimVagasPAC 15 // 15 vagas semestrais para o curso 3 - Programação Avançada de Computadores
typedef struct Matricula {
int ano;
int semestre;
int curso;
int sequencia;
} TMatricula;
typedef struct Aluno {
TMatricula matricula;
char nome [MaxNomeLength];
char cpf [MaxCPFLength];
} TAluno;
int efetuarMatricula(TAluno *vetAlunos);
int converteMesSemestre(int mes);
int verificaVagaCurso(TAluno *vetAlunos, int codCurso, int ano, int mes);
void exibirQtdAlunosCurso(TAluno *vetAlunos, int ano, int semestre, int codCurso);
int exibirDadosAluno(TAluno *vetAlunos, Tmatricula matricula);
void exibirAlunoViaCPF(TAluno *vetAlunos, char *cpf);
int main(int argc, char *argv[]) {
TAluno vetAlunos[MaxMatriculas];
// op -> variavel que guarda as operações
int op;
// variaveis auxiliares
int codCurso;
...
printf("==================================================\n");
printf("============ Centro de Treinamentos LTDA =========\n");
printf("==================================================\n\n");
printf("Bem vindo ao Sistema Academico do Centro de Treinamentos!\n");
do{
//menu de operações
printf("\nMENU:\n");
printf("\t(1) - Efetuar Matricula.\n");
printf("\t(2) - Verificar Quantidade de alunos em uma turma.\n");
printf("\t(3) - Exibir Nome e CPF de um aluno.\n");
printf("\t(4) - Encontrar Matricula pelo CPF\n");
printf("\t(0) - Sair\n");
printf("Entre com o codigo da operacao desejada: ");
scanf("%d", &op);
setbuf(stdin, NULL);
switch(op){
case 1:
case 2:
efetuarMatricula(vetAlunos);
break;
...
break;
case 3:
case 4:
...
break;
...
break;
default:
op = 0;
}
}while(op != 0);
return 0;
}
int efetuarMatricula(TAluno *vetAlunos) {
//variaveis
...
}
mes = converteMesSemestre(mes);
...
int converteMesSemestre(int mes){
...
}
int verificaVagaCurso(TAluno *vetAlunos, int codCurso, int ano, int mes){
...
}
void exibirQtdAlunosCurso(TAluno *vetAlunos, int ano, int semestre, int codCurso){
...
}
int exibirDadosAluno(TAluno *vetAlunos, Tmatricula matricula){
...
}
void exibirAlunoViaCPF(TAluno *vetAlunos, char *cpf){
...
}
Recursos:
•setbuf(stdin, NULL); // comando para limpar buffer de teclado.
•strncpy(strAux, strMatricula + 6, 2); /* esta funcionalidade copia 2 caracteres da cadeia de
caracteres contidas a partir da posição 4 de strMatricula para strAux
Por exemplo, se strMatricula = “2014010301”, vai ser copiado “03” para strAux */
•strcmp(vetCPF[i], cpf) /* função que compara arrays de caracteres, no exemplo, ele compara a
string contida em vetCPF[i] com a que está em cpf e retorna: 0 se as strings forem idênticas; um
inteiro < 0 se a vetCPF[i] for alfabeticamente “menor” que cpf; ou um valor inteiro > 0 se a
vetCPF[i] for alfabeticamente “maior” que cpf. */
•scanf("%[^\n]s", vetNome[i]); // funcionalidade para ler conjunto de caracteres até o ENTER.
•gets(vetNome[i]); // funcionalidade para ler conjunto de caracteres até o ENTER.
•strcpy(vetAlunos->nome, strOrig); /* esta funcionalidade copia a cadeia de caracteres contidas em
strOrig para o campo nome de vetAlunos */
•sprintf(variavel, "%.4d%.2d%.2d%.2d", ano, semestre, codCurso, indice) // funcionalidade que
“imprime” dentro de uma variável (array de caracteres) uma string formatada, formada por
conjuntos de vários tipos.
Download

Lista de Exercícios 7 (Extra 1) Estruturas de Dados Heterogêneas e