Ir para conteúdo
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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por wolf_black
      preciso Escrever um algoritmo que leia três notas, calcule e imprima a média aritmética.
       
      #include <stdio.h>
      #include <stdlib.h>
      main () {
      float n1,n2,n3,media;
      printf(" digite a primeira nota");
      scanf("%f" & n1);
      printf("digite a segunda nota"); 
      scanf("%f" & n2);
      printf("digite a terceira nota");
      scanf("%f" & n3);
      media=n1+n2+n3/5;
      printf("a media foi: %f ",media                
      system("pause");
      return 0;
      }
      progama ficou assim mas esat dando o seguinte erros:

      7    14    C:\Users\User\Documents\atividade 2.cpp    [Error] invalid operands of types 'const char [3]' and 'float' to binary 'operator&'
      9    14    C:\Users\User\Documents\atividade 2.cpp    [Error] invalid operands of types 'const char [3]' and 'float' to binary 'operator&'
      11    14    C:\Users\User\Documents\atividade 2.cpp    [Error] invalid operands of types 'const char [3]' and 'float' to binary 'operator&'
      15    1    C:\Users\User\Documents\atividade 2.cpp    [Error] expected ')' before 'system'
       
      agradeço ajuda desde já. obrigada
       
    • Por alyssonw2silva
      Sou novo aqui e estou com o seguinte código 
      function buscar($query) { include_once 'conn.php'; if ($resulte2 = mysqli_query($conn, $query)) { while($row2 = mysqli_fetch_array($resulte2)) { print "<option value='".$row2[0]."'>".$row2[1]."</option>"; }; }; ele e para preencher os campos do meu select está funcionando mas como tenho outro select o primeiro roda agora o segundo da erro quando eu desabilito o primeiro  o segundo select e preenchido 
       
      estou chamando a mesma função para ambos os selects mas o parâmetro $query e diferente 
       
    • Por kaiquefigui
      sempre que uso o comando 'insert into cliente values...' diz que minha query foi atualiza e as linhas foram afetadas porem quando utilizo o comando 'desc cliente' não vejo alterações, como posso resolver esse problema?
      CREATE TABLE CLIENTE( NOME VARCHAR(30), SEXO CHAR(1), CPF CHAR(11), EMAIL VARCHAR(50), TELEFONE VARCHAR(30), ENDEREÇO VARCHAR(100) ); SHOW TABLES; DESC CLIENTE; INSERT INTO CLIENTE VALUES('KAUAN','M','23453678911','KAUAN@HOTMAIL.COM','254896534','ANTONIO HERDEIRO - SÃO PAULO - SP'); INSERT INTO CLIENTE VALUES('ADRIANA','F','24587630894','ADRIANA@HOTMAIL.COM','48652479','ANTONIO HERDEIRO - SÃO PAULO - SP'); INSERT INTO CLIENTE VALUES('KAIQUE','M','34221176809','KAIQUE@HOTMAIL.COM',NULL,'ANTONIO HERDEIRO - SÃO PAULO - SP'); INSERT INTO CLIENTE(NOME,SEXO,CPF,EMAIL,TELEFONE,ENDEREÇO) VALUES('MARCELA','F','15489652011','MARCELO@HOTMAIL.COM','245826157','ANTONIO HERDEIRO - SÃO PAULO - SP');  
    • Por Eduarda Lang Duarte
      O windows diz que não pode encontrar programas da Office 2010, eu ja tentei ir no Regedit e renomear o Office como Office.old e não funcionou, tentei reparar mas sempre aparece que não acha uma dll diferente. Eu já vi várias pessoas com o mesmo problema que eu, e disseram que é vírus, como eu resolvo? É minha primeira vez nesse site, se tiver algo errado, me falem que eu arrumo.
    • Por isaque_cb2
      Boa noite, estou postando qui por que pesquisei e não achei nada que ajudasse... bem, criei um banco de dados para armazenar meus projetos e carrega-los dinamicamente com o php, deu certo, mas quando tem alguma acentuação no texto ele retorna "�"... 
      ~Grato desde Já~
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.