• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Thiago_7

Vending Machine Virtual - C++

5 mensagens neste tópico

Aqui está um trabalho para a disciplina de Bases de Programação do 12º ano.

Linguagem: C++

Compilador: Borland C++

Consiste na gestão de produtos de uma vending machine, com duas partes essenciais, menu administração e menu utilizador.

A password do menu administração é "trabalhobp". É possivel modificar mais tarde

De resto este programa faz uso de classes e listas dinâmicas para os produtos.

Nota: certos comentários podem ter caracteres estranhos, isto deve-se ao BC nao reconhecer "ç" e acentos pois certos comentários foram editados usando bloco de notas.

Cumps!

Última Versão: 07/03/08

Código:

/**************************************************************************

Programa:     Vending Machine

Ficheiro:     Trabalho.cpp

Descri‡ao:    M quina de Vending, que possui dois ambientes,
      Modo Administrador e Utilizador.

Autor:        Tiago Emanuel Almeida Salvador (TS)

Notas:        Disciplina Bases de Programa‡ao 3
      12§ Ano, Turma D, Aluno n§10

Versoes:      1.00  26/11/07 (TS) Modo Administrador
      1.01  29/11/07 (TS) Modo Utilizador
      1.02  07/12/07 (TS) Primeira Entrega ao Professor
      1.03  25/01/08 (TS) Revisao Geral de Alguns Bugs
      2.00  05/02/08 (TS) Primeira Utiliza‡ao de Classes
      2.01  10/02/08 (TS) Implementa‡ao Geral de Classes
      2.02  16/02/08 (TS) Texto Gr fico Usado em Geral
      3.00  20/02/08 (TS) Utiliza‡ao de Listas e Ponteiros
      3.01  22/02/08 (TS) Alguns Bugs da Versao 2.01 Resolvidos
      3.02  23/02/08 (TS) Primeira utiliza‡ao de Listas Dinƒmicas
      3.03  24/02/08 (TS) Implementa‡ao geral de Listas Dinƒmicas
			  e uso de Classes Derivadas
      3.04  28/02/08 (TS) Primeira versao Beta
      3.05  01/03/08 (TS) Resolu‡ao de alguns bugs conhecidos
      3.06  03/03/08 (TS) Implementa‡ao de trocos
      3.07  05/03/08 (TS) Resolu‡ao de alguns bugs
      4.00  07/03/08 (TS) Versao final

**************************************************************************/

///////////////////bibliotecas///////////////////////////////////

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <string.h>

///////////////////fim bibliotecas///////////////////////////////

///////////////////////declaracao de constantes//////////////////

#define TRUE 1
#define FALSE 0
const unsigned short MAX=200;

//////////////////////fim de declara‡ao de constantes////////////

////////////////////////declaracao de classes/////////////////////

class prod  //classe prod
{
protected:
	unsigned short
		quant_tot,	//total inserido na m quina
		quant_vend;	//quantidade vendida do produto
	float	rend,		//rendimento do produto (lucro, preju¡zo e nulo)
		ganho_tot,	//valor ganho total obtido atrav‚s da quantidade vendida
		gasto_tot;	//valor gasto total obtido atrav‚s da quantidade inserida na maquina
public:
	char	nome[20];	//nome do produto
	int 	num;            //numero do produto
	float	preco,		//pre‡o de produto
		precoprod;	//pre‡o de produ‡ao de produto
	class	produto *seguinte; /*estrutura que possui um objecto do tipo produto e que
				     acede a todas as propriedades
				     da classe produto servindo para ligar todos os objectos
				     na lista dinƒmica*/
};//fim classe prod

class produto:public prod //classe produto derivada da classe prod
{
	static int nprodutos;  //variavel estatica (assim usada por todos os objectos)
			       //contadora do numero de produtos
public:
	produto (){nprodutos++;}         //constructor
	~produto(){nprodutos--;}         //destructor

	   /*fun‡oes de acesso a dados protegidos ou privados
	     da classe prod e propria classe.
	     utiliza sobrecarga de fun‡oes pois existem
	     diferentes tipos de situa‡oes.
	     todas as fun‡oes sao inline pois apenas consistem
	     numa linha.*/

	int getnp(){return nprodutos;}
	inline void  setquant_tot(){quant_tot=0;}
	inline void  setquant_vend(){quant_vend=0;}
	inline void  setganho_tot(){ganho_tot=0;}
	inline void  setgasto_tot(){gasto_tot=0;}
	inline void  setrend(){rend=0;}
	inline void  setquant_tot(unsigned short n){quant_tot-=1;}
	inline void  setquant_tot(unsigned short n, unsigned short q){quant_tot=n+q;}
	inline unsigned short   getquant_tot(){return quant_tot;}
	inline void  setquant_vend(unsigned short n){quant_vend+=n;}
	inline unsigned short   getquant_vend(){return quant_vend;}
	inline void  setrend(float n, float q){rend=ganho_tot-gasto_tot;}
	inline float getrend(){return rend;}
	inline void  setgasto_tot(float n, float q){gasto_tot=n+q;}
	inline float getgasto_tot(){return gasto_tot;}
	inline void  setganho_tot(float n, float q){ganho_tot=n+q;}
	inline float getganho_tot(){return ganho_tot;}

};//fim classe derivada produtos

class coin	//classe coin
{
protected:
	unsigned short
		quant_tot,	//total inserido na m quina referente ao inserido pelo administrador que serve de troco
		tot_utilizador;	//total inserido na m quina pelo utilizador
public:
	char nome[20],		  //nome da moeda
	     nome_ut[20];         //nome da moeda no modo utilizador
	unsigned short	value;	  //valor da moeda (ex:0.05, 0.10, etc.)

};// fim classe coin

class moeda:public coin //classe moeda derivada da classe coin
{
	   /*fun‡oes de acesso a dados protegidos
	     da classe coin.
	     utiliza sobrecarga de fun‡oes pois existem
	     diferentes tipos de situa‡oes.
	     todas as fun‡oes sao inline pois apenas consistem
	     numa linha.*/

public:
	inline void  setquant_tot(){quant_tot=0;}
	inline void  setquant_tot(unsigned short n){quant_tot-=n;}
	inline void  setquant_tot(unsigned short n, unsigned short q){quant_tot=n+q;}
	inline unsigned short   getquant_tot(){return quant_tot;}
	inline void  settot_utilizador(){tot_utilizador=0;}
	inline void  settot_utilizador(unsigned short n){tot_utilizador+=n;}
	inline void  settot_utilizador(unsigned short n, unsigned short q){tot_utilizador=n-q;}
	inline unsigned short   gettot_utilizador(){return tot_utilizador;}

} m[6]; // fim classe moeda

///////////////////fim declara‡ao de classes///////////////////////

////////////////////declara‡ao de variaveis///////////////////////

produto *p=NULL;              //ponteiro usado na cria‡ao de produtos
produto *inicial=NULL;        //item inicial da lista
produto *final=NULL;          //item final da lista
produto *anterior=NULL;       //item anterior ao presente na lista

int produto::nprodutos=0;     /*declara‡ao da variavel estatica usando o
			operador de resolu‡ao de escopo pois ‚
			declarada fora da classe*/

unsigned short
toteach[6]={0,0,0,0,0,0},  /*conta todas as moedas inseridas no
			     momento da compra*/

num_lista=1,               /*vai organizar, a partir do numero de
			     produto, toda a lista e possibilitar que
			     o utilizador escolha os produtos pelo
			     n£mero*/

aux=0, 		//controla a modifica‡ao de palavra-passe, ou seja nao sai enquanto a palavra-passe nao for modificada
aux2=0,         //verifica se j  foi alguma vez criado um produto na m quina
aux4=0, 	//verifica se um produto j  foi adquirido e assim poder, se o utilizador sair, receber o troco
aux5=0, 	//vai verificar se existem moedas presentes na m quina
aux6=0,         //verifica se existem ou nao produtos na m quina
aux7=0,         //vai controlar a inser‡ao de moedas e produtos no modo utilizador
aux_ver=0,      //verifica se alguma vez entrou no modo administrador
totvend=0;      //valor total das moedas inseridas, proviniente da soma do valor de todas as moedas

char	passadm[11]="trabalhobp", //string que inicia com a palavra-passe predefinida e que posteriormente contˆm a palavra-passe pessoal do utilizador, aquando da sua altera‡ao
passut[11], 		  //palavra-passe inserida pelo utilizador para servir para comparar com a string passadm
pass[11], 		  //palavra-passe nova
passconfir[11]; 	  //palavra-passe de confirma‡ao

float max_dinero=3.50;  //dinheiro m ximo de inser‡ao permitido na m quina

/////////////fim declara‡oes de variaveis//////////////////////

/////////////declara‡ao de prototipos de fun‡oes///////////////

void initgraficos();
void interface();
void adicionar(produto *ligacao);
void apaga_lista();
produto *encontrar(int n);
produto *encontra_anterior(produto *item);
void mudar_num(produto *item);
int apagar(produto* item);
void show();
void criar_apagar();
void initstructs();
void predefinido();
void produtos();
void produtospreco();
void moedas();
void moedasut();
void interface_ut();
void compras();
int menupass();
void alterar_pass();
void prod_preco(produto* alias);
void preco_prod_rend(produto *alias);
void rend_moedas_ut(int j);
void insert_coin(int v);
void choice_prod(produto *alias);
void start();
void menu_principal();
void admin_inteiro();
void admin();
void menu_utilizador();

///////////////fim declara‡ao de prototipos de fun‡oes//////////////////

///////////////////////fun‡oes interface///////////////////////////////////

void initgraficos()  //fun‡ao iniciar graficos do programa
{
int driver=0, 	//vari vel que serve para possibilitar a detec‡ao da drive gr fica presente no computador
mode=0, 	//vari vel que ‚ necess ria para inicializar modo gr fico
codigoerro=0; 	//vari vel que serve para tomar o resultado do teste gr fico no ¡nicio do programa
clrscr();
driver=DETECT; 				//detecta driver gr fico presente no computador
initgraph(&driver,&mode,""); 		//inicia modo gr fico
codigoerro = graphresult(); 		//vari vel toma resultado do teste gr fico da driver presente

//se ocorrer erro dispara aviso e, aquando de uma tecla pressionada, o programa sai, caso contr rio inicia programa
if (codigoerro != grOk)
{
	printf("Erro gr fico: %s\n", grapherrormsg(codigoerro));
	printf("Pressione qualquer tecla:");
	getch();
	exit(1);
}
}//fim fun‡ao initgraficos()

void interface() //fun‡ao de interface presente em todos os menus
{
cleardevice();
setcolor(LIGHTBLUE);
circle(565,395,20);
circle(580,425,20);
circle(550,425,20);
setlinestyle(DASHED_LINE,1,1);
line(500,450,565,345);
line(630,450,565,345);
line(630,450,500,450);
line(540,430,565,387);
line(590,430,565,387);
line(590,430,540,430);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
setcolor(WHITE);
outtextxy(185, 15, "VENDING MACHINE");
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
outtextxy(400,460,"Copyright 2008 Tiago Salvador");
setcolor(MAGENTA);
rectangle(5, 5, 635, 475);
setcolor(WHITE);
int maxx = getmaxx();
int maxy = getmaxy();
rectangle(1, 2, maxx, maxy);
} //fim fun‡ao interface()

void interface_ut() //fun‡ao de interface presente apenas no menu utilizador
{
cleardevice();
setcolor(LIGHTBLUE);
circle(230,130,40);
circle(260,180,40);
circle(200,180,40);
setlinestyle(DASHED_LINE,1,1);
setcolor(CYAN);
line(105,230,230,50);
line(355,230,230,50);
line(105,230,355,230);
line(175,200,230,110);
line(285,200,230,110);
line(175,200,285,200);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
setcolor(WHITE);
outtextxy(185, 15, "VENDING MACHINE");
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
setcolor(MAGENTA);
rectangle(5, 5, 635, 475);
setcolor(WHITE);
int maxx = getmaxx();
int maxy = getmaxy();
rectangle(1, 2, maxx, maxy);
}//fim fun‡ao interface_ut()

///////////////////////fim fun‡oes interface///////////////////////////////////

///////////////////////fun‡oes iniciar valores das classes///////////////////////////////////

void initclasse() //fun‡ao que inicia valores dos objectos da classe moeda
{
int i=0;
m[0].value=5;
m[1].value=10;
m[2].value=20;
m[3].value=50;
m[4].value=100;
m[5].value=200;
strcpy(m[0].nome,"5 centimos");
strcpy(m[1].nome,"10 centimos");
strcpy(m[2].nome,"20 centimos");
strcpy(m[3].nome,"50 centimos");
strcpy(m[4].nome,"1 euro");
strcpy(m[5].nome,"2 euros");
strcpy(m[0].nome_ut,"5 cent.");
strcpy(m[1].nome_ut,"10 cent.");
strcpy(m[2].nome_ut,"20 cent.");
strcpy(m[3].nome_ut,"50 cent.");
strcpy(m[4].nome_ut,"1 euro");
strcpy(m[5].nome_ut,"2 euros");
for (i=0;i<6;i++)
{
	m[i].settot_utilizador();
	m[i].setquant_tot();
}
}//fim fun‡ao initclasse()

void predefinido() //fun‡ao que cont‚m os valores predefinidos dos objectos da classe produto
{
p=new produto; 			//aloca mem¢ria dinamica
strcpy(p->nome,"Caf‚");         //nome do novo produto
p->preco=0.35;                  //preco do novo produto
p->precoprod=0.15;              //preco de produ‡ao do novo produto
p->setquant_tot();              //quantidade do novo produto
p->setganho_tot();              //valor de rendimento do novo produto
p->setgasto_tot();              //valor de custo de produ‡ao do novo produto
p->setquant_vend();             //quantidade vendida do novo produto
p->setrend();                   //rendimento do novo produto
p->num=num_lista++;             //n£mero na lista do novo produto
adicionar(p);                   //adiciona novo produto … lista
p=new produto;
strcpy(p->nome,"Descafeinado");
p->preco=0.35;
p->precoprod=0.15;
p->setquant_tot();
p->setganho_tot();
p->setgasto_tot();
p->setquant_vend();
p->setrend();
p->num=num_lista++;
adicionar(p);
p=new produto;
strcpy(p->nome,"Galao");
p->preco=0.45;
p->precoprod=0.25;
p->setquant_tot();
p->setganho_tot();
p->setgasto_tot();
p->setquant_vend();
p->setrend();
p->num=num_lista++;
adicionar(p);
p=new produto;
strcpy(p->nome,"Chocolate Quente");
p->preco=0.50;
p->precoprod=0.30;
p->setquant_tot();
p->setganho_tot();
p->setgasto_tot();
p->setquant_vend();
p->setrend();
p->num=num_lista++;
adicionar(p);
p=new produto;
strcpy(p->nome,"Cappucino");
p->preco=0.50;
p->precoprod=0.30;
p->setquant_tot();
p->setganho_tot();
p->setgasto_tot();
p->setquant_vend();
p->setrend();
p->num=num_lista++;
adicionar(p);
p=new produto;
strcpy(p->nome,"Chocolate com Leite");
p->preco=0.50;
p->precoprod=0.30;
p->setquant_tot();
p->setganho_tot();
p->setgasto_tot();
p->setquant_vend();
p->setrend();
p->num=num_lista++;
adicionar(p);
p=new produto;
strcpy(p->nome,"Agua");
p->preco=0.40;
p->precoprod=0.20;
p->setquant_tot();
p->setganho_tot();
p->setgasto_tot();
p->setquant_vend();
p->setrend();
p->num=num_lista++;
adicionar(p);
}//fim fun‡ao predefinido()

///////////////////////fim fun‡oes iniciar valores das classes//////////////////////////////////

///////////////////////fun‡oes lista dinamica///////////////////////////////////

void adicionar(produto *ligacao) //fun‡ao adicionar produtos … lista
{
ligacao->seguinte=NULL;  /*ponteiro p com outro nome para nao o influenciar
			   onde a sua propriedade seguinte toma o valor NULL*/
if (inicial==NULL)  //se item inicial nao existir
{
	inicial=ligacao;  //entÆo o objecto p (liga‡ao) fica o primeiro item da lista
}
else
{
	final->seguinte=ligacao; /*senao passa para o item final, que ‚ o seguinte
				 do item final actual*/
}
final=ligacao;       /*aqui da primeira vez que a fun‡ao ‚ chamada, o item final equivale ao inicial
		       pois apenas existe um item na lista. Na pr¢xima chamada esta linha de c¢digo
		       coloca final com o valor do item agora mesmo adicionado*/
}//fim fun‡ao adicionar(produto *liga‡ao)

void apaga_lista() //fun‡ao libertar da memoria a lista
{
p=inicial;          //aqui o ponteiro p toma o valor do item inicial da lista
while(p!=NULL)    //enquanto p nao for nulo, ou seja, chegar ao fim da lista
{
	inicial=p->seguinte;     /*inicial toma o valor do seguinte de p pois ‚ necess rio
				 manter a liga‡Æo entre itens*/
	delete p;         //apaga o p da mem¢ria
	p=inicial;        //p toma o valor do inicial que tem o valor p->seguinte
}
}//fim fun‡ao apaga_lista()

