Controle de funcionários(erro na gravação de dados)

1. Controle de funcionários(erro na gravação de dados)

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/11/2018 - 14:21h

Olá pessoal tudo bem? Eu estou fazendo um programa para controle de funcionários em C, e estou com problemas em algumas partes do código.Os dados de cadastramento de funcionário e departamento não está sendo gravados nos seus respectivos arquivo, e em "cadastrar departamento" depois de digitar o código do departamento que sera criado e apertar enter o programa buga.



Segue o código:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

typedef struct{
long int codigo, cod_gerente;
char nome[30],sigla[5];
unsigned short int ramal;
}TDepartamento;

typedef struct{
long int cod_dep, numero;
char nome[60],matricula[10],dataNascimento[11],cpf[12],rua[40],bairro[30],
complemento[20],cidade[30],estado[3],telefone[15],email[30];
double salario;
}TFuncionario;

typedef struct{
long int codfun, coddep;
char data[11];
}Thistoricofuncionario;

typedef struct{
long int codgerente, coddep;
char data[11];
}Thistoricodepartamento;

typedef struct{
long int codfun;
unsigned short int mes,ano;
double salario;
}Thistoricosalario;

int pesquisaDep(FILE *da, long int *cod){
TDepartamento v;
int posicao=0;
/*posição no início do arquivo*/
fseek(da,0,SEEK_SET);
while(fread(&v,sizeof(TDepartamento),1,da)==1){
if(v.codigo==cod)
return posicao;
else
posicao++;
}
return -1;
}
/*retorna a posiço do registro ou -1 se não encontrar*/
int pesquisaFun(FILE *a, char *matricula){
TFuncionario r;
int posicao=0;
/*posição no início do arquivo*/
fseek(a,0,SEEK_SET);
while(fread(&r,sizeof(TFuncionario),1,a)==1){
if(r.matricula==matricula)
return posicao;
else
posicao++;
}
return -1;
}


/*Cadastrar um Departamento*/
void cadDep(FILE *da, FILE *a){
int sair,p;
long int cod,codger;
unsigned short int ch;
TDepartamento vd;
do{
printf("\n******************************************************\n");
printf("\n* Cadastramento de Departamento *\n");
printf("\n******************************************************\n");
printf("\nCódigo do Departamento:");
scanf("%li",&cod);
if(pesquisaDep(da,cod)==-1){
strcpy(vd.codigo,cod);
setbuf(stdin,NULL);
printf("\nNome do departamento:");
fgets(vd.nome,30,stdin);
setbuf(stdin,NULL);
if((strlen(vd.nome)==0) || (strcmp(vd.nome,"0")==0)){
printf("\nO campo nome não pode estar vazio!Digite novamente:");
fgets(vd.nome,30,stdin);
}
printf("\nSigla do Departamanto:");
fgets(vd.sigla,5,stdin);
setbuf(stdin,NULL);
printf("\nCodigo do funcionario que será gerente do departamento:");
scanf("%li",codger);
if(pesquisaFun(a,codger)==-1)
strcpy(vd.cod_gerente,codger);
else
printf("\nMatricula de funcionario inexistente!!!");
printf("\nRamal:");
fflush(stdin);
scanf("%d",&ch);
if(isdigit(ch)){
strcpy(vd.ramal,ch);
}
else{
printf("voce não digitou um numero!!!\n\n");
scanf("%d",&ch);
}

/*posicionando no final do arquivo*/
fseek(da,0,SEEK_END);
fwrite(&vd,sizeof(TDepartamento),1,da);

}
else
printf("\nDepartamento já existe!!!!");

printf("\n\nDeseja sair do cadastro? 1-Sim 2-Não ");
scanf("%d",&sair);
}while(sair!=1);
}

/*Validar o CPF do funcionario*/
int validarCPF(char cpf[]){
int i, j, digito1 = 0, digito2 = 0;
if(strlen(cpf) != 11)
return 0;
else if((strcmp(cpf,"00000000000") == 0) || (strcmp(cpf,"11111111111") == 0) || (strcmp(cpf,"22222222222") == 0) ||
(strcmp(cpf,"33333333333") == 0) || (strcmp(cpf,"44444444444") == 0) || (strcmp(cpf,"55555555555") == 0) ||
(strcmp(cpf,"66666666666") == 0) || (strcmp(cpf,"77777777777") == 0) || (strcmp(cpf,"88888888888") == 0) ||
(strcmp(cpf,"99999999999") == 0))
return 0; /*se o CPF tiver todos os números iguais ele é inválido.*/
else{
/*digito 1---------------------------------------------------*/
for(i = 0, j = 10; i < strlen(cpf)-2; i++, j--) /*multiplica os números de 10 a 2 e soma os resultados dentro de digito1*/
digito1 += (cpf[i]-48) * j;
digito1 %= 11;
if(digito1 < 2)
digito1 = 0;
else
digito1 = 11 - digito1;
if((cpf[9]-48) != digito1)
return 0; /*se o digito 1 não for o mesmo que o da validação CPF é inválido*/
else{
/*digito 2--------------------------------------------------*/
for(i = 0, j = 11; i < strlen(cpf)-1; i++, j--) /*multiplica os números de 11 a 2 e soma os resultados dentro de digito2*/
digito2 += (cpf[i]-48) * j;
digito2 %= 11;
if(digito2 < 2)
digito2 = 0;
else
digito2 = 11 - digito2;
if((cpf[10]-48) != digito2)
return 0; /*se o digito 2 não for o mesmo que o da validação CPF é inválido*/
}
}
return -1;
}


