-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEd.c
450 lines (355 loc) · 13.5 KB
/
Ed.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
/* Jeffley Garçon & Nycollas Widney*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STRING 20
// Tipos de Feno
#define TIPO_A 'A'
#define TIPO_B 'B'
#define TIPO_C 'C'
typedef struct data {
int dia;
int mes;
int ano;
} Data;
typedef struct fardo {
char cultivar[MAX_STRING];
char tipoDeFeno;
float diametro;
float altura;
} Fardo;
typedef struct producao {
int codigo;
Data dataProducao;
Fardo tipoDeFardo;
int qtDeFardo;
float duracao;
struct producao* proximo;
struct producao* anterior;
} Producao;
typedef struct tipoFenoLista {
Producao* inicio;
Producao* fim;
} TipoFenoLista;
// TAD
TipoFenoLista inicializarTipoFenoLista();
void adicionarProducaoAoTipoFenoLista(const Producao* producao, TipoFenoLista* lista);
Producao* incluirProducao(Producao* list);
void consultarPorData(Producao* list, int dia, int mes, int ano);
void alterarProducao(Producao* list, int codigo);
Producao* excluirProducao(Producao* list, int codigo);
void listarTodos(Producao* list);
void listarAgrupadoPorTipoFeno(const Producao* list);
Producao* excluirProducaoPoTipoFeno(Producao* list, char tipoDeFeno);
TipoFenoLista inicializarTipoFenoLista() {
TipoFenoLista lista;
lista.inicio = NULL;
lista.fim = NULL;
return lista;
}
void adicionarProducaoAoTipoFenoLista(const Producao* producao, TipoFenoLista* lista) {
Producao* novoNo = (Producao*)malloc(sizeof(Producao));
if (novoNo == NULL) {
fprintf(stderr, "Erro na alocação de memória para adicionar produção.\n");
exit(EXIT_FAILURE);
}
novoNo->tipoDeFardo = producao->tipoDeFardo;
strcpy(novoNo->tipoDeFardo.cultivar, producao->tipoDeFardo.cultivar);
novoNo->qtDeFardo = producao->qtDeFardo;
novoNo->codigo = producao->codigo;
novoNo->dataProducao = producao->dataProducao;
novoNo->duracao = producao->duracao;
// Configuração dos ponteiros .... ...
novoNo->anterior = lista->fim;
novoNo->proximo = NULL;
if (lista->inicio == NULL) {
lista->inicio = novoNo;
lista->fim = novoNo;
} else {
lista->fim->proximo = novoNo;
lista->fim = novoNo;
}
}
Producao* incluirProducao(Producao* list) {
Producao* novo = (Producao*)malloc(sizeof(Producao));
printf("Digite o código da producao: ");
scanf("%d", &novo->codigo);
Producao* atual = list;
while (atual != NULL) {
if (atual->codigo == novo->codigo) {
printf("O código de produção já existe. Não é possível adicionar.\n");
free(novo);
return list;
}
atual = atual->proximo;
}
printf("Digite a data da producao (dia mes ano): ");
scanf("%d %d %d", &novo->dataProducao.dia, &novo->dataProducao.mes, &novo->dataProducao.ano);
printf("Digite o tipo de feno: ");
scanf(" %c", &novo->tipoDeFardo.tipoDeFeno);
printf("Digite o numero de fardo: ");
scanf("%d", &novo->qtDeFardo);
do {
printf("Digite o diâmetro do fardo (entre 80 cm e 160 cm): ");
scanf("%f", &novo->tipoDeFardo.diametro);
if (novo->tipoDeFardo.diametro < 80 || novo->tipoDeFardo.diametro > 160) {
printf("Erro: Diâmetro fora da faixa aceitável. Tente novamente.\n");
}
} while (novo->tipoDeFardo.diametro < 80 || novo->tipoDeFardo.diametro > 160);
novo->tipoDeFardo.altura = 150.0;
printf("Digite a duração da produção: ");
scanf("%f", &novo->duracao);
printf("Produção registrada com sucesso!!!\n\n");
novo->proximo = list;
novo->anterior = NULL; // O anterior do novo nó é NULL, pois é o novo início
if (list != NULL) {
list->anterior = novo; // Atualiza o anterior do nó antigo para apontar para o novo nó
}
return novo;
}
void consultarPorData(Producao* list, int dia, int mes, int ano) {
Producao* atual = list;
Producao* ultimo = NULL;
while (atual != NULL) {
ultimo = atual; // Guarda o último nó que a gente visita para percorrer a lista de trás para frente
atual = atual->proximo;
if (ultimo->dataProducao.dia == dia && ultimo->dataProducao.mes == mes && ultimo->dataProducao.ano == ano) {
printf("Código: %d\n", ultimo->codigo);
printf("Data: %d/%d/%d\n", ultimo->dataProducao.dia, ultimo->dataProducao.mes, ultimo->dataProducao.ano);
printf("Tipo de Feno: %c\n", ultimo->tipoDeFardo.tipoDeFeno);
printf("Quantidade de Fardo: %d\n", ultimo->qtDeFardo);
printf("Diâmetro do Fardo: %.2f cm\n", ultimo->tipoDeFardo.diametro);
printf("Altura do Fardo: %.2f cm\n", ultimo->tipoDeFardo.altura);
printf("Duracao: %.2f\n", ultimo->duracao);
return;
}
}
// Percorre a lista da última posição até a primeira
while (ultimo != NULL) {
if (ultimo->dataProducao.dia == dia && ultimo->dataProducao.mes == mes && ultimo->dataProducao.ano == ano) {
printf("Código: %d\n", ultimo->codigo);
printf("Data: %d/%d/%d\n", ultimo->dataProducao.dia, ultimo->dataProducao.mes, ultimo->dataProducao.ano);
printf("Tipo de Feno: %c\n", ultimo->tipoDeFardo.tipoDeFeno);
printf("Quantidade de Fardo: %d\n", ultimo->qtDeFardo);
printf("Diâmetro do Fardo: %.2f cm\n", ultimo->tipoDeFardo.diametro);
printf("Altura do Fardo: %.2f cm\n", ultimo->tipoDeFardo.altura);
printf("Duracao: %.2f\n", ultimo->duracao);
return;
}
ultimo = ultimo->anterior;
}
printf("ERRO: Produção não encontrada para a data especificada.\n\n\n");
}
void alterarProducao(Producao* list, int codigo) {
Producao* atual = list;
while (atual != NULL) {
if (atual->codigo == codigo) {
printf("**********************\n");
printf("Produção encontrada. Insira os novos dados:\n");
int novoCodigo;
printf("Digite o novo código da producao: ");
scanf("%d", &novoCodigo);
// Verifica se o novo código já existe na lista
Producao* existente = list;
while (existente != NULL) {
if (existente != atual && existente->codigo == novoCodigo) {
printf("O código de produção já existe. Não é possível alterar.\n");
return;
}
existente = existente->proximo;
}
atual->codigo = novoCodigo;
printf("Digite a nova data da producao (dia mes ano): ");
scanf("%d %d %d", &atual->dataProducao.dia, &atual->dataProducao.mes, &atual->dataProducao.ano);
printf("Digite o novo tipo de feno: ");
scanf(" %c", &atual->tipoDeFardo.tipoDeFeno);
printf("Digite a nova quantidade de fardo: ");
scanf("%d", &atual->qtDeFardo);
// Configuração do equipamento
do {
printf("Digite o novo diâmetro do fardo (entre 80 cm e 160 cm): ");
scanf("%f", &atual->tipoDeFardo.diametro);
// Validar o diâmetro
if (atual->tipoDeFardo.diametro < 80 || atual->tipoDeFardo.diametro > 160) {
printf("Erro: Diâmetro fora da faixa aceitável. Tente novamente.\n");
}
} while (atual->tipoDeFardo.diametro < 80 || atual->tipoDeFardo.diametro > 160);
// Altura fixa
atual->tipoDeFardo.altura = 150.0;
printf("Digite a nova duracao: ");
scanf("%f", &atual->duracao);
printf("Produção alterada com sucesso.\n");
return;
}
atual = atual->proximo;
}
printf("\nProdução não encontrada para o código especificado.\n");
}
Producao* excluirProducao(Producao* list, int codigo) {
Producao* atual = list;
while (atual != NULL) {
if (atual->codigo == codigo) {
if (atual->proximo != NULL) {
atual->proximo->anterior = atual->anterior;
}
if (atual->anterior != NULL) {
atual->anterior->proximo = atual->proximo;
} else {
list = atual->proximo; // Se o nó a ser excluído for o primeiro da lista
}
free(atual);
printf("\nItem excluído com sucesso!!!\n");
return list;
}
atual = atual->proximo;
}
printf("Produção não encontrada para o código especificado.\n");
return list;
}
// ...
// ...
Producao* excluirProducaoPorTipoFeno(Producao* list, char tipoDeFeno) {
Producao* atual = list;
Producao* proximo = NULL;
Producao* anterior = NULL;
while (atual != NULL) {
proximo = atual->proximo;
if (atual->tipoDeFardo.tipoDeFeno == tipoDeFeno) {
if (anterior != NULL) {
anterior->proximo = proximo;
} else {
list = proximo; // Se o nó a ser excluído for o primeiro da lista
}
if (proximo != NULL) {
proximo->anterior = anterior;
}
free(atual);
printf("\nItem excluído com sucesso!!!\n");
} else {
anterior = atual; // Move o ponteiro 'anterior' apenas se o nó não for excluído
}
atual = proximo;
}
if (list == NULL) {
printf("A lista está vazia.\n");
}
return list;
}
void listarTodos(Producao* list) {
if (list == NULL) {
printf("A lista está vazia.\n");
return;
}
Producao* atual = list;
while (atual != NULL) {
printf("**************************************\n");
printf("Código: %d\n", atual->codigo);
printf("Data: %d/%d/%d\n", atual->dataProducao.dia, atual->dataProducao.mes, atual->dataProducao.ano);
printf("Tipo de Feno: %c\n", atual->tipoDeFardo.tipoDeFeno);
printf("Quantidade de Fardo: %d\n", atual->qtDeFardo);
printf("Diâmetro do Fardo: %.2f cm\n", atual->tipoDeFardo.diametro);
printf("Altura do Fardo: %.2f cm\n", atual->tipoDeFardo.altura);
printf("Duracao: %.2f\n\n", atual->duracao);
atual = atual->proximo;
}
}
void listarAgrupadoPorTipoFeno(const Producao* list) {
TipoFenoLista tipoA = inicializarTipoFenoLista();
TipoFenoLista tipoB = inicializarTipoFenoLista();
TipoFenoLista tipoC = inicializarTipoFenoLista();
const Producao* atual = list;
while (atual != NULL) {
switch (atual->tipoDeFardo.tipoDeFeno) {
case TIPO_A:
adicionarProducaoAoTipoFenoLista(atual, &tipoA);
break;
case TIPO_B:
adicionarProducaoAoTipoFenoLista(atual, &tipoB);
break;
case TIPO_C:
adicionarProducaoAoTipoFenoLista(atual, &tipoC);
break;
default:
printf("Tipo de feno desconhecido.\n");
break;
}
atual = atual->proximo;
}
printf("\nProduções Tipo A:\n");
listarTodos(tipoA.inicio);
printf("\nProduções Tipo B:\n");
listarTodos(tipoB.inicio);
printf("\nProduções Tipo C:\n");
listarTodos(tipoC.inicio);
}
int main() {
Producao* lista = NULL;
int escolha, codigo, dia, mes, ano, verif = 0;
char tipo;
do {
if (verif != 0) break;
printf("😊 Bem-vindo ao nosso sistema!!!! 😊\n");
printf("\nMenu:\n");
printf("1. Incluir Produção\n");
printf("2. Consultar\n");
printf("3. Alterar\n");
printf("4. Excluir\n");
printf("5. Listar todos\n");
printf("6. Listar por tipo de feno\n");
printf("7. Sair\n");
printf("8. excluir por tipo de feno\n");
printf("Escolha uma opção: ");
scanf("%d", &escolha);
switch (escolha) {
case 1:
// Incluir Produção
lista = incluirProducao(lista);
break;
case 2:
// Consultar
printf("1. Consultar por data\n");
printf("Digite a data (dia mes ano): ");
scanf("%d %d %d", &dia, &mes, &ano);
consultarPorData(lista, dia, mes, ano);
break;
case 3:
// Alterar
printf("Digite o código da producao a ser alterada: ");
scanf("%d", &codigo);
alterarProducao(lista, codigo);
break;
case 4:
// Excluir
printf("Digite o código da producao a ser excluída: ");
scanf("%d", &codigo);
lista = excluirProducao(lista, codigo);
break;
case 5:
// Listar todos
listarTodos(lista);
break;
case 6:
// tipo de feno
listarAgrupadoPorTipoFeno(lista);
break;
case 7:
// Sair
printf("Saindo do programa...\n");
verif++;
break;
case 8:
printf("Digite o tipo de feno a ser excluído: ");
getchar(); // Limpar o buffer de entrada
scanf("%c", &tipo);
lista = excluirProducaoPorTipoFeno(lista, tipo);
break;
}
} while (escolha != 7);
// para liberar a memória
while (lista != NULL) {
Producao* proximo = lista->proximo;
free(lista);
lista = proximo;
}
return 0;
}