produto *encontrar(int n)  //fun‡Æo encontrar item na lista, que devolve o item encontrado
{
p=inicial;         //p toma o valor do item inicial da lista
while(p!=NULL)  //enquanto p nao for nulo
{
	if (p->num==n)     //se o n£mero de p for igual ao que o utilizador premiu
		return p;  //devolve p
	p=p->seguinte;     //senao passa parao seguinte item
}
return NULL;    //senao encontrar nada entÆo devolve nulo
}//fim fun‡ao encontrar(int n)

produto *encontra_anterior(produto *item) //fun‡Æo encontrar item anterior ao actual para manter liga‡äes na lista
{
if (item!=NULL)  // item existe?
{
	p=inicial;       //p toma valor do item inicial
	while(p!=NULL)  //enquanto p nao for nulo
	{
		if (p->seguinte==item)  //se o item seguinte a p for igual ao item actual
			return p;     //devolve p
		p=p->seguinte;      //senao passa para o seguinte
	}
	return NULL; //se nao encontrar entÆo devolve nulo
}
else
{
	return NULL;  //se o item nao existir devolve nulo
}
}//fim fun‡ao *encontra_anterior(produto *item)

void mudar_num(produto *item) //fun‡ao modicar os n£meros de todos os produtos
{
produto* alias;   //este ponteiro vai ser muito usado ao longo do programa para significar que ‚ um alias do item da lista
alias=item;       //alias toma valor de item (assim nunca modifica o item nao levando a erros)
while(alias!=NULL)   //enquanto alias nao for nulo
{
	alias->num-=1;          //como apagou um item da lista, entÆo todos os n£meros de todos os itens diminuem um valor
	alias=alias->seguinte;   //pr tica sempre utilizada quando se quer percorrer toda a lista, onde o ponteiro alias aponta para o item seguinte
}
}//fim fun‡ao mudar_num()

int apagar(produto* item)  //fun‡ao apagar item da lista
{
//se o item existir mesmo e se a lista nao estiver vazia
if (item!=NULL && inicial!=NULL && final!=NULL)
{
	if (item==final)    //apagar item final?
	{
		//ultimo item existente, entao liberta lista da mem¢ria
		if (final==inicial)
		{
			apaga_lista();
			num_lista=1;   //num_lista volta ao n£mero inicial
			return TRUE;   //apagou item requesitado
		}
		else
		{  	// existe mais que um item e vai apagar £ltimo?
			anterior=encontra_anterior(item);  //aqui encontra o item anterior para manter liga‡oes
			if (anterior)      //se o encontra
			{
				anterior->seguinte=NULL;  //o item a seguir ao final, como nao existe fica nulo
				final=anterior;           //assim com esta instru‡ao o item final fica na posi‡ao anterior … que estava e logo o seguinte, como est  na instru‡ao anterior, nao existe
				mudar_num(item);          //muda numeros de toda a lista
				delete(item);             //apaga item
				num_lista--;              //o proximo item criado fica com o numero seguinte ao item final
				return TRUE;              //confirma que apagou item requesitado
			}
		}
	}
	else  //senao...
	{
		if (item==inicial) // apagar o item inicial da lista?
		{
			inicial=item->seguinte;   //o item inicial toma o valor do seguinte ao que quer apagar
			mudar_num(item);
			delete(item);             //apaga item
			num_lista--;
			return TRUE;              //confirma que apagou
		}
		else    // apagar item no meio da lista?
		{
			anterior=encontra_anterior(item);   //encontra item anterior
			anterior->seguinte=item->seguinte;  //liga o item, anterior ao que deseja apagar, ao item seguinte ao que deseja apagar
			mudar_num(item);
			delete(item);      //apaga item
			num_lista--;
			return TRUE;       //confirma que apagou
		}
	}
}
return FALSE;  //se nao existirem itens na lista devolve falso
}//fim fun‡ao apagar(produto *item)

///////////////////////fim fun‡oes lista dinamica///////////////////////////////////

///////////////fun‡oes inserir e apagar produtos dinamicamente/////////////////////

void start() //fun‡ao para perguntar como deseja especifcar os produtos na primeira vez que ussa o programa
{
//normalmente uso vari veis locais, assim nao precisam de muita explica‡Æo, apenas em casos especiais
char op;
interface();
do
{
	interface();
	outtextxy(37,80,"Deseja especificar agora os produtos ou usar os predefinidos?");
	outtextxy(400,120,"1 - Especificar");
	outtextxy(400,140,"2 - Predefinido");
	gotoxy(5,14);
	op=getche();
	if (op=='1')
	{
		criar_apagar();
	}
	if (op=='2')
	{
		predefinido();
		aux2=TRUE;
		aux6=TRUE;
	}
}while(aux2!=TRUE);  //enquanto nao se criarem itens nao sai
}//fim fun‡ao start

void criar_apagar()
{
int n=0, m=0;
float price=0, priceprod=0;
char op, opx, op2, st[100], str[100], stg[100];
do{
	interface();
	show();
	if (p->getnp()==0)
	{
		aux6=FALSE;     //nao exitem itens....
		aux2=FALSE;     //ou mant‚ns um item na lista ou nao sais!
	}
	if (aux6)
	{
		interface();
		show();
		outtextxy(37,220,"Quer inserir ou apagar um produto? (m x:7)");
		outtextxy(310,250,"1 - Inserir");
		outtextxy(310,270,"2 - Apagar");
		outtextxy(310,290,"0 - Sair");
	}
	if (!aux6)    //se nao exitem itens para quˆ a op‡ao apagar?
	{
		interface();
		show();
		outtextxy(37,220,"Quer inserir um produto? (m x:7)");
		outtextxy(330,220,"1 - Inserir");
		outtextxy(330,240,"0 - Sair");
	}
	op2=getche();
	if (op2=='2'){
		interface();
		show();
		if (p->getnp()==0)   //caso o utilizador … mesma pressione 2 embora nao haja essa op‡ao quando nao existem itens.....
		{
			outtextxy(37,220,"Nao existem produtos para apagar!");
			getch();
		}
		else
		{
			outtextxy(37,220,"Quer apagar que produto?");
			gotoxy(6,16);
			opx=getche();
			interface();
			show();
			if (opx=='1')
			{
				n=1;
				p=encontrar(n);
			}
			if (opx=='2')
			{
				n=2;
				p=encontrar(n);
			}
			if (opx=='3')
			{
				n=3;
				p=encontrar(n);
			}
			if (opx=='4')
			{
				n=4;
				p=encontrar(n);
			}
			if (opx=='5')
			{
				n=5;
				p=encontrar(n);
			}
			if (opx=='6')
			{
				n=6;
				p=encontrar(n);
			}
			if (opx=='7')
			{
				n=7;
				p=encontrar(n);
			}
			if (p && opx>'0' && opx<'8')   //sem esta instru‡ao desta meneira ocurriam v rios erros
			{
				interface();
				show();
				m=p->num;
				sprintf(str,"Tem a certeza de que quer apagar o produto %d?", m);
				outtextxy(37,220,str);
				outtextxy(330,240,"1 - SIM");
				outtextxy(330,260,"0 - NAO");
				op=getche();
				if (op=='1')
				{
					apagar(p);
					sprintf(stg,"Apagou o produto %d.", m);
					outtextxy(37,270,stg);
					getch();
				}
			}
		}
	}
	if (op2=='1')
	{
		interface();
		show();
		if (p->getnp()==7)
		{
			interface();
			show();
			outtextxy(37,220,"J  atingiu o limite m ximo de produtos!");
			getch();
		}
		if (p->getnp()<7)  //caso existam menos de 7 produtos na m quina...
		{
			interface();
			show();
			outtextxy(37,220,"Qual o nome do novo produto?");
			gotoxy(6,16);
			gets(st);
			do
			{
				interface();
				show();
				outtextxy(37,220,"Qual o preco do novo produto?");
				gotoxy(6,16);
				cin>>price;
				if (price<0)
				{
					outtextxy(37,280,"O pre‡o nao pode ser negativo!");
					getch();
				}
			}while(price<0);
			do
			{
				interface();
				show();
				outtextxy(37,220,"Qual o preco de produ‡ao do novo produto?");
				gotoxy(6,16);
				cin>>priceprod;
				if (priceprod<0)
				{
					outtextxy(37,280,"O pre‡o de produ‡ao nao pode ser negativo!");
					getch();
				}
			}while(priceprod<0);
			p=new produto;
			strcpy(p->nome,st);
			p->preco=price;
			p->precoprod=priceprod;
			p->setquant_tot();
			p->setganho_tot();
			p->setgasto_tot();
			p->setquant_vend();
			p->setrend();
			p->num=num_lista++;
			adicionar(p);
			aux6=TRUE;   //existem produtos na m quina
			aux2=TRUE;   //pode sair pois tem pelo menos um produto na m quina
		}
	}
}while(op2!='0');
}//fim fun‡ao criar_apagar()

///////////////fim fun‡oes inserir e apagar produtos dinamicamente/////////////////////

