Jump to content
Matheus William

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

Recommended Posts

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By jadson16
      Estou com um erro no site , esse site era de um jogo antigo que estava gravado no dvd ai tentei abrir ele só pra olhar mesmo e relembrar os velhos tempos mais não consigo arrumar, estou muito precisando de ajuda quem poder me ajudar por favor ficarei grato, vou postar a imagens dos seguinte erros:
       

      Esse é o primeiro erro que mostra e quando vou olhar na linha 460 está assim


       
    • By Full Burn
      Bom dia,
       
      Estou com um problema bem estranho e chato no WP.
       
      Vou logar no painel, coloco o login e a senha corretos, mas depois de enviar, ele volta no login. Não dá nem o alerta de senha errada, pois ela está certa. Apenas volta no login e não abre o painel.
       
      Para entrar, tenho que pedir resgate de senha, fazer o procedimento de trocar a senha e aí consigo entrar. Mas depois de sair, fechar o navegador e tentar entrar de novo, acontece a mesma coisa e tenho que novamente pedir resgate de senha para conseguir entrar.
       
      Alguém já viu isso e sabe me dizer o que é?
       
      Já atualizei a versão do WP e não resolveu.
       
      Agradeço pela ajuda.
    • By christin cley
      Construir um algoritmo em C++ que preencha um matriz quadrada de tamanho 4 pelo usuário. Após o preenchimento pelo usuário, verifique na diagonal principal qual foi o maior valor digitado e exiba na tela o valor. Por fim,  exiba na tela toda matriz em forma de matriz na tela.
    • By andreluizsgf
      Boa noite, eu estou tentando implementar uma função que imprima uma árvore como ela deveria ser, com o pai acima e a direita do menor filho e acima e a esquerda do maior filho. 
      Já tenho duas funcões que me permitem imprimir por nível, porém estou tentando adaptá-las para a impressão correta. Exemplo:
      árvore: 5,4,3,2,1;
      Impressão:
                  5
          3             4
      1      2

      O código para o print é este:
       
      void ---ivel(node_t* raiz, int level) { if (raiz == NULL){ for(int i = 0 ; i < 3 ; i++){ printf("\t"); return;} } if (level == 1) { for (int i=0; i<altura(raiz); i++) printf("\t"); simpleprint(raiz); } else if (level > 1) { ---ivel(raiz->left, level-1); ---ivel(raiz->right, level-1); } }   void printarordem(node_t *raiz) { int h = altura(raiz); int i; for (i=1; i<=h; i++) { printf("\t"); ---ivel(raiz, i); printf("\n"); } }

      Se alguém souber como resolver este ou sugerir outra implementação, fico super agradecido! 
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.