Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /**
  2. Parking Control
  3.  
  4. Creditos: Sidney dos Santos Souza
  5. e-mail: king.sidney@yahoo.com.br
  6.  
  7. Descrição:
  8.  
  9. Software desenvolvido na linguagem C que roda no prompt do Windows para controlar o movimento de entrada e saida de um estacionamento buscando a facil manipulação e execução de tarefas como:
  10.  
  11. Cadastro, Exclusão, Alteração, Reinclusão de clientes mensalistas
  12. Controle de diaristas, pernoites e rotativos
  13. Controle de vagas
  14. Relatórios Diarios, Semanais e Mensais (ficou um pouco limitado).
  15.  
  16. ps: O software foi desenvolvido para windows por exigência do professor e infelizmente não tive tempo de portabiliza-lo pra Linux.
  17.  
  18. Caso alguem se interesse por melhorar o codigo e implementar outras funções, sejam encontrados bugs, dicas e sugestões basta entrar em contato.
  19.  
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <conio.h>
  26. #include <time.h>
  27. #include <ctype.h>
  28.  
  29. //*****************************************************************
  30. // Funções de portabilidade
  31. //*****************************************************************
  32.  
  33. #ifdef _WIN32
  34. #include <windows.h>
  35. void cls(void){ system("CLS");}
  36. void setColor(char* str){ system(str); }
  37. #else
  38. void cls(void){printf("\e[H\e[2J");}
  39. void setColor(char*){};
  40. #endif
  41.  
  42.  
  43. //*****************************************************************
  44. // Constantes Globais
  45. //*****************************************************************
  46.  
  47. #define ESQUERDA 1
  48. #define CENTRO 2
  49. #define DIREITA 3
  50. #define QTD_Vei 5
  51. #define QTD_Vaga 7
  52.  
  53.  
  54. //*****************************************************************
  55. // Variáveis Usadas para controle de pesquisa
  56. //*****************************************************************
  57.  
  58. enum{
  59. TUDO,
  60. CLIENTES,
  61. VEICULOS,
  62. };
  63.  
  64. //*****************************************************************
  65. // Estruturas do Sistema
  66. //*****************************************************************
  67.  
  68. typedef struct{
  69. char modelo[50];
  70. char placa[15];
  71. int tipo;
  72. int excluido;
  73. }Veiculo;
  74.  
  75. typedef struct{
  76. char nome[80];
  77. char endereco[80];
  78. char telefone[15];
  79. char cpf[14];
  80. int codigo;
  81. int excluido;
  82. int numVagas;
  83. int contVei;
  84. int mesPago;
  85. int diaPago;
  86. Veiculo veiculo[QTD_Vei];
  87. }Cliente;
  88.  
  89. typedef struct{
  90. char tipoCliente[20];
  91. char placa[15];
  92. int status;
  93. int entrada;
  94. int tipo;
  95. }Vaga;
  96.  
  97. typedef struct{
  98. int wdia_abertura;
  99. int mdia_abertura;
  100. int mes_abertura;
  101. int contDays;
  102. float fatDiario;
  103. float fatSemanal;
  104. float fatMensal;
  105. }Caixa;
  106.  
  107. typedef struct{
  108. char nome[80];
  109. char Senha[20];
  110. Caixa caixa;
  111. float pernoite;
  112. float diaria;
  113. float mensalista;
  114. float meiaHora;
  115. float vHora;
  116. float vMoto;
  117. int firstStart;
  118. int contVagas;
  119. int contVei;
  120. int vagasMotos;
  121. int vagasMensalistas;
  122. Vaga vagas[QTD_Vaga];
  123. }Sistema;
  124.  
  125. //*****************************************************************
  126. // Variaveis Globais
  127. //*****************************************************************
  128.  
  129. //Variáveis responsáveis pelo controle do tempo //
  130. struct tm* local; //Declaração da variavel 'local' que recebera um ponteiro do tipo 'tm'
  131. time_t t; // Variavel do tipo time
  132.  
  133. // Fim das variáveis de configuração do tempo //
  134.  
  135. /**
  136. * Tentei usar a struct tm, mas como ela dificultou os calculos de acumulo de horas, acabei optando por usar
  137. * variáveis do tipo time_t salvas como inteiro, pois desse modo eu teria a diferença entre a entrada e saida
  138. * dada em segundos, possibilitando uma fácil conversão para minutos e horas.
  139. */
  140.  
  141. FILE* arqC; // Ponteiro do arquivo de clientes
  142. FILE* arqS; // Ponteiro do arquivo do sistema
  143. int retorno; // Variavel usada para controle da gravação dos arquivos, caso ela seja nula é por que a gravação falhou
  144. Sistema sistema; // Variavel do Sistema, usada para guardar as informações utilizadas pelo mesmo
  145. Vaga* sistema_veiculo; // Ponteiro do tipo vaga, usado para acessar as vagas com o nome sistema_veiculo
  146. Cliente cliente; // Variavel de clientes, usada para armazenar os clientes mensalista.
  147. time_t entrada, saida; // Variaveis de controle de tempo
  148.  
  149. //*****************************************************************
  150. // Comandos usados para controle de tela.
  151. //*****************************************************************
  152.  
  153. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  154. CONSOLE_SCREEN_BUFFER_INFO SBInfo; // Pega informações da tela do console
  155.  
  156. int screen_x; //Valor da largura da tela
  157. int screen_y; //Valor da altura da tela
  158.  
  159.  
  160.  
  161. //*****************************************************************
  162. // Inicio Protótipos das funções
  163. //*****************************************************************
  164.  
  165.  
  166. // A prototipação das funções são comumente usadas para que se possa escrever a sua implementação abaixo da função principal(main).
  167. //Como a linguagem C é estruturada (lê o programa linha a linha) ele precisa reconhecer as funções usadas no main para então usa-las.
  168. //A prototipação faz com que o compilador reconheça a função, compile-a e depois use-a posteriormente no main, mesmo que essas funções
  169. //sejam escritas depois da função principal.
  170.  
  171.  
  172. void gotoxy(int, int); // Função usada para deslocar o ponteiro do console, recebe por parametro a COLUNA e LINHA
  173. void alinhar(int,int, char*); // Função usada para alinhar o texto na tela, recebe por parametro a LINHA a ser impressa na tela, POSIÇÃO (ESQUERDA, DIREITA, CENTRO), FRASE A SER ESCRITA.
  174. void printCabecalho(void); // Função usada para escrever o cabeçalho com o nome do estabelecimento
  175. void clearLine(void); // Função usada para limpar caracteres inscritos em uma linha na tela
  176. void formDados(void); // Função responsavel pelo formulario do cadastro de clientes
  177. void coletaDados(void); // Função responsavel pela coleta de dados do formulario acima
  178. void CarIn(void); // Função usada para realizar a entrada do carro no estacionamento.
  179. int CarOut(void); // Função usada para realizar a saida do carro do estacionamento
  180. void Relatorios(void); // Função responsavel por gerar relatórios de caixa.
  181. void System_Conf(void); // Função usada para fazer as configurações do sistema.
  182. void cadastraCliente(void); // Função para Cadastro de clientes mensalistas
  183. void listaClientes(void); // Função usada para listar todos os clientes cadastrados no sistema
  184. int pesquisaGeral(int); // Função que realiza as pesquisa de clientes e carros
  185. void excluiCliente(int); // Função usada para excluir clientes
  186. void pagamentoCliente(int); // Função usada para efetuar o pagamento do cliente
  187. void cadastraCarro(int, int); // Função usada para cadastrar carros no sistema
  188. void editarRegistroCliente(int); // Função para editar registros dos clientes
  189. void editarRegistroCarros(int); // Função para editar registro dos Carros
  190. void getInformationClients(void); // Função para Carrega informações dos clientes no sistema
  191. void getInformationSystem(void); // Função para Carregas informações do proprio sistema
  192. void FirstStart(void); // Função que testa se é a primeira inicialização do sistema
  193. void listaVagas(void); // Função que Lista todas as Vagas.
  194.  
  195. //*****************************************************************
  196. // Funções para abrir arquivos leitura
  197. //*****************************************************************
  198. void abreArquivos(char*);
  199. void abreArquivoCliente(char*);
  200. void abreArquivoSistema(char*);
  201.  
  202. //*****************************************************************
  203. // Funções para Fechar arquivos
  204. //*****************************************************************
  205. void fechaArquivos(int);
  206. void fechaArquivoCliente(int); // Fecha arquivo com posição definida //
  207. void fechaArquivoSistema();
  208.  
  209. // Fim das funções de manipulação dos arquivos//
  210. //*************************************************************************
  211. void relatorios(void);
  212. void fecharAplicacao(void);
  213.  
  214.  
  215.  
  216. //*****************************************************************
  217. // Função principal, local onde tudo acontece de fato.
  218. //*****************************************************************
  219. int main(){
  220. GetConsoleScreenBufferInfo(hOut,&SBInfo); // Pegas as configuraçãoes de tamanho e largura da tela do console
  221. screen_x = SBInfo.srWindow.Right;
  222. screen_y = SBInfo.srWindow.Bottom;
  223.  
  224. sistema_veiculo = sistema.vagas; // Salvação da minha vida, aqui estou atribuindo ao ponteiro sistema_veiculo toda a estrutura das vagas do sistema, mais uma vez, obrigado HANDLEY
  225.  
  226. t = time(NULL); // Zera as informações da variavel 't'
  227. local=localtime(&t); // atribui a 'local' o endereço de 't', posibilitando o uso da struct tm
  228.  
  229. setColor("COLOR 3F"); //Função usada para setar a cor da letra e do fundo do console
  230. char resp; // Var que recebe a resposta do user para perguntas to tipo [S/n]
  231. int op, respInt; // 'Op' usada para saber qual operação executar. 'respInt', usada em perguntas de resultado inteiro [1, 2, 4, 0]
  232. int posicao; // Usada para retorno das posições de veiculo e cliente .
  233.  
  234. getInformationClients(); // Função que carrega informações dos clientes e carros
  235. getInformationSystem(); // Função que carrega as informações do sistema
  236.  
  237. if(sistema.firstStart == 0){
  238. FirstStart();
  239. }
  240.  
  241. do{
  242.  
  243. cls();
  244. printCabecalho();
  245. alinhar(4, CENTRO,"Seu carro seguro e vc despreocupado!!");
  246. alinhar(10, CENTRO,"Entrada Veiculo..................[1]");
  247. alinhar(11, CENTRO,"Saida Veiculo....................[2]");
  248. alinhar(12, CENTRO,"Opcoes Mensalistas...............[3]");
  249. alinhar(13, CENTRO,"Listar Vagas ....................[4]");
  250. alinhar(14, CENTRO,"Relatorios.......................[5]");
  251. alinhar(15, CENTRO,"Configuracao do Sistema..........[6]");
  252. alinhar(16, CENTRO,"Sair.............................[0]");
  253. alinhar(19, CENTRO,"Escolha uma opcao: ");
  254. gotoxy((screen_x/2)+1,19); scanf("%d", &op); fflush(stdin);
  255.  
  256. switch (op){
  257. case 1:
  258. do{
  259. cls();
  260. printCabecalho();
  261. alinhar(4, CENTRO, "Entrada Veiculo");
  262. CarIn();
  263. gotoxy(3,23); clearLine();
  264. gotoxy(3,23); printf("Continuar [S/n]: ");
  265. resp = getchar(); fflush(stdin);
  266. }while(resp == 'S' || resp == 's');
  267. break;
  268. case 2:
  269. do{
  270. cls();
  271. printCabecalho();
  272. alinhar(4, CENTRO, "Saida Veiculo");
  273. if(CarOut() != 1){
  274. gotoxy(3,21); printf("Veiculo nao encontrado");
  275. }
  276. gotoxy(3,23); clearLine();
  277. gotoxy(3,23); printf("Continuar [S/n]: ");
  278. resp = getchar(); fflush(stdin);
  279. }while(resp == 'S' || resp == 's');
  280. break;
  281. case 3:
  282. cls();
  283. printCabecalho();
  284. alinhar(4, CENTRO,"Opcoes Mensalistas");
  285. alinhar(10, CENTRO,"Cadastrar Clientes...............[1]");
  286. alinhar(11, CENTRO,"Listar Clientes..................[2]");
  287. alinhar(12, CENTRO,"Pesquisa/Alterar Cliente.........[3]");
  288. alinhar(13, CENTRO,"Excluir Clientes.................[4]");
  289. alinhar(14, CENTRO,"Pagamento........................[5]");
  290. alinhar(15, CENTRO,"Voltar ao menu anterior..........[0]");
  291. alinhar(19, CENTRO,"Escolha uma opcao: ");
  292.  
  293. gotoxy((screen_x/2)+1,19); scanf("%d", &respInt); fflush(stdin);
  294. switch (respInt){
  295. case 1:
  296. do{
  297. cls();
  298. printCabecalho();
  299. alinhar(4, CENTRO, "Cadastro de Cliente");
  300. cadastraCliente();
  301. fflush(stdin);
  302. gotoxy(3,23);clearLine();
  303. gotoxy(3,23); printf("Deseja cadastrar outro Cliente? [S/n]: ");
  304. resp = getchar();
  305.  
  306. }while(resp == 'S' || resp == 's');
  307. break;
  308. case 2:
  309. cls();
  310. printCabecalho();
  311. alinhar(4, CENTRO, "Listagem de Cliente\n\n\n");
  312. listaClientes();
  313. break;
  314. case 3:
  315. cls();
  316. printCabecalho();
  317. alinhar(4, CENTRO, "Pesquisa/Altera Cliente");
  318. posicao = pesquisaGeral(TUDO);
  319. if(posicao >= 0){
  320. printf("\n\n Digite [1]Editar Cliente, [2]Editar/Adicionar Veiculo, [0]Voltar: ");
  321. scanf("%d", &respInt);fflush(stdin);
  322.  
  323. switch(respInt){
  324.  
  325. case 1:
  326. cls();
  327. printCabecalho();
  328. alinhar(4, CENTRO, "Pesquisa/Altera Cliente");
  329. editarRegistroCliente(posicao);
  330. break;
  331.  
  332. case 2:
  333. do{
  334. cls();
  335. printCabecalho();
  336. alinhar(4, CENTRO, "Pesquisa/Altera Cliente");
  337. editarRegistroCarros(posicao);
  338. gotoxy(3,23); printf("Deseja alterar outro veiculo? [S/n]: ");
  339. resp = getchar(); fflush(stdin);
  340. gotoxy(3,23); clearLine();
  341. }while (resp == 'S' || resp == 's');
  342. break;
  343. }
  344. }
  345. break;
  346. case 4:
  347. cls();
  348. printCabecalho();
  349. alinhar(4, CENTRO, "Exclui Cliente");
  350. posicao = pesquisaGeral(CLIENTES);
  351. getch();
  352. excluiCliente(posicao);
  353. break;
  354. case 5:
  355. cls();
  356. printCabecalho();
  357. alinhar(4, CENTRO, "Pagamentos");
  358. posicao = pesquisaGeral(CLIENTES);
  359. getch();
  360. pagamentoCliente(posicao);
  361.  
  362. break;
  363. }
  364.  
  365. break;
  366. case 4:
  367. cls();
  368. printCabecalho();
  369. alinhar(4, CENTRO, "Listar Vagas");
  370. listaVagas();
  371. break;
  372. case 5:
  373. cls();
  374. printCabecalho();
  375. alinhar(4, CENTRO, "Relatorios");
  376. relatorios();
  377. getch();
  378. break;
  379. case 6:
  380. cls();
  381. printCabecalho();
  382. alinhar(4, CENTRO, "Configuracao do Sistema");
  383. System_Conf();
  384. break;
  385. case 0:
  386. fecharAplicacao();
  387. op = -1;
  388. break;
  389. }
  390. }while(op != -1);
  391. return 0;
  392. }
  393.  
  394. //*****************************************************************
  395. // Funções adicionais para ações diversas
  396. //*****************************************************************
  397.  
  398. void gotoxy(int x, int y){
  399. COORD coord;
  400. coord.X=(short)x;
  401. coord.Y=(short)y;
  402. SetConsoleCursorPosition(hOut,coord);
  403. }
  404.  
  405. void alinhar(int LINHA, int modo, char *MENSAGEM){
  406.  
  407. int COLUNA;
  408. if( modo == 1)
  409. COLUNA=0;
  410.  
  411. if(modo == 2)
  412. COLUNA = ((screen_x-strlen(MENSAGEM))/2);
  413.  
  414. if(modo == 3)
  415. COLUNA = screen_x-strlen(MENSAGEM);
  416.  
  417. gotoxy(COLUNA,LINHA); printf(MENSAGEM);
  418.  
  419. }
  420. void formDados(){
  421. gotoxy(3,7); printf("Codigo Cliente..........: %d", cliente.codigo);
  422. gotoxy(3,8); printf("Digite o Nome do Cliente: ");
  423. gotoxy(3,9); printf("Digite o CPF do Cliente.: ");
  424. gotoxy(3,10); printf("Digite o Endereco.......: ");
  425. gotoxy(3,11); printf("Digite o Telefone.......: ");
  426. gotoxy(3,12); printf("Digite o Numero de Vagas: ");
  427. }
  428.  
  429. void coletaDados(){
  430. gotoxy(29,8); scanf("%[^\n]", cliente.nome);fflush(stdin);
  431. gotoxy(29,9); scanf("%s", cliente.cpf);fflush(stdin);
  432. gotoxy(29,10); scanf("%[^\n]", cliente.endereco);fflush(stdin);
  433. gotoxy(29,11); scanf("%[^\n]", cliente.telefone);fflush(stdin);
  434. gotoxy(29,12); scanf("%d", &cliente.numVagas);fflush(stdin);
  435. }
  436.  
  437. //*****************************************************************
  438. // Função usadas para carregar informações no sistema
  439. //*****************************************************************
  440.  
  441. void getInformationClients(){
  442. if(!(arqC = fopen("clientes.bin", "rb"))){
  443. if(!(arqC = fopen("clientes.bin", "w+"))){
  444. printf("Erro ao abrir arquivo de clientes....\n");
  445. getch();
  446. return;
  447. }
  448. fclose(arqC);
  449. return;
  450. }
  451.  
  452. rewind(arqC);
  453. while(fread(&cliente, sizeof(cliente), 1,arqC) == 1);
  454. fclose(arqC);
  455. }
  456.  
  457. void getInformationSystem(){
  458. if(!(arqS = fopen("sistema.bin","rb"))){
  459. if(!(arqS = fopen("sistema.bin","w+"))){
  460. printf("Erro ao abrir arquivo do sistema....\n");
  461. getch();
  462. return;
  463.  
  464. }
  465. fclose(arqS);
  466. return;
  467. }
  468.  
  469. rewind(arqS);
  470. fread(&sistema,sizeof(sistema),1,arqS);
  471. fclose(arqS);
  472. }
  473.  
  474. //*****************************************************************
  475. // Funções para abrir arquivos leitura
  476. //*****************************************************************
  477. void abreArquivos(char* modo_abertura){
  478. abreArquivoCliente(modo_abertura);
  479. abreArquivoSistema(modo_abertura);
  480. }
  481.  
  482. void abreArquivoCliente(char* modo_abertura){
  483. arqC = fopen("clientes.bin", modo_abertura);
  484. if(!arqC){
  485. printf("\nErro ao abrir arquivo de clientes....\n");
  486. getch();
  487. return;
  488. }
  489. }
  490.  
  491. void abreArquivoSistema(char* modo_abertura){
  492. arqS = fopen("sistema.bin", modo_abertura);
  493. if(!arqS){
  494. printf("\nErro ao abrir arquivo do sistema....\n");
  495. getch();
  496. return;
  497. }
  498. }
  499.  
  500. //*****************************************************************
  501. // Funções para Fechar arquivos
  502. //*****************************************************************
  503. void fechaArquivos(int posicao){
  504. fechaArquivoCliente(posicao);
  505. fechaArquivoSistema();
  506. }
  507.  
  508. void fechaArquivoCliente(int posicao){
  509. rewind(arqC);
  510. fseek(arqC, (sizeof(cliente)*posicao), SEEK_CUR);
  511. retorno = fwrite(&cliente, sizeof(cliente), 1,arqC); // escreve no binario a struct q tiver na memoria
  512.  
  513. if(!retorno){ // trata o retorno do comando de escrita, se ele retornar null
  514. cls();
  515. printf("\nErro ao gravar arquivo se clientes....\n"); // imprime um erro de gravação do arquivo
  516. getch();
  517. }
  518. fclose(arqC);
  519. }
  520.  
  521. void fechaArquivoSistema(){
  522. rewind(arqS);
  523. retorno = fwrite(&sistema, sizeof(sistema), 1,arqS);
  524.  
  525. if(!retorno){
  526. cls();
  527. printf("\nErro ao gravar arquivo do sistema....\n");
  528. getch();
  529. }
  530.  
  531. fclose(arqS);
  532. }
  533.  
  534. //*****************************************************************
  535. // Função usada para mostrar mensagem na primeira inicialização
  536. //*****************************************************************
  537.  
  538. void FirstStart(){
  539.  
  540. cls();
  541. alinhar(5,CENTRO,"******************************************");
  542. alinhar(6,CENTRO,"* *");
  543. alinhar(7,CENTRO,"* SEJA BEM VINDO, ESPERAMOS QUE GOSTE *");
  544. alinhar(8,CENTRO,"* DO NOSSO PRODUTO. *");
  545. alinhar(9,CENTRO,"* PEDIMOS QUE CONFIGURE-O CONFORME A *");
  546. alinhar(10,CENTRO,"* SUA NECESSIDADE. *");
  547. alinhar(11,CENTRO,"* PARA TAL, ENTRE NO MENU RERENTE AS *");
  548. alinhar(12,CENTRO,"* CONFIGURACOES DO SISTEMA E FACA AS DE- *");
  549. alinhar(13,CENTRO,"* VIDAS ALTERACOES. *");
  550. alinhar(14,CENTRO,"* *");
  551. alinhar(15,CENTRO,"******************************************");
  552.  
  553. gotoxy(3,23); printf("Pressione <enter> para continuar");
  554. getch();
  555.  
  556. }
  557.  
  558. //*****************************************************************
  559. // Funções Utilizadas para Estruturação dos Menus
  560. //*****************************************************************
  561.  
  562. void printCabecalho(){
  563. int i;
  564.  
  565. for(i = 0; i <= screen_x; i++)
  566. printf("*");
  567.  
  568. alinhar(2, CENTRO, sistema.nome);
  569. }
  570.  
  571. void clearLine(){
  572. puts(" ");
  573. }
  574.  
  575. //*****************************************************************
  576. // Funções para controle de entrada dos carros
  577. //*****************************************************************
  578.  
  579. void CarIn(){
  580. char timeStr [9]; // String que recebe o time
  581. char placa[10] = ""; // Placa Temporaria
  582. char resp = {0};
  583. int i = 0; // Variavel de controle do for
  584. int j = 0; // Variavel de inicialização do i, usada para controle das vagas: caso seja moto vagas [i - j], case ja carro vagas [j- QTD_Vaga];
  585. int parada = 0; // Recebera a o valor de parada do for//
  586. int tempTipoV = 0; // Tipo de Veiculo Temporario
  587. int indiceVei = 0; // Utilizada para acessar as posições ao vetor de veiculos//
  588. int achou = 0; // Flag para controle do cliente, se ele for mensalista ela recebe o valor 1
  589. int respInt; // Resposta para perguntas que retornam um inteiro como resultado
  590. int posicao =-1; // Foi iniciado com -1 pois ao incrementa-la eu terei o resultado = || cliente posição 1,
  591. //deve iniciar a escrita na posição ZERO para que seja feita de maneira correta;
  592.  
  593. abreArquivos("rb+");
  594.  
  595. gotoxy(3,10); printf("Digite a placa do veiculo:");
  596. gotoxy(3,11); printf("Cod veiculo..............:");
  597. gotoxy(3,12); printf("Modelo veiculo...........:");
  598. gotoxy(3,13); printf("Tipo do veiculo..........:");
  599. gotoxy(3,14); printf("Hora de entrada..........:");
  600. gotoxy(3,15); printf("Tipo do Cliente..........:");
  601. gotoxy(30,14); printf("%s",_strtime(timeStr)); //printa o horario na tela usando a string
  602.  
  603. do{
  604. gotoxy(30,10); scanf("%s", placa); fflush(stdin);
  605. if((strlen(placa) != 7) && (strlen(placa) != 8)){
  606. gotoxy(3,21); printf("Placa incorreta, tente novamente...");
  607. gotoxy(30,10); printf(" ");
  608. }
  609. }while((strlen(placa) != 7) && (strlen(placa) != 8));
  610.  
  611. gotoxy(0,21);clearLine();
  612.  
  613. rewind(arqS);
  614. fread(&sistema, sizeof(sistema), 1,arqS);
  615.  
  616. //Vare o arquivo de clientes em procura do carro a ser estacionado
  617. rewind(arqC);
  618. while(fread(&cliente, sizeof(cliente), 1,arqC) == 1){
  619. if (cliente.excluido == 0){
  620. for (i=1;i <= cliente.contVei;i++){
  621. if (cliente.veiculo[i].excluido == 0){
  622. if(strcmp(placa, cliente.veiculo[i].placa)==0){
  623. gotoxy(30,11); printf("%d", i); //Codigo
  624. gotoxy(30,12); printf("%s", cliente.veiculo[i].modelo); //Modelo
  625. achou=1; // Flag para saber se o cliente é mensalista e/ou o carro esta cadastrado
  626. indiceVei=i;
  627. break;
  628. }
  629. }
  630. }
  631. }
  632. posicao++; // Posicao do cliente no arquivo
  633. }
  634.  
  635. if(achou != 1){ // Se o carro não foi encontrado é por que não esta cadastrado
  636. gotoxy(3,21); printf("Veiculo nao cadastrado");
  637. }
  638.  
  639. if(achou == 1){ //Se o cliente for mensalista executa os codigos abaixo
  640. gotoxy(30,15); printf("Mensalista");
  641. gotoxy(30,13); printf((cliente.veiculo[indiceVei].tipo == 1)? "Carro":"Moto");
  642.  
  643. if((cliente.diaPago < local->tm_mday)&&(((cliente.mesPago == 12)? 0:cliente.mesPago) < (local->tm_mon+1))){
  644. gotoxy(3,21); clearLine();
  645. gotoxy(3,21); printf("Cliente com pagamento em atraso...");
  646. return;
  647. }
  648.  
  649. }
  650. else{ // Se o cliente não for mensalista executa os comandos abaixo afim de coletar as informações necessarias para estacionar
  651. gotoxy(3,13); printf("Tipo? [1]Carro [2]Moto...:");
  652. do {
  653. gotoxy(30,13); scanf("%d", &tempTipoV); fflush(stdin);
  654. if ((tempTipoV != 1) && (tempTipoV != 2)){ // Seta o tipo do veiculo
  655. gotoxy(30,13); printf(" ");
  656. }
  657. }while((tempTipoV != 1)&&(tempTipoV != 2));
  658. gotoxy(30,13); printf((tempTipoV == 1)? "Carro":"Moto");
  659.  
  660. do{
  661. gotoxy(3,22); printf("Qual o tipo do Cliente? [1]Diaria,[2]Pernoite,[3]Rotativo: "); // Seta o tipo de cliente
  662. scanf("%d", &respInt);fflush(stdin);
  663. if ((respInt != 1) && (respInt != 2) && (respInt != 3)){
  664. gotoxy(61,22); printf(" ");
  665. }
  666. }while((respInt != 1) && (respInt != 2) && (respInt != 3));
  667. gotoxy(0,22); clearLine();
  668.  
  669. switch(respInt){
  670. case 1:
  671. gotoxy(30,15); printf("Diaria");
  672. break;
  673. case 2:
  674. gotoxy(30,15); printf("Pernoite");
  675. break;
  676. case 3:
  677. gotoxy(30,15); printf("Rotativo");
  678. break;
  679.  
  680. }
  681. }
  682.  
  683. for (i= 1; i < QTD_Vaga;i++){
  684. if(strcmp(placa,sistema.vagas[i].placa)==0){ // Se o veiculo ja estiver estacionado, coisa q é impossivel de acontecer, mostra a mensagem abaixo, para controlar erros de digitação
  685. gotoxy(3,21); printf("Veiculo ja se encontra estacionado na Vaga %d", i);
  686. return; // Sai da função caso cheque até aqui
  687. }
  688. }
  689.  
  690.  
  691. // Trecho usado para controlar a vaga na qual o veiculo sera estacionado.
  692. // caso ele seja uma moto recebera as vagas [ 1 até vagasMotos ], caso seja carro não cadastrado recebera as vagas de [ (vagasMotos+1) até (Vagas - vagasMensalistas)]
  693. // caso seja mensalista recebera as vagas de [ (vagas - mensalistas + 1) até (vagas)]
  694.  
  695. if(tempTipoV == 2){
  696. j = 1;
  697. parada = sistema.vagasMotos;
  698. }
  699. else{
  700. j = sistema.vagasMotos+1;
  701. parada = (QTD_Vaga-1) - sistema.vagasMensalistas;
  702. }
  703.  
  704. if (achou == 1){
  705. j = (QTD_Vaga - sistema.vagasMensalistas);
  706. parada = QTD_Vaga-1;
  707. }
  708.  
  709. //Varre as vagas para saber quais estão ocupadas, quais veiculos estão nas vagas e quais as vagas livres
  710.  
  711. for (i=j;i <= parada;i++){
  712.  
  713. if(sistema.vagas[i].status == 0){ // Testa se a vaga esta ou não livre, se estiver mostra disponibiliza para estacionamento
  714. gotoxy(3,16); printf("Vaga Destino.............: %d", i);
  715.  
  716. // Comandos para mensagens de aviso
  717. if((i == sistema.vagasMotos)&&(achou == 0)&&(tempTipoV == 2)){ // caso não hava vaga de motos
  718. gotoxy(3,21); printf("Ultima vaga para motos");
  719. }
  720. else if((i == parada)&&(achou == 0)&&(sistema.vagas[i].status == 0)){
  721. gotoxy(3,21); printf("Ultima vaga para Carros"); // caso não haja vaga de carros
  722. }
  723.  
  724. gotoxy(3,23); printf("Confirmar entrada [S/n]: "); // confirma a entrada do veiculo no estacionamento
  725. resp = getchar(); fflush(stdin);
  726. if(resp == 'S' || resp == 's'){
  727. sistema.contVagas++; //Incrementa a quantidade de vagas ocupadas no estacionamento
  728. if(achou == 1){ // Se for mensalista executa os comandos abaixo
  729. time(&entrada); // Pega a data de entrada do veiculo, baseado na hora do sistema operacional
  730. sistema.vagas[i].entrada = entrada; // Seta hora de entrada na estrutura
  731. sistema.vagas[i].status = 1; // altera o status da vaga para ocupada
  732. strcpy(sistema.vagas[i].tipoCliente,"Mensalista"); // Seta o tipo de cliente na vaga para mensalista
  733. strcpy(sistema.vagas[i].placa,placa); // Seta a placa do carro na vaga
  734.  
  735. if(cliente.numVagas > 0){ // Se a quantidade de vaga for maior que Zero, ele decrementa a quantidade disponivel para o cliente
  736. cliente.numVagas--;
  737. }
  738. else{ // Se a quantidade de vagas for zero, diz q ele excedeu o numero de vagas
  739. gotoxy(0,21);clearLine();
  740. gotoxy(3,21); printf("Cliente excedeu o numero de vagas");
  741. return;
  742. }
  743. }
  744. else{ // Se o cliente não for mensalista executa os comandos abaixo
  745. time(&entrada);
  746. sistema_veiculo[i].tipo = tempTipoV;
  747. sistema_veiculo[i].entrada = entrada;
  748. sistema.vagas[i].status=1;
  749. strcpy(sistema.vagas[i].placa,placa);
  750.  
  751. switch(respInt){
  752. case 1:
  753. strcpy(sistema.vagas[i].tipoCliente,"Diaria");
  754. break;
  755. case 2:
  756. strcpy(sistema.vagas[i].tipoCliente,"Pernoite");
  757. break;
  758. case 3:
  759. strcpy(sistema.vagas[i].tipoCliente,"Rotativo");
  760. break;
  761.  
  762. }
  763. }
  764. }
  765.  
  766. break;
  767. }
  768. }
  769.  
  770. // Caso a quantidade de vagas p/ motos e de mensalistas seja = ele não entrara for, passando direto sem dar nenhuma mensagem
  771. // os comandos abaixo são apenas uma mensagem de aviso;
  772.  
  773. // Trecho ainda em faze de testes
  774. // Se não ouver vagas livres mostra uma das mensagens abaixo
  775.  
  776. if((i >= sistema.vagasMotos)&&(sistema_veiculo[i].tipo == 2)){ // caso não hava vaga de motos
  777. gotoxy(3,21); printf("Nao temos mais vagas para motos");
  778. }
  779. else if(((j > parada) || (i > parada)) &&(achou == 0)&&(sistema.vagas[i].status == 0)){
  780. gotoxy(3,21); printf("Nao temos mais vagas para Carros"); // caso não haja vaga de carros
  781. }
  782.  
  783. if(sistema.contVagas > QTD_Vaga-1){ // Testa se ainda há vagas disponiveis no estacionamento
  784. gotoxy(0,21);clearLine();
  785. gotoxy(3,21); printf("Nao temos mais vagas disponiveis");
  786. return; // Caso não tenha vagas, sai da função sem gravar nada.
  787. }
  788.  
  789. if(achou == 1){ // Se o cliente foi encontrado, salva as alterações no arquivo de clientes e fecha-o.
  790. fechaArquivoCliente(posicao);
  791. }
  792. else{ // Se o cliente não for encontrado, simplesmente fecha o arquivo de clientes.
  793. fclose(arqC);
  794. }
  795.  
  796. fechaArquivoSistema();
  797. }
  798.  
  799. int CarOut(){
  800.  
  801. char placa[10], resp;
  802. int i;
  803. int indiceVei = 0;
  804. int achou = 0;
  805. int respInt = 0;
  806. int posicao =-1;
  807. int hora_s = 0; // Recebe o total de horas que o veiculo ficou estacionado
  808. int min_s = 0; // Recebe o totqal de minutos que o veiculo ficou estacionado
  809. int dif_Entrada_Saida = 0; // Diferença, em minutos, entre as horas de entrada e saida do veiculo da vaga;
  810. int encontrouCarro = 0; // Flag usada para controlar se o carro foi ou não encontrado nas vagas do estacionamento
  811. float pagar = 0;
  812.  
  813. abreArquivos("rb+");
  814.  
  815. gotoxy(3,10); printf("Digite a placa do Veiculo:");
  816. gotoxy(3,11); printf("Cod Veiculo..............:");
  817. gotoxy(3,12); printf("Modelo Veiculo...........:");
  818. gotoxy(3,13); printf("Tipo Cliente.............:");
  819. gotoxy(3,14); printf("Tempo permanencia........:");
  820. gotoxy(3,15); printf("Total a pagar............:");
  821.  
  822.  
  823. do{
  824. gotoxy(30,10); scanf("%s", placa); fflush(stdin);
  825. if((strlen(placa) != 7) && (strlen(placa) != 8)){
  826. gotoxy(3,21); printf("Placa incorreta, tente novamente...");
  827. gotoxy(30,10); printf(" ");
  828. }
  829. }while((strlen(placa) != 7) && (strlen(placa) != 8));
  830.  
  831. gotoxy(0,21);clearLine();
  832.  
  833. rewind(arqS);
  834. fread(&sistema, sizeof(sistema), 1,arqS);
  835.  
  836. rewind(arqC);
  837. while(fread(&cliente, sizeof(cliente), 1,arqC) == 1){
  838. if (cliente.excluido == 0){
  839. for (i=1;i <= cliente.contVei;i++){
  840. if (cliente.veiculo[i].excluido == 0){
  841. if(strcmp(placa, cliente.veiculo[i].placa)==0){
  842. achou=1;
  843. indiceVei=i;
  844. break;
  845. }
  846. }
  847. }
  848. }
  849. posicao++;
  850. }
  851.  
  852. for (i=1;i < QTD_Vaga;i++){// Varre o vetor de vagas a procura da placa digitada.
  853. if(strcmp(placa, sistema.vagas[i].placa)==0){ // Se encontrar, executa os comandos baixo
  854.  
  855.  
  856. if(achou == 1){ // Se o cliente for mensalista
  857. gotoxy(30,11); printf("%d", indiceVei); // Mostra o codigo do 'veiculo'
  858. gotoxy(30,12); printf("%s", cliente.veiculo[indiceVei].modelo); // mostra o modelo do veiculo
  859. gotoxy(30,13); printf("%s", sistema.vagas[i].tipoCliente);
  860. time(&saida);
  861. dif_Entrada_Saida = saida - sistema.vagas[i].entrada; // Diferença entre a hora de entrada e a hora de saida
  862. hora_s = (dif_Entrada_Saida/3600); // Seta quantas horas o cliente deixou o veiculo estacionado
  863. min_s = ((dif_Entrada_Saida%3600)/60); // Seta quantos minutos o cliente deixou o veiculo estacionado
  864.  
  865. gotoxy(30,14); printf("%d hora(as): %d minuto(os)", hora_s, min_s);
  866. }
  867. else{// Se o cliente não for mensalista, é incrementado a variavel para acessar cada posição do vetor de veiculos do sistema
  868.  
  869. indiceVei++;
  870. gotoxy(30,13); printf("%s", sistema.vagas[i].tipoCliente);
  871. time(&saida);
  872. dif_Entrada_Saida = saida - sistema.vagas[i].entrada;
  873. hora_s = (dif_Entrada_Saida/3600);
  874. min_s = ((dif_Entrada_Saida%3600)/60);
  875. gotoxy(30,14); printf("%d hora(as): %d minuto(os)", hora_s, min_s);
  876.  
  877. }
  878.  
  879. if((sistema_veiculo[i].tipo != 1) && (achou == 0)){ // Se o veiculo for uma moto, ele diz que o total a pagar é o preço da moto.
  880. gotoxy(30,15); printf("%.2f reais", sistema.vMoto);
  881. pagar = sistema.vMoto;
  882. }
  883. else{ // Se for um carro ele efetua os calculos afim de definir o valor a pagar
  884. if(achou == 1){// se for cliente mensalista o total é ZERO, pois ele pagara tudo no final do mes
  885. gotoxy(30,15); printf("0 reais");
  886. }
  887. else{// Se não for mensalista, calcula o preço a ser pago
  888.  
  889. if(strcmp(sistema.vagas[i].tipoCliente, "Rotativo") == 0){
  890. pagar = sistema.vHora; // Caso o cliente seja rotativo, pagará no minimo o valor integral da hora
  891.  
  892. //Teste usados para calcular o acrescimo caso o cliente execeda o tempo contratado
  893.  
  894. if((min_s > 0)&&(min_s <= 30)&&(hora_s > 0)){
  895. pagar+= 1*sistema.meiaHora;
  896. min_s = 1;
  897. }
  898. else if((min_s > 30)&&(min_s < 60)&&(hora_s > 0)){
  899. pagar+= 2*sistema.meiaHora;
  900. min_s = 2;
  901. }
  902.  
  903. // Caso o cliente exceda 8 horas de estadia no estacionamento sera cobrado uma diaria do mesmo, caso ele exceda esse tempo sera cobrado ainda 1 real a cada meia hora
  904.  
  905. if((hora_s > 1) && (hora_s < 8)){
  906. pagar = sistema.vHora+((hora_s - 1)*2.0*sistema.meiaHora)+(sistema.meiaHora*min_s);
  907. }
  908. else if((hora_s >= 8 ) && (hora_s < 10)){
  909. pagar = sistema.diaria+((hora_s-8)*2.0*sistema.meiaHora)+(sistema.meiaHora*min_s);
  910. }
  911. else if(hora_s >= 10){
  912. pagar = sistema.diaria+((hora_s-10)*2.0*sistema.meiaHora)+(sistema.meiaHora*min_s);
  913. }
  914. }
  915.  
  916. if(strcmp(sistema.vagas[i].tipoCliente, "Diaria") == 0){
  917. pagar = sistema.diaria;
  918.  
  919. if((min_s > 0)&&(min_s <= 30)&&(hora_s > 8)){
  920. pagar+= sistema.meiaHora;
  921. min_s = 1;
  922. }
  923. else if((min_s > 30)&&(min_s < 60)&&(hora_s > 8)){
  924. pagar+= 2*sistema.meiaHora;
  925. min_s = 2;
  926. }
  927.  
  928. if((hora_s >= 8 ) && (hora_s < 10)){
  929. pagar = sistema.diaria+((hora_s-8)*2.0*sistema.meiaHora)+(sistema.meiaHora*min_s);
  930. }
  931. else if (hora_s >= 10){
  932. pagar = sistema.diaria+((hora_s-10)*2.0*sistema.meiaHora)+(sistema.meiaHora*min_s);
  933. }
  934. }
  935.  
  936. if(strcmp(sistema.vagas[i].tipoCliente, "Pernoite") == 0){
  937. pagar = sistema.pernoite;
  938.  
  939. if((min_s > 0)&&(min_s <= 30)&&(hora_s > 10)){
  940. pagar+= sistema.meiaHora;
  941. min_s = 1;
  942. }
  943. else if((min_s > 30)&&(min_s < 60)&&(hora_s > 10)){
  944. pagar+= 2*sistema.meiaHora;
  945. min_s = 2;
  946. }
  947.  
  948. if(hora_s > 10){
  949. pagar = sistema.pernoite+((hora_s-10)*2.0*sistema.meiaHora)+(sistema.meiaHora*min_s);
  950. }
  951. }
  952.  
  953. gotoxy(30,15); printf("%.2f reais", pagar);
  954. }
  955. }
  956.  
  957. gotoxy(3,23); printf("Confirmar Saida [S/n]: ");
  958. resp = getchar(); fflush(stdin);
  959. if(resp == 'S' || resp == 's'){
  960. sistema.contVagas--; //Decrementa a quantidade de vagas ocupadas no estacionamento
  961. if(achou == 1){
  962. cliente.numVagas++;// Incrementa as vagas pois ele esta retirando um veiculo do estacionamento;
  963. }
  964.  
  965. // Libera a vaga no estacionamento
  966. strcpy(sistema.vagas[i].placa,"");
  967. sistema.vagas[i].status = 0;
  968. strcpy(sistema.vagas[i].tipoCliente,"");
  969.  
  970. //Soma o valor pago ao faturamento diario;
  971. sistema.caixa.fatDiario += pagar;
  972.  
  973. }
  974. encontrouCarro = 1;
  975. break;
  976. }
  977. }
  978.  
  979. if(achou == 1){
  980. fechaArquivoCliente(posicao);
  981. }
  982. else{
  983. fclose(arqC);
  984. }
  985.  
  986. fechaArquivoSistema();
  987.  
  988. return encontrouCarro;
  989. }
  990.  
  991. //*****************************************************************
  992. // Funções do Cliente
  993. //*****************************************************************
  994.  
  995. void cadastraCliente(){
  996.  
  997. int retorno; // Variavel usada para alocar o retorno da escrita no arquivo
  998. char resp; // variavel usada para capturar as respostas do usuario
  999. cliente.codigo++; // incrementa o codigo do cliente
  1000.  
  1001. fflush(stdin);
  1002. abreArquivoCliente("a+");
  1003.  
  1004. formDados(); // Formulario de cadastro do cliente
  1005. coletaDados();
  1006.  
  1007. gotoxy(3,23); printf("Deseja cadastrar um veiculo? [S/n]: ");
  1008. resp = getchar();
  1009.  
  1010. if (resp == 'S' || resp == 's'){
  1011. cliente.contVei = 0; // Var usada para contar a quantidade de veiculos, começa em UM por que eu não qro ter um veiculo de codigo ZERO
  1012. do {
  1013. fflush(stdin);
  1014. cliente.contVei++; // incrementa codigo do veiculo
  1015. cadastraCarro(cliente.contVei, 1);
  1016. gotoxy(3,23); printf("Deseja cadastrar outro veiculo? [S/n]: ");
  1017. resp = getchar();
  1018. }while (resp == 'S' || resp == 's');
  1019. }
  1020.  
  1021. if(cliente.codigo != 0)
  1022. retorno = fwrite(&cliente, sizeof(cliente), 1,arqC); // escreve no binario a struct q tiver na memoria
  1023.  
  1024. if(!retorno){ // trata o retorno do comando de escrita, se ele retornar null
  1025. printf("Erro ao gravar arquivo de clientes...."); // imprime um erro de gravação do arquivo
  1026. getch();
  1027. }
  1028. fclose(arqC);
  1029. }
  1030.  
  1031. void cadastraCarro(int indice, int num){
  1032. if(num == 1)
  1033. alinhar(14, CENTRO, "Cadastro de Veiculos");
  1034. // Inicio Comandos para limpar a tela do cadastro de veiculos
  1035. gotoxy(3,16); clearLine();
  1036. gotoxy(3,17); clearLine();
  1037. gotoxy(3,18); clearLine();
  1038. gotoxy(3,19); clearLine();
  1039. gotoxy(3,23);clearLine();
  1040. // Fim Comandos para limpar a tela do cadastro de veiculos
  1041.  
  1042. gotoxy(3,16); printf("Codigo do Veiculo..........: %d\n", indice);
  1043. gotoxy(3,17); printf("Digite o Modelo do Veiculo.: ");
  1044. gotoxy(3,18); printf("Tipo: [1]Carro, [2]Moto....: ");
  1045. gotoxy(3,19); printf("Digite a Placa.............: ");
  1046. gotoxy(32,17); scanf("%[^\n]",cliente.veiculo[indice].modelo); fflush(stdin);
  1047.  
  1048. do {
  1049. gotoxy(32,18); scanf("%d",&cliente.veiculo[indice].tipo); fflush(stdin);
  1050. if ((cliente.veiculo[indice].tipo != 1) && (cliente.veiculo[indice].tipo != 2)){
  1051. gotoxy(32,18);
  1052. printf(" ");
  1053. }
  1054. }while((cliente.veiculo[indice].tipo != 1)&&(cliente.veiculo[indice].tipo != 2));
  1055.  
  1056. gotoxy(32,19); scanf("%[^\n]",cliente.veiculo[indice].placa);fflush(stdin);
  1057.  
  1058. }
  1059.  
  1060. void listaClientes(){
  1061. int i;
  1062. int contClient=0; // Var usada para saber se o cliente a ser impresso é ou não o primeiro cliente.
  1063.  
  1064. abreArquivoCliente("rb");
  1065.  
  1066. rewind(arqC);
  1067.  
  1068. while(fread(&cliente, sizeof(cliente), 1,arqC) == 1){
  1069.  
  1070. if (cliente.excluido == 0){
  1071. if (contClient > 0) // Testa se o cliente é o primeiro e se ele não for imprime duas quebras de linha (uso apenas estetico)
  1072. printf("\n\n");
  1073.  
  1074. printf("Codigo Cliente......: %d\n", cliente.codigo);
  1075. printf("Nome do Cliente.....: %s\n", cliente.nome);
  1076. printf("CPF do Cliente......: %s\n", cliente.cpf);
  1077. printf("Endereco do Cliente.: %s\n", cliente.endereco);
  1078. printf("Telefone do Cliente.: %s\n", cliente.telefone);
  1079. printf("Numero de Vagas.....: %d\n", cliente.numVagas);
  1080. printf("\nVeiculo(os)\n-----------------------");
  1081. for (i=1;i <= cliente.contVei;i++){
  1082. if (cliente.veiculo[i].excluido == 0){
  1083. printf("\n\nCod. Veiculo: %d\n",i);
  1084. printf("Modelo do carro: %s\n", cliente.veiculo[i].modelo);
  1085. printf("Placa: %s\n", cliente.veiculo[i].placa);
  1086. printf("Tipo: %s\n", (cliente.veiculo[i].tipo == 1) ? "Carro" : "Moto");
  1087. }
  1088. }
  1089. }
  1090. contClient++;
  1091. }
  1092. fclose(arqC);
  1093. getch();
  1094. }
  1095.  
  1096. int pesquisaGeral(int tipo){
  1097. int codigo, i, posicao = 0;
  1098.  
  1099. abreArquivoCliente("rb");
  1100.  
  1101. if((tipo == TUDO) || (tipo == CLIENTES)){
  1102. gotoxy(3,10); printf("Digite o codigo.....: ");
  1103. gotoxy(3,11); printf("Nome do Cliente.....: ");
  1104. gotoxy(3,12); printf("CPF do Cliente......: ");
  1105. gotoxy(3,13); printf("Endereco do Cliente.: ");
  1106. gotoxy(3,14); printf("Telefone do Cliente.: ");
  1107. gotoxy(3,15); printf("Status do Cliente...: ");
  1108. gotoxy(25,10); scanf("%d", &codigo);fflush(stdin);
  1109.  
  1110. rewind(arqC); // envia o ponteiro do arquivo para o seu inicio
  1111. posicao = codigo-1; // Defini a posição do cliente no arquivo
  1112. fseek(arqC, (sizeof(cliente)*posicao), SEEK_CUR); // Desloca o ponteiro do arquivo X bytes até o primeiro byte da posição desejada
  1113. fread(&cliente, sizeof(cliente), 1,arqC); // Lê a strutura do cliente
  1114.  
  1115. if (cliente.codigo != codigo){ // Testa se o codigo do cliente é igual ou diferente do codigo digitado
  1116. gotoxy(3,23); printf("Cliente nao cadastrado. Aperte <enter> para retornar "); // Resposta caso seja diferente.
  1117. getch();
  1118. return -1;
  1119. }//Fim do if
  1120.  
  1121. gotoxy(25,11); printf("%s", cliente.nome);
  1122. gotoxy(25,12); printf("%s", cliente.cpf);
  1123. gotoxy(25,13); printf("%s", cliente.endereco);
  1124. gotoxy(25,14); printf("%s", cliente.telefone);
  1125. gotoxy(25,15); printf("%s", (cliente.excluido == 1)? "Excluido" : "Ativo");
  1126.  
  1127. }
  1128.  
  1129. if((tipo == TUDO)|| (tipo == VEICULOS)){
  1130. gotoxy(3,17); printf("Veiculo(os)\n -----------------------\n");
  1131. for (i=1;i <= cliente.contVei;i++){
  1132. if (cliente.veiculo[i].excluido == 0){
  1133. printf(" \n Cod. Veiculo: %d\n",i);
  1134. printf(" Modelo do carro: %s\n", cliente.veiculo[i].modelo);
  1135. printf(" Placa: %s\n", cliente.veiculo[i].placa);
  1136. printf(" Tipo: %s\n", (cliente.veiculo[i].tipo == 1) ? "Carro" : "Moto");
  1137. printf(" Status: %s\n", (cliente.veiculo[i].excluido == 1) ? "Excluido" : "Ativo");
  1138. }
  1139. }
  1140.  
  1141. }
  1142.  
  1143. fclose(arqC);
  1144. return posicao;
  1145. }
  1146.  
  1147. void excluiCliente(int posicao){
  1148.  
  1149. char resp;
  1150.  
  1151. abreArquivoCliente("rb+");
  1152.  
  1153. if (posicao >= 0){
  1154. gotoxy(3,23); printf("Deseja mesmo excluir o Cliente? [S/n] ");
  1155. resp = getchar();
  1156.  
  1157. if (resp == 'S' || resp == 's'){
  1158. cliente.excluido = 1;
  1159. gotoxy(3,23); printf("Cliente excluido com sucesso. Aperte <enter> para retornar");
  1160. getch();
  1161. }
  1162.  
  1163. fechaArquivoCliente(posicao);
  1164. }
  1165. }
  1166.  
  1167. void editarRegistroCliente(int posicao){
  1168. int retorno; // Variavel usada para alocar o retorno da escrita no arquivo
  1169. char resp; // variavel usada para capturar as respostas do usuario
  1170.  
  1171. abreArquivoCliente("rb+");
  1172.  
  1173. formDados();
  1174. if(cliente.excluido == 1){
  1175. gotoxy(3,13); printf("Excluido, [0] p/ incluir: ");
  1176. }
  1177.  
  1178. coletaDados();
  1179. if(cliente.excluido == 1){
  1180. gotoxy(29,13); scanf("%d", &cliente.excluido);fflush(stdin);
  1181. }
  1182.  
  1183. fechaArquivoCliente(posicao);
  1184. }
  1185.  
  1186. void editarRegistroCarros(int posicao){
  1187. int indice;
  1188. int respInt;
  1189. char resp; // variavel usada para capturar as respostas do usuario
  1190.  
  1191. abreArquivoCliente("rb+");
  1192.  
  1193. // Clear Screen //
  1194. gotoxy(3,11); clearLine();
  1195. gotoxy(3,12); clearLine();
  1196. gotoxy(3,13); clearLine();
  1197. gotoxy(3,14); clearLine();
  1198. gotoxy(3,15); clearLine();
  1199.  
  1200. gotoxy(3,10); printf("Digite o codigo.....: ");
  1201. gotoxy(25,10); printf(" ");
  1202. gotoxy(25,10); scanf("%d", &indice);
  1203. fflush(stdin);
  1204.  
  1205. if(indice > 0){
  1206. do{
  1207. if(indice <= cliente.contVei+1){// Teste usado para cadastrar novos carros aos clientes, e varre-los usando o for posteriormente
  1208. cliente.contVei = indice;
  1209. gotoxy(3,10); clearLine();
  1210. gotoxy(3,11); printf("Codigo do Veiculo..........: %d\n", indice);
  1211. gotoxy(3,12); printf("Digite o Modelo do Veiculo.: %s\n", cliente.veiculo[indice].modelo);
  1212. gotoxy(3,13); printf("Tipo: [1]Carro, [2]Moto....: %s\n", (cliente.veiculo[indice].tipo == 1) ? "Carro" : "Moto");
  1213. gotoxy(3,14); printf("Digite a Placa.............: %s\n", cliente.veiculo[indice].placa);
  1214. if(cliente.veiculo[indice].excluido == 1){
  1215. gotoxy(3,15); printf("Excluido, [0] para incluir.: ");
  1216. }else{
  1217. gotoxy(3,15); printf("Excluir? [1]Sim, [0]Nao....: ");
  1218. }
  1219.  
  1220. gotoxy(3,23); printf("Qual item Alterar? [1]Modelo,[2]Tipo,[3]Placa,[4]Status,[0]Sair: ");
  1221. scanf("%d", &respInt); fflush(stdin);
  1222. gotoxy(3,23); clearLine();
  1223.  
  1224. switch(respInt){
  1225.  
  1226. case 1:
  1227. gotoxy(32,12); printf(" ");
  1228. gotoxy(32,12); scanf("%[^\n]",cliente.veiculo[indice].modelo); fflush(stdin);
  1229. break;
  1230. case 2:
  1231. do {
  1232. gotoxy(32,13); printf(" ");
  1233. gotoxy(32,13); scanf("%d",&cliente.veiculo[indice].tipo); fflush(stdin);
  1234. }while((cliente.veiculo[indice].tipo != 1)&&(cliente.veiculo[indice].tipo != 2));
  1235. break;
  1236. case 3:
  1237. gotoxy(32,14); printf(" ");
  1238. gotoxy(32,14); scanf("%[^\n]",cliente.veiculo[indice].placa);fflush(stdin);
  1239. break;
  1240. case 4:
  1241. gotoxy(32,15); printf(" ");
  1242. gotoxy(32,15); scanf("%d", &cliente.veiculo[indice].excluido);fflush(stdin);
  1243. break;
  1244. case 5:
  1245. break;
  1246. }
  1247. }
  1248. else{
  1249. gotoxy(3,23); printf("O ultimo veiculo tem codigo: %d, para adicionar outro digite cod = %d", cliente.contVei, cliente.contVei+1);
  1250. getch();
  1251. gotoxy(3,23); clearLine();
  1252. gotoxy(3,24); clearLine();
  1253. return;
  1254. }
  1255. }while(respInt !=0);
  1256.  
  1257. }
  1258. else{
  1259. gotoxy(3,23); printf("Veiculo Inexistente");
  1260. getch();
  1261. }
  1262.  
  1263. fechaArquivoCliente(posicao);
  1264. }
  1265.  
  1266. void pagamentoCliente(int posicao){
  1267. char resp;
  1268.  
  1269. abreArquivos("rb+");
  1270.  
  1271. rewind(arqS);
  1272. fread(&sistema, sizeof(sistema), 1,arqS);
  1273.  
  1274. if (posicao >= 0){
  1275. gotoxy(3,23); printf("Deseja mesmo Efetuar o pagamento? [S/n] ");
  1276. resp = getchar();
  1277.  
  1278. if (resp == 'S' || resp == 's'){
  1279. sistema.caixa.fatDiario += sistema.mensalista; // Soma o valor do mensalista ao faturamento diario
  1280. cliente.mesPago = (local->tm_mon+1); // Seta o mes pago atualmente pelo cliente.
  1281. cliente.diaPago = (local->tm_mday); // Seta o dia do mes pago atualmente pelo cliente.
  1282. gotoxy(3,23); printf("Pagamento efetuado com sucesso. Aperte <enter> para retornar");
  1283. getch();
  1284. }
  1285. }
  1286.  
  1287. fechaArquivos(posicao);
  1288. }
  1289.  
  1290. //*****************************************************************
  1291. // Função Listagem de vagas
  1292. //*****************************************************************
  1293.  
  1294. void listaVagas(){
  1295. int i;
  1296. abreArquivoSistema("rb");
  1297.  
  1298. rewind(arqS);
  1299. fread(&sistema,sizeof(sistema),1,arqS);
  1300.  
  1301. for(i=1;i < QTD_Vaga;i++){
  1302. printf("\n\nNo. vaga.....: %d\n",i);
  1303. printf("Status.......: %s\n", (sistema.vagas[i].status == 0)? "Livre":"Ocupada");
  1304. printf("Tipo Cliente.: %s\n",sistema.vagas[i].tipoCliente);
  1305. printf("Placa Veiculo: %s",sistema.vagas[i].placa);
  1306. }
  1307.  
  1308. fclose(arqS);
  1309. getch();
  1310. }
  1311.  
  1312. //*****************************************************************
  1313. // Função de relatórios
  1314. //*****************************************************************
  1315. void relatorios(){
  1316. gotoxy(3,10); printf("Valor do faturamento Diario: %.2f", sistema.caixa.fatDiario);
  1317. gotoxy(3,12); printf("Valor do faturamento Semanal: %.2f", sistema.caixa.fatSemanal);
  1318. gotoxy(3,14); printf("Valor do faturamento Mensal: %.2f", sistema.caixa.fatMensal);
  1319. }
  1320.  
  1321.  
  1322. //*****************************************************************
  1323. // Função configuração do sistema
  1324. //*****************************************************************
  1325. void System_Conf(){
  1326. char buffer[20] = {0};
  1327. char c;
  1328. int retorno;
  1329. int respInt;
  1330. int pos;
  1331.  
  1332. arqS = fopen("sistema.bin","rb+");
  1333. if (!arqS){
  1334. arqS = fopen("sistema.bin","wb+");
  1335. if (!arqS){
  1336. printf("Erro ao abrir arquivo do sistema....");
  1337. getch();
  1338. exit(0);
  1339. }
  1340. }
  1341.  
  1342. if(sistema.firstStart == 1){
  1343. pos = 0; // Usada para retornar a posicao ZERO do vetor referente a senha.
  1344. alinhar(6,CENTRO,"******************************************");
  1345. alinhar(7,CENTRO,"* *");
  1346. alinhar(8,CENTRO,"* PARA ALTERAR AS CONFIGURACOES *");
  1347. alinhar(9,CENTRO,"* EH NECESSARIO UMA SENHA. *");
  1348. alinhar(10,CENTRO,"* *");
  1349. alinhar(11,CENTRO,"* DIGITE-A PARA CONTINUAR: *");
  1350. alinhar(12,CENTRO,"* +--------------------+ *");
  1351. alinhar(13,CENTRO,"* | | *");
  1352. alinhar(14,CENTRO,"* +--------------------+ *");
  1353. alinhar(15,CENTRO,"* *");
  1354. alinhar(16,CENTRO,"******************************************");
  1355. gotoxy(34,13);
  1356. do {
  1357. c = getch();fflush(stdin);
  1358.  
  1359. if( isprint(c) )
  1360. {
  1361. buffer[ pos++ ] = c;
  1362. printf("%c", '*');
  1363. }
  1364. } while(c != 13);
  1365.  
  1366. if(strcmp(buffer,sistema.Senha) !=0){
  1367. gotoxy(3,22); printf("Login invalido!!!!");
  1368. gotoxy(3,23); printf("Pressione <enter> para continuar");
  1369. getch();
  1370. return;
  1371. }
  1372.  
  1373. do{
  1374. cls();
  1375. printCabecalho();
  1376. alinhar(4, CENTRO, "Configuracao do Sistema");
  1377. pos = 0;
  1378.  
  1379. gotoxy(3,10); printf("[01] Nome do estabelecimento: %s", sistema.nome);
  1380. gotoxy(3,11); printf("[02] Valor diaria...........: %.2f", sistema.diaria);
  1381. gotoxy(3,12); printf("[03] Valor pernoite.........: %.2f", sistema.pernoite);
  1382. gotoxy(3,13); printf("[04] Valor mensalista.......: %.2f", sistema.mensalista);
  1383. gotoxy(3,14); printf("[05] Valor hora.............: %.2f", sistema.vHora);
  1384. gotoxy(3,15); printf("[06] Valor 1/2 adicional....: %.2f", sistema.meiaHora);
  1385. gotoxy(3,16); printf("[07] Valor moto.............: %.2f", sistema.vMoto);
  1386. gotoxy(3,17); printf("[08] QTD de vagas p/ moto...: %d", sistema.vagasMotos);
  1387. gotoxy(3,18); printf("[09] Vagas p/ Mensalistas...: %d", sistema.vagasMensalistas);
  1388. gotoxy(3,19); printf("[10] Senha de Acesso........:");
  1389.  
  1390. gotoxy(5,23); printf("Atencao: Esse software foi projetado para %d vagas logo a soma das vagas de mensalistas e motos nao deve ultrapassar esse numero.", QTD_Vaga-1);
  1391.  
  1392. gotoxy(3,21); printf("Digite o item que deseja alterar ou [0]SAIR: ");
  1393. scanf("%d", &respInt); fflush(stdin);
  1394.  
  1395.  
  1396. switch(respInt){
  1397.  
  1398. case 1:
  1399. gotoxy(33,10); printf(" ");
  1400. gotoxy(33,10); scanf("%[^\n]", sistema.nome); fflush(stdin);
  1401. break;
  1402. case 2:
  1403. gotoxy(33,11); printf(" ");
  1404. gotoxy(33,11); scanf("%f", &sistema.diaria); fflush(stdin);
  1405. break;
  1406. case 3:
  1407. gotoxy(33,12); printf(" ");
  1408. gotoxy(33,12); scanf("%f", &sistema.pernoite); fflush(stdin);
  1409. break;
  1410. case 4:
  1411. gotoxy(33,13); printf(" ");
  1412. gotoxy(33,13); scanf("%f", &sistema.mensalista); fflush(stdin);
  1413. break;
  1414. case 5:
  1415. gotoxy(33,14); printf(" ");
  1416. gotoxy(33,14); scanf("%f", &sistema.vHora); fflush(stdin);
  1417. break;
  1418. case 6:
  1419. gotoxy(33,15); printf(" ");
  1420. gotoxy(33,15); scanf("%f", &sistema.meiaHora); fflush(stdin);
  1421. break;
  1422. case 7:
  1423. gotoxy(33,16); printf(" ");
  1424. gotoxy(33,16); scanf("%f", &sistema.vMoto); fflush(stdin);
  1425. break;
  1426.  
  1427. case 8:
  1428. gotoxy(33,17); printf(" ");
  1429. gotoxy(33,17); scanf("%d", &sistema.vagasMotos); fflush(stdin);
  1430. break;
  1431.  
  1432. case 9:
  1433. gotoxy(33,18); printf(" ");
  1434. gotoxy(33,18); scanf("%d", &sistema.vagasMensalistas);
  1435. break;
  1436.  
  1437. case 10:
  1438. strcpy(sistema.Senha,"");
  1439. gotoxy(33,18); printf(" ");
  1440. gotoxy(33,18);
  1441. do {
  1442. c = getch();fflush(stdin);
  1443.  
  1444. if( isprint(c) )
  1445. {
  1446. sistema.Senha[ pos++ ] = c;
  1447. printf("%c", '*');
  1448. }
  1449. } while( c != 13 );
  1450.  
  1451. break;
  1452.  
  1453. }
  1454. }while(respInt !=0);
  1455. }
  1456. else{
  1457. pos = 0;
  1458.  
  1459. gotoxy(3,10); printf("Digite o nome do estabelecimento:");
  1460. gotoxy(3,11); printf("Digite o Valor diaria...........:");
  1461. gotoxy(3,12); printf("Digite o Valor pernoite.........:");
  1462. gotoxy(3,13); printf("Digite o Valor mensalista.......:");
  1463. gotoxy(3,14); printf("Digite o Valor hora.............:");
  1464. gotoxy(3,15); printf("Digite o Valor 1/2 adicional....:");
  1465. gotoxy(3,16); printf("Digite o Valor moto.............:");
  1466. gotoxy(3,17); printf("Digite a QTD de vagas p/ moto...:");
  1467. gotoxy(3,18); printf("Digite as vagas p/ Mensalistas..:");
  1468. gotoxy(3,19); printf("DIGITE A SENHA DE CONTROLE......:");
  1469.  
  1470. gotoxy(5,22); printf("Atencao: Esse software foi projetado para %d vagas logo a soma das vagas de mensalistas e motos nao deve ultrapassar esse numero.", QTD_Vaga-1);
  1471.  
  1472. gotoxy(37,10); scanf("%[^\n]", sistema.nome); fflush(stdin);
  1473. gotoxy(37,11); scanf("%f", &sistema.diaria); fflush(stdin);
  1474. gotoxy(37,12); scanf("%f", &sistema.pernoite); fflush(stdin);
  1475. gotoxy(37,13); scanf("%f", &sistema.mensalista); fflush(stdin);
  1476. gotoxy(37,14); scanf("%f", &sistema.vHora); fflush(stdin);
  1477. gotoxy(37,15); scanf("%f", &sistema.meiaHora); fflush(stdin);
  1478. gotoxy(37,16); scanf("%f", &sistema.vMoto); fflush(stdin);
  1479. gotoxy(37,17); scanf("%d", &sistema.vagasMotos);
  1480. gotoxy(37,18); scanf("%d", &sistema.vagasMensalistas);
  1481. gotoxy(37,19);
  1482. do {
  1483. c = getch();fflush(stdin);
  1484.  
  1485. if( isprint(c) )
  1486. {
  1487. sistema.Senha[ pos++ ] = c;
  1488. printf("%c", '*');
  1489. }
  1490. } while( c != 13 );
  1491.  
  1492. }
  1493. sistema.caixa.wdia_abertura = local->tm_wday; // Atribui o dia da semana no qual foi aberto o caixa
  1494. sistema.caixa.mdia_abertura = local->tm_mday; // Atribui o dia do mes no qual foi aberto o caixa
  1495. sistema.caixa.mes_abertura = local->tm_mon+1; // Atribui o mes atual ao mes de abertura do caixa
  1496. sistema.firstStart = 1;
  1497.  
  1498. fechaArquivoSistema();
  1499. }
  1500.  
  1501. //*****************************************************************
  1502. // Função Fecha Aplicação
  1503. //*****************************************************************
  1504. void fecharAplicacao(){
  1505. abreArquivoSistema("rb+");
  1506. sistema.caixa.fatMensal += sistema.caixa.fatDiario; // Soma o conteudo do faturamento diario ao mensal
  1507. sistema.caixa.fatDiario = 0; // Zera o faturamento diario
  1508. sistema.caixa.fatSemanal = sistema.caixa.fatMensal;
  1509.  
  1510. //(sistema.caixa.mdia_abertura != local->tm_mday)&&
  1511. if((sistema.caixa.wdia_abertura == (local->tm_wday+1))){ // Se o dia atual for = ao proximo dia, ZERA o Faturamento Semanal;
  1512. sistema.caixa.fatSemanal = 0;
  1513. }
  1514. if((sistema.caixa.mdia_abertura == local->tm_mday)&&(sistema.caixa.mes_abertura != (local->tm_mon+1))){
  1515. sistema.caixa.fatMensal = 0;
  1516. }
  1517.  
  1518.  
  1519.  
  1520. fechaArquivoSistema();
  1521. }
  1522.