///////////////////////fun‡oes interface menus///////////////////////////////////

void show()  //fun‡ao mostrar produtos no menu de criar e apagar itens
{
int i=65;
char stl[100], prec[100];   //todas as strings com 100 elementos sÆo usadas para o sprintf
produto *alias=NULL;
interface();
setcolor(MAGENTA);
int left = getmaxx() / 2 - 300;
int top = getmaxy() / 2 - 180;
int right = getmaxx() / 2 + 110;
int bottom = getmaxy() / 2 - 35;
rectangle(left,top,right,bottom);
setcolor(WHITE);
outtextxy(30,40,"Produtos dispon¡veis:");
alias=inicial;
while(alias!=NULL)
{
	sprintf(stl,"%d - %s",alias->num,alias->nome);
	outtextxy(37,i, stl);
	sprintf(prec,"Preco: %0.2f",alias->preco);
	outtextxy(280,i, prec);
	alias=alias->seguinte;
	i+=20;
}
}//fim fun‡ao show()

void menu_principal() //fun‡ao de menu inicial do programa
{
char opbegin;
interface();
setcolor(5);
int left = getmaxx() / 2 - 140;
int top = getmaxy() / 2 - 190;
int right = getmaxx() / 2 + 110;
int bottom = getmaxy() / 2 - 115;
rectangle(left,top,right,bottom);
setcolor(15);
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
outtextxy(210,60,"1 - Modo Administrador");
outtextxy(210,80,"2 - Modo Utilizador");
outtextxy(210,100,"0 - Sair");
}//fim fun‡ao menu_principal

void admin() //fun‡ao que inicia o modo administrador
{
if (menupass())
{
	cleardevice();
	settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
	setcolor(MAGENTA);
	rectangle(5, 5, 635, 475);
	setcolor(WHITE);
	outtextxy(150, 50, "BEM-VINDO AO PROGRAMA");
	int maxx = getmaxx();
	int maxy = getmaxy();
	rectangle(1, 2, maxx, maxy);
	getch();
	if (!aux2 && aux_ver==FALSE) //se nunca entrou no programa e se nao existem produtos
	{
		start();
	}
	admin_inteiro();
	aux_ver=TRUE;   //j  entrou no modo administrador uma vez
}
}//fim fun‡ao admin()

void produtos() //fun‡ao que mostra os produtos no menu de definir pre‡o e quantidade
{
produto *alias=NULL;
int precoy=85, py=70;
char str[100], quant[100], preco[100];
alias=inicial;
setcolor(MAGENTA);
int left = getmaxx() / 2 - 300;
int top = getmaxy() / 2 - 180;
int right = getmaxx() / 2 + 180;
int bottom = getmaxy() / 2 + 60;
rectangle(left,top,right,bottom);
setcolor(WHITE);
outtextxy(30,45,"Produtos dispon¡veis:");
while (alias!=NULL)
{
	setcolor(LIGHTBLUE);
	sprintf(str,"%d - %s :",alias->num,alias->nome);
	outtextxy(37,py,str);
	setcolor(LIGHTMAGENTA);
	sprintf(quant,"Quantidade : (%d)",alias->getquant_tot());
	outtextxy(300,py,quant);
	setcolor(MAGENTA);
	sprintf(preco,"Pre‡o : %0.2f",alias->preco);
	outtextxy(300,precoy,preco);
	py+=30;
	precoy+=30;
	alias=alias->seguinte;
}
}//fim fun‡ao produtos

void produtospreco() //fun‡ao que mostra os produtos e seu pre‡o de produ‡ao
{
int i=65;
char stl[100], prec[100];
produto *alias=NULL;
interface();
setcolor(MAGENTA);
int left = getmaxx() / 2 - 300;
int top = getmaxy() / 2 - 180;
int right = getmaxx() / 2 + 170;
int bottom = getmaxy() / 2 - 10;
rectangle(left,top,right,bottom);
setcolor(WHITE);
outtextxy(30,40,"Produtos dispon¡veis:");
alias=inicial;
while(alias!=NULL)
{
	sprintf(stl,"%d - %s",alias->num,alias->nome);
	outtextxy(37,i, stl);
	sprintf(prec,"Preco de Produ‡ao: %0.2f",alias->precoprod);
	outtextxy(280,i, prec);
	alias=alias->seguinte;
	i+=20;
}
}//fim fun‡ao produtospreco()

void moedas() //fun‡ao que mostra as moedas disponiveis no menu de trocos
{
int my=65, i=0;
char stl[100], quant[100];
setcolor(MAGENTA);
int left = getmaxx() / 2 - 250;
int top = getmaxy() / 2 - 190;
int right = getmaxx() / 2 + 130;
int bottom = getmaxy() / 2 - 30;
rectangle(left,top,right,bottom);
setcolor(WHITE);
outtextxy(70,40,"Moedas dispon¡veis:");
for (i=0;i<6;i++)
{
	sprintf(stl,"%d - %s",i+1,m[i].nome);
	outtextxy(75,my, stl);
	sprintf(quant,"Quantidade: %d",m[i].getquant_tot());
	outtextxy(320,my, quant);
	my+=20;
}
}//fim fun‡ao moedas()

void moedasut() //fun‡ao que mostra as moedas disponiveis no menu de moedas inseridas pelo utilizador
{
int my=65, i=0;
char stl[100], quant[100];
setcolor(MAGENTA);
int left = getmaxx() / 2 - 250;
int top = getmaxy() / 2 - 190;
int right = getmaxx() / 2 + 130;
int bottom = getmaxy() / 2 - 30;
rectangle(left,top,right,bottom);
setcolor(WHITE);
outtextxy(70,40,"Moedas dispon¡veis:");
for (i=0;i<6;i++)
{
	sprintf(stl,"%d - %s",i+1,m[i].nome);
	outtextxy(75,my, stl);
	sprintf(quant,"Quantidade: %d",m[i].gettot_utilizador());
	outtextxy(320,my, quant);
	my+=20;
}
}//fim fun‡ao moedasut()

void compras() //fun‡ao que cont‚m todo o interface do modo utilizador
{
produto *alias=NULL;
int py=85, p_num=60, statey=6, i=0;
char tot[100], prod[100], prod_num[100], preco[100], moeda[100], quant_moeda[100], moeda_num[100];
alias=inicial;
setcolor(LIGHTMAGENTA);
int left = getmaxx() / 2 - 300;
int top = getmaxy() / 2 + 150;
int right = getmaxx() / 2 + 195;
int bottom = getmaxy() / 2 + 225;
rectangle(left,top,right,bottom);
left = getmaxx() / 2 + 130;
top = getmaxy() / 2 - 190;
right = getmaxx() / 2 + 310;
bottom = getmaxy() / 2 + 140;
rectangle(left,top,right,bottom);
left = getmaxx() / 2 - 300;
top = getmaxy() / 2 - 190;
right = getmaxx() / 2 + 120;
bottom = getmaxy() / 2 + 140;
rectangle(left,top,right,bottom);
setcolor(CYAN);
left = 30;
top = 320;
right = 430;
bottom = 370;
rectangle(left,top,right,bottom);
setcolor(BROWN);
sprintf(tot,"Total: œ%0.2f",(float)totvend/100);
outtextxy(330,60,tot);
if (!aux7)
{
	outtextxy(40,250,"Insira moedas:");
	outtextxy(40,270,"Prima Enter para escolher o produto");
}
if (aux7)
{
	outtextxy(40,250,"Escolha o produto que deseja:");
	outtextxy(40,270,"Prima Enter para inserir moedas");
}
setcolor(LIGHTBLUE);
outtextxy(280,300,"8 - Retirar moedas");
outtextxy(35,60,"Troco:");
line(518,389,630,389);
line(518,389,518,464);
line(630,464,518,464);
line(630,389,630,464);
aux5=FALSE;
for (i=0;i<6;i++)
{
	if (m[i].getquant_tot()>0)
		aux5++;
}
if (aux5==FALSE)
{
	setcolor(RED);
	circle(90,63,4);
	circle(90,63,2);
	circle(90,63,1);
}
if (aux5>0)
{
	setcolor(GREEN);
	circle(90,63,4);
	circle(90,63,2);
	circle(90,63,1);
}
int linho=54, linho2=100;
while (alias!=NULL){
	setcolor(LIGHTBLUE);
	line(454,linho,454,linho2);
	line(454,linho,625,linho);
	line(625,linho,625,linho2);
	line(454,linho2,625,linho2);
	setcolor(WHITE);
	sprintf(prod_num,"%d - ",alias->num);
	outtextxy(457,p_num,prod_num);
	sprintf(prod,"%s",alias->nome);
	outtextxy(457,py,prod);
	setcolor(BROWN);
	sprintf(preco,"œ%0.2f",alias->preco);
	outtextxy(580,p_num,preco);
	if (alias->getquant_tot()==0)
	{
		setcolor(RED);
		circle(618,py+4,4);
		circle(618,py+4,2);
		circle(618,py+4,1);
	}
	if (alias->getquant_tot()>20)
	{
		setcolor(GREEN);
		circle(618,py+4,4);
		circle(618,py+4,2);
		circle(618,py+4,1);
	}
	if (alias->getquant_tot()>0 && alias->getquant_tot()<=20)
	{
		setcolor(YELLOW);
		circle(618,py+4,4);
		circle(618,py+4,2);
		circle(618,py+4,1);
	}
	py+=46;
	p_num+=46;
	statey+=2;
	linho=linho2-1;
	linho2+=46;
	alias=alias->seguinte;
}
int coordi=60, coord=40, linha=24, linha2=110;
for (i=0;i<6;i++)
{
	setcolor(LIGHTBLUE);
	line(linha,392,linha,461);
	line(linha,392,linha2,392);
	line(linha2,392,linha2,461);
	line(linha,461,linha2,461);
	setcolor(WHITE);
	sprintf(moeda_num,"%d",i+1);
	outtextxy(coordi,400,moeda_num);
	sprintf(moeda,"%s",m[i].nome_ut);
	outtextxy(coord,420,moeda);
	sprintf(quant_moeda,"(%d)",toteach[i]);
	outtextxy(coordi-5,440,quant_moeda);
	coordi+=80;
	coord+=80;
	linha=linha2-3;
	linha2+=80;

}
}//fim fun‡ao compras()

///////////////////////fim fun‡oes interface menus//////////////////////////////////

///////////////////////fun‡oes palavra-passe///////////////////////////////////

int menupass()   //fun‡ao inserir palavra-passe aquando do login de administrador
{
int x, y, z, res;
interface();
gotoxy(3,5);
if (!aux)
{
	settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
	setcolor(WHITE);
	outtextxy(15,70,"Insira a palavra-passe fornecida na £ltima p gina do manual de utilizador.");
}
gotoxy(3,5);
if (aux)
{
	settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
	setcolor(WHITE);
	outtextxy(15,70,"Insira a sua palavra-passe pessoal.");
}
setcolor(MAGENTA);
int left = getmaxx() / 2 - 250;
int top = getmaxy() / 2 - 115;
int right = getmaxx() / 2 - 145;
int bottom = getmaxy() / 2 - 95;
rectangle(left,top,right,bottom);
setcolor(WHITE);
outtextxy(15,100,"Palavra-passe:");
y=11;
z=0;
do
{
	x=getch();
	if (x!=13 && x!=8)
	{
		gotoxy(y,9);
		passut[z]=x;     //escreve asteriscos em vez de letras
		cout<<"*";
		z++;
		y++;
	}
	else if (x==8 && y>=12)  //se premir backspace e estiver no limite do rectangulo onde se insere a palavra-passe
	{
		if (z)
			z--;     //se tiver alguma letra a string, entao a posi‡ao diminui
		y--;
		gotoxy(y,9);
		cout<<" ";
	}
	else if (x==13)
	{
		passut[z]='\0';   //se premiu enter entao vai para a ultima posi‡ao da string
	}
}while (x!=13);
if (strcmp(passut, passadm)!=0)
{
	outtextxy(15,160,"Palavra-passe incorrecta!");
	getch();
	res=FALSE;
}
if (strcmp(passut, passadm)==0)
{
	res=TRUE;
}
return res;
}//fim fun‡ao menupass()

void alterar_pass()  //fun‡ao para alterar palavra-passe, nao acho que necessite de coment rios
{
int x=0, y=0, z=0, n=0, t=0;
setcolor(WHITE);
if (aux)
{
	outtextxy(15,140,"Insira a sua palavra-passe pessoal:");
}
if (!aux)
{
	outtextxy(15,140,"Insira a palavra-passe fornecida no manual:");
}
setcolor(MAGENTA);
int left = getmaxx() / 2 - 300;
int top = getmaxy() / 2 - 80;
int right = getmaxx() / 2 - 205;
int bottom = getmaxy() / 2 - 60;
rectangle(left,top,right,bottom);
setcolor(WHITE);
gotoxy(4,11);
y=4;
z=0;
do{
	x=getch();
	if (x!=13 && x!=8)
	{
		gotoxy(y,11);
		passut[z]=x;
		cout<<"*";
		z++;
		y++;
	}
	else if (x==8 && y>=5)
	{
		if (z)
			z--;
		y--;
		gotoxy(y,11);
		cout<<" ";
	}
	else if (x==13)
	{
		passut[z]='\0';
	}
}while (x!=13);
if (strcmp(passut, passadm)!=0)
{
	outtextxy(15,190,"Palavra-passe incorrecta!");
	getch();
}
if (strcmp(passut, passadm)==0)
{
	outtextxy(15,190,"Palavra-passe aceite!");
	getch();
	do{
		interface();
		outtextxy(15,80,"Insira uma nova palavra-passe (m x:10 caract‚res):");
		setcolor(MAGENTA);
		left = getmaxx() / 2 - 300;
		top = getmaxy() / 2 - 145;
		right = getmaxx() / 2 - 205;
		bottom = getmaxy() / 2 - 125;
		rectangle(left,top,right,bottom);
		setcolor(WHITE);
		gotoxy(4,7);
		y=4;
		z=0;
		do{
			x=getch();
			if (x!=13 && x!=8)
			{
				gotoxy(y,7);
				pass[z]=x;
				cout<<"*";
				z++;
				y++;
			}
			else if (x==8 && y>=5)
			{
				if (z)
					z--;
				y--;
				gotoxy(y,7);
				cout<<" ";
			}
			else if (x==13)
			{
				pass[z]='\0';
			}
		}while (x!=13);
		n=strlen(pass);
		if (n>10)
		{
			outtextxy(15,130,"Excedeu o n£mero de caracteres permitido!");
			getch();
		}
		if (n<3)
		{
			outtextxy(15,130,"A palavra-passe tem de ter pelo menos 3 caracteres!");
			getch();
		}
		if (n>2 && n<=10)
		{
			outtextxy(15,140,"Insira novamente a palavra-passe:");
			setcolor(MAGENTA);
			left = getmaxx() / 2 - 300;
			top = getmaxy() / 2 - 81;
			right = getmaxx() / 2 - 205;
			bottom = getmaxy() / 2 - 61;
			rectangle(left,top,right,bottom);
			setcolor(WHITE);
			gotoxy(4,11);
			y=4;
			z=0;
			do
			{
				x=getch();
				if (x!=13 && x!=8)
				{
					gotoxy(y,11);
					passconfir[z]=x;
					cout<<"*";
					z++;
					y++;
				}
				else if (x==8 && y>=5)
				{
					if (z)
						z--;
					y--;
					gotoxy(y,11);
					cout<<" ";
				}
				else if (x==13){
					passconfir[z]='\0';
				}
			}while (x!=13);
			if (strcmp(pass, passconfir)!=0)
			{
				outtextxy(15,200,"Palavras-passe nao identicas!");
				getch();
			}
			if (strcmp(pass, passconfir)==0)
			{
				for (t=0;t<10;t++)
					passadm[t]=passconfir[t];
				outtextxy(15,200,"Palavra-passe modificada com sucesso!");
				aux=TRUE;
				getch();
			}
		}
	}while (!aux);
}
}//fim fun‡ao alterar_pass()

/////////////////////////fim fun‡oes palavra-passe////////////////////////////

/////////////////////////fun‡oes actividades da m quina////////////////////////////

