# include <stdio.h>// Declaração de Bibliotecas //
# include <stdlib.h> // Declaração de Bibliotecas //
# include <string.h> // Declaração de Bibliotecas //

# define max 100 

int contInfM=0,contInfT=0, contInfN=0, contMatM=0, contMatT=0, contMatN=0; /* Declaração de variaveis */
int contContM=0,contContT=0,contContN=0,ContTotalCurso=0, ContTotaoPeriodo=0; /* Declaração de variaveis */
int contAlunoMat,contAlunoVesp,contAlunoNot; /* Declaração de variaveis */

struct CadAluno{ /* Criando uma estrutura de dados */
	int RA_Aluno,Curso_Aluno,Periodo_Aluno; /* Definindo campos do tipo inteiro*/
	char Nome_Aluno[100]; /* Definindo capo do tipo string de 100 posições*/
};

typedef struct CadAluno Aluno; /* Definindo o tipo de dados da lista aluno*/

Aluno *p; /* Definindo o ponteiro p para aluno*/

int contN=0,i; /* Declarando as variaveis do tipo inteiro para o contador*/

void Cadastrar_Aluno(); /* criando a função*/
void Listar_Aluno(); /* criando a função*/
void ListarPorCurso(); /* criando a função*/
void ListarPorPeriodo(); /* criando a função*/
void Consultar_Aluno(); /* criando a função*/
void RemoverListaSelecione_Aluno(); /* criando a função*/
void RemoverFilaPrimeiro_Aluno(); /* criando a função*/
void RemoverPilhaUltimo_Aluno(); /* criando a função*/
void RemoverTudos_Alunos();

void Cadastrar_Aluno() /*Função de entrada de Cadatro de Alunos*/
{
     if(contN<max) 
          {
                  printf("\n\t\t Digite a RM: "); /* Solicitando dados para serem armazenados na variavel */
                  scanf("%i", &p[contN].RA_Aluno); /* quardando o valor digitado em um campo da lista */
                  printf("\n\t\t Digite o Nome: "); /* Solicitando dados para serem armazenados na variavel */
                  scanf("%s", &p[contN].Nome_Aluno); /* quardando o valor digitado em um campo da lista */  
                  printf("\n\t\t Digite o Periodo: 1 - Manha 2 - Tarde 3 - Noite "); /* Solicitando dados para serem armazenados na variavel */
                  scanf("%i", &p[contN].Periodo_Aluno); /* quardando o valor digitado em um campo da lista */
                  printf("\n\t\t Digite o Curso: 1 - Informatica 2 - Matematica 3 - Contabilidade "); /* Solicitando dados para serem armazenados na variavel */
                  scanf("%i", &p[contN].Curso_Aluno); /* quardando o valor digitado em um campo da lista */
                  contN++; /* Incrementando o vvalor do contador */
                          
          }
     else
          {
                  printf("\n\t\t Lista Cheia \n"); /* Informando que a memoria esta cheia */        
          }
}

void Listar_Aluno() /*Função para listar os alunos */
{
     if(contN==0)
         {
                 printf("\n\t\t Lista Vazia \n"); /*Informando que não foi encontrado nenhum aluno no cadastro */       
         }    
     else
         {
              for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           printf("\n\t\t Cadastro[%i] \n\t\t RA: %i \n\t\t Nome: %s \n\t\t Periodo: %i \n\t\t Curso: %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */
                     }     
         }
}

void ListarPorCursoPeriodo() /* Função para listar o total de alunos por curso e por periodo */
{
     if(contN==0)
         {
                 printf("\n\t\t Lista Vazia \n"); /*Informando que não foi encontrado nenhum aluno no cadastro */       
         }    
     else
         {
                     printf("\n\t\t --------- Informatica Manha -------- \n"); /* Titulo */ 
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno == 1 && p[i].Periodo_Aluno == 1) /* Verificando se o registro é de Informatica e periodo da Manhã */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */   
                               contInfM++; /* Incrementando o contador */
                           }
                           
                     }
                     printf("\n\t\t --------- Informatica Tarde -------- \n");/* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno == 1 && p[i].Periodo_Aluno == 2) /* Verificando se o registro é de Informatica e periodo da Tarde */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contInfT++; /* Incrementando o contador */
                           }
                           
                     }
                     printf("\n\t\t --------- Informatica Noite -------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno == 1 && p[i].Periodo_Aluno == 3)/* Verificando se o registro é de Informatica e periodo da Noite */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contInfN++; /* Incrementando o contador */
                           }
                           
                     }
                     printf("\n\t\t --------- Matematica Manha -------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno == 2 && p[i].Periodo_Aluno == 1) /* Verificando se o registro é de Matematica e periodo da Manhã */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contMatM++; /* Incrementando o contador */                          
                           }                           
                     }
                     printf("\n\t\t --------- Matematica Tarde -------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno==2 && p[i].Periodo_Aluno==2) /* Verificando se o registro é de Matematica e periodo da Tarde */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contMatT++; /* Incrementando o contador */                         
                           }                           
                     }
                     printf("\n\t\t --------- Matematica Noite-------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno==2 && p[i].Periodo_Aluno==3) /* Verificando se o registro é de Matematica e periodo da Noite */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno );  /* Imprimindo os registros encontrados */   
                               contMatN++; /* Incrementando o contador */                         
                           }                           
                     }
                     printf("\n\t\t --------- Contabilidade Manha-------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno==3 && p[i].Periodo_Aluno==1) /* Verificando se o registro é de Contabilidade e periodo da Manhã */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */   
                               contContM++; /* Incrementando o contador */    
                           }
                           
                     }
                     printf("\n\t\t --------- Contabilidade Tarde-------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno==3 && p[i].Periodo_Aluno==2) /* Verificando se o registro é de Contabilidade e periodo da Tarde */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */   
                               contContT++; /* Incrementando o contador */    
                           }
                           
                     }
                     printf("\n\t\t --------- Contabilidade Noite-------- \n"); /* Titulo */
                     for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Curso_Aluno==3 && p[i].Periodo_Aluno==3) /* Verificando se o registro é de Contabilidade e periodo da Noite */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contContN++; /* Incrementando o contador */   
                           } 
                     }
                     ContTotalCurso = (contInfM + contInfT + contInfN); /* Calcula o total de alunos por curso */
                     printf("\n\t\t Total de Alunos de Informatica: %i - Manha: %i Tarde: %i Noite: %i \n",ContTotalCurso,contInfM,contInfT,contInfN); /* Imprime o total de alunos por curso e por periodo */
                     ContTotalCurso = 0; /* Limpa a variavel */
                     ContTotalCurso = (contMatM + contMatT + contMatN);/* Calcula o total de alunos por curso */
                     printf("\n\t\t Total de Alunos de Matematica: %i  - Manha: %i Tarde: %i Noite: %i \n",ContTotalCurso,contMatM,contMatT,contMatN); /* Imprime o total de alunos por curso e por periodo */
                     ContTotalCurso = 0; /* Limpa a variavel */
                     ContTotalCurso = (contContM + contContT + contContN);/* Calcula o total de alunos por curso */
                     printf("\n\t\t Total de Alunos de Contabilidade: %i - Manha: %i Tarde: %i Noite: %i \n",ContTotalCurso,contContM,contContT,contContN); /* Imprime o total de alunos por curso e por periodo */
         }
}

void ListarPorPeriodo() /* Função para listar o total de alunos periodo */
{
     if(contN==0)
         {
                 printf("\n\t\t Lista Vazia \n"); /*Informando que não foi encontrado nenhum aluno no cadastro */        
         }    
     else
         {
              printf("\n\t\t --------- Manha --------- \n"); /* Titulo */
              for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Periodo_Aluno==1) /* Verificando se o registro é do periodo da Manhã */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contAlunoMat++; /* Incrementando o contador */
                           }
                           
                     }
               printf("\n\t\t --------- Tarde --------- \n"); /* Titulo */      
               for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Periodo_Aluno==2) /* Verificando se o registro é do periodo da Tarde */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contAlunoVesp++; /* Incrementando o contador */                         
                           }
                           
                     }
                 printf("\n\t\t --------- Noite --------- \n"); /* Titulo */    
                 for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                     {
                           if(p[i].Periodo_Aluno==3) /* Verificando se o registro é do periodo da Noite */
                           {
                               printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */    
                               contAlunoNot++; /* Incrementando o contador */   
                           }
                           
                     }
                            
                     printf("\n\t\t Total de Alunos do Periodo da Manha: %i \n",contAlunoMat); /* Imprime o total de alunos periodo */
                     printf("\n\t\t Total de Alunos do Periodo da Tarde: %i \n",contAlunoVesp); /* Imprime o total de alunos periodo */
                     printf("\n\t\t Total de Alunos do Periodo da Noite: %i \n",contAlunoNot); /* Imprime o total de alunos periodo */   
         }
}

void Consultar_Aluno() /* Função para cunsultar aluno por RA*/
{
     int cont=0,np; /* Declaração de Variaveis para o contador*/
     if(contN==0)
          {
                 printf("\n\t\t Lista Vazia \n"); /*Informando que não foi encontrado nenhum aluno no cadastro */      
          }    
     else
          {
               printf("\n\t\t Digite o RA do Aluno: "); /* Mensagem solicitando o RA a ser localizado*/
               scanf("%i", &np); /* Armazena o valor digitado a uma variavel */
               for(i=0;i<contN;i++)/* Criando um laço para percorrer os registros */
                    {
                          if(np==p[i].RA_Aluno) /* Compara a cada passagem pelo laço se o valor digitado é igual ao valor que se encontra na lista */
                               {
                                     printf("\n\t\t Cadastro[%i] = %i %s %i %i \n",i,p[i].RA_Aluno,p[i].Nome_Aluno,p[i].Periodo_Aluno,p[i].Curso_Aluno ); /* Imprimindo os registros encontrados */        
                               }
                          else
                               {
                                     cont++; /* Incrementando o contador */
                               }               
                    }
               if(cont==contN) /* Compara se o contador é igual ao contador de registros */
                   {
                         printf("\n\t\t Numero nao encontrado \n"); /* Exbibe a mensagem de RA não encontrado */
                   }     
          }      
}

void RemoverListaSelecione_Aluno() /* Função para emover um registro especifico */
{
     int cont=0,j,np; /* Declaração de Variaveis para o contador*/ 
     if(contN==0)
          {
                 printf("\n\t\t Lista Vazia"); /*Informando que não foi encontrado nenhum aluno no cadastro */
          }
     else
          {
                 printf("\n\t\t Digite RA do Aluno a ser removido: \n"); /* Mensagem solicitando o RA para ser removido */
                 scanf("%i", &np); /* Armazena o RA digitado em uma variavel */
                 for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros */
                       {
                             if(np==p[i].RA_Aluno) /* Compara a cada passagem pelo laço se o valor digitado é igual ao valor que se encontra na lista */
                                 {
                                      printf("\n\t\t %i sendo removido cadastro %i \n",np,i); /* Exibe mensagem que o registro esta sendo removido */
                                      for(j=i;j<contN;j++) /* Criando um laço para percorrer os registros - Realoca os registros */
                                           {
                                                 p[j].RA_Aluno = p[j+1].RA_Aluno; /* Copia o proximo registro para a posição atual */
                                                 strcpy(p[j].Nome_Aluno, p[j+1].Nome_Aluno); /* Copia o proximo registro para a posição atual */
                                                 p[j].Periodo_Aluno = p[j+1].Periodo_Aluno; /* Copia o proximo registro para a posição atual */
                                                 p[j].Curso_Aluno = p[j+1].Curso_Aluno; /* Copia o proximo registro para a posição atual */             
                                           }
                                      p[contN-1].RA_Aluno=0; /* Limpa a ultima posição */
                                      strcpy(p[contN-1].Nome_Aluno,""); /* Limpa a ultima posição */
                                      p[contN-1].Periodo_Aluno=0; /* Limpa a ultima posição */
                                      p[contN-1].Curso_Aluno=0; /* Limpa a ultima posição */
                                      contN--; /* Decrementa um do contador */
                                 }
                            else
                                 {
                                      cont++; /* Incrementando o contador */     
                                 }
                       }             
                 if(cont==contN) /* Compara o contador com o contador de regisros */
                      {
                            printf("\n\t\t numero nao encontrado \n"); /* Se os dois contadores forem iguais, exibe a mensagem de registro não encontrado */
                      }
          }
}

