Ir ao conteúdo
  • Cadastre-se
luiz_l

C auxilio para pontar erro na funcao do meu cadastro e uma solucao

Posts recomendados

ola pessoal tudo bem to precisando de uma ajuda para fazer cadastro ele ta quase completo , a  minha ideia é fazer dois tipo de funcao uma preencher e a outra imprimir. Nao estou conseguindo fazer a funcao imprimir e coletar, e quando coleta o programa coleta os dados incorreto olha meu codigo abaixo: 

 

estrutura.h  

typedef struct {
   int dia;
   int mes;
   int ano;
} data;

typedef struct {
   char cpf[15];
   char nome[51];
   data data_nascimento;
   float salario;
} registro_funcionario;






#include<string.h>
#include <stdio.h>
#include <stdlib.h>
#include "estrutura.h"



void prencher(registro_funcionario*funcionario){

        printf(">> Cadastro Salarial de Funcionarios <<\n");

        printf("\nInforme os dados solicitados dos funcionarios (digite 0 no CPF para sair)...\n");

        funcionario = malloc(sizeof(registro_funcionario));
            int num =0,p=0,u=0;
            int i,qtd;
            int dia, mes, ano;
            float media;


           do{
            printf("\nPessoa %d", p+1);
            fflush(stdin);
            printf("\nCPF: ");
            scanf("%s", &funcionario[num].cpf);

             if (strcmp(funcionario[num].cpf, "0") != 0){
                    //(funcionario->cpf[num]
                       //funcionario[quantidade].cpf

               // printf("Nome: ");
               // scanf("%s",&funcionario[num].nome);
                //fflush(stdin);

               //printf("Digite a Data Nascimento (use >>/<< ): ");


              //printf("Salario: ");
               // scanf("%f", &funcionario[num].salario);

        // scanf("%i/%i/%i", &funcionario[num].data_nascimento.dia, &funcionario[num].data_nascimento.mes,
              // &funcionario[num].data_nascimento.ano);

                num++;
                p++;
                funcionario = realloc(funcionario, sizeof(registro_funcionario)*(num+1));

             }

        }while (strcmp(funcionario[num].cpf, "0") != 0);

}

void imprimir(registro_funcionario *funcionario, int *num){

*num= n;

n=0;

       for(i=0;i<n;i++){

     printf("cpf %s",funcionario[i].cpf);

       }
}


int main(){

int num=0,i,n,count;

float media;


    registro_funcionario(funcionario);

    preencher(&funcionario);


    imprimir(&funcionario);

return 0;
}

 

 

 

como podem ver estou apenas testando com cpf por isso que outros tipo como salarios ,data de nascimento e nome estão como anotacao. Eu  tava testando apenas o cpf pra se imprimia os dados.

Só que nao estou conseguindo, ja tentei de varias maneira a minha ideia  É PEGAR ESSE NUMM++ ESTA ACUMULADO NA FUNCAO PRRENCHER E USAR ELE NA FUNCAO IMPRIMIR PRA FAZER O LAÇO FOR . EIS O PROBLEMA NAO CONSIGO PEGAR ESSE NUM PaRA usar na FUNÇÃO IMPRIMIR ja tentei usar ele como parametro por referencia e nao consegui usei ele assim void imprimir(registro_funcionario *funcionario, int *num) e também  assim void imprimir(registro_funcionario *funcionario, int num) nao consegui e tambem ja tentei usar ponteiro, por favor alguem  me ajude.

 

na funcao imprimir mostrada ai , foi a ultima vez que eu tentei fazer, ja tentei outras e nao consegui resultados;

texto longo me desculpe sou novato em linguagem C. 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@luiz_l    com algumas modificações seu código funcionou e está pegando o que foi preenchido , 

typedef struct {
   int dia;
   int mes;
   int ano;
} data;
typedef struct {
   char cpf[15];
   char nome[51];
   data data_nascimento;
   float salario;
} registro_funcionario;
#include<string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int num;/* aqui todas as variáveis são criadas e inicializadas com valor zero */
/* e podem ser acessadas em qualquer parte do programa e esse num será usado apenas para contagem de cadastros*/
//#include "estrutura.h"
void preencher(registro_funcionario funcionario[]){
    printf(">> Cadastro Salarial de Funcionarios << ");
    printf("\nInforme os dados solicitados dos funcionarios (digite 0 no CPF para sair)...\n");
//    funcionario = malloc(sizeof(registro_funcionario));
        int p=0,u=0;
        int i,qtd;
        int dia, mes, ano;
        float media;
         do{
             printf("\nPessoa %d", p+1);
             fflush(stdin);
             printf("\nCPF: ");
             scanf("%s",funcionario[num].cpf);/* aqui já armazenou o cadastro do cpf */
             printf("%s   Tecle !\n",funcionario[num].cpf);
             getch();/* para ver o que digitou */
             if (strcmp(funcionario[num].cpf, "0") != 0){/* não precisa desse  if  */
                 //funcionario->cpf[num];
                 //funcionario[quantidade].cpf
                 // printf("Nome: ");
                 // scanf("%s",&funcionario[num].nome);
                 //fflush(stdin);

               //printf("Digite a Data Nascimento (use >>/<< ): ");


              //printf("Salario: ");
               // scanf("%f", &funcionario[num].salario);

        // scanf("%i/%i/%i", &funcionario[num].data_nascimento.dia, &funcionario[num].data_nascimento.mes,
              // &funcionario[num].data_nascimento.ano);

                num++;
                p++;
//                funcionario = realloc(funcionario, sizeof(registro_funcionario)*(num+1));

             }

        }while (strcmp(funcionario[num].cpf, "0") != 0);

}

void imprimir(registro_funcionario *funcionario){

//*num= n;

//n=0;
int i,n=2;
    for(i=0;i<num;i++){
        printf("Na Funcao imprimir -> ");
        printf("cpf %s",funcionario[i].cpf);
    }
}


int main(){
    int num=0,i,n,count;
    float media;
    registro_funcionario(funcionario);
    preencher(&funcionario);
    imprimir(&funcionario);
    getch();
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, devair1010 disse:

@luiz_l    com algumas modificações seu código funcionou e está pegando o que foi preenchido , 


typedef struct {
   int dia;
   int mes;
   int ano;
} data;
typedef struct {
   char cpf[15];
   char nome[51];
   data data_nascimento;
   float salario;
} registro_funcionario;
#include<string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int num;/* aqui todas as variáveis são criadas e inicializadas com valor zero */
/* e podem ser acessadas em qualquer parte do programa e esse num será usado apenas para contagem de cadastros*/
//#include "estrutura.h"
void preencher(registro_funcionario funcionario[]){
    printf(">> Cadastro Salarial de Funcionarios << ");
    printf("\nInforme os dados solicitados dos funcionarios (digite 0 no CPF para sair)...\n");
//    funcionario = malloc(sizeof(registro_funcionario));
        int p=0,u=0;
        int i,qtd;
        int dia, mes, ano;
        float media;
         do{
             printf("\nPessoa %d", p+1);
             fflush(stdin);
             printf("\nCPF: ");
             scanf("%s",funcionario[num].cpf);/* aqui já armazenou o cadastro do cpf */
             printf("%s   Tecle !\n",funcionario[num].cpf);
             getch();/* para ver o que digitou */
             if (strcmp(funcionario[num].cpf, "0") != 0){/* não precisa desse  if  */
                 //funcionario->cpf[num];
                 //funcionario[quantidade].cpf
                 // printf("Nome: ");
                 // scanf("%s",&funcionario[num].nome);
                 //fflush(stdin);

               //printf("Digite a Data Nascimento (use >>/<< ): ");


              //printf("Salario: ");
               // scanf("%f", &funcionario[num].salario);

        // scanf("%i/%i/%i", &funcionario[num].data_nascimento.dia, &funcionario[num].data_nascimento.mes,
              // &funcionario[num].data_nascimento.ano);

                num++;
                p++;
//                funcionario = realloc(funcionario, sizeof(registro_funcionario)*(num+1));

             }

        }while (strcmp(funcionario[num].cpf, "0") != 0);

}

void imprimir(registro_funcionario *funcionario){

//*num= n;

//n=0;
int i,n=2;
    for(i=0;i<num;i++){
        printf("Na Funcao imprimir -> ");
        printf("cpf %s",funcionario[i].cpf);
    }
}


int main(){
    int num=0,i,n,count;
    float media;
    registro_funcionario(funcionario);
    preencher(&funcionario);
    imprimir(&funcionario);
    getch();
    return 0;
}

 

muito obrigado ajudou bastante

adicionado 45 minutos depois

Só mais uma pergunta no código acima você colocou a variável "num" dentro da struct registro funcionário beleza ok mas se eu não quiser alterar a struct registro funcionário. Como eu faço para pegar a variável 'num' dentro função preencher e acumular na função imprimir e fazer um laço?? Poderia me mostrar um exemplo?

 

É que preciso saber como faz parametro com e sem retorno eu me confundo nisso. E também dps que eu fazer a cadastro vou tem que fazer a média do salário então vou tem criar variável média numa função média. 

Como faço para pegar de novo essa variável 'num' e fazer um laço pra fazer a média na função média ?

 

Obs: nesse trabalho não posso criar a média dentro da função preencher e nem da imprimir por isso vou tem que criar uma função média.

Não posso adicionar variável na struct registro funcionário.

 

Desculpe outra vez o texto longo

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

recomendo você fazer uma organização melhor no código

Exemplo

hearder

Spoiler

#ifndef FUNCIONARIO_H
#define FUNCIONARIO_H
/* Interface */
#include <stdio.h>
#include <stdlib.h>

/* Constantes */
#define T_NOME 30
#define T_CPF 15

/* Tipos */
typedef struct
{
  unsigned short dia,mes,ano;
}TData;

typedef struct
{
  char nome[T_NOME];
  char cpf[T_CPF];
  TData nascimento;
  float salario;
}TFuncionario;

/* Procedimentos */
void CadastraFuncionario(TFuncionario **funcionarios, int *quantidade);

void MostraCasdastros(TFuncionario *funcionarios, const int quantidade);
#endif

 

fonte

Spoiler

#include "func.h"

/* Implementação */
void CadastraFuncionario(TFuncionario **funcionarios, int *quantidade)
{
  char tecla;
  do
  {
    TFuncionario temp,*lista=NULL;
    printf("\nCadastro salarial de funcionarios.");
    printf("\nInforme os dados solicitados dos funcionarios.");
    printf("\nPessoa %i",(*quantidade)+1);
    printf("\nNome:");
    fgets(temp.nome,T_NOME,stdin);
    printf("\nCPF:");
    scanf(" %s",temp.cpf);
    printf("\nData de nascimento.");
    printf("\nDia:");
    scanf(" %hu",&temp.nascimento.dia);
    printf("\nMes:");
    scanf(" %hu",&temp.nascimento.mes);
    printf("\nAno:");
    scanf(" %hu",&temp.nascimento.ano);
    printf("\nOs dados estão corretos\?\nS/N:");
    scanf(" %c",&tecla);
    if(tecla=='s'||tecla=='S')
    {
      int n1;
      lista=malloc(sizeof(TFuncionario)*((*quantidade)+1));
      if(!lista)    /* ERRO */
      {
        perror("ERRO GRAVE : não foi possivel reservar memoria do sistema.");
        exit(EXIT_FAILURE);
      }
      lista[*quantidade]=temp;
      for(n1=0; n1<*quantidade; n1++)
        lista[n1]=(*funcionarios)[n1];
      free(*funcionarios);
      *funcionarios=lista;
      (*quantidade)++;
      printf("\nCadastro Salvo.");
    }
    else
      printf("\nCadastro descartado.");
    printf("\nDeseja continuar cadastrando\?\nS/N:");
    scanf(" %c",&tecla);
    getchar();
  }while(tecla=='s'||tecla=='S');
}

void MostraCasdastros(TFuncionario *funcionarios, const int quantidade)
{
  int n1;
  for(n1=0; n1<quantidade; n1++)
  {
    printf("\nNome:%s",funcionarios[n1].nome);
    printf("\nCPF:%s",funcionarios[n1].cpf);
    printf("\nData de nascimento:%hu/%hu/%hu",funcionarios[n1].nascimento.dia,funcionarios[n1].nascimento.mes,funcionarios[n1].nascimento.ano);
    printf("\n");
  }
}

 

main

Spoiler

#include <stdio.h>
#include <stdlib.h>
#include "func.h"


int main(void)
{
  int quantidade=0;
  TFuncionario *funcionarios=NULL;
  CadastraFuncionario(&funcionarios,&quantidade);
  MostraCasdastros(funcionarios,quantidade);
  getchar();
  free(funcionarios);
  return(0);
}

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KXSY  muito obrigado vou refazer meu codigo mas eu fiquei com algumas duvida o que seria  "const int" que tu usou?

55 minutos atrás, KXSY disse:

void MostraCasdastros(TFuncionario *funcionarios, const int quantidade)

 

E o que seria "unsigned short"?

56 minutos atrás, KXSY disse:

unsigned short dia,mes,ano;

 

e também nao entendi porque você utulizou esse laço for????

1 hora atrás, KXSY disse:

lista[*quantidade]=temp;     

for(n1=0; n1<*quantidade; n1++)    

lista[n1]=(*funcionarios)[n1]; free(*funcionarios);     

*funcionarios=lista;    

(*quantidade)++;   

printf("\nCadastro Salvo."); }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, luiz_l disse:

@KXSY  muito obrigado vou refazer meu codigo mas eu fiquei com algumas duvida o que seria  "const int" que tu usou?

Significa que a minha função não vai alterar o valor, Vai ser sempre constante.

4 minutos atrás, luiz_l disse:

E o que seria "unsigned short"?

É o tipo int sem sinal e mais curto, só podendo variar entre 0..65,535 (geralmente quando se declara o tipo int ele pode variar entre -2,147,483,648 até -2,147,483,647 pode depender do computador e do sistema)

Mais informações aqui Data types in C

8 minutos atrás, luiz_l disse:

e também nao entendi porque você utulizou esse laço for????

A ideia geral é cria uma lista nova toda vez que cadastrar um novo funcionário e passar todos os dados da lista velha para a nova, é por fim apagar a lista antiga (quando eu estou falado de lista quero dizer o vetor) e passa para o ponteiro antigo.

  • Curtir 1

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





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...