void prod_preco(produto* alias)   //fun‡ao que define a quantidade e preco dos produtos
{
int quant=0;
float pr=0;
char opcaopp, stx[100], quantx[100], precx[100];
do
{
	float gasto=0;
	interface();
	produtos();
	setcolor(WHITE);
	sprintf(stx,"Deseja aumentar a quantidade do produto %d ou modificar o seu pre‡o?", alias->num);
	outtextxy(30,320,stx);
	outtextxy(400,350,"1 - Quantidade");
	outtextxy(400,370,"2 - Pre‡o");
	outtextxy(400,390,"0 - Sair");
	opcaopp=getche();
	if (opcaopp=='1')
	{
		interface();
		produtos();
		setcolor(WHITE);
		if (alias->getquant_tot()==MAX)  //se for igual a MAX...
		{
			outtextxy(30,320,"Quantidade j  atingiu o seu m ximo permitido!");
			getch();
		}
		if (alias->getquant_tot()<MAX)  //se for inferior a MAX...
		{
			sprintf(quantx,"Insira a quantidade do produto %d (m x:%d).", alias->num,MAX-alias->getquant_tot() );
			outtextxy(30,320,quantx);
			gotoxy(5,23);
			cin>>quant;
			if (quant<0)    //se for negativo...
			{
				outtextxy(30,400,"Quantidade nao pode ser negativa!");
				getch();
			}
			if (quant>0 && quant+alias->getquant_tot()<=MAX) //se nao for negativo e o resultado for menor ou igual a MAX....
			{
				alias->setquant_tot(alias->getquant_tot(),quant);
				gasto=quant*alias->precoprod;    //calcula o gasto no produto
				alias->setgasto_tot(alias->getgasto_tot(),gasto);
				gasto=0;
				quant=0;
			}
			if (quant+alias->getquant_tot()>MAX)  //se resultado for superior a MAX...
			{
				outtextxy(30,400,"Quantidade excedida!");
				getch();
			}
		}
	}
	if (opcaopp=='2'){
		interface();
		produtos();
		setcolor(WHITE);
		sprintf(precx,"Determine o pre‡o do produto %d.",alias->num);
		outtextxy(30,320,precx);
		gotoxy(5,23);
		cin>>pr;
		if (pr<0) //se for negativo....
		{
			outtextxy(37,280,"O pre‡o nao pode ser negativo!");
			getch();
		}
		if (pr>=0)  //senÆo...
		{
			alias->preco=pr;
		}
	}
} while(opcaopp!='0');
}//fim fun‡ao prod_preco()

void menu_trocos(int x)  //fun‡ao de inserir e retirar trocos
{
int quant=0;
char opcaocoin, stroco[100], stroco_retirar[100], st[100];
do
{
	interface();
	moedas();
	setcolor(WHITE);
	sprintf(st,"Deseja inserir ou retirar moedas de %s?",m[x].nome);
	outtextxy(30,230,st);
	outtextxy(340,250,"1 - Inserir");
	outtextxy(340,270,"2 - Retirar");
	outtextxy(340,290,"0 - Sair");
	opcaocoin=getche();
	if (opcaocoin=='1')
	{
		interface();
		moedas();
		setcolor(WHITE);
		if (m[x].getquant_tot()==MAX)   //se for igual a MAX...
		{
			outtextxy(30,230,"Quantidade j  atingiu o seu m ximo permitido!");
			getch();
		}
		if (m[x].getquant_tot()<MAX)    //se for inferior a MAX...
		{
			sprintf(stroco,"Qual a quantidade de moedas de %s que deseja inserir? (m x:%d)",m[x].nome,MAX-m[x].getquant_tot());
			outtextxy(30,230,stroco);
			gotoxy(6,17);
			cin>>quant;
		}
		if (quant<0)      //se for negativo....
		{
			outtextxy(30,290,"Quantidade nao pode ser negativa!");
			getch();
		}
		else if (quant+m[x].getquant_tot()>MAX)    //se resultado for superior a MAX...
		{
			outtextxy(30,290,"Quantidade excedida!");
			getch();
		}
		if (quant>0 && quant+m[x].getquant_tot()<=MAX)  //se nao for negativo e resultado inferior ou igual a MAX...
		{
			m[x].setquant_tot(m[x].getquant_tot(),quant);
			quant=0;
		}
	}
	if (opcaocoin=='2')
	{
		interface();
		moedas();
		setcolor(WHITE);
		if (m[x].getquant_tot()==0) //se nao existirem moedas...
		{
			outtextxy(30,230,"Nao existem moedas para retirar!");
			getch();
		}
		if (m[x].getquant_tot()>0)  //se for superior a MAX...
		{
			sprintf(stroco_retirar,"Quantas moedas de %s deseja retirar?",m[x].nome);
			outtextxy(30,230,stroco_retirar);
			gotoxy(6,17);
			cin>>quant;
			if (quant<0)      //se for negativo...
			{
				outtextxy(30,290,"A quantidade nao pode ser negativa!");
				getch();
			}
			else if (quant>m[x].getquant_tot())   //se for superior … existente
			{
				outtextxy(30,290,"A quantidade que deseja retirar ‚ superior … existente!");
				getch();
			}
			if (quant>0 && quant<=m[x].getquant_tot()) //se for positivo e resultado inferior ou igual … existente
			{
				m[x].setquant_tot(quant);
				quant=0;
			}
		}
	}
}while(opcaocoin!='0');
}//fim fun‡ao menu_trocos()

void consul_rend()  //fun‡ao para consultar rendimentos de produtos
{
produto *alias=NULL;
int rendy=80, prody=60, quanty=60;
char rend[100], prod[100], quanti[100];
alias=inicial;
setcolor(MAGENTA);
int left = getmaxx() / 2 - 300;
int top = getmaxy() / 2 - 190;
int right = getmaxx() / 2 + 200;
int bottom = getmaxy() / 2 + 140;
rectangle(left,top,right,bottom);
setcolor(WHITE);
while (alias!=NULL)
{
	sprintf(prod,"%s :",alias->nome);
	outtextxy(37,prody,prod);
	sprintf(quanti,"Quantidade vendida: (%d)",alias->getquant_vend());
	outtextxy(300,quanty,quanti);
	if (alias->getganho_tot()-alias->getgasto_tot()>0)
	{
		alias->setrend(alias->getganho_tot(),alias->getgasto_tot());  //define rendimento
		sprintf(rend,"Lucro: %0.2f euros",alias->getrend());
		outtextxy(300,rendy,rend);
	}
	if (alias->getganho_tot()-alias->getgasto_tot()<0)
	{
		alias->setrend(alias->getganho_tot(),alias->getgasto_tot());
		sprintf(rend,"Preju¡zo: %0.2f euros",alias->getrend());
		outtextxy(300,rendy,rend);
	}
	if (alias->getganho_tot()-alias->getgasto_tot()==0)
	{
		outtextxy(300,rendy,"Nulo");
	}
	rendy+=40;
	prody+=40;
	quanty+=40;
	alias=alias->seguinte;
}
}//fim fun‡ao consul_rend()

void trocos(produto *alias)   //fun‡ao para executar os trocos
{
int res=0, devmoedas=0, quantdev[6]={0,0,0,0,0,0}, auxiliar=0;
float ganho=0;
int l=5, tr=398;
char troco[100], decide;
int aux_totvend=totvend;  //variavel auxiliar toma o valor de totvend, assim nao influenciando o seu valor at‚ eu querer
aux_totvend=aux_totvend-(alias->preco*100);  //decresce o valor do pre‡o do produto
auxiliar=aux_totvend;     //auxiliar toma valor de aux_totvend, verificando se o valor dele ‚ nulo ou superior a zero
if (aux5>0)      //se existirem trocos na m quina...
{
	while (l>-1)       //enquanto for maior que -1
	{
		if (m[l].getquant_tot()>0)   //se quantidade dessa moeda maior que zero
		{
			devmoedas=(int)(aux_totvend/m[l].value); //quantidade de moedas possiveis de devolver com este tipo de moeda
			res=m[l].getquant_tot()-devmoedas;     //subtra‡ao da quantidade existente e a possivel de devolver com este tipo de moeda
			if (res>=0){            //se for maior ou igual que zero
				quantdev[l]=devmoedas;      //entao podes devolver todas as possiveis
			}
			if (res<0){
				quantdev[l]=devmoedas+res;  //senao devolves as possiveis menos as exitentes (fa‡o soma pois res ‚ negativo). EX: devmoedas=6; quant_tot=4; res=quant_tot-devmoedas == -2..... assim quantdev=6+(-2)==4....devolve, entao as 4 existentes
			}
			if (quantdev[l]<=m[l].getquant_tot()) //se a quantidade for realmente menor ou igual … existente...
			{
				aux_totvend=aux_totvend-(quantdev[l]*m[l].value);  //o total decresce o valor de quantdev vezes o valor da moeda
			}
			devmoedas=0;
			res=0;
		}
		l-=1;
	}
	if (aux_totvend>0 && auxiliar>0)  //se apos toda aquela conta, mesmo assim aux_totvend nao for igual a zero nem auxiliar...
	{
		interface_ut();
		compras();
		outtextxy(40,330,"Nao existe troco suficiente, quer continuar?");
		outtextxy(105,350,"1 - Sim");
		outtextxy(225,350,"0 - Nao");
		decide=getche();
		if (decide=='1')
		{
			totvend=totvend-(alias->preco*100);  //como se concretizou a compra entao totvend decresce
			interface_ut();
			compras();
			l=5;
			outtextxy(40,330,"Retire a sua bebida e troco possivel.");
			alias->setquant_vend(1);
			ganho=ganho+alias->preco;
			alias->setganho_tot(alias->getganho_tot(),ganho);
			alias->setquant_tot(1);
			while (l>-1)
			{
				if (quantdev[l]>0){
					sprintf(troco,"%d - %s",quantdev[l],m[l].nome_ut);
					outtextxy(524,tr,troco);
					m[l].setquant_tot(quantdev[l]);
					tr+=11;
				}
				l-=1;
			}
			totvend=aux_totvend;
			devmoedas=0;
			for (l=0;l<6;l++)     //limpa tudo e insere as moedas do utilizador na m quina
			{
				m[l].settot_utilizador(toteach[l]);
				toteach[l]=0;
				quantdev[l]=0;
			}
		}

	}
	else if(aux_totvend==0 && auxiliar>0)   //se o aux_totvend e o auxiliar for igual a zero, entao quer dizer que ‚ preciso devolver troco
	{
		totvend=totvend-(alias->preco*100);
		interface_ut();
		compras();
		l=5;
		outtextxy(40,340,"Retire a sua bebida e troco.");
		alias->setquant_vend(1);
		ganho=ganho+alias->preco;
		alias->setganho_tot(alias->getganho_tot(),ganho);
		alias->setquant_tot(1);
		while (l>-1)
		{
			if (quantdev[l]>0){
				sprintf(troco,"%d - %s",quantdev[l],m[l].nome_ut);
				outtextxy(524,tr,troco);
				m[l].setquant_tot(quantdev[l]);
				tr+=11;
			}
			l-=1;
		}
		totvend=0;
		devmoedas=0;
		for (l=0;l<6;l++)
		{
			m[l].settot_utilizador(toteach[l]);
			toteach[l]=0;
			quantdev[l]=0;
		}
	}
}
if (aux5==FALSE || auxiliar==0)   //nao existe troco nenhum ou nao e preciso devolve-lo
{
	totvend=totvend-(alias->preco*100);
	interface_ut();
	compras();
	outtextxy(40,340,"Retire a sua bebida.");
	alias->setquant_vend(1);
	ganho=ganho+alias->preco;
	alias->setganho_tot(alias->getganho_tot(),ganho);
	alias->setquant_tot(1);
	for (l=0;l<6;l++)
	{
		m[l].settot_utilizador(toteach[l]);
		toteach[l]=0;
		quantdev[l]=0;
	}
}
}//fim fun‡ao trocos(produto *alias)

