#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_IT 500
#define MAX_FN 100
#define MAX_TXT 150
typedef struct data { short int dia;
char mes[3];
short int ano;
}data_tipo;
typedef struct funcionario { short int cod_fn;
char nome[40];
char morada[50];
data_tipo data_admissao;
short int especialidade;
}funcionario_tipo;
typedef struct componente { short int cod_cp;
char descricao[50];
data_tipo data_compra;
}componente_tipo;
typedef struct intervencao { short int cod_it;
componente_tipo cp_principal;
char tipo_intervencao;
componente_tipo vec_cp[100];
char vec_it[100];
char estado;
data_tipo data_pedido;
char urgencia;
data_tipo data_inicio;
data_tipo data_fim;
funcionario_tipo equipa[100];
funcionario_tipo responsavel;
}intervencao_tipo;
char especialidades[][20]={"Eletricista","Manobrador","Mecânico","Serralheiro","Trolha"};
short int lerInteiro(short int li,short int ls, short int tam)
{short int num, certo=0;
char valor[MAX_TXT];
do
{
printf("\nDigite um valor entre %u e %u: ",li,ls);
gets(valor);
if (strlen(valor)==tam)
{
num=atoi(valor);
if (num>=li && num<=ls)
certo=1;
else
printf("\nUnicamente digitos entre %u e %u !",li,ls);
}
else
printf("\nComprimento inválido !");
}while(certo==0); // enquanto o valor lido não estiver correcto
return num;
}
void lerChars(char *s, short int tam, char *info)
{ short int i=0;
char ch;
puts(info);
ch=getchar();
while(ch!='\n' && i<tam)
{
s[i]=ch;
i++;
ch=getchar();
}
s[i]='\0';
}
short int procurarCodigoFn(funcionario_tipo fn[], short int qtd, short int cod)
{ short int i, enc=-1;
for(i=0;i<qtd && enc==-1;i++)
if (fn[i].cod_fn==cod)
enc=i;
return enc;
}
// Lê dados de um funcionario e guarda no vetor
void inserirFn(funcionario_tipo fn[], short int *qtd)
{ short int n, i, encontrou;
char valor[MAX_TXT];
struct tm *local;
time_t t;
if (*qtd==MAX_FN)
printf("\nEste Porto não admite mais funcionários!!\n");
else
{
printf("\n--- Dados do funcionário ---");
n=lerInteiro(1000,9999,4);
encontrou=procurarCodigoFn(fn,*qtd,n);
printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd);
while(encontrou>=0) // Significa que é repetido e não pode acontecer!!!
{
n=lerInteiro(1000,9999,4);
encontrou=procurarCodigoFn(fn,*qtd,n);
}
printf("\n\t\t Fora: ");
fn[*qtd].cod_fn=n;
lerChars(valor,39,"\nNome (max 39 caracteres):");
printf("\n\t %s ", valor);
strcpy(fn[*qtd].nome,valor);
lerChars(valor,49,"\nMorada (max 49 caracteres):");
printf("\n\t %s ", valor);
strcpy(fn[*qtd].morada,valor);
n=lerInteiro(0,4,1);
fn[*qtd].especialidade=n;
t= time(NULL);
local=localtime(&t);
fn[*qtd].data_admissao.dia=local->tm_mday;
strncat(fn[*qtd].data_admissao.mes, __DATE__ , 3);
fn[*qtd].data_admissao.ano=local->tm_year+1900;
}
(*qtd)++; // Incrementa a quantidade de utentes existentes no vector
}
// Recebe um funcionario por parâmetro e mostra os seus dados
void mostrarFn(funcionario_tipo fn)
{ printf("\n--- Dados do Funcionario ---\n");
printf("\n Codigo: %hd",fn.cod_fn);
printf("\n Nome: %s",fn.nome);
printf("\n Morada: %s",fn.morada);
printf("\n Especialidade: %s",especialidades[fn.especialidade]);
printf("\n Dia/Mes/Ano: %hd//%s//%hd",fn.data_admissao.dia,fn.data_admissao.mes,fn.data_admissao.ano);
}
// Procura um funcionario e mostra todos os seus dados
void mostrarDadosFn(funcionario_tipo fn[], short int qtd)
{ short int n, encontrou=0;
if (qtd==0)
printf("\nEste Porto não tem funcionarios inscritos!!\n");
else
{
n=lerInteiro(1000,9999,4);
encontrou=procurarCodigoFn(fn,qtd,n);
if (encontrou>=0)
mostrarFn(fn[encontrou]);
else
printf("\n Não existe nenhum funcionario com código = %hd",n);
}
getch();
}
// Mostrar todos os dados de todos os funcionarios
void mostrarDadosFns(funcionario_tipo fn[], short int qtd)
{ short int i;
if (qtd==0)
printf("\nEste Porto não tem funcionarios inscritos!!\n");
else
for(i=0;i<qtd;i++)
{
mostrarFn(fn[i]);
getch();
}
}
// Eliminar um funcionario
void eliminarFn(funcionario_tipo fn[], short int qtd)
{ short int n, encontrou=0;
char r;
if (qtd==0)
printf("\nEste Porto não tem funcionarios inscritos!!\n");
else
{
n=lerInteiro(1000,9999,4);
encontrou=procurarCodigoFn(fn,qtd,n);
if (encontrou>=0){
mostrarFn(fn[encontrou]);
do{
printf("\n\nConfirma? (s/n)");
r=getch();
}while(r!='s' && r!='S' && r!='n' && r!='N');
if (r=='s' || r=='S'){
//inserir aqui códgo para eliminar funcionario
printf("\n\nFuncionário ELIMINADO");
}
else
printf("\n\nFuncionário NÃO ELIMINADO");
}
else
printf("\n Não existe nenhum funcionario com código=hd",n);
}
getch();
}
short int procurarCodigoIt(intervencao_tipo it[],short int qtd, short int cod)
{short int i, enc=-1;
for(i=0;i<qtd && enc==-1;i++)
if (it[i].cod_it==cod)
enc=i;
return enc;
}//Valida o tipo de intervenção
char valtipo()
{ char s='s';
do
{
printf("\nTipo de intervenção no componente:\n'A'-avaria 'M'-melhoria 'N'-nenhuma\n");
scanf("%c",&s);
}
while(s!='a'&&s!='A'&&s!='m'&&s!='M'&&s!='n'&&s!='N');
return(s);
}
//Procura uma intervenção e altera os seus dados
char alterarEstadoIntervencao(intervencao_tipo it[], short int qtd)
{char estado;
struct tm *local;
time_t t;
do
{
printf("\nEstado de intervenção no componente:\n'0'- pendente '1'- em curso '2'- concluída\n");
scanf("%c",&estado);
}
while(estado!='0'&&estado!='1'&&estado!='2');
t= time(NULL);
local=localtime(&t);
switch(estado)
{
case '0':
it[qtd].data_pedido.dia=local->tm_mday;
strncat(it[qtd].data_pedido.mes, __DATE__ , 3);
it[qtd].data_pedido.ano=local->tm_year+1900;
break;
case '1':
it[qtd].data_inicio.dia=local->tm_mday;
strncat(it[qtd].data_inicio.mes, __DATE__ , 3);
it[qtd].data_inicio.ano=local->tm_year+1900;
break;
case '2':
it[qtd].data_fim.dia=local->tm_mday;
strncat(it[qtd].data_fim.mes, __DATE__ , 3);
it[qtd].data_fim.ano=local->tm_year+1900;
break;
}
return estado;
}
void alterarEquipas(intervencao_tipo it[],short int *qtd)
{int i,n,encontrou;
funcionario_tipo fn[MAX_FN];
do{
n=lerInteiro(1000,9999,4);
encontrou=procurarCodigoFn(fn,*qtd,n);
if (encontrou>=0)
{
it[*qtd].equipa[i].cod_fn=n;
i++;
}
}while(n==0||i==100);
}
short int procurarCodigoEq(componente_tipo cp[],short int qtd, short int cod)
{ short int i, enc=-1;
for(i=0;i<qtd && enc==-1;i++)
if (cp[i].cod_cp==cod)
enc=i;
return enc;
}
// Lê dados de um equipamento e guarda no vetor
void inserirEquipamentos(componente_tipo eq[], short int *qtd)
{short int n, i, encontrou;
char valor[MAX_TXT];
struct tm *local;
time_t t;
printf("\n--- Dados do equipamento ---");
n=lerInteiro(100,999,3);
encontrou=procurarCodigoEq(eq,*qtd,n);
printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd);
while(encontrou>=0) // Significa que é repetido e não pode acontecer!!!
{
n=lerInteiro(100,999,3);
encontrou=procurarCodigoEq(eq,*qtd,n);
}
eq[*qtd].cod_cp=n;
lerChars(valor,50,"\nDescrição (max 50 caracteres):");
printf("\n\t %s ", valor);
strcpy(eq[*qtd].descricao,valor);
t= time(NULL);
local=localtime(&t);
eq[*qtd].data_compra.dia=local->tm_mday;
strncat(eq[*qtd].data_compra.mes, __DATE__ , 3);
eq[*qtd].data_compra.ano=local->tm_year+1900;
(*qtd)++; // Incrementa a quantidade de utentes existentes no vector
}
// Lê dados de uma intervenção e guarda no vetor
void inserirIntervencao(intervencao_tipo it[], short int *qtd)
{short int n, i, encontrou,m,qtd_eq=0;
char valor[MAX_TXT],s,estado;
struct tm *local;
time_t t;
componente_tipo vec_cp[100];
componente_tipo eq[100];
if (*qtd==MAX_IT)
printf("\nEste Porto não admite mais intervenções!!\n");
else
{
printf("\n--- Dados da Intervenção ---");
n=lerInteiro(100,999,3);
encontrou=procurarCodigoIt(it,*qtd,n);
printf("\n\t\t encontrou %hd e *qtd %hd ",encontrou, *qtd);
while(encontrou>=0) // Significa que é repetido e não pode acontecer!!!
{
n=lerInteiro(100,999,3);
encontrou=procurarCodigoIt(it,*qtd,n);
}
it[*qtd].cod_it=n;
do
{
encontrou=-1;
printf("\nQual é o componente principal?");
m=lerInteiro(100,999,3);
encontrou=procurarCodigoEq(eq,*qtd,m);
}
while(encontrou<0);
it[*qtd].cp_principal.cod_cp=m;
it[*qtd].tipo_intervencao=valtipo();
for(i=0;i<100;i++)
{
inserirEquipamentos(vec_cp,&qtd_eq);
}
for(i=0;i<100;i++)
{
n=lerInteiro(100,999,3);
//if(vec_cp[i]>0)
it[*qtd].vec_it[i]=valtipo();
}
it[*qtd].estado=alterarEstadoIntervencao(it,*qtd);
//it[*qtd].equipa=alterarEquipas(it,qtd);
}
(*qtd)++; // Incrementa a quantidade de utentes existentes no vector
}
void mostrarIt(intervencao_tipo it)
{ printf("\n--- Dados da Intervenção ---\n");
printf("\n Codigo: %hd",it.cod_it);
}
// Procura uma intervenção e mostra todos os seus dados
void mostrarDadosIt(intervencao_tipo it[], short int qtd)
{short int n, encontrou=0;
if (qtd==0)
printf("\nNeste momento, não existe nenhuma intervenção!!\n");
else
{
n=lerInteiro(100,999,3);
encontrou=procurarCodigoIt(it,qtd,n);
if (encontrou>=0)
mostrarIt(it[encontrou]);
else
printf("\n Não existe nenhuma intervenção com código = %hd",n);
}
getch();
}
// Recebe um equipamento por parâmetro e mostra os seus dados
void mostrarEq(componente_tipo cp)
{printf("\n--- Dados do Equipamento ---\n");
printf("\n Codigo: %hd",cp.cod_cp);
printf("\n Descrição: %s",cp.descricao);
}
// Procura um equipamento e mostra todos os seus dados
void mostrarDadosEq(componente_tipo cp[], short int qtd)
{short int n, encontrou=0;
if (qtd==0)
printf("\nEste Porto não tem equipamento!!\n");
else
{
n=lerInteiro(100,999,3);
encontrou=procurarCodigoEq(cp,qtd,n);
if (encontrou>=0)
mostrarEq(cp[encontrou]);
else
printf("\n Não existe nenhum equipamento com código = %hd",n);
}
getch();
}
// Menu de opções
char formulario()
{char r;
do
{
system ("cls");
system ("title GESTÃO DA MANUTENÇÃO DE EQUIPAMENTOS PORTUÁRIOS");
printf("\n\n===> INSERIR DADOS");
printf("\n1- Inserir informação sobre funcionários");
printf("\n2- Inserir informação sobre materiais (equipamentos/componentes)");
printf("\n3- Inserir informação sobre intervenção\n");
printf("\n\n===> LISTAGENS");
printf("\n4- Mostrar estado, equipa de manutenção e datas de todas as intervenções");
printf("\n5- Mostrar equipamentos e componentes com intervenções superiores à média");
printf("\n6- Mostrar equipas com melhores resultados de desempenho");
printf("\n\n===> ATUALIZAR DADOS");
printf("\n7- Eliminar um funcionário");
printf("\n8- Alterar o estado de uma intervenção");
printf("\n9- Alterar equipas de manutenção");
printf("\n\ns/S- Sair\n");
r=getch();
}while(r!='s' && r!='S' && r!='1' && r!='2' &&
r!='3' && r!='4' && r!='5' && r!='6' && r!='7' && r!='8');
return r;
}
// Função principal
int main()
{short int qtd_fn=0,qtd_eq=0,qtd_it=0,qtd_equipas=0;
funcionario_tipo vec_fn[MAX_FN];
componente_tipo vec_eq[MAX_IT];
intervencao_tipo vec_it[MAX_IT];
funcionario_tipo vec_equipas[100];
char ch;
do
{
ch=formulario();
switch (ch)
{
case '1':{ inserirFn(vec_fn,&qtd_fn); break; }
case '2':{ inserirEquipamentos(vec_eq,&qtd_eq); break; }
case '3':{ inserirIntervencao(vec_it,&qtd_it); break; }
case '4':{ mostrarDadosIt(vec_it,qtd_it); break; }
case '5':{ mostrarDadosEq(vec_eq,qtd_eq); break; }
//case '6':{ mostrarDadosEquipas(vec_equipas,qtd_equipas); break; }
case '7':{ eliminarFn(vec_fn,qtd_fn); break; }
case '8':{ alterarEstadoIntervencao(vec_it,qtd_it); break; }
//case '9':{ alterarEquipas(vec_equipas,qtd_equipas); break; }
}
}while(ch!='s' && ch!='S');
getch();
return 0;
}