Buscar

PIM ADS Pinheiros dez

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 29 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 29 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 29 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

/*           PIM ADS Pinheiros dez/2018 Grupo: 16
 
Participantes --------------------------------------------------------------------
Nome: Eduardo Gomes Duques da Silva RA: D6708J-9 2º Sem
Nome: Fabricio de Assiz Sousa RA: N3205E-8 2º Sem
Nome: Gabriel Vieira Toledo Leme RA: T8287F-2 1º Sem
Nome: Yuri de Oliveira Amorim RA:D63AJF9 2º Sem
 
Outras Observacoes -----------------------------------------------------------
                O primeiro código foi realizado em parceria com o Grupo 14, e auxílios externos, porém o mesmo apresenta alguns problemas de execução, dependendo do computador que está sendo utilizado. Por essa razão anexamos o segundo código, que está totalmente executável, porém ainda falta alguns dos requisitos.
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <pch.h>
#include <ctype.h>
/* 0 1 2 3 4 5 6 7 8 */
typedef enum {
	BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, /* nome das cores */
	LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE
} COLORS;
/* 9 10 11 12 13 14 15 */
static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = LIGHTGRAY;
void textcolor(int letras, int fundo) {/*para mudar a cor de fundo mude o background*/
	__FOREGROUND = letras;
	__BACKGROUND = fundo;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
		letras + (__BACKGROUND << 4));
}
struct participantes {
	char data[11], hora[9];
	int cpf, acento;
	char nome[30];
	int tipo; //Professor=0, Convidado=1, Aluno=2
	int portador; //Não=0, Sim=1
}/*MP[200]*/; //Matriz participantes
struct participantes MP[200];
void tela1();
int tela2();
void tela3();
int MA[10], cont;
int carac[8] = { 179,47,196,92,179,47,196,92 };
void gotoxy(int x, int y) {
	COORD c;
	c.X = x;
	c.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
int localizapart(int x) {
	return 0;
}
void inicia_participa() {
	MP[0].cpf = 12345;
	strcpy(MP[0].nome, "João Santos");
	MP[0].tipo = 2;
	MP[0].portador = 0;
	MP[1].cpf = 13245;
	strcpy(MP[1].nome, "Fernanda Tavares");
	MP[1].tipo = 2;
	MP[1].portador = 0;
	MP[2].cpf = 14245;
	strcpy(MP[2].nome, "Fernando Silva");
	MP[2].tipo = 2;
	MP[2].portador = 0;
	MP[3].cpf = 14255;
	strcpy(MP[3].nome, "Juliano Sousa");
	MP[3].tipo = 2;
	MP[3].portador = 1;
	MP[4].cpf = 12255;
	strcpy(MP[4].nome, "Silvio Santos");
	MP[4].tipo = 2;
	MP[4].portador = 0;
	MP[5].cpf = 12555;
	strcpy(MP[5].nome, "Augusto Silva");
	MP[5].tipo = 2;
	MP[5].portador = 0;
	MP[6].cpf = 32555;
	strcpy(MP[6].nome, "Joaquina Soares");
	MP[6].tipo = 2;
	MP[6].portador = 1;
}
void inicia_particp() {
	int MA[10][10];
}
void inicia_auditorio() {
	int i, j, MA[10];
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 10; j++)
			MA[j] = 0;
	}
}
void listar() {
	int i, j;
	printf("Listando todos participantes :\n");
	for (j = 0; j < cont; j++) {
		printf("Nome -----: %s\n", MP[j].nome);
		printf("cpf ---------: %d\n", MP[j].cpf);
		printf("Tipo -------: %d\n", MP[j].tipo);
		printf("Portador -: %d\n", MP[j].portador);
		printf("Acento ---: %d\n", MP[j].acento);
		printf("Data ------: %s\n", MP[j].data);
		printf("Hora ------: %s\n\n", MP[j].hora);
	}
}
void espera(int r) {
	int j, w, x, y; /* variáveis simples */
	HANDLE hOut; /* controle dos dispositivos do pc */
	hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* pega a saída padrão */
	CONSOLE_SCREEN_BUFFER_INFO SBInfo; /* informações sobre a buffer da tela */
	GetConsoleScreenBufferInfo(hOut, &SBInfo);/* pega a posição do cursor do console */
	x = SBInfo.dwCursorPosition.X; /* X será a posição x do cursor no console */
	y = SBInfo.dwCursorPosition.Y; /* Y será a posição y do cursor no console */
	gotoxy(x + 2, y);
	for (j = 0; j < 10; j++) {
		textcolor(12, 0);
		printf(" %d", 9 - j);
		textcolor(10, 0);
		for (w = 0; w < 8; w++) {
			if (kbhit()) {
				j = 10;
				break;
			}
			gotoxy(x + 1, y);
			printf("%c", carac[w]);/* gira o caractere na tela */
			Sleep(r / 25); /* dorme um tempinho */
		}
	}
	gotoxy(x, y);
	textcolor(7, 0);
	printf(" \n\n");
}
void tela() {
	int opcao;
	do {
		printf("1 - Cadastro\n");
		printf("2 - Reserva\n");
		printf("3 - Sorteio\n");
		printf("4 - Listar\n");
		printf("5 - Sair\n");
		scanf("%d", &opcao);
		switch (opcao) {
		case 1:
			tela1();/* cadastro */
			break;
		case 2:
			tela2();/* reserva */
			break;
		case 3:
			tela3();/* sorteio */
			break;
		case 4:
			listar();
			break;
		case 5:
			printf("Saindo do programa !");
			espera(1200);
			break;
		default:
			printf("Opcao invalida !\n\n");
		}
	} while (opcao != 5);
}
/*==================== inicio do programa =============================================*/
int main() {
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO SBInfo;
	GetConsoleScreenBufferInfo(hOut, &SBInfo);/* SBInfo é do tipo int e pega a posição do cursor */
	tela();
	return 0;
}
/*================================ fim do proframa =============================================*/
/* funções abaixo da main precisam ser declaradas lá no início antes do início */
/* acima da main não precisam ser declaradas */
void tela1() {/* cadastrar */
	char aux;
	textcolor(14, 0);
	printf("Aqui cadastrar participantes");
	espera(1200);
	textcolor(7, 0);
	printf("\nInforme os dados do participante\n");
	printf("o cpf : ");
	fflush(stdin);
	scanf("%d", &MP[cont].cpf);
	printf("o nome : ");
	fflush(stdin);
	scanf("%s", &MP[cont].nome);
	printf("o tipo : ");
	fflush(stdin);
	scanf("%d", &MP[cont].tipo);
	printf("portador 1 ou 0 : ");
	fflush(stdin);
	scanf("%d", &MP[cont].portador);
	printf("numero do acento : ");
	fflush(stdin);
	scanf("%d", &MP[cont].acento);
	_strdate(MP[cont].data);/* pega a data em inglês */
	_strtime(MP[cont].hora);/* pega a hora atual */
	aux = MP[cont].data[3];
	MP[cont].data[3] = MP[cont].data[0];
	MP[cont].data[0] = aux;
	aux = MP[cont].data[4];
	MP[cont].data[4] = MP[cont].data[1];
	MP[cont].data[1] = aux;
	aux = MP[cont].data[7];
	MP[cont].data[9] = MP[cont].data[7];
	MP[cont].data[8] = MP[cont].data[6];
	MP[cont].data[6] = '2';
	MP[cont].data[7] = 'O';/* data formato português */
	MP[cont].data[10] = '\0';/* sinaliza o final da string */
	cont++;
}
int tela2(int cpf) {/* reserva */
	int part, i, inicio, fim, posicao = -1;
	/*part = localizapart(cpf);*/
	if (MP[part].portador == 1) {
		inicio = 99;
		if (MP[part].tipo <= 1)
			fim = 0;
		else
			fim = 20;
	}
	else {
		if (MP[part].tipo <= 1)
			inicio = 0;
		else
			inicio = 20;
		fim = 94;
	}
	if (inicio > fim) {
		i = inicio;
		do {
			if (MA != 0) //i é bidimensional
				posicao = i;
			else
				i--;
		} while (posicao != -1 && i >= fim);
	}
	else {
		i = inicio;
		do {
			if (MA != 0)
				posicao = i;
			else
				i++;
		} while (posicao != -1 && (i <= fim));
	}
	if (posicao != -1)
		MA[posicao] = MP[part].cpf;
	else
		printf("Auditorio sem lugar disponivel");
	localizapart(cpf);
	/*int posicao = -1;*/
	/*int i = 0;*/
	while (posicao == -1 && i < 200) {
		if (MP[1].cpf == cpf)
			posicao = i;i++;
	}
	return posicao;
}
void tela3() {
	char aux[2];
	textcolor(14, 0);
	printf("Aqui sortear participantes");
	espera(1200);
	textcolor(7, 0);
}
*/ Código 2 – Está rodando, porém falta adicionar algumas opções
	#ifdef __WIN32
	#define limpar_tela "cls"
	#else
	#define limpar_tela "clear"
	#endif
	
	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
	
	#define MAXNOME 100
	#define MAXCPF 12
	#define MAXCARGO 15
	#define MAXPNE 3
	#define MAXPOS 100
	
	#define COL 10
	#define ROW 10
	#define FALSE 0
	#define TRUE 1
	
		// definição da struct assento
	typedef struct assento
	{
		// campos da struct assento
		int id;
		int id_cliente;	
	} t_assento;
	 
	// definição da struct cliente
	typedef struct cliente
	{
		// campos da struct cliente
		int id;
		char nome[MAXNOME];
		char cpf[MAXCPF];
		char cargo[MAXCARGO];
		char pne[MAXPNE];
		int assento;
	} t_cliente;
	 
	int colunaY();
	int linhaX();
	 
	// protótipos de funções
	 
	/**
	* Exibe o menu com todas as opções do programa
	* retorno: um caractere do número correspondente a opção
	*/
	char menu();
	 
	/**
	* Cadastro um cliente pedindo apenas o nome
	*/
	void cadastrar_cliente();
	 
	/**
	* Exibe todos os clientes cadastrados
	*/
	void listar_clientes();
	 
	/**
	* Procura um cliente pelo seu id
	*
	* Parâmetros:
	* arq_clientes: ponteiro para um arquivo aberto
	* id_cliente: ID do cliente que será buscado
	* retorno: um ponteiro para o cliente encontrado ou NULL caso o ID não exista
	*/
	t_cliente *obter_cliente(FILE *arq_clientes, int id_cliente);
	 
	/**
	* Pesquisa um cliente e exibe suas informações
	*/
	void pesquisar_cliente();
	 
	/**
	* Procura um cliente pelo seu id e informa se ele foi encontrado
	*
	* Parâmetros:
	* arq_clientes: ponteiro para um arquivo aberto
	* id_cliente: ID do cliente que será buscado
	* retorno: 1 se o cliente existe ou 0 caso o ID não exista
	*/
	int existe_cliente(FILE *arq_clientes, int id_cliente);
	/**
	 * Exclui um cliente do arquivo
	 */
	void excluir_cliente();
	 
	/**
	 * Inicializa a matriz de assentos
	 */
	void inicializa(char matriz[ROW][COL]);
	
	/**
	 * Mostra o painel de assentos
	 */
	void mostrarPainel(char matriz[ROW][COL]);
	
	/**
	 * Ocupa o Assento
	 */
	void reserva(char matriz[ROW][COL]);
	/**
	 * Exibe a legenda dos assentos
	 */
	void legenda(); 
	
	/**
	* Informa se a string é um número
	*
	* Parâmetros:
	* str: ponteiro para uma cadeia de caracteres
	* retorno: 1 se a string só conter números ou 0 caso contrário
	*/
	int str_somente_numeros(char str[]);
	
	 
	int main(int argc, char *argv[])
	{
		char resp;
		char matriz[ROW][COL];
 		 inicializa(matriz); //Iniciliza a matriz com valores .(Livre)
 
	 
		// loop infinito do programa
		while(1)
		{
			// obtém a escolha do usuário
			resp = menu();
	 
			// testa o valor de "resp"
			if(resp == '1')
				cadastrar_cliente();
			else if(resp == '2')
				listar_clientes();
			else if(resp == '3')
				pesquisar_cliente();
			else if(resp == '4')
				excluir_cliente();
			else if(resp == '5')
				 mostrarPainel(matriz);
			else if(resp == '6'){
				mostrarPainel(matriz);
				reserva(matriz);
				}				
			else if(resp == '0') // se for igual a 0, então sai do loop while
				break;
			else
			{
				printf("\nOpcao invalida! Pressione <Enter> para continuar...");
				scanf("%*c");
				// uma forma de "limpar" o buffer de entrada
				fseek(stdin, 0, SEEK_END); // não recomendável o uso
			}
			system(limpar_tela);
		}
	 
		printf("\nVolte sempre!\n");//Despedida
		return 0;
	}
	 
	 
	// função que exibe o menu e retorna a opção escolhida pelo usuário
	char menu()
	{
		char resp[2];
	 
		printf("------------------------------ Reserva de Assentos ------------------------------");
		printf("\n\n1 - Cadastrar um cliente\n");
		printf("2 - Listar todos os clientes\n");
		printf("3 - Pesquisar por cliente\n");
		printf("4 - Excluir cliente\n");
		printf("5 - Mostrar painel\n");
		printf("6 - Reservar assento\n");
		printf("0 - Sair\n");
		printf("Digite o numero da opcao: ");
		scanf("%1s%*c", resp); // o *c pega o Enter e descarta
	 
		// uma forma de "limpar" o buffer de entrada
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	 
		// se chegou aqui, é porque a opção é válida
		return resp[0];
	}
	 
	 
	// função que verifica se uma string contém somente números
	int str_somente_numeros(char str[])
	{
		int i = 0;
		int len_str = strlen(str);
	 
		for(i = 0; i < len_str; i++)
		{
			if(str[i] < '0' || str[i] > '9')
				return 0;
		}
		return 1;
	}
	 
	 
	// função para cadastrar cliente
	void cadastrar_cliente()
	{
		// abre o arquivo para escrita
		// a+b => acrescenta dados ao final do arquivo ou cria
		// um arquivo binária para leitura e escrita
		FILE *arq_clientes = fopen("clientes.bin", "a+b");
	 
		// testa a abertura do arquivo
		if(arq_clientes == NULL)
		{
			printf("\nFalha ao abrir arquivo(s)!\n");
			exit(1); // aborta o programa
		}
		
		int cont_bytes = 0;
	 
		// cont irá guardar o número total de bytes
		// seta o ponteiro do arquivo para o final do arquivo
		fseek(arq_clientes, 0, SEEK_END);
		// pegamos a quantidade de bytes com a função ftell
		cont_bytes = ftell(arq_clientes);
	 
		t_cliente cliente;
	 
		if(cont_bytes == 0)
		{
			// se for 0, então não existe cliente cadastrado
			// coloco o ID começando de 1
			cliente.id = 1;
		}
		else
		{
			t_cliente ultimo_cliente;
	 
			// utilizo a função fseek para posicionar o arquivo
			// cont_bytes - sizeof(t_cliente) serve para posicionar
			// para que possamos pegar o último cliente cadastrado
			fseek(arq_clientes, cont_bytes - sizeof(t_cliente), SEEK_SET);
	 
			// ler o cliente
			fread(&ultimo_cliente, sizeof(t_cliente), 1, arq_clientes);
	 
			// o ID do cliente é o ID do último cliente acrescido em 1
			cliente.id = ultimo_cliente.id + 1;
		}
		// obtém os dados do cliente
		// ^\n indica para pegar até a quebra de linha (enter)
		// %*c descarta o enter
		printf("\nDigite o nome do cliente: ");
		scanf("%99[^\n]%*c", cliente.nome);
		printf("\nDigite o CPF do cliente: ");
		scanf("%99[^\n]%*c", cliente.cpf);
		printf("\nDigite o cargo do cliente: ");
		scanf("%99[^\n]%*c", cliente.cargo);
		printf("\nDigite se o cliente e pne: ");
		scanf("%99[^\n]%*c", cliente.pne);
		 
		// uma forma de "limpar" o buffer de entrada
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	 
		// se o ponteiro não estiver no final do arquivo nada é escrito
		fseek(arq_clientes, 0, SEEK_END);
		// escreve no arquivo
		fwrite(&cliente, sizeof(t_cliente), 1, arq_clientes);
	 
		// fecha o arquivo
		fclose(arq_clientes);
	 
		printf("\nCliente \"%s\" cadastrado com sucesso!\n", cliente.nome);
		printf("\nPressione <Enter> para continuar...");
		scanf("%*c"); // pega o Enter e descarta
	 
		// uma forma de "limpar" o buffer de entrada
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	}
	 
	// função para listar todos os clientes
	void listar_clientes()
	{
		// rb => abre arquivo binário para leitura apenas
		FILE *arq_clientes = fopen("clientes.bin", "rb");
	 
		// testa a abertura do arquivo
		if(arq_clientes == NULL)
		{
			printf("\nFalha ao abrir arquivo(s)ou ");
			printf("Nenhum cliente cadastrado.\n");
			printf("\nPressione <Enter> para continuar...");
			scanf("%*c"); // pega o Enter e descarta
	 
			// uma forma de "limpar" o buffer de entrada
			fseek(stdin, 0, SEEK_END); // não recomendável o uso
			return;
		}
	 
		// variável que indica se encontrou pelo menos 1 cliente
		int encontrou_clientes = 0;
		t_cliente cliente;
	 
		printf("\nListando todos os clientes...\n");
		// loop para percorrer o arquivo
		while(1)
		{
			// fread retorna o número de elementos lidos com sucesso
			size_t result = fread(&cliente, sizeof(t_cliente), 1, arq_clientes);
	 
			// se for 0, é porque não há mais elemento, então sai do loop
			if(result == 0)
				break;
	 
			// atualiza a variável indicando que encontrou
			// pelo menos um cliente
			encontrou_clientes = 1;
	 
			// mostra os dados do cliente
			printf("\nID do cliente: %d\n", cliente.id);
			printf("Nome do cliente: %s\n", cliente.nome);
			printf("CPF do cliente: %s\n", cliente.cpf);
			printf("Cargo do cliente: %s\n", cliente.cargo);
			printf("E pne? %s\n", cliente.pne);
		}
	 
		if(encontrou_clientes == 0)
			printf("\nNenhum cliente cadastrado.\n");
	 
		fclose(arq_clientes);
	 
		printf("\nPressione <Enter> para continuar...");
		scanf("%*c");
	 
		// uma forma de "limpar" o buffer de entrada
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	}
	 
	 
	// função que obtém um cliente pelo ID
	t_cliente *obter_cliente(FILE *arq_clientes, int id_cliente)
	{
		// vai para o início do arquivo
		rewind(arq_clientes);
	 
		t_cliente *cliente;
	 
		// loop para percorrer o arquivo
		// busca linear O(n), como o ID é crescente é possível fazer uma busca binária O(log(n))
		// aloca espaço mesmo sem saber se o cliente existe
		cliente = (t_cliente *)malloc(sizeof(t_cliente));
		while(1)
		{
	 
			// fread retorna o número de elementos lidos com sucesso
			size_t result = fread(cliente, sizeof(t_cliente), 1, arq_clientes);
	 
			// se for 0, é porque não há mais elemento, então sai do loop
			if(result == 0)
			{
				free(cliente); // libera a mémoria, pois o cliente não foi encontrado
				return NULL;
			}
			// verifica se os ID's são iguais
			if(cliente->id == id_cliente)
				break;
		}
		return cliente;
	}
	 
	// função para pesquisar por algum cliente
	void pesquisar_cliente()
	{
		char cpf[MAXCPF];
		int encontrou_cliente = 0;
	 
		// rb+ => abre para leitura somente
		FILE *arq_clientes = fopen("clientes.bin", "rb");
	 
		// testa a abertura do arquivo
		if(arq_clientes == NULL)
		{
			printf("\nFalha ao abrir arquivo(s)!\n");
			exit(1); // aborta o programa
		}
	 
		printf("\nDigite o cpf do cliente: ");
		scanf("%99[^\n]%*c", cpf);
	 
		printf("\nClientes com o cpf \"%s\":\n\n", cpf);
		// loop para percorrer o arquivo
		t_cliente cliente;
		while(1)
		{
			// fread retorna o número de elementos lidos com sucesso
			size_t result = fread(&cliente, sizeof(t_cliente), 1, arq_clientes);
	 
			// se for 0, é porque não há mais elemento, então sai do loop
			if(result == 0)
				break;
	 
			char cpf_aux[MAXNOME];
			// faz uma cópia para não alterar cliente->nome
			strcpy(cpf_aux, cliente.cpf);
	 
			// verifica se é igual
			if(strcmp(strupr(cpf_aux), strupr(cpf)) == 0)
			{
				// mostra os dados do cliente
				printf("ID do cliente: %d\n\n", cliente.id);
				encontrou_cliente = 1;
			}
		}
	 
		if(encontrou_cliente == 0)
			printf("Nenhum cliente encontrado.\n\n");
	 
		// fecha o arquivo
		fclose(arq_clientes);
	 
		printf("Pressione <Enter> para continuar...");
		scanf("%*c");
	 
		// uma forma de "limpar" o buffer de entrada
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	}
	 
	// função que verifica se um cliente existe
	// retorna 0 se NÃO existe e 1 caso contrário
	int existe_cliente(FILE *arq_clientes, int id_cliente)
	{
		// vai para o início do arquivo
		rewind(arq_clientes);
	 
		t_cliente cliente;
		// loop para percorrer o arquivo
		// busca linear O(n), como o ID é crescente é possível fazer uma busca binária O(log(n))
		while(1)
		{
			// fread retorna o número de elementos lidos com sucesso
			size_t result = fread(&cliente, sizeof(t_cliente), 1, arq_clientes);
	 
			// se for 0, é porque não há mais elemento, então sai do loop
			if(result == 0)
				break;
	 
			// verifica se o ID é igual
			if(cliente.id == id_cliente)
				return 1;
		}
	 
		// se chegou aqui é porque NÃO existe o cliente, então retorna 0
		return 0;
	}
	
		// função responsável por excluir clientes
	void excluir_cliente()
	{
		char str_id_cliente[10];
		int id_cliente;
	 
		printf("\nDigite o ID do cliente: ");
		scanf("%10s%*c", str_id_cliente);
	 
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	 
		// verifica se str_id_cliente só contém números
		if(str_somente_numeros(str_id_cliente) == 1)
		{
			// se chegou aqui é porque o ID do cliente é válido
			sscanf(str_id_cliente, "%d", &id_cliente);
	 
			// rb abre para leitura (o arquivo deve existir)
			FILE *arq_clientes = fopen("clientes.bin", "rb");
	 
			if(arq_clientes == NULL)
			{
				printf("\nFalha ao abrir arquivo(s)!\n");
				exit(1); // aborta o programa
			}
	 
			// verifica se o cliente existe
			if(existe_cliente(arq_clientes, id_cliente) == 1)
			{
				char nome_cliente[MAXNOME];
				// abre um novo arquivo temporário
				FILE *arq_temp = fopen("temp_clientes.bin", "a+b");
				if(arq_temp == NULL)
				{
					printf("\nFalha ao criar arquivo temporario!\n");
					fclose(arq_clientes);
					exit(1); // aborta o programa
				}
				rewind(arq_clientes); // vai para o início do arquivo
	 
				t_cliente cliente;
				while(1) // loop para percorrer o arquivo
				{
	 
					// fread retorna o número de elementos lidos com sucesso
					size_t result = fread(&cliente, sizeof(t_cliente), 1, arq_clientes);
	 
					// se for 0, é porque não há mais elemento, então sai do loop
					if(result == 0)
						break;
	 
					// só copia pro novo arquivo se for diferente
					if(cliente.id != id_cliente)
					{
						// escreve no arquivo temporário
						fwrite(&cliente, sizeof(t_cliente), 1, arq_temp);
					}
					else
						strcpy(nome_cliente, cliente.nome);
				}
	 
				// antes de fazer operações de remover arquivo e renomear,
				// é preciso fechar os dois arquivos
				fclose(arq_clientes);
				fclose(arq_temp);
	 
				// depois de fechar o arquivo, então tentamos remover
				if(remove("clientes.bin") != 0)
					printf("\nErro ao deletar o arquivo \"clientes.bin\"\n");
				else
				{
					// renomeia o arquivo
					int r = rename("temp_clientes.bin", "clientes.bin");
					if(r != 0)
					{
						printf("\nPermissao negada para renomear o arquivo!\n");
						printf("Feche esse programa bem como o arquivo \"temp_clientes.bin\" e renomeie manualmente para \"clientes.bin\"\n");
					}
					else
						printf("\nCliente \"%s\" removido com sucesso!\n", nome_cliente);
				}
			}
			else
			{
				fclose(arq_clientes);
				printf("\nNao existe cliente com o ID \"%d\".\n", id_cliente);
			}
		}
		else
			printf("\nO ID so pode conter numeros!\n");
	 
		printf("\nPressione <Enter> para continuar...");
		scanf("%*c");
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	}
	
	void inicializa(char matriz[ROW][COL]){
 int i,j;
 for(i=1;i<=ROW;i++)for(j=1;j<=COL;j++)
 matriz[i][j] = '.';
	}
	void mostrarPainel(char matriz[ROW][COL]){
 
	 int i,j;
	 printf("\n\n %c PAINEL DE OCUPACOES %c\n\n",16,17);
	 printf(" ");
	 
	 for(i=1;i<=COL;i++)
	 printf("%d ",i);
	 
	 for(i=1;i<=ROW;i++){
	 printf("\n\n %d",i);
	 for(j=1;j<=COL;j++)
	 printf(" (%c)",matriz[i][j]); 
	 }
	 legenda();
	 system ("pause");
	}
	
	//apresenta a legenda na tela
	void legenda(){
		printf("\n\n\n .-Livre X-Ocupado\n");
		printf(" Assentos da linha 1 sao destinados a pessoas com pne\n");
		printf(" Assentos das linhas 2 e 3 sao destinados a professores\n\n");
	} 
	 //efetica a compra da cadeira
		void reserva(char matriz[ROW][COL]){
		int row, col;
		printf("\n Reserva de Assentos\n\n");
		row = linhaX();
		col = colunaY();
	 
		if(matriz[row][col]=='.'){
	 	matriz[row][col] = 'X';
	 	printf("\n\n RESERVA EFETIVADA COM SUCESSO !!");
			} 
		else if (matriz[row][col]=='X')
	 printf("\n\n CADEIRA JA OCUPADA!! ESCOLHA OUTRA !!\n\n");
	 else if(matriz[row][col]=='R')
	 printf("\n\n CADEIRA JA RESERVADA!! ESCOLHA OUTRA !!\n\n"); 
	} 
	
	//ler a linha oferecida pelo usuario
	int linhaX(){
	 int row;
	 printf(" Linha: "); scanf("%d",&row);
	 if(row>10)
	 {
	 printf("\t\n Esta cadeira nao existe!!! ");
	 }
	 return row;
	}
	
	//ler a coluna oferecida pelo usuario
	int colunaY(){
	 int col;
	 printf(" Coluna: "); scanf("%d",&col);
	 if(col>10)
	 {
	 printf("\t\n Esta cadeira nao existe!!! ");
	 }
	 return col; 
	}
	
	/*// função responsável pelo reserva de acentos
	void reserva(char matriz[ROW][COL])
	{
		char str_id_cliente[10];
		int id_cliente;
	 
		// rb+ abre para leitura/atualização
		FILE *arq_reserva = fopen("reserva.bin", "rb+");
		FILE *arq_clientes = fopen("clientes.bin", "rb+");
	 
		// se não conseguiu abrir, então cria o arquivo
		// wb+ abre para escrita/atualização (cria o arquivo se ele NÃO existir)
		if(arq_reserva == NULL)
		{
			arq_reserva = fopen("reserva.bin", "wb+");
			if(arq_reserva == NULL)
			{
				printf("\nFalha ao criar arquivo(s)!\n");
				exit(1); // aborta o programa
			}
		}
	 
		if(arq_clientes == NULL)
		{
			arq_clientes = fopen("clientes.bin", "wb+");
			if(arq_clientes == NULL)
			{
				printf("\nFalha ao criar arquivo(s)!\n");
				exit(1); // aborta o programa
			}
		}
	 
		// obtém o ID do cliente
		printf("\nDigite o ID do cliente: ");
		scanf("%10s%*c", str_id_cliente);
	 
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	 
		if(str_somente_numeros(str_id_cliente) == 1)
		{
			// se caiu aqui é porque o ID possui somente números, então
			// preenche a variável "id_cliente" com o valor de "str_id_cliente"
			sscanf(str_id_cliente, "%d", &id_cliente);
	 
			// verifica se o ID do do cliente existe
			if(existe_cliente(arq_clientes, id_cliente))
			{
				char str_id_assento[100];
				int id_assento;
	 			int row, col;
				printf("\n Reserva de Assentos\n\n");
				row = linhaX();
				col = colunaY();
	 			
				str_id_assento = row * col;
	 
				fseek(stdin, 0, SEEK_END); // não recomendável o uso
	 			
	 			t_assento assento;
	 			
				if(str_somente_numeros(str_id_assento) == 1)
				{
					// se chegou aqui é porque o ID do assento é válido
					sscanf(str_id_assento, "%d", &id_assento);
					
					// testa se o filme existe...
					if(assento != NULL)
					{
						if(matriz[row][col]=='.'){
				 matriz[row][col] = 'X';
				 printf("\n\n RESERVA EFETIVADA COM SUCESSO !!");
				 } 
				 else if (matriz[row][col]=='X')
				 printf("\n\n CADEIRA JA OCUPADA!! ESCOLHA OUTRA !!\n\n");
				 else if(matriz[row][col]=='R')
				 printf("\n\n CADEIRA JA RESERVADA!! ESCOLHA OUTRA !!\n\n"); 
	}
						free(assento); // libera o filme alocado
					}
					else
						printf("\nNao existe assento com o ID \"%d\".\n", id_assento);
				}
				else
					printf("\nO ID so pode conter numeros!\n");
			}
			else
				printf("\nNao existe cliente com o ID \"%d\".\n", id_cliente);
		}
		else
			printf("\nO ID so pode conter numeros!\n");
	 
		// fecha os arquivos
		fclose(arq_clientes);
		fclose(arq_assento);
	 
		printf("\nPressione <Enter> para continuar...");
		scanf("%*c");
	 
		fseek(stdin, 0, SEEK_END); // não recomendável o uso
	}*/
*/

Continue navegando