· 6 years ago · Oct 28, 2019, 12:28 AM
1#include <stdio.h> // Biblioteca para entrada e saída de dados
2#include <locale.h> // Biblioteca para incluir regras da língua portuguesa em strings
3#include <stdlib.h> // Biblioteca para alocação de memória e controle de processos
4#include <string.h> // Biblioteca para realizar operações com string
5#include <ctype.h> // Biblioteca para manipulação de caracteres
6
7char keyboard[BUFSIZ]; // Prótotipo de função para limpeza do buffer
8
9//------ Documentação -------//
10
11/**
12*@author ---
13*@version ---
14*@since ---
15*/
16
17//------ Documentação -------//
18
19//------ Variável globais -------//
20
21int i = 0, j = 0; // Variáveis usadas no FOR ( I = Filmes ) ( J = Clientes )
22
23int qtd_filmes = 0, qtd_clientes = 0; // Controla a ação dos for, é usado para controle de indice dentro de array
24
25int filme = 0, cliente = 0;// Usado para contar a quantidade de clientes ou filmes cadastrados
26
27int consulta; // Variável responsável por armazenar e comparar o identificador que é fornecido pelo usuário.
28char cliente_consulta[40]; // Variável responsável por armazenar e comparar o nome do cliente que é fornecido pelo usuário no menu de atualização.
29
30int escolha; // Variável responsável pelo controle das opções da navegação.
31
32char *guardar; // Variável que armazena o que existe depois do @ dentro de uma string
33char validar_email[2][30] = {"@gmail.com","@hotmail.com"}; // Variável criada para validar email do usuário <- 30 de tamanho para evitar erros de conflito com a variável email do struct filmes
34
35//----- Variável globais -------//
36
37struct st_filmes{ // Struct para armazenar os filmes;
38
39
40
41
42 int identificador;
43 char titulo[40];
44 int ano_de_producao;
45 char genero[15];
46} filmes[20]; // Inciializando o Struct com um vetor de 20 de tamanho, você só poderá cadastrar 20 filmes
47
48struct st_clientes{ // Struct para armazenar os clientes;
49
50
51
52 char nome[40];
53 char cpf[12]; // Tamanho extra para o terminador \0
54 char email[30]
55
56
57} clientes[20]; // Inciializando o Struct com um vetor de 20 de tamanho, você só poderá cadastrar 20 clientes
58
59void f_cadastrar_filme(){ // Função para cadastrar os filmes
60
61
62
63 printf("\n======Cadastro de filmes=======\n\n");
64
65 int identificador; // Serve para armazenar o identificador do filme e comparar com o identificador da struct
66 int booleana = 0; // Servirá para o controle do if/else da verificação de identificadores cadastrados (0 false) - (1 - True)
67
68 printf("Diga-me o identificador do filme: ");
69 setbuf(stdin,keyboard); // Tirando o lixo da entrada
70 scanf("%d", &identificador);
71 // Identificador menor que zero
72 if(identificador <= 0){ // Se o identificador for negativo então, a função é chamada novamente
73
74 printf("\n\nInforme um identificador positivo ou não nulo! \n");
75 system("pause");
76 system("cls");
77 f_cadastrar_filme();
78 }
79 // Verificação de identificadores iguais
80 if(filme < 20){ // O usuário só pode cadastrar 20 filmes, a verificação só ocorrerrá se o usuário ainda não tiver preenchido 20 filmes
81
82
83 for(i = 0 ; i < qtd_filmes ; i++){ // Laço para ver se existe um identificador igual a um que já está cadastrado no sistema
84
85 if(identificador == filmes[i].identificador) // Se o identificador que o usuário informar for igual a um identificador em uma posição X do meu struct
86 booleana = 1; // Então a booleana recebe 1 ( True )
87 }
88 if(booleana == 1){ // Se a booleana for igual a 1 quer dizer que esse identificador já existe no sistema
89
90 printf("Filme já cadastrado!\n");
91 system("pause");
92 system("cls");
93 f_cadastrar_filme(); // Se o identificador for inválido chama a função novamente!
94 }
95 else{ // Se a booleana não for 1 então o identificador não existe no sistema, o meu struct st_filmes na variável identificador, recebe o identificador que o usuário informou.
96
97 filmes[qtd_filmes].identificador = identificador;
98 }
99 }
100 else{ // Caso ele já tenha cadastrado 20 filmes, então ele volta para o menu
101
102 printf("\n\nVocê já cadastrou o número máximo de filmes! \n");
103 system("pause");
104 system("cls");
105 menu_filme();
106 }
107
108 printf("Diga-me o título do filme: ");
109 setbuf(stdin,keyboard);
110 scanf("%39[^\n]s",&filmes[qtd_filmes].titulo); // Pegando o input da forma correta, sem o \n
111
112 printf("Diga-me o ano de produção do filme: ");
113 setbuf(stdin,keyboard);
114 scanf("%d",&filmes[qtd_filmes].ano_de_producao);
115
116 if(filmes[qtd_filmes].ano_de_producao > 2019 || filmes[qtd_filmes].ano_de_producao < 1895){ // Faz com que o usuário não digite um ano de produção que não exista.
117
118
119 printf("\nAno de produção inválido! \n\n"); // Se o ano de produção for menor que 1895 irei chamar a função novamente, porém com alguns detalhes...
120 system("pause");
121 system("cls");
122 f_cadastrar_filme();
123 }
124 printf("Diga-me o gênero do filme: ");
125 setbuf(stdin,keyboard);
126 scanf("%14[^\n]s",&filmes[i].genero);
127
128 printf("\n\n");
129 ++qtd_filmes; // Após o usuário cadastrar o filme essa variável é incrementada, fazendo que conte quantos filmes foram cadastrados.
130 ++filme; // Conta quantos filmes foram cadastrados é a partir disso vê se o limite de filmes cadastrados passou da meta, ou não.
131 system("pause"); // Da uma pausa antes de executar a próxima linha de comando
132 system("cls"); // Limpa o console
133 menu_filme(); // Chamada de função
134
135}
136
137
138void f_cadastrar_cliente(){ // Função para cadastrar clientes
139
140
141 char nomeador[20][40]; // Serve para armazenar o nome do cliente e comparar com nome da struct
142 char cpfeador[20][12]; // Serve para armazenar o cpf do cliente e comparar com o cpf da struct
143 char emaildor[20][30]; // Serve para armazenar o email do cliente e comparar com o cpf da struct
144 int booleana = 0; // Servirá para o controle do if/else da verificação de elementos cadastrados (0 false) - (1 - True)
145 int e_digito = 0; // Servirá para verificar se o CPF é digito ou não
146
147 printf("\n======Cadastro de cliente=======\n\n");
148
149 if(cliente < 20){ // O usuário só pode cadastrar 20 clientes, a verificação só ocorrerrá se o usuário ainda não tiver preenchido 20 clientes.
150
151 printf("Diga-me o nome do cliente: ");
152 setbuf(stdin,keyboard); // Usando o setbuf para tirar o lixo da entrada
153 scanf("%39[^\n]s", &nomeador[qtd_clientes]); // Pegando o input do usuario
154
155 printf("Diga-me o cpf do cliente(Sem pontuação): ");
156 setbuf(stdin,keyboard);
157 scanf("%11[^\n]s", &cpfeador[qtd_clientes]);
158 //Verificação do CPF
159 for(int j = 0 ; j <= strlen(cpfeador[qtd_clientes]) ; j++){ // Laço percorre o tamanho da string
160
161
162 if(isdigit(cpfeador[j])){ // Verifica se o cpf fornecido pelo usuário tem letras do alfabeto
163
164 e_digito = 1; // Se tiver letras do alfabetos e_digito = 1
165 }
166 else{ // Se não tiver letras do alfabeto e_digito fica = 0
167
168 e_digito = 0;
169 }
170 }
171
172 if(strlen(cpfeador[qtd_clientes]) != 11 || e_digito == 1){ //Verifica se o CPF contêm 11 números, se não tiver a função é chamada novamente.
173
174 printf("CPF Inválido!(Sem pontos ou traços)!/Somente números! \n");
175 system("pause");
176 system("cls");
177 f_cadastrar_cliente(); // Se o CPF for inválido chama a funão novamente!
178 }
179
180 printf("Diga-me o email do cliente: ");
181 setbuf(stdin,keyboard);
182 scanf("%29[^\n]s",&emaildor[qtd_clientes]);
183
184 guardar = strrchr(emaildor[qtd_clientes],'@'); // Guarda a primeira ocorrência do @ na string
185
186 if( strcmp(guardar,validar_email[0]) != 0 && strcmp(guardar,validar_email[1]) != 0){ // Se o usuário não digitar a formatação de um email correto então a função é retornada.
187
188
189 printf("Email inválido, Aceitamos somente o dominio gmail.com e hotmail.com, também verifique o uso do '@' .\n");
190 system("pause");
191 system("cls");
192 f_cadastrar_cliente();
193 }
194
195 // Verificação de elementos iguais
196 for(j = 0 ; j < qtd_clientes ; j++){ // Laço para ver se existe os elementos igual a um que já está cadastrado no sistema
197
198 if(strcmp(nomeador[qtd_clientes],clientes[j].nome) == 0 || strcmp(cpfeador[qtd_clientes],clientes[j].cpf) == 0 || strcmp(emaildor[qtd_clientes],clientes[j].email) == 0 ){ // Se os elementos que o usuário informar for igual a um os elementos da posição X do meu struct
199
200 booleana = 1; // Então a booleana recebe 1 ( True )
201 }
202 }
203 if(booleana == 1){ // Se a booleana for igual a 1 quer dizer que esses elementos já existe no sistema
204
205 printf("Elementos que você inseriu já estão cadastrados em outro cliente!\n");
206 system("pause");
207 system("cls");
208 f_cadastrar_cliente(); // Se os elementos for inválido chama a função novamente!
209 }
210 else{ // Se a booleana não for 1 então os elementos não existem no sistema, o meu struct st_cliente nas três variáveis, receberá as informações que o usuário digitou.
211
212 strcpy(clientes[qtd_clientes].nome,nomeador[qtd_clientes]); // Copia a 2 string na 1
213 strcpy(clientes[qtd_clientes].cpf,cpfeador[qtd_clientes]); // Copia a 2 string na 1
214 strcpy(clientes[qtd_clientes].email,emaildor[qtd_clientes]); // Copia a 2 string na 1
215 }
216 }
217 else{ // Caso ele já tenha cadastrado 20 clientes, então ele volta para o menu
218
219 printf("\n\nVocê já cadastrou o número máximo de clientes! \n");
220 system("pause");
221 system("cls");
222 menu_cliente();
223 }
224 printf("\n\n");
225
226 ++qtd_clientes; // Após o usuário cadastrar o cliente essa variável é incrementada, fazendo que conte quantos clientes foram cadastrados.
227 ++cliente; // Conta quantos clientes foram cadastrados é a partir disso vê se o limite de clientes cadastrados passou da meta, ou não.
228 system("pause"); // Da uma pausa para a próxima linha de comando
229 system("cls"); // Limpa o console
230 menu_cliente(); // Chama a função de menu dos clientes
231
232}