Ir para conteúdo
Fórum Script Brasil
  • 0

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


Matheus William

Pergunta

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;
}

 

Editado por Matheus William
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...