-
Notifications
You must be signed in to change notification settings - Fork 0
/
ejercicio2.c
274 lines (255 loc) · 7.89 KB
/
ejercicio2.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
/*
Trabajo Practico 4 - Ejercicio
Profe Martín
Comision Profes - 2023
Programacion 1 - Ingenieria en computacion
*/
#include <stdio.h>
/*
Consigna:
Implementar una función que, en el ordenamiento de arreglos de números enteros,
haga uso de la función "intercambia" para hacer los movimientos de los valores
en el arreglo en lugar de hacer las asignaciones entre las posiciones.
*/
/*
* Notas de la solución del ejercicio:
* Este ejercicio toma practicamente todo lo del TP3 ejercicio 1, solo
* modificando lo referido al ordenamiento.
*/
#define CAPACIDAD_MAXIMA 10
// Codigos de salida
#define TODO_OK 0
#define ARREGLO_NULO -1
#define SIN_LUGAR_SUFICIENTE -2
#define CAPACIDAD_INCORRECTA -3
/**
* Imprime un mensaje de error basado en un código de error.
*
* Esta función toma el código numérico de error como entrada y muestra un
* mensaje correspondiente en la salida estándar. Los mensajes se utilizan para
* describir los diferentes tipos de errores posibles en el programa.
*
* @param codigo_error El código de error que indica la naturaleza del problema.
*
* @pre El código de error debe ser alguno de los definidos y conocidos:
* (TODO_OK, ARREGLO_NULO, SIN_LUGAR_SUFICIENTE,
* CAPACIDAD_INCORRECTA).
*
* @post Se imprime el mensaje de error correspondiente al código de error
* proporcionado. Si el código de error no es reconocido, se muestra un mensaje
* genérico que indica un código de error desconocido.
*/
void imprime_mensaje_error(int codigo_error)
{
if (codigo_error == TODO_OK)
{
printf("Todo bien!\n");
}
else if (codigo_error == ARREGLO_NULO)
{
printf("El arreglo es nulo\n");
}
else if (codigo_error == SIN_LUGAR_SUFICIENTE)
{
printf("No hay lugar suficiente para la operacion\n");
}
else if (codigo_error == CAPACIDAD_INCORRECTA)
{
printf("La capacidad no es la correcta (0 o negativa)\n");
}
else
{
printf("Codigo de error '%d' desconocido!\n", codigo_error);
}
}
/**
* Comprueba si un arreglo es válido.
*
* Esta función verifica si un arreglo es válido según las siguientes
* condiciones:
* - El puntero al arreglo no es nulo.
* - La capacidad del arreglo es mayor o igual a 1.
*
* @param capacidad La capacidad del arreglo.
* @param arreglo Un puntero al arreglo de enteros.
*
* @return Un código de salida que indica si el arreglo es válido o no.
* - Si el arreglo es nulo, devuelve ARREGLO_NULO.
* - Si la capacidad es menor que 1, devuelve CAPACIDAD_INCORRECTA.
* - Si el arreglo es válido, devuelve TODO_OK.
*
* @pre El puntero al arreglo puede ser nulo o apuntar a un arreglo válido.
* La capacidad debe ser un valor mayor o igual a 1.
*
* @post La función devuelve uno de los siguientes códigos:
* - ARREGLO_NULO si el arreglo es nulo.
* - CAPACIDAD_INCORRECTA si la capacidad es menor que 1.
* - TODO_OK si el arreglo es válido.
*/
int es_valido(int capacidad, int arreglo[])
{
int codigo_salida;
if (arreglo == NULL)
{
codigo_salida = ARREGLO_NULO;
}
else if (capacidad < 1)
{
codigo_salida = CAPACIDAD_INCORRECTA;
}
else
{
codigo_salida = TODO_OK;
}
return codigo_salida;
}
/**
* Carga un arreglo con valores ingresados por el usuario.
*
* Esta función carga un arreglo con valores ingresados por el usuario,
* siempre y cuando el arreglo sea válido según la función `es_valido`.
*
* @param capacidad La capacidad del arreglo.
* @param arreglo Un puntero al arreglo de enteros.
*
* @return Un código de salida que indica si la carga se realizó correctamente o
* no.
* - Si el arreglo es nulo o la capacidad es menor que 1, devuelve
* códigos de error segun es_valido.
* - Si la carga se realizó exitosamente, devuelve TODO_OK.
*
* @pre El arreglo debe ser valido segun la funcion es_valido
*
* @post Si la carga se realiza correctamente, el arreglo contendrá los valores
* ingresados por el usuario. Si el arreglo no es válido, no se realizará
* ninguna carga y se mantendrá sin cambios.
*/
int cargar_arreglo(int capacidad, int arreglo[])
{
int i = 0;
int ingresado = 0;
int codigo_salida = es_valido(capacidad, arreglo);
if (codigo_salida == TODO_OK)
{
printf("Cargando %d elementos\n", capacidad);
while (i < capacidad)
{
printf("ingresando el %d numero, quedan %d: ", i + 1,
capacidad - i);
scanf("%d", &ingresado);
arreglo[i] = ingresado;
i++;
}
codigo_salida = TODO_OK;
}
return codigo_salida;
}
/**
* Muestra los elementos de un arreglo.
*
* Esta función muestra los elementos de un arreglo si este es válido según la
* función `es_valido`.
*
* @param capacidad La capacidad del arreglo.
* @param arreglo Un puntero al arreglo de enteros.
*
* @return Un código de salida que indica si la operación se realizó
* correctamente o no.
* - Si el arreglo es nulo o la capacidad es menor que 1, devuelve
* códigos de error segun es_valido.
* - Si la muestra se realizó exitosamente, devuelve TODO_OK.
*
* @pre El arreglo debe ser valido segun la funcion es_valido
*
* @post Si la muestra se realiza correctamente, se imprimirán los elementos del
* arreglo. Si el arreglo no es válido, no se realizará ninguna muestra y se
* mantendrá sin cambios.
*/
int muestra_arreglo(int capacidad, int arreglo[])
{
int i = 0;
int codigo_salida = es_valido(capacidad, arreglo);
if (codigo_salida == TODO_OK)
{
printf("(");
while (i < capacidad)
{
printf("%d:%d", i, arreglo[i]);
i++;
if (i < capacidad)
{
printf(", ");
}
}
printf(")\n");
codigo_salida = TODO_OK;
}
return codigo_salida;
}
/**
* Intercambia los valores apuntados por dos punteros.
*
* @param izquierda Puntero a un entero que apunta al primer valor.
* @param derecha Puntero a un entero que apunta al segundo valor.
*
* @pre
* - Los punteros 'izquierda' y 'derecha' deben ser válidos y apuntar a enteros.
*
* @post
* - Los valores apuntados por 'izquierda' y 'derecha' han sido intercambiados.
*/
void intercambia(int *izquierda, int *derecha)
{
int temp = *izquierda;
*izquierda = *derecha;
*derecha = temp;
}
/**
* Ordena un arreglo en orden ascendente.
*
* Esta función ordena un arreglo de enteros en orden ascendente.
*
* @param capacidad La capacidad del arreglo.
* @param arreglo Un puntero al arreglo de enteros.
*
* @return Un código de salida que indica si la operación se realizó
* correctamente o no.
* - Si el arreglo no es válido, devuelve códigos de error segun
* es_valido.
* - Si la ordenación se realizó exitosamente, devuelve TODO_OK.
*
* @pre El arreglo debe ser valido segun la funcion es_valido
*
* @post Si la ordenación se realiza correctamente, el arreglo estará ordenado
* en orden ascendente. Si el arreglo no es válido, no se realizará ninguna
* ordenación y se mantendrá sin cambios.
*/
int ordena_ascendente(int capacidad, int arreglo[])
{
int codigo_salida = es_valido(capacidad, arreglo);
if (codigo_salida == TODO_OK)
{
for (int i = 0; i < capacidad - 1; i++)
{
for (int j = 0; j < capacidad - i - 1; j++)
{
if (arreglo[j] > arreglo[j + 1])
{
intercambia(&arreglo[j], &arreglo[j + 1]);
}
}
}
}
return codigo_salida;
}
int main()
{
int arreglo[CAPACIDAD_MAXIMA] = {5, 2, 9, 1, 5, 6, 10, -1, 0};
int capacidad = CAPACIDAD_MAXIMA;
printf("Antes");
muestra_arreglo(capacidad, arreglo);
ordena_ascendente(capacidad, arreglo);
printf("despues");
muestra_arreglo(capacidad, arreglo);
return 0;
}