void preco_prod_rend(produto *alias) //fun‡ao definir pre‡o de produ‡ao
{
char s[100];
float prpr=0;
interface();
produtospreco();
sprintf(s,"Determine o pre‡o de produ‡ao do produto %d.",alias->num);
outtextxy(30,240,s);
gotoxy(5,17);
cin>>prpr;
if (prpr<0)
{
	outtextxy(30,280,"O pre‡o de produ‡ao nao pode ser negativo!");
	getch();
}
if (prpr>=0)
{
	alias->precoprod=prpr;
}
}//fim fun‡ao preco_prod_rend(produto *alias)

void rend_moedas_ut(int j) //fun‡ao para retirar moedas inseridas pelo utilizador
{
int qmoeda=0;
char strend[100];
interface();
moedasut();
if (m[j].gettot_utilizador()==0)          //acho que todos estes if j  foram bem explicados
{
	interface();
	moedasut();
	outtextxy(37,230,"Nao existem moedas para retirar!");
	getch();
}
if (m[j].gettot_utilizador()>0)
{
	sprintf(strend,"Qual a quantidade de moedas de %s deseja retirar?",m[j].nome);
	outtextxy(37,230,strend);
	gotoxy(6,17);
	cin>>qmoeda;
	if (qmoeda<0)
	{
		interface();
		moedasut();
		outtextxy(37,230,"Quantidade nao pode ser negativa!");
		getch();
	}
	else if (qmoeda>m[j].gettot_utilizador())
	{
		interface();
		moedasut();
		outtextxy(37,230,"Pedido excede quantia existente!");
		getch();
	}
	if (qmoeda>0 && qmoeda<=m[j].gettot_utilizador())
	{
		m[j].settot_utilizador(m[j].gettot_utilizador(),qmoeda);
	}
}
}//fim fun‡ao rend_moedas_ut(int j)

void insert_coin(int v)  //fun‡ao para inserir moedas na m quina
{
//se resultado for inferior ao m ximo permitido e o total for inferior ao m ximo permitido...
if (totvend+m[v].value<=(max_dinero*100) && totvend<(max_dinero*100))
{
	toteach[v]+=1;
	totvend=totvend+m[v].value;
}
//se resultado for superior ao m ximo mas totvend ainda nao atingiu o maximo...
else if (totvend+m[v].value>(max_dinero*100) && totvend<(max_dinero*100))
{
	outtextxy(40,330,"Nao ‚ permitido inserir mais moedas desse tipo!");
	getch();
}
else if (totvend==(max_dinero*100)) //se atingiu m ximo...
{
	outtextxy(40,330,"Nao ‚ permitido inserir mais moedas!");
	getch();
}
}//fim fun‡ao insert_coin(int v)

void choice_prod(produto *alias)  //fun‡ao para escolher produto
{
int aux3=0;  //controla as condi‡oes presentes na escolha de um produto pelo utilizador
compras();
do{
	if (totvend<(alias->preco*100) && 1>alias->getquant_tot())
	{
		outtextxy(40,330,"Quantidade indispon¡vel e dinheiro insuficiente!");
		aux3=FALSE;
		getch();
	}
	else if (totvend<(alias->preco*100))
	{
		outtextxy(40,330,"Dinheiro insuficiente para quantidade desejada!");
		aux3=FALSE;
		getch();
	}
	else if (1>alias->getquant_tot())
	{
		outtextxy(40,330,"Quantidade pretendida nao dispon¡vel!");
		aux3=FALSE;
		getch();
	}
	else if (totvend>=(alias->preco*100) && 1<=alias->getquant_tot())
	{
		compras();
		trocos(alias);
		aux3=FALSE;
		aux7=FALSE;
		getch();
	}
} while(aux3!=FALSE);
}//fim fun‡ao choice_prod(produto *alias)

void max_money() //fun‡ao definir dinheiro m ximo permitido
{
char maxi[100], op_dinero;
do
{
	interface();
	outtextxy(65,120,"Deseja definir o dinheiro m ximo permitido na m quina?");
	outtextxy(175,150,"1 - Sim");
	outtextxy(295,150,"0 - Nao");
	op_dinero=getche();
	if (op_dinero=='1')
	{
		interface();
		sprintf(maxi,"Defina a inser‡ao de dinheiro m xima na m quina. (actual:%0.2f)", max_dinero);
		outtextxy(65,120, maxi);
		gotoxy(8,11);
		cin>>max_dinero;
	}
}while (op_dinero!='0');
}//fim fun‡ao max_money()

/////////////////////////fim fun‡oes actividades da m quina////////////////////////////

/////////////////////////fun‡oes modos da m quina////////////////////////////

