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.