/*Cadastrar um funcionario*/
void cadFun(FILE *a, FILE *da){
int i,cod,sair,achou,data;
char mat[10],cp[11];
TFuncionario vf;
TDepartamento vd;
do{
printf("\n******************************************************\n");
printf("\n* Cadastramento de Funcionarios *\n");
printf("\n******************************************************\n");

printf("\nForneça a matricula:");
fgets(mat,10,stdin);
if(pesquisaFun(a,mat)==-1){
strcpy(vf.matricula,mat);
setbuf(stdin,NULL);
printf("\nNome do Funcionario:");
fgets(vf.nome,60,stdin);
setbuf(stdin,NULL);
if(vf.nome==NULL){
printf("\nO nome não pode estar vazio!!!");
fgets(vf.nome,60,stdin);
setbuf(stdin,NULL);
}
printf("\nSalario do Funcionario:");
scanf("%lf",&vf.salario);
setbuf(stdin,NULL);
printf("\nData de nascimento:");
fgets(vf.dataNascimento,11,stdin);
setbuf(stdin,NULL);

printf("\nCPF:");
fgets(cp,12,stdin);
setbuf(stdin,NULL);
if(validarCPF(cp)==-1)
strcpy(vf.cpf,cp);
else{
printf("\nCPF inválido!Digite-o novamente:");
fgets(cp,12,stdin);
setbuf(stdin,NULL);
}


printf("\n******************************************************\n");
printf("\n* Endereço *\n");
printf("\n******************************************************\n");
printf("\nRua:");
fgets(vf.rua,40,stdin);
setbuf(stdin,NULL);
printf("\nBairro:");
fgets(vf.bairro,30,stdin);
setbuf(stdin,NULL);
printf("\nNúmero:");
scanf("%li",&vf.numero);
setbuf(stdin,NULL);
printf("\nComplemento:");
fgets(vf.complemento,20,stdin);
setbuf(stdin,NULL);
printf("\nCidade:");
fgets(vf.cidade,30,stdin);
setbuf(stdin,NULL);
printf("\nEstado:");
fgets(vf.estado,3,stdin);
setbuf(stdin,NULL);

printf("\n******************************************************\n");
printf("\n* Informações de contato *\n");
printf("\n******************************************************\n");
printf("\nTelefone:");
fgets(vf.telefone,15,stdin);
setbuf(stdin,NULL);
printf("\nE-mail:");
fgets(vf.email,30,stdin);
setbuf(stdin,NULL);
printf("\nForneça o Código do departamento:");
scanf("%d",&cod);
if(pesquisaDep(da,cod)==-1)
strcpy(vf.cod_dep,cod);
else
printf("\nDepartamento inexistente!!!");


/*posicionando no final do arquivo*/
fseek(a,0,SEEK_END);
fwrite(&vf,sizeof(TFuncionario),1,a);

}
else
printf("\nMatricula de funcionario repetida!!!!");
printf("\n\nDeseja sair do cadastro? 1-Sim 2-Não ");
scanf("%d",&sair);

}while(sair!=1);
}


