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.#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;
}
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Gentoo bane contribuições de código feitas com IA (7)
Todo erro sempre gera um acerto... (11)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba