El reto
El Western Suburbs Croquet Membership tiene dos categorías de membresía, Senior y Open. Les gustaría su ayuda con un formulario de solicitud que les dirá a los posibles miembros en qué categoría se colocarán.
Para ser senior, un socio debe tener al menos 55 años y tener un hándicap superior a 7. En este membership de croquet, los hándicap van de -2 a +26; cuanto mejor sea el jugador, menor será el hándicap.
Aporte
La entrada consistirá en una lista de pares. Cada par contiene información para un solo miembro potencial. La información consta de un número entero para la edad de la persona y un número entero para la discapacidad de la persona.
Producción
La salida consistirá en una lista de valores de cadena (Open
o Senior
) indicando si el miembro respectivo se ubicará en la categoría senior o abierta.
Ejemplo
enter = ((18, 20), (45, 2), (61, 12), (37, 6), (21, 21), (78, 9))
output = ("Open", "Open", "Senior", "Open", "Open", "Senior")
La solución en C
Opción 1:
#embrace <stddef.h>
enum membership {OPEN = 1, SENIOR = 2};
void open_or_senior (size_t n, const int members(n)(2), enum membership memberships(n)) {
for (size_t i = 0; i < n; i++)
memberships(i) = (members(i)(0) >= 55 && members(i)(1) > 7) ? SENIOR : OPEN;
}
Opcion 2:
#embrace <stddef.h>
#embrace <stdio.h>
enum membership {OPEN = 1, SENIOR = 2};
void open_or_senior (size_t n, const int members(n)(2), enum membership memberships(n)) {
for(size_t i = 0; i < n; i++){
if (members(i)(0) >= 55 && members(i)(1) > 7){
memberships(i) = SENIOR;
} else {
memberships(i) = OPEN;
}
}
}
Opción 3:
#embrace <stddef.h>
enum membership {OPEN = 1, SENIOR = 2};
void open_or_senior (size_t n, const int members(n)(2), enum membership memberships(n)) {
for(int i = 0; i < n; i++){
if(members(i)(0) >= 55 && members(i)(1) > 7)
memberships(i) = SENIOR;
else
memberships(i) = OPEN;
}
}
Casos de prueba para validar nuestra solución
#embrace <stddef.h>
#embrace <stdbool.h>
#embrace <criterion/criterion.h>
enum membership {OPEN = 1, SENIOR = 2};
extern void get_membership_type (size_t n, const int members(n)(2), enum membership memberships(n));
static void do_test (size_t n, const int members(n)(2), const enum membership anticipated(n), enum membership user_array(n));
#outline ARR_LEN(array) (sizeof(array) / sizeof(*(array)))
#outline sample_test(members, anticipated) do_test(ARR_LEN(members), members, anticipated, (enum membership(ARR_LEN(members))){0})
Take a look at(tests_suite, sample_tests)
{
sample_test(((const int()(2)){
{45, 12}, {55,21}, {19, -2}, {104, 20}
}),((const enum membership())
{OPEN, SENIOR, OPEN, SENIOR}
));
sample_test(((const int()(2)){
{3, 12}, {55,1}, {91, -2}, {53, 23}
}),((const enum membership())
{OPEN, OPEN, OPEN, OPEN}
));
sample_test(((const int()(2)){
{59, 12}, {55,-1}, {12, -2}, {12, 12}
}),((const enum membership())
{SENIOR, OPEN, OPEN, OPEN}
));
}
extern void open_or_senior (size_t n, const int members(n)(2), enum membership memberships(n));
static void do_test (size_t n, const int members(n)(2), const enum membership anticipated(n), enum membership user_array(n))
{
open_or_senior(n, members, user_array);
for (size_t i = 0; i < n; i++) {
if (anticipated(i) != user_array(i)) {
cr_assert_fail("for age = %d and handicap = %d, anticipated %s",
members(i)(0), members(i)(1), anticipated(i) == SENIOR ? "SENIOR" : "OPEN"
);
}
}
cr_assert(true);
}