Ir ao conteúdo
  • Cadastre-se

C Programa em C não retorna resultado


Posts recomendados

<>

Olá, quando eu cadastro os dois vendedores, faço a a exibição dos vendedores cadastrados porém, não esta retornando o id e nome que passei.

*** Cadastrar Vendedor ***

Digite o ID do vendedor: 1

Digite o nome do vendedor: s

Digite o ID do vendedor: 2

Digite o nome do vendedor: b

*** Vendedor Cadastrado ***

ID Vendedor:

Nome Vendedor:

ID Vendedor:

Nome Vendedor:

O que pode ser?

______________________________________________

#include <iostream>

#include <stdio.h>

#include <string.h>

#include "lo.h"

struct Vendedor {

int IDVendedor;

char nomeVendedor[30];

};

struct Produto {

int IDProduto;

char descricao[30];

float preco;

};

struct Cliente {

int IDCliente;

char nomeCliente[30];

};

struct Vendas {

Vendedor vendedores[2];

Produto produtos[2];

Cliente clientes[2];

};

struct Vendas v;

void CadastroVendedor(){

printf("\n*** Cadastrar Vendedor ***\n");

for(int i=0;i<2;i++){

printf("Digite o ID do vendedor: "); fflush(stdin); scanf("%i", &v.vendedores.IDVendedor);

printf("Digite o nome do vendedor: "); fflush(stdin); scanf("%c", &v.vendedores.nomeVendedor);

}

printf("\n*** Vendedor Cadastrado ***\n");

for(int i=0;i<2;i++){

printf("\nID Vendedor: ", &v.vendedores.IDVendedor);

printf("\nNome Vendedor: ", &v.vendedores.nomeVendedor);

}

}

int main(void) {

int op;

char opc;

do{

printf("\n ***** Lanchonete ***** \n\n");

printf(" O que voce deseja fazer? \n");

printf(" (1) Cadastrar Vendedor \n");

printf(" (2) Cadastrar Produto \n");

printf(" (3) Cadastrar Cliente \n");

printf(" (4) Realizar uma Venda \n");

printf(" (5) Exibir os Relatorios \n");

printf("\nDigite o numero da opicao desejada: \n"); scanf(" %i", &op);

switch(op){

case 1:{

CadastroVendedor();

break;

}

case 2:{

printf("\n*** Cadastrar Produto ***\n");

break;

}

case 3:{

printf("*** Cadastrar Cliente ***");

break;

}

case 4:{

printf("*** Realizar uma Venda ***");

break;

}

case 5:{

printf("*** Realizar uma Venda ***");

break;

}

}

printf("\nDeseja Retornar ao menu? S/N:"); fflush(stdin); scanf("%c",&opc);

} while (toupper(op)!='N');

return 0;

}

Link para o comentário
Compartilhar em outros sites

string de formatação scanf para leitura de sequência de caracteres com limite em uma palavra é " %s"

Quando precisamos de nomes compostos (+1 palavra) a formatação é esse: " %[^\n]"

 

Com relação a função mencionada, recomendo cadastrar 1x por chamada da função, isso é, remova o loop de dentro e coloque-o fora da função cadastro

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@PereiraTiago Vendedores é um vetor, logo precisa informar o índice para setar e pegar os dados:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct {
    int id;
    char nome[30];
} Vendedor;

typedef struct {
    int id;
    char descricao[30];
    double preco;
} Produto;

typedef struct {
    int id;
    char nome[30];
} Cliente;

typedef struct {
    Vendedor vendedores[2];
    Produto produtos[2];
    Cliente clientes[2];
} Vendas;

Vendas v;

void CadastroVendedor();

int main(void) {
    char op = ' ';

    do {
        printf(" ***** Lanchonete ***** \n\n");
        printf(" O que voce deseja fazer? \n");
        printf(" (1) Cadastrar Vendedor \n");
        printf(" (2) Cadastrar Produto \n");
        printf(" (3) Cadastrar Cliente \n");
        printf(" (4) Realizar uma Venda \n");
        printf(" (5) Exibir os Relatorios \n\n");
        printf(" Digite o numero da opcao desejada: \n");
        scanf(" %c%*c", &op);

        switch (op) {
            case '1':
                CadastroVendedor();
                break;
            case '2':
                printf("\n*** Cadastrar Produto ***\n");
                break;
            case '3':
                printf("*** Cadastrar Cliente ***");
                break;
            case '4':
                printf("*** Realizar uma Venda ***");
                break;
            case '5':
                printf("*** Realizar uma Venda ***");
                break;
            default:
                break;
        }

        printf("Deseja Retornar ao menu? S/N: ");
        scanf(" %c%*c", &op);
    } while (toupper(op) != 'N');

    return EXIT_SUCCESS;
}

void CadastroVendedor() {
    printf("*** Cadastrar Vendedor ***\n");

    for (int i = 0; i < 2; i++) {
        printf("Digite o ID do vendedor: ");
        scanf(" %i%*c", &v.vendedores[i].id);
        printf("Digite o nome do vendedor: ");
        scanf(" %[^\n]", v.vendedores[i].nome);
    }

    printf("*** Vendedor Cadastrado ***\n");

    for (int i = 0; i < 2; i++) {
        printf("ID Vendedor: %i \n", v.vendedores[i].id);
        printf("Nome Vendedor: %s \n", v.vendedores[i].nome);
    }
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Notei o 

#include <iostream>

marcou seu tópico como C e escreveu acho que tudo exceto isso em C. Pretendia escrever um programa em C++? Se pretendia seu programa está muito longe ainda. Em C++ é mais fácil escrever esse tipo de coisa, mas é bem diferente do que escreveu ;) exceto por esse include

 

