Solución a la Tarea 5: Genes Dominantes y Recesivos
Al igual que la anterior, esta tarea se puede resolver en dos etapas:
Primero leemos los datos y
luego los procesamos. La lectura de cadenas se puede hacer tanto con gets como con scanf. Para el procesamiento,
resulta conveniente definir dos funciones que decidan si una letra es
minúscula o bien si es mayúscula. Aunque ambas son
sencillas, aquí las muestro:
int
minus(char c)
{
return ('a' <= c)
&& (c <= 'z');
}
int mayus(char c)
{
return ('A' <= c)
&& (c <= 'Z');
}
El procesamiento se hace según las reglas explicadas en el
enunciado. Observe que como todas las cadenas tienen la misma longitud,
basta verificar en el ciclo si una de ellas aún contiene
caracteres. Los if-else-if dentro del ciclo son los que hacen el
procesamiento. Al final, no olvidemos colocar al caracter nulo en las
dos cadenas construidas:
void
combina(char m[], char p[], char a[], char o[])
{
int i = 0;
while (m[i]) {
if
(mayus(m[i]) && minus(p[i]))
a[i] = o[i] = m[i];
else if
(minus(m[i]) && mayus(p[i]))
a[i] = o[i] = p[i];
else {
a[i] = m[i];
o[i] = p[i];
}
i++;
}
a[i] = o[i] = '\0';
}
Finalmente, el programa principal lee las cadenas, las procesa e
imprime los resultados:
int
main(void)
{
char madre[1001],
padre[1001];
char hija[1001],
hijo[1001];
gets(madre);
gets(padre);
combina(madre, padre,
hija, hijo);
puts(hija);
puts(hijo);
return 0;
}
Los valores de entrada y salida (¡cada uno en un renglón!)
empleados para la evaluación
fueron los siguientes:
Entrada (madre)
Entrada (padre)
Salida
(hija)
Salida (hijo)
JosEFIna
fiLOMeNo
JoLEFINa
JiLOMINo
TEre
JuAn
TEAe
JEAn
abcDEF
ABCdef
ABCDEF
ABCDEF
abcDEF
defABC
abcDEF
defABC
qwertyuio
asdfghjkl
qwertyuio
asdfghjkl
ZXCVBNM
QWERTYU
ZXCVBNM
QWERTYU
asdfghj
ZXCVBNM
ZXCVBNM
ZXCVBNM
QWERTYUIO
asdfghjkl
QWERTYUIO
QWERTYUIO
qazWSXedcRFVtgbYHNujmIKolP qwertyuiopASDFGHJKLzxcvbnm
qazWSXedcRFVDFGYHNLjmIKolP qweWSXuioRASDFGHJKLzxIKbnP
qWeRtYuIoPaSdFgHjKlZxCvBnM qweRTYuioPASdfgHJKlzxCVBnm
qWeRTYuIoPASdFgHJKlZxCVBnM qWeRTYuIoPASdFgHJKlZxCVBnM
Para probar su tarea en UNIX, escriban la instrucción gcc genesNN.c -o genes para
compilar su programa, y la instrucción ./genes para correrlo.
En este caso, cada prueba vale dos puntos: uno para cada cadena.
Algunos
errores comúnes fueron: (a) No colocar el caracter nulo al final
de las dos cadenas construidas, lo que produce un poco de "basura" al
final de ellas, y (b) No leer o imprimir correctamente las cadenas.