/*Consultar um funcionario cadastrado*/
void consFun(FILE *a, FILE *da){
int sair,p;
TFuncionario rf;
do{
printf("\nForneça a matricula:");
fgets(rf.matricula,10,stdin);
if(pesquisaFun(a,rf.matricula)==-1){

/*posicionando no final do arquivo*/
fseek(a,sizeof(TFuncionario)*p,SEEK_SET);
fread(&rf,sizeof(TFuncionario),1,a);
printf("\n******************************************************\n");
printf("\n* Dados do Funcionario *\n");
printf("\n******************************************************\n");
printf("\nMatricula: %s",&rf.matricula);
printf("\nNome: %s",&rf.nome);
printf("\nSalario: %.2f",&rf.salario);
printf("\nData de nascimento: %s",&rf.dataNascimento);
printf("\nCPF: %s",&rf.cpf);
printf("\nRua: %s",&rf.rua);
printf("\nBairro: %s",&rf.bairro);
printf("\nNúmero: %li",&rf.numero);
printf("\nComplemento: %s",&rf.complemento);
printf("\nCidade: %s",&rf.cidade);
printf("\nEstado: %s",&rf.estado);
printf("\nTelefone: %s",&rf.telefone);
printf("\nE-mail: %s",&rf.email);

}
else
printf("\nMatriclua inexistente!!!");

printf("\n\nDeseja sair da consulta? 1-Sim 2-Não ");
scanf("%d",&sair);
}while(sair!=1);
}


/*Alterar os dados de um funcionario e atualizar o arquivo histfun*/
void alteracaoFun(FILE *a,FILE *da, FILE *hist){
int cod,sair,achou,data,p;
char cp[11];
TFuncionario rf;
TDepartamento rd;
do{

printf("\n******************************************************\n");
printf("\n* Alteração de Dados do Funcionarios *\n");
printf("\n******************************************************\n");

printf("\nForneça a matricula:");
fgets(rf.matricula,10,stdin);

p=pesquisaFun(a,rf.matricula);
if(p==-1){

setbuf(stdin,NULL);
printf("\nNome do Funcionario:");
fgets(rf.nome,60,stdin);
if(rf.nome==NULL){
printf("\nO nome não pode estar vazio!!!");
fgets(rf.nome,60,stdin);
}
setbuf(stdin,NULL);
printf("\nData de nascimento:");
fgets(rf.dataNascimento,11,stdin);
setbuf(stdin,NULL);

printf("\nCPF:");
fgets(cp,12,stdin);

if(validarCPF(cp)==1)
strcmp(rf.cpf,cp);
else{
printf("\nCPF inválido!Digite-o novamente:");
fgets(cp,12,stdin);
}
setbuf(stdin,NULL);

printf("\n******************************************************\n");
printf("\n* Endereço *\n");
printf("\n******************************************************\n");
printf("\nRua:");
fgets(rf.rua,40,stdin);
setbuf(stdin,NULL);
printf("\nBairro:");
fgets(rf.bairro,30,stdin);
setbuf(stdin,NULL);
printf("\nNúmero:");
scanf("%li",&rf.numero);
setbuf(stdin,NULL);
printf("\nComplemento:");
fgets(rf.complemento,20,stdin);
setbuf(stdin,NULL);
printf("\nCidade:");
fgets(rf.cidade,30,stdin);
setbuf(stdin,NULL);
printf("\nEstado:");
fgets(rf.estado,3,stdin);
setbuf(stdin,NULL);

printf("\n******************************************************\n");
printf("\n* Informações de contato *\n");
printf("\n******************************************************\n");
printf("\nTelefone:");
fgets(rf.telefone,15,stdin);
setbuf(stdin,NULL);
printf("\nE-mail:");
fgets(rf.email,30,stdin);
setbuf(stdin,NULL);

/*posicionando no final do arquivo*/
fseek(a,sizeof(TFuncionario)*p,SEEK_SET);
fwrite(&rf,sizeof(TFuncionario),1,a);
}
else
printf("\nMatriclua inexistente!!!");

printf("\n\nDeseja sair da alteração? 1-Sim 2-Não ");
scanf("%d",&sair);

}while(sair!=1);
}


/*Alterar o departamento do funcionario e atualizar o arquivo histdep*/
void alteracaoFunDep(FILE *a,FILE *da, FILE *hist){
int sair,p,cod,achou;
TFuncionario rf;
TDepartamento rd;
do{
printf("\nForneça a matricula do funcionario:");
fgets(rf.matricula,10,stdin);

p=pesquisaFun(a,rf.matricula);
if(p==-1){
do{
setbuf(stdin,NULL);
printf("\nForneça o novo departamento do funcionario:");
fgets(rf.cod_dep,60,stdin);
setbuf(stdin,NULL);
achou=0;
if(pesquisaDep(da,rd.codigo)==1)
printf("\nDepartamento não cadastrado!!!");
else
achou=1;
}while(achou==0);
strcpy(rf.cod_dep,cod);

/*posicionando no final do arquivo*/
fseek(a,sizeof(TFuncionario)*p,SEEK_SET);
fwrite(&rf,sizeof(TFuncionario),1,a);
}
else
printf("\nMatriclua inexistente!!!");

printf("\n\nDeseja sair da alteração? 1-Sim 2-Não ");
scanf("%d",&sair);
}while(sair!=1);
}

