-
Notifications
You must be signed in to change notification settings - Fork 0
/
busca_struzik.c
208 lines (181 loc) · 4.83 KB
/
busca_struzik.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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include "busca_struzik.h"
struct alunos
{
char nome[50];
int matricula;
float media;
};
// Função que vai contar quantas linhas existem no arquivo
int contarLinhas(FILE *arquivo)
{
char caracter;
int linhas = 0;
while ((caracter = fgetc(arquivo)) != EOF)
{
if (caracter == '\n')
{
linhas++;
}
}
fseek(arquivo, 0, SEEK_SET); // Volta o ponteiro para o início do arquivo
return linhas;
}
// Função que aloca um vetor de alunos dinamicamente
Aluno *vetorAlunos(int linhas)
{
Aluno *alunos = (Aluno *)malloc(linhas * sizeof(Aluno));
if (alunos == NULL)
{
printf("Memoria Insuficiente!");
exit(1);
}
return alunos;
}
// Função que converte todos os caracteres em maiúsculo
void CaracterMaiusculo(char *valor)
{
int tamanho = strlen(valor);
for (int i = 0; i < tamanho; i++)
{
valor[i] = toupper(valor[i]);
}
}
// Função que verifica se existe algum caractere inválido (considerando apenas buffers e espaço)
int VerificaCaracter(char *valor)
{
int tamanho = strlen(valor);
for (int i = 0; i < tamanho; i++)
{
if (!isalpha(valor[i]) && !isspace(valor[i]))
{
printf("Caracter invalido!\n");
return -1;
}
}
return 0;
}
// Função de comparação para qsort
int compararAlunos(const void *a, const void *b)
{
return strcmp(((Aluno *)a)->nome, ((Aluno *)b)->nome);
}
// Função para abrir o arquivo e verificar se foi aberto com sucesso
FILE *Verificacao(char *nome, char *modo)
{
FILE *arquivo = fopen(nome, modo);
if (arquivo == NULL)
{
printf("Nao foi possivel abrir o arquivo");
exit(1);
}
else
{
printf("Arquivo aberto!\n");
}
return arquivo;
}
// Função de busca binária
int buscaBinaria(Aluno *alunos, int inicio, int fim, char *valor)
{
while (inicio <= fim)
{
int meio = inicio + (fim - inicio) / 2;
int comparacao = strcmp(alunos[meio].nome, valor);
if (comparacao == 0)
{
return meio; // Nome encontrado
}
if (comparacao < 0)
{
inicio = meio + 1; // Procurar na metade direita
}
else
{
fim = meio - 1; // Procurar na metade esquerda
}
}
return -1; // Valor não encontrado
}
// Função de busca exponencial seguida de busca binária
int buscaExponencial(Aluno *alunos, int tamanho, char *valor)
{
int i = 1;
//enquanto i for menor que o tamanho do array e o nome na posição i
while (i < tamanho && strcmp(alunos[i].nome, valor) <= 0) // Encontra o intervalo onde o valor pode estar
{
i *= 2; // Dobra o tamanho do intervalo
}
int inicio = i / 2;//Defino o início do intervalo
int fim = (i < tamanho) ? i : tamanho;//Define o fim do intervalo
return buscaBinaria(alunos, inicio, fim - 1, valor);
}
int validadorNumero()
{
int numero;
char buffer;
int validador = -1;
do
{
printf("Informe um Numero Valido:\n");
validador = scanf("%d", &numero);
do
{
buffer = getchar(); // limpar o buffer do teclado
} while (buffer != '\n');
} while (numero <= 0 || validador == 0);
return numero;
}
float validadorMedia()
{
float media;
char buffer;
int validador = -1;
do
{
printf("Informe uma media valida:");
validador = scanf("%f", &media);
do
{
buffer = getchar(); // limpar o buffer do teclado
} while (buffer != '\n');
} while (validador == 0 || media < 0 || media > 10);
return media;
}
void cadastroAluno()
{
char nome[50];
int matricula;
float media;
FILE *arquivo = Verificacao("alunos.txt", "a+");
printf("Informe o Nome:\n");
scanf(" %[^\n]", nome);
while (VerificaCaracter(nome) == -1)
{
printf("Informe o Nome novamente:\n");
scanf(" %[^\n]", nome);
}
printf("Informe a Matricula:\n");
matricula = validadorNumero();
media = validadorMedia();
fprintf(arquivo, "%s\t%d\t%.1f\n", nome, matricula, media);
printf("Aluno cadastrado com sucesso!\n");
fclose(arquivo);
}
void exibirLista()
{
char nome[50];
int matricula;
float media;
FILE *arquivo = Verificacao("alunos.txt", "r");
printf("Lista de Alunos Cadastrados:\n");
while (fscanf(arquivo, " %49[^\t]\t%d\t%f\n", nome, &matricula, &media) == 3)
{
printf("%s\t%d\t%.1f\n", nome, matricula, media);
}
fclose(arquivo);
}