Skip to content

Instantly share code, notes, and snippets.

@anderson-marin26
Created December 5, 2017 00:15
Show Gist options
  • Save anderson-marin26/da51d07224cd4970c6e73c889a92c9b4 to your computer and use it in GitHub Desktop.
Save anderson-marin26/da51d07224cd4970c6e73c889a92c9b4 to your computer and use it in GitHub Desktop.
//Programa ponto de Venda
//FATEC - MC - Anderson - 04/05/2016
#include "PontoDeVenda.h"
// Função que pede um código de produto válido ou zero para
// cancelar a transação da main que está sendo executada
// Parâmetros:
// Entrada: char *szAcao - ponteiro para um string que indica qual
// é a transação que está sendo executada
int PedeUmProdutoValido(char *szAcao, CONFIGURACAO stConfig)
{
int nCodigo = 0; // para receber o código do produto
cout << "\n\tAção: " << szAcao << endl;
do
{
cout << "Informe um código entre 1 e " << stConfig.nQtdeProdutos << endl
<< "Ou zeros para cancelar a transação: ";
cin >> nCodigo; // pede o código
if (nCodigo == 0) // cancelar a transação?
return 0; // indica que a transação foi cancelada
} while (nCodigo < 1 || nCodigo > stConfig.nQtdeProdutos);
return nCodigo; // devolve o código que foi digitado
}
//
//Entry point do Programa
//
void main(void)
{
CONFIGURACAO stConfig; //struct para conter a configuração
PRODUTO stProduto; //para conter os dados de um produto
int i, nCodigo;
char cOpcao, //recebe a opçao de escolha do operador
cWork[200]; //para edições com o sprintf
SYSTEMTIME stTime; // struct para data e hora do sistema
FILE *fdConfig, //file descriptor do arquivo de configuração
*fdProduto; //idem arquivo de cadastro de produtos
setlocale(LC_ALL, "portuguese_brazil");
//abrir o arquivo de configuração em modo leitura/binário
if (fopen_s(&fdConfig, CAMINHO_CONFIG, "rb") != 0) //erro de abertura?
{//não sendo aberto significa q é a primeira vez o programa é executado
if (fopen_s(&fdConfig, CAMINHO_CONFIG, "wb") != 0) //erro de abertura?
{//erro irrecuperável
cout << "Erro de ABertura da configuração!" << endl;
PAUSA;
exit(-1); //retorna ao S.O. em condição de erro
}
//configurar o programa
cout << "Informe quantidade de produtos: ";
cin >> stConfig.nQtdeProdutos;
cin.ignore(1, EOF); //ignora a tecla enter anterior
cout << "Razão social: ";
cin.getline(stConfig.cRazaoSocial, EXTENSAO_RAZAO, '\n');
GetLocalTime(&stTime); //data e hora do sistema
stConfig.stDtInicio.nDia = stTime.wDay;
stConfig.stDtInicio.nMes = stTime.wMonth;
stConfig.stDtInicio.nAno = stTime.wYear;
if (fwrite(&stConfig, sizeof(CONFIGURACAO), 1, fdConfig) == 0) //erro gravação?
{//erro irrecuperável de gravação
fclose(fdConfig); //fecha o arquivo
cout << "Erro de gravação da configuração!" << endl;
PAUSA;
exit(-1);
}
//abrir o arquivo de produtos em modo gravação/leitura/binário
if (fopen_s(&fdProduto, CAMINHO_CADASTRO, "w+b") != 0) //erro de abertura?
{
fclose(fdConfig);
cout << "Erro de Abertura do cadastro de Produtos" << endl;
PAUSA;
exit(-1);
}
//"Formatar" o arquivo de produtos com todos inativos
for (i = 0; i < stConfig.nQtdeProdutos; i++)
{
stProduto.nCodProduto = i + 1;
stProduto.cAtivo = INATIVO; //produto não existe
stProduto.dPrecoUnit = 0.0; //zerar preço unitario
stProduto.cDescricao[0] = NULL; //string vazio
if (fwrite(&fdProduto, sizeof(PRODUTO), 1, fdProduto) == 0) //erro de gravação?
{//erro irrecuperável
fclose(fdConfig); //fecha o arquivo de configuração
fclose(fdProduto); //fecha o arquivo de cadastro
cout << "Erro de Gravação do produto!" << endl;
exit(-1);
}
}//for i
}//primeira vez
else
{//não é a primeira vez
if (fread_s(&stConfig, sizeof(CONFIGURACAO), sizeof(CONFIGURACAO), 1, fdConfig) == 0) //erro de leitura??
{//erro irrecuperável
fclose(fdConfig);
cout << "Erro de Leitura da Configuração!" << endl;
PAUSA;
exit(-1);
}
//abrir o arquivo de produto em modo leitura/gravação/binário
if (fopen_s(&fdProduto, CAMINHO_CADASTRO, "r+b") != 0) //erro de abertura?
{//erro irrecuperável
fclose(fdConfig);
cout << "Erro de Abertura do Cadastro!" << endl;
PAUSA;
exit(-1);
}
}//os dois arquivos foram abertos
//loop infinito do programa
while (true)
{
LIMPAR_TELA;
GetLocalTime(&stTime);
sprintf_s(cWork, sizeof(cWork), "\n\tPonto de Venda de %s %02d/%02d/%04d ás %02d:%02d:%02d Dt.Inicio %02d/%02d/%04d",
stConfig.cRazaoSocial,
stTime.wDay,
stTime.wMonth,
stTime.wYear,
stTime.wHour,
stTime.wMinute,
stTime.wSecond,
stConfig.stDtInicio.nDia,
stConfig.stDtInicio.nMes,
stConfig.stDtInicio.nAno);
cout << cWork << endl;
//exibir o menu de opções
cout << CADASTRAR_PRODUTO << " - Cadastrar novo Produto" << endl;
cout << EXCLUIR_PRODUTO << " - Excluir um produto existente" << endl;
cout << MOSTRAR_PRODUTO << " - Exibir dados de um produto" << endl;
cout << VENDER_PRODUTO << " - Vender um produto" << endl;
cout << SAIR_DO_PROGRAMA << " - Sair do Programa" << endl;
cout << "\tSelecione: ";
cin >> cOpcao;
cOpcao = toupper(cOpcao);
switch (cOpcao)
{
case CADASTRAR_PRODUTO:
nCodigo = PedeUmProdutoValido("Cadastrar Produto", stConfig);
if (nCodigo == 0)
break;
if (stProduto.cAtivo == true)
{
cout << "Produto já cadastrado!" << endl;
PAUSA;
break;
}
else
{
cin.ignore(1, EOF);
cout << "Informe as caracteristicas do produto: " << endl; //pede as características do produto
cin.getline(stProduto.cDescricao, EXTENSAO_DESCRICAO - 1, '\n'); //mais de uma palavra armazenada
cout << "Qual o preço unitario do produto?" << endl << "R$"; //pergunta o preço do produto
cin >> stProduto.dPrecoUnit; //armazena o preço
stProduto.cAtivo = ATIVO; //define o código do produto como "ocupado"
cout << "Produto Cadastrado com sucesso!" << endl; //informa sucesso no cadastro
PAUSA; //pausa para leitura
// 6. Voltar ao menu
break; //volta ao menu
}
break;
case EXCLUIR_PRODUTO:
break;
case MOSTRAR_PRODUTO:
break;
case VENDER_PRODUTO:
break;
case SAIR_DO_PROGRAMA:
cout << "Sair realmente? (s ou n): ";
cin >> cOpcao;
if (cOpcao == 's' || cOpcao == 'S') //sair realmente?
{//vai sair realmente
fclose(fdConfig);
fclose(fdProduto);
exit(0); //retorna ao S.O. sem erro
}
break;
default:
cout << "\n\tOpção inválida!" << endl;
PAUSA;
}
}//while
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment