Ver Mensaje Individual
  #12 (permalink)  
Antiguo 26/07/2016, 02:28
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Necesito orientacion con planteamiento de codigo en C

Código C:
Ver original
  1. long factorial(int n)
  2. {
  3.     int c;
  4.     long result = 1;
  5.    
  6.     for (c = 1; c <= n; c++){
  7.         result *= c;
  8.     }
  9.     return result;
  10. }

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 original
  1. long factorial(int n)
  2. {
  3.     long result = 1;
  4.    
  5.     for (int c = 1; c <= n; c++){
  6.         result *= c;
  7.     }
  8.     return result;
  9. }

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 original
  1. int i,j;
  2. for( i=0; i<10; i++)
  3.   printf("%d",i);
  4. for( i=0; j<10;j++)
  5.   printf("%d",j);

Un ejemplo que directamente no compila:
Código C:
Ver original
  1. for(int  i=0; i<10; i++)
  2.   printf("%d",i);
  3. for(int i=0; j<10;j++)
  4.   printf("%d",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 original
  1. long factorial(int n)
  2. {
  3.     long result = 1;
  4.    
  5.     for( ; n>1; n--){
  6.         result *= n;
  7.     }
  8.     return result;
  9. }

Por otro lado, yo este bucle:

Código C:
Ver original
  1. for (i=0;i<nCables-1;i++)
  2. {
  3.     for (j=i+1;j <nCables;j++)
  4.     {
  5.         strcpy (combinaciones[n].cable[0],cable [i]);
  6.         strcpy (combinaciones[n].cable[1],cable [j]);
  7.         printf ("Introduce la resistencia entre el %s y el %s: ",combinaciones [n].cable[0],combinaciones [n].cable[1]);
  8.         scanf ("%f",&combinaciones[n].resistencia);
  9.         n++;
  10.     }
  11. }

lo dejaría tal que (con cambios adicionales):

Código C:
Ver original
  1. typedef struct {
  2.             char* cable[2];
  3.             float resistencia;
  4. }Combinacion;
  5.  
  6. typedef struct
  7. {
  8.   Combinacion* lista;
  9.   int nCombinaciones;
  10. } Combinaciones;
  11.  
  12. Combinaciones GenerarCombinaciones(char** cables, int nCables)
  13. {
  14.   Combinaciones combinaciones;
  15.   combinaciones.nCombinaciones = factorial(nCables)/(2*factorial(nCables-2));
  16.   combinaciones.lista = (Combinacion*)malloc(combinaciones.nCombinaciones*sizeof(Combinacion));
  17.  
  18.   Combinacion* ptr = combinaciones.lista;
  19.   for (int i=0;i<nCables-1;i++)
  20.   {
  21.     for (int j=i+1;j<nCables;j++,ptr++)
  22.     {
  23.       ptr->cable[0] = cables[i];
  24.       ptr->cable[1] = cables[j];
  25.     }
  26.   }
  27.  
  28.   return combinaciones;  
  29. }
  30.  
  31. // ...
  32.  
  33. Combinaciones combinaciones = GenerarCombinaciones(cable,nCables);
  34. for(int n=0;n<combinaciones.nCombinaciones;n++)
  35. {
  36.     printf ("Introduce la resistencia entre el %s y el %s: ",combinaciones.lista [n].cable[0],combinaciones[n].cable[1]);
  37.     scanf ("%f",&combinaciones.lista[n].resistencia);
  38. }

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.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.