-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
168 lines (139 loc) · 5.05 KB
/
main.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
/**
Universidade Federal Rural de Pernambuco
Discente: Ewerton Queiroz
Disciplina: Algoritmos e Estruturas de Dados
Data: 28/08/2016
Atividade: EP0
OBS: A saída do programa não apresenta o início da avalanche de 0 à N, sendo N o tamanho do vetor.
Ele apresenta o índice do vetor_pista onde se iniciou a avalanche.
A função checar_avalanche está com problemas e eu não sei como corrigí-los, se o senhor puder
me dar um feedback sobre o que tem de errado com ela, eu ficaria muito agradecido.
Ocorre o seguinte:
Há momento que o vetor aux não é ordenado dentro dela, consequentemente, no momento que
ocorre as comparações com o trecho do vetor_pista, não são encontradas diferenças e é
devolvido -1 incorretamente. Eu tenho um exemplo de arquivo ao qual utilizei para testes.
Caso queira conferir está no seguinte link:
https://github.com/EwertonQueiroz/AED-EP0/blob/master/pista2
*/
#include <stdio.h>
#include <stdlib.h>
int vetor_pista[50];
int aux[25];
int z = 0; // A variavel global z controla o tamanho do vetor.
/**
Esta função realiza a leitura do arquivo que contém as altitudes da pista.
Atentar para o fato de que não há verificação de validade do arquivo, ou seja,
se o arquivo não for localizado o programa funcionará de maneira inesperada.
*/
void ler_arquivo (char url[]) {
FILE *arquivo;
arquivo = fopen (url, "r");
fscanf (arquivo, "%d", &vetor_pista[z]);
while (vetor_pista[z] != 0) {
z++;
fscanf (arquivo, "%d", &vetor_pista[z]);
}
fclose (arquivo);
}
// Esta função percorre o vetor da esquerda para a direita e o ordena de maneira crescente.
void ordenar_selecao (int v[], int inicio, int tamanho) {
int i, j, x, menor;
for (i = inicio; i < tamanho - 1; ++i) {
menor = i;
for (j = i + 1; j < tamanho; ++j) {
if (v[j] < v[menor]) {
menor = j;
}
}
x = v[i];
v[i] = v[menor];
v[menor] = x;
}
}
/**
Esta função é exclusivamente para testes. Ela serve para visualizar como está o vetor vetor_pista. *
void imprimir_vetor_teste (int v[], int tamanho) {
int a;
for (a = 0; a < tamanho; a++) {
printf ("[%d] = %d \t", a, v[a]);
}
}
//*/
// Esta função realiza a impressão da pista corrigida.
void imprimir_vetor (int v[], int inicio, int tamanho) {
int a;
printf ("%d ", inicio);
for (a = inicio; a <= tamanho; a++) {
printf ("%d ", v[a]);
}
printf ("\n\n");
}
/**
Esta função copia a pista para o vetor aux, ordena o vetor aux e depois compara
com os elementos do vetor_pista, caso encontre alguma diferença, ou seja, caso
ocorreu uma avalanche na pista, é devolvida a posição onde a avalanche ocorreu.
*/
int checar_avalanche (int v[], int inicio, int tamanho, int a[]) {
int i;
for (i = inicio; i < inicio + tamanho; i++) {
a[i] = v[i];
}
ordenar_selecao (a, inicio, tamanho);
for (i = inicio; i < inicio + tamanho; i++) {
if (a[i] != v[i]) {
return i;
}
}
return -1;
}
/**
Esta função realiza os reparos na pista da seguinte forma:
A partir do vetor recebido nos parâmetros, consegue-se obter o tamanho da pista,
a primeira e a última altitude.
Após isso, é utilizado o algoritmo de ordenação por seleção para ordenar as altitudes
da pista. Para a pista ser ordenada corretamente, ou seja, ordenar sem considerar o
valor que indica o tamanho da mesma, para isso é utilizada a variável "linha_inicio".
*/
void reparar_pista (int v[]) {
int linha_tamanho = v[0];
int linha_inicio = 1;
int linha_fim = linha_tamanho;
int inicio_avalanche = checar_avalanche(v, linha_inicio, linha_tamanho, aux);
if (inicio_avalanche != -1) {
if (inicio_avalanche == 0) {
inicio_avalanche = 1;
ordenar_selecao (v, inicio_avalanche, linha_tamanho + 1);
imprimir_vetor (v, inicio_avalanche, linha_tamanho);
}
else {
ordenar_selecao (v, inicio_avalanche, linha_tamanho + 1);
imprimir_vetor (v, inicio_avalanche, linha_tamanho);
}
}
else {
printf("%d\n\n", inicio_avalanche);
}
while (v[linha_fim + 1] != 0) {
linha_tamanho = v[linha_fim + 1];
linha_inicio = linha_fim + 2;
linha_fim += linha_tamanho + 1;
inicio_avalanche = checar_avalanche(v, linha_inicio, linha_fim, aux);
if (inicio_avalanche != -1) {
ordenar_selecao (v, inicio_avalanche, linha_fim + 1);
imprimir_vetor (v, inicio_avalanche, linha_fim);
}
else {
printf("%d\n\n", inicio_avalanche);
}
}
}
/**
É necessário que o caminho do arquivo ou apenas o nome,
caso o arquivo esteja no mesmo diretório do executável,
seja informado no parâmetro da função ler_arquivo().
*/
int main() {
ler_arquivo ("pista");
reparar_pista (vetor_pista);
return 0;
}