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?
– Rodrigo Guiotti
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.
– RenanCn
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.
– jsbueno
I don’t know what you think you got in the program, but you’re testing the variable
tipo
in the expressionwhile(pessoa_verifica_tipo(tipo)==0)
without initializing this variable before (and that’s probably where your original problem was).– jsbueno
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")
– jsbueno
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.
– RenanCn