-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalleslp
executable file
·262 lines (240 loc) · 6.17 KB
/
calleslp
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
#!/bin/sh
#calleslp, determina entre qué calles queda una determinada dirección en la ciudad de La Plata
#uso(), explica el funcionamiento del programa y sale
uso()
{
echo "Modo de uso: `basename $0` calle altura"
echo "Ejemplo: `basename $0` 6 523"
}
#esDigito(), chequea si una determinada variable es un número entero.
esDigito()
{
case $1 in
''|*[!0-9]*)
return 1 ;;
*)
return 0 ;;
esac
}
#norteSur(), el cálculo para las paralelas a Av. 7
norteSur()
{
if [ $2 -lt 1 ] || [ $2 -gt 8799 ]
then
echo "La numeración de las calles norte-sur va desde 1 a 8799. Recuerde que si la dirección está ubicada en Tolosa, Ringuelet o alrededores, debe agregar una t antes del número de calle (t7 653, por ejemplo). Por favor, revise los datos y vuelva a intentarlo."
exit 1
fi
calle1=$(($2 / 50 + 32 ))
if [ $calle1 -gt 51 ]
then
calle1=$(($calle1 + 1))
if [ $calle1 -eq 99 ]
then
calle2=600
elif [ $calle1 -gt 99 ]
then
calle1=$(( $calle1 + 500))
calle2=$(( $calle1 + 1 ))
else
calle2=$(($calle1 + 1))
fi
elif [ $calle1 -eq 51 ]
then
calle2=53
advertencia="Entre las calles 27 y 31 existe la calle 52, extienda su búsqueda hasta ella si no halla la dirección."
else
calle2=$(($calle1 + 1))
if [ $calle1 -eq 50 ]
then
advertencia="Entre las calles 27 y 31 existe la calle 52, extienda su búsqueda hasta ella si no halla la dirección."
fi
fi
}
#esteOeste(), el cálculo para las paralelas a calle 50
esteOeste()
{
if [ $2 -lt 1 ] || [ $2 -gt 15849 ]
then
echo "La numeración de las calles este-oeste va desde 1 a 15849. Por favor, revise los datos y vuelva a intentarlo."
exit 1
# Las direcciones menores a 300 quedan al este de calle 1. La numeración sigue por 115 (1, 115, 116 hacia el este), de aquí la complicada fórmula.
elif [ $2 -lt 300 ]
then
if [ $1 -eq 51 ] || [ $1 -eq 53 ]
then
echo "Las calles 51 y 53 sólo existen entre las calles 1 y 31 (numeración entre 300 y 1799). Por favor, revise los datos y vuelva a intentarlo."
exit 1
fi
calle1=$(( -1 * $(($2 / 50 - 5)) + 115))
case $calle1 in
115)
calle2=1;;
*)
calle2=$(( $calle1 - 1));;
esac
elif [ $2 -lt 1800 ]
then
if [ $1 -eq 52 ] && [ $2 -lt 1600 ]
then
echo "La calle 52 no existe entre las calles 1 y 27 (numeración entre 300 y 1599). Por favor, revise los datos y vuelva a intentarlo."
exit 1
fi
calle1=$(($2 / 50 - 5))
calle2=$(($calle1 + 1))
else
if [ $1 -eq 51 ] || [ $1 -eq 53 ]
then
echo "Las calles 51 y 53 sólo existen entre las calles 1 y 31 (numeración entre 300 y 1799). Por favor, revise los datos y vuelva a intentarlo."
exit 1
fi
calle1=$(($2 / 50 - 5 + 100 ))
calle2=$(($calle1 + 1))
fi
}
#diagonalesPrincipales(), el cálculo para las diagonales 73, 74, 79 y 80
diagonalesPrincipales()
{
case $1 in
d73|d74)
if [ $2 -lt 1 ] || [ $2 -gt 31699 ]
then
echo "Dirección inexistente (la altura ingresada no existe en dicha diagonal)".
exit 1
fi;;
*)
if [ $2 -lt 1 ] || [ $2 -gt 999 ]
then
echo "Dirección inexistente (la altura ingresada no existe en dicha diagonal)".
exit 1
fi;;
esac
if [ $2 -lt 600 ]
then
calle1=$(( -1 * $(( $2 / 100 - 5 )) + 115))
case $calle1 in
115)
calle2=1;;
*)
calle2=$(( $calle1 - 1 ));;
esac
elif [ $2 -lt 3600 ]
then
calle1=$(( $2 / 100 - 5))
calle2=$(($calle1 + 1))
else
calle1=$(( $2 / 100 - 5 + 100 ))
calle2=$(($calle1 + 1))
fi
}
#diagonales7576(), el cálculo para las diagonales 75 y 76
diagonales7576()
{
if [ $2 -lt 1 ] || [ $2 -gt 1099 ]
then
echo "La altura especificada no existe en esta diagonal. Por favor, revise los datos e inténtelo nuevamente."
exit 1
fi
calle1=$(( $2 / 100 + 14))
calle2=$(($calle1 + 1))
}
#diagonales7778(), el cálculo para las diagonales 77 y 78
diagonales7778()
{
if [ $2 -lt 1 ] || [ $2 -gt 1099 ]
then
echo "La altura especificada no existe en esta diagonal. Por favor, revise los datos e inténtelo nuevamente."
exit 1
fi
calle1=$(( $2 / 100 + 1))
calle2=$(( $calle1 + 1))
}
#tolosaNorteSur(), el cálculo para las paralelas a Av. 7 en la zona de Tolosa y Ringuelet
tolosaNorteSur()
{
if [ $2 -lt 0 ] || [ $2 -gt 2999 ]
then
echo "La altura especificada no existe. Por favor, revise los datos y vuelva a intentarlo."
exit 1
elif [ $2 -lt 100 ]
then
calle1=32
calle2=531
else
calle1=$(( 531 - $2 / 100 ))
calle2=$(( $calle1 + 1 ))
fi
}
#tolosaEsteOeste(), el cálculo para las paralelas a Av. 32 en la zona de Tolosa y Ringuelet
tolosaEsteOeste()
{
if [ $2 -lt 1 ] || [ $2 -gt 15849 ]
then
echo "La numeración de las calles este-oeste va desde 1 a 15849. Por favor, revise los datos y vuelva a intentarlo."
exit 1
# Las direcciones menores a 300 quedan al este de calle 1. La numeración sigue por 115 (1, 115, 116 hacia el este), de aquí la complicada fórmula.
elif [ $2 -lt 300 ]
then
calle1=$(( -1 * $(($2 / 50 - 5)) + 115))
case $calle1 in
115)
calle2=1;;
*)
calle2=$(( $calle1 - 1));;
esac
elif [ $2 -lt 1800 ]
then
calle1=$(($2 / 50 - 5))
calle2=$(($calle1 + 1))
else
calle1=$(($2 / 50 - 5 + 100 ))
calle2=$(($calle1 + 1))
fi
}
#imprimir(), imprime el resultado
imprimir()
{
echo "$1 Nº $2 queda entre $calle1 y $calle2"
#Advertencias adicionales, se imprimen en caso de calles cuya numeración no sigue la regla.
if [ -n "$advertencia" ]
then
echo $advertencia
fi
return 0
}
#### Punto de entrada ####
#Chequeo de cantidad de argumentos
if [ $# -ne 2 ]
then
echo "Error: cantidad de argumentos incorrecta."
uso
exit 1
fi
#La altura de la calle siempre debe ser numérica, si esa condición no se cumple no tiene sentido seguir.
esDigito $2
if [ $? -ne 0 ]
then
uso
exit 1
else
# La selectora que deriva el cálculo a las diferentes funciones o sale si los argumentos no son válidos
case $1 in
d7[349]|d80)
diagonalesPrincipales $1 $2;;
d7[56])
diagonales7576 $1 $2;;
d7[78])
diagonales7778 $1 $2;;
[1-9]|[12][0-9]|3[01])
norteSur $1 $2;;
3[2-9]|[456789][0-9]|11[5-9]|120|6[0-9][0-9]|70[0-8])
esteOeste $1 $2;;
t[1-9]|t[12][0-9]|t3[01])
tolosaNorteSur $1 $2;;
t50[2-9]|t5[12][0-9]|t53[01])
tolosaEsteOeste $1 $2;;
*)
uso
exit 1;;
esac
fi
imprimir $1 $2