/*Alterar o salario do funcionario*/
void alteracaoSalarioFun(FILE *a,FILE *hist){
int sair,p,cod,achou;
TFuncionario rf;
TDepartamento rd;
do{
printf("\nForneça a matricula do funcionario:");
fgets(rf.matricula,10,stdin);

p=pesquisaFun(a,rf.matricula);
if(p==-1){
setbuf(stdin,NULL);
printf("\nForneça o novo salario do funcionario:");
scanf("%lf",&rf.salario);
setbuf(stdin,NULL);

/*posicionando no final do arquivo*/
fseek(a,sizeof(TFuncionario)*p,SEEK_SET);
fwrite(&rf,sizeof(TFuncionario),1,a);
}
else
printf("\nMatriclua inexistente!!!");

printf("\n\nDeseja sair da alteração? 1-Sim 2-Não ");
scanf("%d",&sair);
}while(sair!=1);
}

/*Alterar o salario do funcionario e atualizar o arquivo histsal*/
void alteracaoGerenteDep(FILE *da,FILE *a, FILE *hist){
int sair,p,cod,achou;
TFuncionario rf;
TDepartamento rd;
do{
printf("\nForneça o codigo do departamento:");
scanf("%li",&rd.codigo);

p=pesquisaDep(da,rd.codigo);
if(p==-1){
setbuf(stdin,NULL);
printf("\nForneça a matricula do novo gerente do departamento:");
scanf("%li",&rd.cod_gerente);
setbuf(stdin,NULL);

/*posicionando no final do arquivo*/
fseek(a,sizeof(TFuncionario)*p,SEEK_SET);
fwrite(&rf,sizeof(TFuncionario),1,a);
}
else
printf("\nMatriclua inexistente!!!");

printf("\n\nDeseja sair da alteração? 1-Sim 2-Não ");
scanf("%d",&sair);
}while(sair!=1);
}


int main(){
FILE *func;
FILE *dep;
FILE *histfun;
FILE *histdep;
FILE*histsal;
int opcao;
func = fopen("funcionario.dat","rb+");
dep = fopen("departamento.dat","rb+");
histfun = fopen("histfun.dat","rb+");
histdep = fopen("histdep.dat","rb+");
histsal = fopen("histsal.dat","rb+");

if (dep==NULL)
dep=fopen("departamento.dat","wb+");
if (dep==NULL){
printf("\nErro na abertura do arquivo");
}
else
func=fopen("funcionario.dat","rb+");
if(func==NULL){
func=fopen("funcionario.dat","wb+");
}
if(func==NULL){
printf("\nErro na abertura do arquivo");
}
else{
histfun=fopen("histfun.dat","rb+");
}
if(histfun==NULL){
histfun=fopen("histfun.dat","wb+");
}
if(histfun==NULL){
printf("\nErro na abertura do arquivo");
}
else{
histdep=fopen("histdep.dat","rb+");
}
if(histdep==NULL){
histdep=fopen("histdep.dat","wb+");
}
if(histdep==NULL){
printf("\nErro na abetura do arquivo");
}
else{
histsal=fopen("histsal.dat","rb+");
}
if(histsal==NULL){
histsal=fopen("histsal.dat","wb+");
}
if(histsal==NULL){
printf("\nErro na abertura do arquivo");
}

else
do{
printf("\n******************************************************\n");
printf("\n* Controle de Funcionarios *\n");
printf("\n******************************************************\n");
printf("\n1-Cadastro de Departamentos\n2-Cadastro de Funcionarios");
printf("\n3-Consultar Funcionario");
printf("\n4-Relatorio de Funcionários por Departamento");
printf("\n5-Alterar um funcionario");
printf("\n6-Alterar Departamento de um Funcionario");
printf("\n7-Alterar Gerente de um Departamento");
printf("\n8-Gerar Folha de Pagamento");
printf("\n9-Alterar o salario de um Funcionario");
printf("\n10-Historico de Salario em um periodo");
printf("\n11-Gerentes de um Departamento");
printf("\n12-Fim\nForneça sua opção:");
scanf("%d", &opcao);
switch(opcao){
case 1:
cadDep(dep,func);
break;
case 2:
cadFun(func, dep);
break;
case 3:
consFun(func,dep);
break;
case 5:
alteracaoFun(func,dep, histfun);
break;
case 6:
alteracaoFunDep(func,dep,histfun);
break;
case 7:
alteracaoGerenteDep(dep,func,histdep);
case 9:
alteracaoSalarioFun(func,histsal);
break;

}
}while(opcao!=12);
fclose(func);
fclose(dep);
fclose(histfun);
fclose(histdep);
fclose(histsal);
return 0;
}



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts