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>typedefstruct{longint codigo, cod_gerente;char nome[30],sigla[5];unsignedshortint ramal;}TDepartamento;typedefstruct{longint 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;typedefstruct{longint codfun, coddep;char data[11];}Thistoricofuncionario;typedefstruct{longint codgerente, coddep;char data[11];}Thistoricodepartamento;typedefstruct{longint codfun;unsignedshortint mes,ano;double salario;}Thistoricosalario;int pesquisaDep(FILE*da,longint*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;longint cod,codger;unsignedshortint 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)return0;elseif((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))return0;/*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)return0;/*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)return0;/*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");}elsedo{
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){case1:
cadDep(dep,func);break;case2:
cadFun(func, dep);break;case3:
consFun(func,dep);break;case5:
alteracaoFun(func,dep, histfun);break;case6:
alteracaoFunDep(func,dep,histfun);break;case7:
alteracaoGerenteDep(dep,func,histdep);case9:
alteracaoSalarioFun(func,histsal);break;}}while(opcao!=12);
fclose(func);
fclose(dep);
fclose(histfun);
fclose(histdep);
fclose(histsal);return0;}
Pergunta
Matheus William
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:
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.