De todo modo, uma coisa que não deveria estar fazendo é começar seu programa por um menu e ficar lendo dados e mostrando coisas na tela. Não leva a nada e só vai te atrasar. 

 

Acha mesmo que precisa a cada vez que testar seu programa digitar, digamos, dois vendedores, e ficar em frente a tela digitando comandinhos de uma letra e preenchendo formulários? Não precisa. Demora muito. E é chato pra caramba.

 

Evite usar funções void(). Em geral é um desperdício. Retorne algo que faça sentido. Um código de erro ao cadastrar? Um contador de itens listados? Algo assim. Não trate o erro dentro da função escrevendo mais e mais mensagens e arrumando mais pontos onde o programa pode encerrar.

 


struct Vendedor {
	int IDVendedor;
	char nomeVendedor[30];
};

struct Produto {
	int IDProduto;
	char descricao[30];
	float preco;
};

struct Cliente {
	int IDCliente;
	char nomeCliente[30];
};

struct Vendas {
	Vendedor vendedores[2];
	Produto produtos[2];
	Cliente clientes[2];
};

struct Vendas v;

Isso não está bom.O pior aí é a struct Vendas ter 2 itens dentro. Isso é pedir por problemas Provavelmente estaria bem melhor com algo assim

typedef struct
{
	int ID;
	char nome[30];
} Vendedor;

typedef struct
{
	int ID;
	char descricao[30];
	float preco;
} Produto;

typedef struct
{
	int ID;
	char nome[30];
} Cliente;

typedef struct 
{
	Vendedor vendedor;
	Produto produto;
	Cliente cliente;
} Venda;

typedef struct
{
	Cliente c[30];
	Vendedor v[30];
	Produto p[30];
} Cadastro;

Venda v[2];
Cadastro loja1, loja2;

Isso é só um exemplo e nem está completo, mas entenda que um cadastro tem clientes, produtos e vendedores. E as venda é só uma venda. Você declara um vetor delas, como todo o resto. Na prática provavelmente usaria uma lista delas e não um vetor de tamanho fixo, mas acho que já dá pra entender. E se tem duas vendas ou 200 você declara um vetor de Vendas e não 200 vendas DENTRO da estrutura

 

Não use variáveis globais para acessar dentro das funções. É outro desastre. Nunca use variáveis globais porque só dá problema. Imagine que tivesse mais de um cadastro por exemplo... todos os autores recomendam isso. Muitas empresas proíbem isso. Muitos professores ensinam isso. Todos pela mesma razão.

 

Pense mais nos dados antes de escrever o programa. Uma venda pode ser considerada como vinculando um único cliente a um único vendedor, mas provavelmente teria uma lista de produtos e não um só. Quanto mais perto modelar essas estruturas de seu modelo real mais simples vai ficar o seu programa. Então pense nas funções que precisa implementar e desenhe os dados de acordo.

 

  • Escreveu várias funções. Porque não uma 
    char Menu();

que mostra o menu e lê a opção e retorna para o seu programa? Muito mais simples. Muito mais simples também é  ler o menu de um arquivo ao invés de ficar editando isso toda hora para adequar o alinhamento e as opções.

 

  • use sempre default num case
  • inicialize todas as variáveis. acho que sabe que esta entrando no loop da primeira vez sem ter sequer algo conhecido em  op...
  • "opicao" pega mal. Corrija.
  • perguntar se quer retornar ao menu é algo irritante. Se não está no enunciado tire isso daí.
  • inclua o simples: uma opção para sair do programa
  • evite construções assim:
    struct Cliente
    {
    	int IDCliente;
    	char nomeCliente[30];
    };

    Dentro da struct Cliente dá pra imaginar que a ID vai ser de um cliente e o nome também. Só vai escrever mais a toa.
     

    typedef struct 
    {
    	int ID;
    	char nome[30];
    }   Cliente;

    Prefira assim. E entenda que pode escrever 
     

    	Cliente c1 = { 12, "Cliente 212234-4" };
    	Cliente c2 = { 122, "Cliente 2" };
    	Vendedor exemplo[5] =
    	{
    		{ 3, "Jhonny Cash" },
    		{ 233, "Kris" },
    		{ 5, "Waylon" },
    		[4] = {.nome = "Willie", .ID = 1254 }
    	};

    MUITO mais fácil. Ao invés de perder tempo com os menus e inventando nomes e produtos, apenas declare uns poucos de cada assim e termine logo as funções do programa e teste tudo. Depois em meia hora você coloca a p0^^@ do menu. Não perca tempo.
     

Sobre o exemplo acima:
 

  • note que no caso do vendedor foram declarados 5 e você nem precisa preencher todos. Os que estão na sequência vão ser os caras a partir de exemplo[0]. O que tem o [5] vai ser claro carregado em exemplo[4].
  • entenda que pode até declarar fora de ordem e colocar o nome do campo direto na linha, como .ID e .nome. E assim só precisa inicializar os campos que vai usar. Compare isso com ficar parado na tela inventando nomes e ID para 5 vendedores e 5 clientes e 5 produtos.... Acho que já entendeu...
  • Esse trecho
    
    	for (int i = 0; i < 5; i = i + 1)
    		printf("Id do vendedor %d: [%d]\n", i, exemplo[i].ID);
    	printf(
    		"Vendedor 5: Id: %d. Nome: %s\n",
    		exemplo[4].ID,
    		exemplo[4].nome
    	);

    Mostra

  • Id do vendedor 0: [3]
    Id do vendedor 1: [233]
    Id do vendedor 2: [5]
    Id do vendedor 3: [0]
    Id do vendedor 4: [1254]
    Vendedor 5: Id: 1254. Nome: Willie

    E pode ver como é muito mais fácil escrever assim

Seu programa não está bom ainda.

 

 

 

 

 

 

 

 

 

 

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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...