Código C:
Ver originallong factorial(int n)
{
int c;
long result = 1;
for (c = 1; c <= n; c++){
result *= c;
}
return result;
}
Desde C99 es posible declarar variables dentro de los for. Siempre es bueno acortar la vida de las variables lo máximo posible:
Código C:
Ver originallong factorial(int n)
{
long result = 1;
for (int c = 1; c <= n; c++){
result *= c;
}
return result;
}
Esto lo puedes (y lo deberías) utilizar en todos los bucles siempre que sea posible. ¿Por qué? Básicamente porque así evitas errores tontos. Imagínate que por error se borra una inicialización o se traspapela la variable... como la variable ya estaba declarada el programa compilará perfectamente y te dará errores rarísimos.
Un ejemplo que compila pero tiene errores:
Código C:
Ver originalint i,j;
for( i=0; i<10; i++)
for( i=0; j<10;j++)
Un ejemplo que directamente no compila:
Código C:
Ver originalfor(int i=0; i<10; i++)
for(int i=0; j<10;j++)
Por cierto, como nota adicional respecto a la función anterior, la variable
c se puede eliminar con bastante facilidad:
Código C:
Ver originallong factorial(int n)
{
long result = 1;
for( ; n>1; n--){
result *= n;
}
return result;
}
Por otro lado, yo este bucle:
Código C:
Ver originalfor (i=0;i<nCables-1;i++)
{
for (j=i+1;j <nCables;j++)
{
strcpy (combinaciones
[n
].
cable[0],cable
[i
]); strcpy (combinaciones
[n
].
cable[1],cable
[j
]); printf ("Introduce la resistencia entre el %s y el %s: ",combinaciones
[n
].
cable[0],combinaciones
[n
].
cable[1]); scanf ("%f",&combinaciones
[n
].
resistencia); n++;
}
}
lo dejaría tal que (con cambios adicionales):
Código C:
Ver originaltypedef struct {
char* cable[2];
float resistencia;
}Combinacion;
typedef struct
{
Combinacion* lista;
int nCombinaciones;
} Combinaciones;
Combinaciones GenerarCombinaciones(char** cables, int nCables)
{
Combinaciones combinaciones;
combinaciones.nCombinaciones = factorial(nCables)/(2*factorial(nCables-2));
combinaciones.
lista = (Combinacion
*)malloc(combinaciones.
nCombinaciones*sizeof(Combinacion
));
Combinacion* ptr = combinaciones.lista;
for (int i=0;i<nCables-1;i++)
{
for (int j=i+1;j<nCables;j++,ptr++)
{
ptr->cable[0] = cables[i];
ptr->cable[1] = cables[j];
}
}
return combinaciones;
}
// ...
Combinaciones combinaciones = GenerarCombinaciones(cable,nCables);
for(int n=0;n<combinaciones.nCombinaciones;n++)
{
printf ("Introduce la resistencia entre el %s y el %s: ",combinaciones.
lista [n
].
cable[0],combinaciones
[n
].
cable[1]); scanf ("%f",&combinaciones.
lista[n
].
resistencia); }
No es obligatorio, ni mucho menos, pero creo que el código estaría mejor si estuviese un poco más compartimentado en funciones.
Por cierto, nota que en
Combinaciones hago que los cables apunten al string original en vez de copiar los colores n veces. Dado que no se eliminan los strings originales copiarlos tantas veces es una tarea redundante.
Un saludo.