How to block the insertion of information using a List

Asked

Viewed 119 times

1

Well I’m using list structure and I’ve tried everything and so far I can’t. I am trying to get the product entity to receive ONLY the CPF from a vendor. The entity Product works when the entity Pessoa has nothing inside or until I insert a second person in the register, after that the product registration accepts anything. If anyone can help I’d appreciate it.

main. c

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

int main()
{
/////Produto
Produto prod1;
int id;
float preco;
int cpfFornecedor;
char nome_prod1[20];
int quantidade;
prod1 = produto_iniciar();

/////////
//provisorio
int prov;

/////Pessoa
Pessoa p1;
int cpf;
char nome[20];
char tipo;
p1 = pessoa_iniciar();
////////////

/////Compra

    Compra compra1;
    int id_compra;
    int cpfCliente;
    int cpfEmpregado;
    Produto produtos;
    float valorTotal;
    int dia,mes,ano;
    compra1= compra_iniciar();
 /////////////////////////

int entidade;



do{
printf("MENU: \n");
printf("1. Inserir Produto\n");
printf("2. Inserir Pessoa\n");
printf("3. Inserir Compra\n");
printf("4. Imprimir produtos pelo ID\n");
printf("999. Imprimir tudo\n\n");
printf("Op%c%co: ",135,198);
scanf("%d",&entidade);
printf("\n");

//////// PRODUTO




if(entidade==1){
    do{
        printf("ID: ");
        scanf("%d",&id);
        if(produto_busca_produto(prod1,id)==0){
        if(id==-1)break;
        fflush(stdin);
        printf("Pre%co: ",135);
        scanf("%f",&preco);
        printf("CPF do Fornecedor: ");
        scanf("%d",&cpfFornecedor);
            while(pessoa_verifica_tipo(tipo)!=1){
            printf("Erro de cadastro! Digite o CPF de um fornecedor: ");
            scanf("%d",&cpfFornecedor);
            if(cpfFornecedor==-1)break;
            }
        if(cpfFornecedor==-1)break;
        fflush(stdin);
        printf("Nome: ");
        fgets(nome_prod1,20,stdin);
        fflush(stdin);
        printf("Quantidade: ");
        fflush(stdin);
        scanf("%d",&quantidade);
         printf("\n");
            while(verifica_quantidade(quantidade)==0){
                  printf("Erro de cadastro! A quantidade n%co pode ser menor que 3.\n\n",198);
                  fflush(stdin);
                  scanf("%d",&quantidade);
            }}
        else
            printf("Erro de cadastro! Digite um id novo: ");
           /* printf("\n");
             while(pessoa_busca_cpf(p1,cpf)==0){
                printf("CPF invalido, insira um CPF cadastrado: ");
                fflush(stdin);
                scanf("%d",&cpfFornecedor);
             }*/
            prod1=produto_insere(id,preco,cpfFornecedor,nome_prod1,quantidade,prod1);
    }while(1);
}

//////// PESSOA
if(entidade==2){
    do{
        printf("CPF: ");
        scanf("%d",&cpf);
        if(cpf==-1)break;
        fflush(stdin);
        printf("Nome: ");
        fgets(nome,20,stdin);
        fflush(stdin);
        printf("Tipo (c, e ou f): ");
        fflush(stdin);
        scanf("%c",&tipo);
        printf("\n");
            while(pessoa_verifica_tipo(tipo)==0){
                printf("Erro de cadastro! Insira o tipo corretamente (c, e ou f). \n\n");
                fflush(stdin);
                scanf("%c",&tipo);
            }
        p1=pessoa_inserir(cpf,nome,tipo,p1);
    }while(1);
}//fflush(stdin);
////IMPRIMIR

if(entidade==3){
    printf("\nID da compra: ");
    printf("\nCPF do cliente: ");
    printf("\nCPF do empregado: ");
    printf("\nProdutos comprados: ");
    printf("\nValor total: ");
    printf("\nData da compra: ");
    printf("\n");

}
/*  int id_compra;
    int cpfCliente;
    int cpfEmpregado;
    Produto produtos;
    float valorTotal;
    int dia,mes,ano;*/

if(entidade==4){
    do{
    printf("ID do produto: ");
    scanf("%d",&id);
    if(id==-1) break;
    produto_imprimir_id(id,prod1);
    }while(1);
}

if(entidade==999){
    produto_imprimir(prod1);
    pessoa_imprimir(p1);
    printf("Sair (-1): ");
    scanf("%d",&prov);
    if(prov==-1)break;
}
system("cls");
}while(1);



return 0;


}

Part 1.c

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

struct produto{
        int id;
        float preco;
        int cpfFornecedor;
        char nome[20];
        int quantidade;
        struct produto*prox;
};

Produto produto_iniciar(void){
return NULL;
}

int produto_busca_produto(Produto produtos, int id){
    Produto aux;
    for(aux=produtos;aux!=NULL;aux=aux->prox)
        if(aux->id==id){
            return 1;
        }
            return 0;
}



Produto produto_insere(int id, float preco, int cpfFornecedor, char* nome, int quantidade, Produto produtos){
    Produto novo_produto=(Produto)malloc(sizeof(struct produto));
    if(produtos==NULL){
        novo_produto->id=id;
        novo_produto->preco=preco;
        novo_produto->cpfFornecedor= cpfFornecedor;
        strcpy(novo_produto->nome,nome);
        novo_produto->quantidade=quantidade;
        novo_produto->prox=produtos;
        return novo_produto;
    }

    else{

            novo_produto->id=id;
            novo_produto->preco=preco;
            novo_produto->quantidade=quantidade;
            novo_produto->cpfFornecedor= cpfFornecedor;
            strcpy(novo_produto->nome,nome);
            novo_produto->prox=produtos;
            return novo_produto;


    }
}


void produto_imprimir(Produto p){

    printf("Produtos cadastrados: \n");

    if(p==NULL)
        printf("N%co h%c produtos cadastrados.\n\n",198,160);

    Produto aux;
    for(aux=p;aux!=NULL;aux=aux->prox){
        printf("ID: %d",aux->id);
        printf("\nPre%co: %.2f",135,aux->preco);
        printf("\nCPF do Fornecedor: %d",aux->cpfFornecedor);
        printf("\nNome: %s",aux->nome);
        printf("Quantidade: %d\n\n",aux->quantidade);
    }
}



/*        int id;
        float preco;
        int cpfFornecedor;
        char nome[20];
        int quantidade;
        struct produto*prox;*/

int verifica_quantidade(int quant){
    if(quant<3)
        return 0;
    else
        return 1;
}



/////////////////////////////////////////////////

struct pessoa{
    int cpf;
    char nome[20];
    char tipo;
    struct pessoa* prox;
};



Pessoa pessoa_iniciar(void){
    return NULL;
}

//funcao pesquisa cpf  de uma lista de pessoas e retorna 1 se exister
int pessoa_busca_cpf(Pessoa p, int cpf){
    Pessoa aux;
    for(aux=p;aux!=NULL;aux=aux->prox){
        if(aux->cpf== cpf)//procura por cpf, se ele for iguar retorna 1
            return 1;     // senao retorna 0
    }
        return 0;
}

int pessoa_verifica_tipo(char c){
    if(c=='f' || c=='F')
        return 1;
    if(c=='e'|| c=='E')
        return 2;
    if(c=='c'|| c=='C')
        return 3;
    else
        return 0;
}

Pessoa pessoa_inserir(int cpf, char* nome, char tipo, Pessoa pessoas){

    Pessoa nova_pessoa;
    nova_pessoa = (Pessoa)malloc(sizeof(struct pessoa));
    if(pessoas == NULL){
    nova_pessoa-> cpf = cpf;
    strcpy(nova_pessoa->nome,nome);
    nova_pessoa-> tipo =tipo;
    nova_pessoa->prox=pessoas;
    return nova_pessoa;
    }
    else{
            do{
            if(pessoa_busca_cpf(pessoas,cpf)==0){
                nova_pessoa-> cpf = cpf;
                strcpy(nova_pessoa->nome,nome);
                nova_pessoa-> tipo =tipo;
                nova_pessoa->prox=pessoas;
                return nova_pessoa;
            }
            else{

                puts("Erro de cadastro! CPF existente, insira um novo CPF.\n");
                //puts("Digite 0000 para abortar a insercao\n");
                //scanf("%d", &saida);
                //if(saida == 0000){
                free(nova_pessoa);
                return pessoas;
                //}
            }
            }while(pessoa_busca_cpf(nova_pessoa,cpf)==1);

}
}

void pessoa_imprimir(Pessoa p){

    printf("\nPessoas cadastradas: \n");

    if(p==NULL)
        printf("N%co h%c pessoas cadastradas.\n\n",198,160);

    Pessoa aux;
    for(aux=p;aux!=NULL;aux=aux->prox){
        printf("CPF: %d",aux->cpf);
        printf("\nNome: %s",aux->nome);
        printf("Tipo: %c\n\n",aux->tipo);
    }
}




/*struct lista_compras{
    int id;
    int qtd;
    struct lista_compras* prox;
};*/


struct compra{
    int id_compra;
    int cpfCliente;
    int cpfEmpregado;
    Produto produtos;
    float valorTotal;
    int dia,mes,ano;
};

Compra compra_iniciar(void){
return NULL;
}

Compra compra_inserir(int id_compra, int cpfCliente, int cpfEmpregado, Produto produtos, float valorTotal, int dia, int mes, int ano, Compra compras){

    Compra nova_compra =(Compra)malloc(sizeof(struct compra));
    if(compras==NULL){
        nova_compra->id_compra=id_compra;
        nova_compra->cpfCliente=cpfCliente;
        nova_compra->produtos=produtos;
        nova_compra->valorTotal=valorTotal;
        nova_compra->dia=dia;
        nova_compra->mes=mes;
        nova_compra->ano=ano;
        return nova_compra;
    }
    else{
        nova_compra->id_compra=id_compra;
        nova_compra->cpfCliente=cpfCliente;
        nova_compra->produtos=produtos;
        nova_compra->valorTotal=valorTotal;
        nova_compra->dia=dia;
        nova_compra->mes=mes;
        nova_compra->ano=ano;
        return nova_compra;

    }
}

/* OFF PRODUTO */

int produto_pesquisa_fornecedor(Pessoa p1,int cpf){
    Pessoa aux;
    Pessoa aux1;

    for(aux1=p1;aux1!=NULL;aux1=aux1->prox){
        if(aux1==NULL)
            puts("Nao existe fornecedor");
        return 0;
    }


    for(aux=p1;aux!=NULL;aux=aux->prox){
            if(aux->cpf==cpf && (aux->tipo=='f' || aux->tipo=='F'));
                return 1;
    }
                return 0;
}
/// MENU 4:
void produto_imprimir_id(int id_produto, Produto produtos)
{
    Produto aux;
    if(produtos==NULL)
        printf("N%co h%c produtos cadastrados.\n\n",198,160);

    for(aux=produtos;aux!=NULL;aux=aux->prox){
        if(id_produto==aux->id){
        printf("\nID: %d",aux->id);
        printf("\nPre%co: %.2f",135,aux->preco);
        printf("\nCPF do Fornecedor: %d",aux->cpfFornecedor);
        printf("\nNome: %s",aux->nome);
        printf("Quantidade: %d\n\n",aux->quantidade);
        }
    }
}

Trabofinal. h

#ifndef TRABALHOFINAL_H_INCLUDED
#define TRABALHOFINAL_H_INCLUDED

// Pessoa
typedef struct pessoa* Pessoa;
Pessoa pessoa_iniciar(void);
int pessoa_busca_cpf(Pessoa, int);
int pessoa_verifica_tipo(char );
Pessoa pessoa_inserir(int , char* , char , Pessoa);
void pessoa_imprimir(Pessoa);

// Produto
typedef struct  produto* Produto;
void pessoa_imprimir(Pessoa p);
int produto_busca_produto(Produto produtos, int id);
Produto produto_insere(int , float, int , char* , int , Produto);
void produto_imprimir(Produto );
int verifica_quantidade(int);
int produto_pesquisa_fornecedor(Pessoa ,int );


// Compra
typedef struct compra* Compra;


#endif // TRABALHOFINAL_H_INCLUDED
  • I don’t understand. It’s not enough to create the product?

  • The Cpf should only be from the supplier, when I tried to change the call from the product inserts it simply ignores the condition. I must be doing something wrong about this.

  • Buddy - this program is on some bugs already, and the trend is to get worse. Believe me - they teach C in college to learn algorithms and how computers work - but for "real" programs of this kind, it’s better (like 1000% better) to use a higher-level language. I suggest you try doing your program in Python, Ruby, PHP, Javascript or Java - you will notice some orders of magnitude in the facility there.

  • I don’t know what you think you got in the program, but you’re testing the variable tipo in the expression while(pessoa_verifica_tipo(tipo)==0) without initializing this variable before (and that’s probably where your original problem was).

  • Also, Observer that is well crazy try to put a CPF on a variable of type "int" of C - even though the int of C does not hold a CPF - the highest value for int is 2**31 -1, which is: 2.147.483.647 - Cpfs has 9 digits plus two digit checkers: 1 integer digit more than this value holds. (But no, passing to "long int" will not make your program a good program for "real use")

  • But the program is not real use, it’s just an academic job. I am doing as stated: https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxndWVlZGVzbWF0aGV1c3xneDo0MjliYTM4YjIwZjk5ZDMy It should be done in C. I am only dealing with the most important exceptions/restrictions, but thank you for your attention.

Show 1 more comment

1 answer

0

I got it working. I inserted this function:

int pessoa_verifica_fornecedor(Pessoa p, int cpf_fornecedor){
Pessoa aux=p;

    for(aux=p;aux!=NULL;aux=aux->prox)
    {

       if(aux->cpf==cpf_fornecedor)
        {
            if(aux->tipo=='f')
                return 1;
        }
    }
    return 0;}

main:

    printf("CPF do Fornecedor: ");
    scanf("%d",&cpfFornecedor);
        while(pessoa_verifica_fornecedor(p1,cpfFornecedor)==0){
            printf("Erro de cadastro! Insira o CPF de um fornecedor: \n\n");
            scanf("%d",&cpfFornecedor);
            if(cpfFornecedor==-1)break;
    }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.