void admin_inteiro() //fun‡ao de todo o modo administrador
{
char opcaomoeut, opcaomenuadmin, opcao_sair;
do
{
	interface();
	setcolor(MAGENTA);
	int left = getmaxx() / 2 - 230;
	int top = getmaxy() / 2 - 190;
	int right = getmaxx() / 2 + 230;
	int bottom = getmaxy() / 2 - 80;
	rectangle(left,top,right,bottom);
	setcolor(15);
	settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
	outtextxy(110,60,"1 - Alterar palavra-passe");
	outtextxy(110,80,"2 - Definir quantidade dispon¡vel e pre‡o de produtos");
	outtextxy(110,100,"3 - Inserir/retirar moedas");
	outtextxy(110,120,"4 - Consultar rendimentos");
	outtextxy(110,140,"0 - Sair");
	opcaomenuadmin=getche();
	if (opcaomenuadmin=='1')
	{
		char opcaopass;
		do
		{
			interface();
			setcolor(MAGENTA);
			left = getmaxx() / 2 - 130;
			top = getmaxy() / 2 - 190;
			right = getmaxx() / 2 + 100;
			bottom = getmaxy() / 2 - 140;
			rectangle(left,top,right,bottom);
			setcolor(WHITE);
			outtextxy(200,60,"1 - Alterar palavra-passe");
			outtextxy(200,80,"0 - Sair");
			opcaopass=getche();
			if (opcaopass=='1')
				alterar_pass();
		}while(opcaopass!='0');
	}
	if (opcaomenuadmin=='2')
	{
		char opcaoprod;
		int prod=0;
		do
		{
			interface();
			produtos();
			setcolor(WHITE);
			outtextxy(37,280,"0 - Sair");
			gotoxy(5,23);
			opcaoprod=getche();
			if (opcaoprod=='1')
			{
				prod=1;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
			if (opcaoprod=='2')
			{
				prod=2;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
			if (opcaoprod=='3')
			{
				prod=3;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
			if (opcaoprod=='4')
			{
				prod=4;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
			if (opcaoprod=='5')
			{
				prod=5;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
			if (opcaoprod=='6')
			{
				prod=6;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
			if (opcaoprod=='7')
			{
				prod=7;
				p=encontrar(prod);
				if (p) prod_preco(p);
			}
		}while(opcaoprod!='0');
	}
	if (opcaomenuadmin=='3')
	{
		int x=0;
		char opcaomoeda;
		do
		{
			interface();
			moedas();
			setcolor(WHITE);
			outtextxy(75,185,"0 - Sair");
			opcaomoeda=getche();
			if (opcaomoeda=='1')
			{
				x=0;
				menu_trocos(x);
			}
			if (opcaomoeda=='2')
			{
				x=1;
				menu_trocos(x);
			}
			if (opcaomoeda=='3')
			{
				x=2;
				menu_trocos(x);
			}
			if (opcaomoeda=='4')
			{
				x=3;
				menu_trocos(x);
			}
			if (opcaomoeda=='5')
			{
				x=4;
				menu_trocos(x);
			}
			if (opcaomoeda=='6')
			{
				x=5;
				menu_trocos(x);
			}
		}while(opcaomoeda!='0');
	}
	if (opcaomenuadmin=='4')
	{
		char opcaorend;
		do
		{
			interface();
			setcolor(MAGENTA);
			left = getmaxx() / 2 - 230;
			top = getmaxy() / 2 - 190;
			right = getmaxx() / 2 + 230;
			bottom = getmaxy() / 2 - 60;
			rectangle(left,top,right,bottom);
			setcolor(15);
			settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
			outtextxy(110,60,"1 - Consultar rendimentos de produtos");
			outtextxy(110,80,"2 - Apagar e inserir produtos");
			outtextxy(110,100,"3 - Definir pre‡o de custo de produ‡ao de produtos");
			outtextxy(110,120,"4 - Retirar moedas provinientes de compras");
			outtextxy(110,140,"5 - Definir inser‡ao maxima de dinheiro");
			outtextxy(110,160,"0 - Sair");
			opcaorend=getche();
			if (opcaorend=='1')
			{
				interface();
				consul_rend();
				outtextxy(37,350,"Prima qualquer tecla para sair");
				getch();
			}
			if (opcaorend=='2')
				criar_apagar();
			if (opcaorend=='3')
			{
				int o=0;
				char opcaopreco;
				do
				{
					interface();
					produtospreco();
					setcolor(WHITE);
					outtextxy(37,215,"0 - Sair");
					opcaopreco=getche();
					if (opcaopreco=='1')
					{
						o=1;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
					if (opcaopreco=='2')
					{
						o=2;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
					if (opcaopreco=='3')
					{
						o=3;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
					if (opcaopreco=='4')
					{
						o=4;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
					if (opcaopreco=='5')
					{
						o=5;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
					if (opcaopreco=='6')
					{
						o=6;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
					if (opcaopreco=='7')
					{
						o=7;
						p=encontrar(o);
						if(p) preco_prod_rend(p);
					}
				} while(opcaopreco!='0');
			}
			if (opcaorend=='4')
			{
				int j=0;
				do
				{
					interface();
					moedasut();
					setcolor(WHITE);
					outtextxy(75,185,"0 - Sair");
					opcaomoeut=getche();
					if (opcaomoeut=='1')
					{
						j=0;
						rend_moedas_ut(j);
					}
					if (opcaomoeut=='2')
					{
						j=1;
						rend_moedas_ut(j);
					}
					if (opcaomoeut=='3')
					{
						j=2;
						rend_moedas_ut(j);
					}
					if (opcaomoeut=='4')
					{
						j=3;
						rend_moedas_ut(j);
					}
					if (opcaomoeut=='5')
					{
						j=4;
						rend_moedas_ut(j);
					}
					if (opcaomoeut=='6')
					{
						j=5;
						rend_moedas_ut(j);
					}
				} while(opcaomoeut!='0');
			}
			if (opcaorend=='5')
			{
				max_money();
			}
		} while(opcaorend!='0');
	}
	if (opcaomenuadmin=='0')
	{
		interface();
		outtextxy(85,120, "Tem a certeza de que pretende sair do Modo Administrador?");
		outtextxy(210,150,"1 - Sim");
		outtextxy(350,150,"0 - Nao");
		opcao_sair=getche();
	}
} while(opcao_sair!='1');
}//fim fun‡ao admin_inteiro()

void menu_utilizador() //fun‡ao de todo o modo utilizador
{
int v=0,
    i=0;
char opcaoutmoeda, opcao_sair;
do
{
	interface_ut();
	compras();
	opcaoutmoeda=getche();
	int opx=0;
	if (opcaoutmoeda=='1' && !aux7)
	{
		v=0;
		insert_coin(v);
	}
	if (opcaoutmoeda=='1' && aux7)
	{
		opx=1;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='2' && !aux7)
	{
		v=1;
		insert_coin(v);
	}
	if (opcaoutmoeda=='2' && aux7)
	{
		opx=2;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='3' && !aux7)
	{
		v=2;
		insert_coin(v);
	}
	if (opcaoutmoeda=='3' && aux7)
	{
		opx=3;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='4' && !aux7)
	{
		v=3;
		insert_coin(v);
	}
	if (opcaoutmoeda=='4' && aux7)
	{
		opx=4;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='5' && !aux7)
	{
		v=4;
		insert_coin(v);
	}
	if (opcaoutmoeda=='5' && aux7)
	{
		opx=5;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='6' && !aux7)
	{
		v=5;
		insert_coin(v);
	}
	if (opcaoutmoeda=='6' && aux7)
	{
		opx=6;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='7' && aux7)
	{
		opx=7;
		p=encontrar(opx);
		if (p) choice_prod(p);
	}
	if (opcaoutmoeda=='8')
	{
		totvend=0;
		for (i=0;i<6;i++)
		{
			toteach[i]=0;
		}
	}
	if (opcaoutmoeda==13)
	{
		if (!aux7)
			aux7=TRUE;
		else if (aux7)
			aux7=FALSE;
	}
	if (opcaoutmoeda=='0')
	{
		interface();
		outtextxy(85,120, "Tem a certeza de que pretende sair do Modo Utilizador?");
		outtextxy(210,150,"1 - Sim");
		outtextxy(350,150,"0 - Nao");
		opcao_sair=getche();
		if (totvend>0)
		{
			outtextxy(105,200,"Primeiro retire o seu dinheiro da m quina!");
			opcao_sair='0';
			getch();
		}
	}
}while(opcao_sair!='1');
}//fim fun‡ao menu_utilizador

/////////////////////////fim fun‡oes modos da m quina////////////////////////////

/////////////////////////fun‡ao main////////////////////////////

void main()
{
initgraficos();
initclasse();
char opbegin, opcao_sair;
do{
	menu_principal();
	opbegin=getche();
	if (opbegin=='1')
	{
		admin();
	}
	if (opbegin=='2')
	{
		if (p->getnp()==0)
		{
			interface();
			outtextxy(40,120, "Tem de primeiro inserir produtos na m quina para efectuar compras!");
			getch();
		}
		if (p->getnp()>0)
		{
			cleardevice();
			settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
			setcolor(MAGENTA);
			rectangle(5, 5, 635, 475);
			setcolor(WHITE);
			outtextxy(230, 50, "BEM-VINDO");
			int maxx = getmaxx();
			int maxy = getmaxy();
			rectangle(1, 2, maxx, maxy);
			getch();
			menu_utilizador();
		}
	}
	if (opbegin=='0')
	{
		interface();
		outtextxy(120,120, "Tem a certeza de que pretende sair do programa?");
		outtextxy(210,150,"1 - Sim");
		outtextxy(350,150,"0 - Nao");
		opcao_sair=getche();
	}
} while(opcao_sair!='1');
apaga_lista();
p=NULL;
inicial=NULL;
final=NULL;
anterior=NULL;
closegraph();
}

/////////////////////////fim funçao main////////////////////////////

E aqui está o link para o download do programa já compilado e com exe. Tem manual também!

http://rapidshare.com/files/198223996/Vending_Machine.rar

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem vindo Thiago_7 :)

Olha não sei se sabes mas está a decorrer um concurso de projectos de programação, a entrega de trabalhos termina hoje, mas ainda vais a tempo :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parabéns :D gostei bastante.

É por estas e por outras que eu gostava de saber programar C++, mas o VB.NET não me larga :)

Já agora, onde guardavas os valores?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz algo semelhante em assembly para uma cadeira.

Claro que não incluía classes nem listas dinâmicas hehe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parabéns :D gostei bastante.

É por estas e por outras que eu gostava de saber programar C++, mas o VB.NET não me larga :D

Já agora, onde guardavas os valores?

pois C++ é muito fixe.

Não guardava os valores pois não sabia ainda utilizar ficheiros  :D eventualmente faço uma versão com ficheiros mas no Ansi-C++ pois o Turbo C++ já é antigo  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora