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