Solución a la Tarea 4: Hidrocarburos Lineales


A continuación muestro un programa que resuelve el problema propuesto. Observe que el trabajo fue dividido en cinco funciones: La primera que lee los datos de entrada y además coloca dos valores comodínes en las posiciones inicial y final del arreglo. La segunda verifica que los datos de entrada no contengan errores. La tercera ordena los enlaces, si es que resulta necesario. La cuarta imprime la fórmula semidesarrolada. Finalmente, la quinta imprime los carbonos con errores.

#include <stdio.h>

void lee(int *n, int h[])
{
  int i;

  scanf("%d", n);
  h[0] = h[*n+1] = 0;
  for (i = 1; i <= *n; i++)
    scanf("%d", &h[i]);
}

int verifica(int n, int h[])
{
  int i;

  for (i = 0; i <= n; i++)
    if (h[i] + h[i+1] > 4)
      return 0;
  return 1;
}

void ordena(int n, int h[])
{
  int t, i = 0;
 
  while ((2*i <= n) && (h[i] == h[n+1-i]))
    i++;
  if ((2*i <= n) && (h[i] < h[n+1-i]))
    for (; 2*i <= n; i++) {
      t = h[i];
      h[i] = h[n+1-i];
      h[n+1-i] = t;
    }
}

void imprime(int n, int h[])
{
  int i;
  char enlace[5] = " -=#";

  for (i = 0; i <= n; i++) {
    printf("C");
    switch (h[i] + h[i+1]) {
      case 1: printf("H3"); break;
      case 2: printf("H2"); break;
      case 3: printf("H");
    }
    printf("%c", enlace[h[i+1]]);
  }
  printf("\n");
}

void errores(int n, int h[])
{
  int i;

  printf("ERROR EN");
  for (i = 0; i <= n; i++)
    if (h[i] + h[i+1] > 4)
      printf(" %d", i+1);
  printf("\n");
}

int main(void)
{
  int n;
  int h[1002];

  lee(&n, h);
  if (verifica(n, h)) {
    ordena(n, h);
    imprime(n, h);
  } else errores(n, h);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada             Salida
2 2 3               ERROR EN 2
2 3 3               ERROR EN 2
3 1 2 3             ERROR EN 3
3 3 2 1             ERROR EN 2
6 1 2 3 1 2 3       ERROR EN 3 6
4 3 1 1 1           CH#C-CH2-CH2-CH3
4 1 3 1 1          
CH3-C#C-CH2-CH3
5 1 1 1 1 1         CH3-CH2-CH2-CH2-CH2-CH3
5 1 2 1 1 1         CH3-CH=CH-CH2-CH2-CH3
5 1 1 2 1 1         CH3-CH2-CH=CH-CH2-CH3
4 1 1 1 3           CH#C-CH2-CH2-CH3
4 1 1 3 1           CH3-C#C-CH2-CH3
5 1 1 1 2 1         CH3-CH=CH-CH2-CH2-CH3
5 1 1 1 1 2         CH2=CH-CH2-CH2-CH2-CH3
7 1 1 2 1 3 1 2     CH2=CH-C#C-CH=CH-CH2-CH3