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.