void RemoverFilaPrimeiro_Aluno() /* Função para remover o primeiro registro da fila */
{
     if(contN==0) /* Verifica se o contador de Registros é igual a zero*/
          {
                 printf("\n\t\t Fila Vazia"); /* Exibe uma mensagem de Fila Vazia */
          }
     else
          {
                 for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros - Realoca os registros */
                 {
                     p[i].RA_Aluno = p[i+1].RA_Aluno; /* Move o proximo registro para o registro atual*/
                     strcpy(p[i].Nome_Aluno, p[i+1].Nome_Aluno); /* Move o proximo registro para o registro atual*/
                     p[i].Periodo_Aluno = p[i+1].Periodo_Aluno; /* Move o proximo registro para o registro atual*/
                     p[i].Curso_Aluno = p[i+1].Curso_Aluno; /* Move o proximo registro para o registro atual*/             
                 }
                 p[contN-1].RA_Aluno=0; /* Limpa a ultima posição */
                 strcpy(p[contN-1].Nome_Aluno,""); /* Limpa a ultima posição */
                 p[contN-1].Periodo_Aluno=0; /* Limpa a ultima posição */
                 p[contN-1].Curso_Aluno=0; /* Limpa a ultima posição */
                 contN--; /* Decrementa um do contador */
          }
}
void RemoverPilhaUltimo_Aluno() /* Função para remove o ultimo registro da pilha*/
{
     if(contN==0) /* Verifica se o contador de Registros é igual a zero*/
          {
                 printf("\n\t\t Pilha Vazia"); /* Exibe uma mensagem de Fila Vazia */
          }
     else
          {
                 p[contN-1].RA_Aluno=0; /* Limpa a ultima posição */
                 strcpy(p[contN-1].Nome_Aluno,""); /* Limpa a ultima posição */ 
                 p[contN-1].Periodo_Aluno=0; /* Limpa a ultima posição */
                 p[contN-1].Curso_Aluno=0; /* Limpa a ultima posição */
                 contN--; /* Decrementa um do contador */
          }
}
void RemoverTudos_Alunos()
{
     if(contN==0)/* Verifica se o contador de Registros é igual a zero*/
          {
                 printf("\n\t\t Lista Vazia"); /* Exibe uma mensagem de Fila Vazia */
          }
     else
          {
                 for(i=0;i<contN;i++) /* Criando um laço para percorrer os registros - Realoca os registros */
                 {
                 p[i].RA_Aluno=0; /* Limpa a posição atual */
                 strcpy(p[i].Nome_Aluno,""); /* Limpa a posição atual */
                 p[i].Periodo_Aluno=0; /* Limpa a posição atual */
                 p[i].Curso_Aluno=0; /* Limpa a posição atual */                                    
                 }
                 contN=0; /* Zera o contador */
          }
}

main()
{
      int opcao; /* Declaração de variavel */
      p=(Aluno*)malloc(max * sizeof(Aluno)); //lista - Tipo de dados definido// mallc - faz parte da biblioteca stdlib // max - tamanho pre definido // sizeof - retorna o tamanho em bytes  // lista - tipo de dados //Alocação dinamica de vetor//
      do
       {
             printf("\n\t\t ----------- Cadastro de Alunos - Faculdade Uniban ------------ \n"); /* Titulo */
             printf("\n\t\t --- Escolha a opcao: \n"); /* Titulo do Menu */
             printf("\n\t\t 1 - Cadastrar Aluno \n"); /* Opções do menu */
             printf("\n\t\t 2 - Listar Aluno\n"); /* Opções do menu */
             printf("\n\t\t 3 - Consultar ALuno \n"); /* Opções do menu */ 
             printf("\n\t\t 4 - Remover Aluno Selecionado \n"); /* Opções do menu */
             printf("\n\t\t 5 - Remover Fila Primeiro Aluno \n"); /* Opções do menu */
             printf("\n\t\t 6 - Remover Pilha Ultimo Aluno \n"); /* Opções do menu */
             printf("\n\t\t 7 - Remover Todos Alunos \n"); /* Opções do menu */
             printf("\n\t\t 8 - Listar Total de Alunos por curso - Perido\n"); /* Opções do menu */
             printf("\n\t\t 9 - Listar Total de Alunos por Periodo\n"); /* Opções do menu */
             printf("\n\t\t10 - Sair: "); /* Opções do menu */
             scanf("%i", &opcao ); /* Atribui o valor digitado a uma variavel */
             printf("\n\n\t\t ----------------------- \n");
             switch(opcao)
                 {
                          case 1: Cadastrar_Aluno();break; /* Chama a função conforme a opção digitada*/
                          case 2: Listar_Aluno();break; /* Chama a função conforme a opção digitada*/
                          case 3: Consultar_Aluno();break; /* Chama a função conforme a opção digitada*/
                          case 4: RemoverListaSelecione_Aluno();break; /* Chama a função conforme a opção digitada*/
                          case 5: RemoverFilaPrimeiro_Aluno();break; /* Chama a função conforme a opção digitada*/
                          case 6: RemoverPilhaUltimo_Aluno();break; /* Chama a função conforme a opção digitada*/
                          case 7: RemoverTudos_Alunos();break; /* Chama a função conforme a opção digitada*/
                          case 8: ListarPorCursoPeriodo();break; /* Chama a função conforme a opção digitada*/
                          case 9: ListarPorPeriodo();break; /* Chama a função conforme a opção digitada*/
                          case 10: p=NULL; /* Limpa o ponteiro */
                                  free(p); /* Libera o espaço alocado */
                                  return(0);
                          default: printf("\n\t\t Opcao Invalida \n"); /* Mensagem de opção invalida */
                 }
       }while(opcao!=10);    
}
