Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Necesito orientacion con planteamiento de codigo en C

Estas en el tema de Necesito orientacion con planteamiento de codigo en C en el foro de C/C++ en Foros del Web. Hola amigos, he estado viendo como se comprueban los motores de ventiladores de aires acondicionado y se me ocurrió crearme un código para hacerlo más ...
  #1 (permalink)  
Antiguo 21/07/2016, 13:15
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Necesito orientacion con planteamiento de codigo en C

Hola amigos, he estado viendo como se comprueban los motores de ventiladores de aires acondicionado y se me ocurrió crearme un código para hacerlo más rápido. El caso es que llevo parias horas y no doy con la tecla.
En un ventilador con 3 cables uno es el común al que van conectadas las dos bobinas, los otros dos son las otras puntas de las bobinas.
Si se mide la resistencia, entre los dos cables que de la mayor resistencia va un condensador.
Los dos que dan menor resistencia son los que están conectados a la bobina de arranque.
Los que quedan por probar son los que van conectados a la bobina de funcionamiento.
Por ejemplo, si tenemos un cable rojo, uno negro y uno blanco y:
-Entre rojo y negro hay 200.
-Entre rojo y blanco hay 450.
-Entre negro y blanco hay 250.
Por lo tanto el condensador va entre rojo y blanco porque es la mayor medida.
Las dos bobinas suman lo mismo que la medida mayor así que el común es el negro ya que para que me entiendan ahí va el signo de sumar jijiji.
El cable N va al común y el L va al cable que sea el de la bobina mayor que en este caso es el blanco.
La idea es que primero me pida los colores de los cables, luego me pida los valores entre los cables y me muestre entre cuales va el condensador, en cual va el N y en cual el L.
Tengo este código pero no soy capaz de que funcione correctamente:
Código C:
Ver original
  1. #include <stdio.h>
  2. #define NCABLES 3
  3. int main ()
  4. {
  5.     char cable [NCABLES][25];
  6.     int i,j,n=0,mayor=0,menor;
  7.     float valor [NCABLES];
  8.    
  9.     for (i=0;i <NCABLES;i++)
  10.     {
  11.         printf ("Introduce el color %d: ",i+1);
  12.         scanf ("%s",cable [i]);
  13.     }
  14.     for (i=0;i<NCABLES-1;i++){
  15.         for (j=i+1;j<NCABLES;j++){
  16.             printf ("Introduce la resistencia entre el %s y el %s: ",cable[i], cable[j]);
  17.             scanf ("%f",valor [n]);
  18.         }
  19.     }
  20.     menor=valor[0];
  21.  
  22.     for (i=0;i<NCABLES;i++){
  23.         if (valor [mayor]>valor [i]){
  24.             mayor=i;
  25.         }
  26.         if (valor [menor]<valor [i]){
  27.             menor=i;
  28.         }
  29.     }
  30.     if (mayor ==0){
  31.         printf ("El condensador va entre el %s y el %s",cable [mayor],cable [NCABLES-1]);
  32.     }else {
  33.         printf ("El condensador va entre el %s y el %s",cable [mayor],cable [mayor-1]);
  34.     }
  35. }
De aquí saque la idea: https://m.youtube.com/watch?v=RiBraC2-e9I
¿Podéis Ayudarme?

Última edición por aguml; 21/07/2016 a las 13:40
  #2 (permalink)  
Antiguo 21/07/2016, 14:56
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Necesito orientacion con planteamiento de codigo en C

Para empezar, en la línea 17, al leer valor[n], debes pasar su dirección:

scanf ("%f", &valor[n]);

Saludos,
  #3 (permalink)  
Antiguo 22/07/2016, 08:45
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Necesito orientacion con planteamiento de codigo en C

Bueno, hice la corrección que me indicaba pero no consigo que me funcione como quiero.
Lo tengo así y aun me falta por indicar en cual iría el L o fase pero no se como hacerlo y además lo que tengo a veces falla y no se que hacer ya .
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define NCABLES 3
  4.  
  5. int main ()
  6. {
  7.     char cable [NCABLES][25];
  8.     char combinacion [NCABLES][50];
  9.     int i,j,n=0,mayor=0,menor,trabajo,comun;
  10.     float valor [NCABLES];
  11.    
  12.     for (i=0;i <NCABLES;i++)
  13.     {
  14.         printf ("Introduce el color %d: ",i+1);
  15.         scanf ("%s",cable [i]);
  16.     }
  17.     for (i=0;i<NCABLES-1;i++){
  18.         for (j=i+1;j<NCABLES;j++){
  19.             sprintf (combinacion [n],"el %s y el %s",cable[i], cable[j]);
  20.             printf ("Introduce la resistencia entre %s: ",combinacion [n]);
  21.             scanf ("%f",&valor[n]);
  22.             n++;
  23.         }
  24.     }
  25.     menor=valor[0];
  26.  
  27.     for (i=0;i<NCABLES;i++){
  28.         if (valor [mayor]<valor [i]){
  29.             mayor=i;
  30.         }
  31.         if (valor [menor]>valor [i]){
  32.             menor=i;
  33.         }
  34.         if (valor [i] < valor[mayor] && valor [i] > valor[menor]){
  35.             trabajo=i;
  36.         }
  37.     }
  38.     printf ("El condensador va entre %s\n",combinacion [mayor]);
  39.     printf ("La bobina de arranque esta entre %s\n",combinacion [menor]);
  40.     printf ("La bobina de trabajo esta entre %s\n",combinacion [trabajo ]);
  41.     for (i=0;i <NCABLES;i++){
  42.         if (strstr (combinacion[mayor],cable [i])==NULL){
  43.             comun=i;
  44.             break;
  45.         }
  46.     }
  47.     printf ("El comun es el %s. Conecta el neutro en el\n",cable [comun]);
  48. }
  #4 (permalink)  
Antiguo 22/07/2016, 13:45
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 7 meses
Puntos: 5
Respuesta: Necesito orientacion con planteamiento de codigo en C

Hola; espero que mi comentario no te resulte molesto, pero yo no consigo entender la "especificación funcional" del programa que estás intentando. El tema de la conexión de estos ventiladores puede ser que sea familiar para algunos, pero no para todo el mundo. En esos casos, creo que conviene tratar de ser lo más explícito posible, y que en "las especificaciones" no queden muchas cosas libradas a la interpretación.

A modo de ejemplo, voy a tomar una de tus primeras oraciones:
Cita:
En un ventilador con 3 cables uno es el común al que van conectadas las dos bobinas, los otros dos son las otras puntas de las bobinas.
Yo me pregunto:
- De esos 3 cables que tiene el ventilador, dices que uno "es el común". ¿A qué te refieres? Uno de ellos es un cable común, como cualquier otro cable, mientras que los otros dos no? O aquí la palabra "común" tiene otro significado?

- "... al que van conectadas las dos bobinas..." ¿Cómo? ¿Qué dos bobinas? No has mencionado antes la existencia de bobinas.

- "... los otros dos son las otras puntas de las bobinas..." A ver si entiendo, ¿hay dos de esos cables que forman parte (son sus puntas) de las dos bobinas?

Yo creo que me llevo medianamente bien con la solución de problemas lógicos, y tengo algunos años de experiencia codificando en C, y me da la impresión de que el problema que planteas no es demasiado complejo, peor no consigo pasar de las primeras dos líneas de ese planteo.

Última edición por enrieto; 22/07/2016 a las 13:48 Razón: hilación
  #5 (permalink)  
Antiguo 22/07/2016, 16:44
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Necesito orientacion con planteamiento de codigo en C

En el enlace del video se explica mejor pero intentare explicarlo yo.
Un motor de ventilador de una sola velocidad y con condensador de arranque tiene dos bobinas. La bobina con menor resistencia es la que ayuda para el arranque del motor y la otra bobina es la de trabajo, o sea, lo que mantiene el motor girando.
Ambas bobinas están unidas por una punta y de esa unión sale un cable que se le dice el común porque esta conectado a ambas.
De la otra punta de cada bobina sale otro cable y con eso ya tenemos tres cables.
Si mides la resistencia entre las dos puntas de las bobinas, o sea entre los dos cables que no son el común, te dará como resistencia la suma de las dos resistencias ya que están en serie.
Bien, ente esos dos cables se coloca un condensador.
A la punta de la bobina con mayor resistencia se conecta la fase y al común se conecta el neutro.
Esperó que lo entiendas mejor.
  #6 (permalink)  
Antiguo 23/07/2016, 09:54
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 7 meses
Puntos: 5
Respuesta: Necesito orientacion con planteamiento de codigo en C

Tengo algo en C++ que para mí es más fácil, pero no calcula todo lo posible, sólo a) dónde va el condensador, b) cuál es el común y c) dónde conectar la línea.

Te quedaría completar lo que necesites y pasarlo a C, y yo controlaría la entrada de datos. Sobre todo porque vi en el video que parece fácil equivocarse en las mediciones, esos números no se quedan quietos y los cables se agarran con los deditos.

La criatura:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <map>
  5. #include <vector>
  6. #include <utility>
  7.  
  8. using pair_string = std::pair<std::string, std::string>;
  9.  
  10. pair_string calculaCapacitor(const std::map<pair_string, double>& medida)
  11. {
  12.     // determina el valor mayor de las tres mediciones y
  13.     // devuelve el par de cables donde se obtuvo
  14.     using mpartype = std::pair<pair_string, double>;
  15.     auto maximo = std::max_element(medida.begin(), medida.end(),
  16.     [](mpartype a, mpartype b) {
  17.         return a.second < b.second;
  18.     });
  19.     return pair_string(maximo->first.first, maximo->first.second);
  20. }
  21.  
  22. std::string calculaComun(const std::vector<std::string>& c, const pair_string& parCapacitor)
  23. {
  24.     // el cable común es donde no va conectado el capacitor
  25.     for(size_t i = 0; i < 3; ++i) {
  26.         if(parCapacitor.first != c[i] && parCapacitor.second != c[i]) {
  27.             return c[i];
  28.         }
  29.     }
  30.     return "";
  31. }
  32.  
  33. std::string calculaLinea(const std::map<pair_string, double>& medidas,
  34.                          const pair_string& parCapacitor,
  35.                          const std::string& comun)
  36. {
  37.     // determina la medida intermedia (inmediata menor a la del capacitor)
  38.     // y devuelve el cable que no es el común
  39.     // -- el mayor, siempre que no sea ni esto ni aquello --
  40.     double max = -1;
  41.     std::string linea;
  42.     for(const auto& par : medidas) {
  43.         if(par.first == parCapacitor)
  44.             continue;
  45.         if(par.second > max) {
  46.             max = par.second;
  47.             if(par.first.first != comun)
  48.                 linea = par.first.first;
  49.             else
  50.                 linea = par.first.second;
  51.         }
  52.     }
  53.     return linea;
  54. }
  55.  
  56. int main()
  57. {
  58.     std::map<pair_string, double> medidas;
  59.     std::vector<std::string> c;
  60.     c.resize(3);
  61.     std::cout << "ingrese los tres colores: ";
  62.     std::cin >> c[0] >> c[1] >> c[2];
  63.  
  64.     double m;
  65.     auto parcolores = std::pair<std::string, std::string>(c[0], c[1]);
  66.     std::cout << "ingrese la resistencia medida entre el " << c[0] << " y el " << c[1] << ": ";
  67.     std::cin >> m;
  68.     medidas[parcolores] = m;
  69.  
  70.     parcolores = std::pair<std::string, std::string>(c[0], c[2]);
  71.     std::cout << "ingrese la resistencia medida entre " << c[0] << " y " << c[2] << ": ";
  72.     std::cin >> m;
  73.     medidas[parcolores] = m;
  74.  
  75.     parcolores = std::pair<std::string, std::string>(c[1], c[2]);
  76.     std::cout << "ingrese la resistencia medida entre " << c[1] << " y " << c[2] << ": ";
  77.     std::cin >> m;
  78.     medidas[parcolores] = m;
  79.  
  80.     // faltaría controlar la forma y los valores.
  81.  
  82.     std::cout << '\n';
  83.  
  84.     // Capacitor
  85.     pair_string parCapacitor = calculaCapacitor(medidas);
  86.     std::cout << "el capacitor va entre el " << parCapacitor.first << " y el " << parCapacitor.second << '\n';
  87.  
  88.  
  89.     // común
  90.     std::string comun = calculaComun(c, parCapacitor);
  91.     std::cout << "el comun es el " << comun << '\n';
  92.  
  93.  
  94.     // linea
  95.     std::cout << "la linea se conecta al " << calculaLinea(medidas, parCapacitor, comun) << '\n';
  96.  
  97. }
  #7 (permalink)  
Antiguo 23/07/2016, 13:56
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Necesito orientacion con planteamiento de codigo en C

Aquí va mi solución (si no he entendido mal):
Código C++:
Ver original
  1. #include <stdio.h>
  2.     #include <string.h>
  3.     #define NCABLES 3
  4.  
  5.     int main ()
  6.     {
  7.         char cable[NCABLES][25];
  8.         char combinacion [NCABLES][50];
  9.         int i=0,indice_mayor=0,indice_trabajo,indice_menor=0,comun;
  10.         int mayor=0;
  11.         int menor=0;
  12.         float valor [NCABLES];
  13.  
  14.  
  15.         for (i=0;i <NCABLES;i++)
  16.         {
  17.             printf ("Introduce el color %d: ",i+1);
  18.             scanf ("%s",cable[i]);
  19.         }
  20.         for (i=0;i<NCABLES;i++)
  21.         {
  22.             sprintf (combinacion[i],"el %s y el %s",cable[i], i<2?cable[i+1]:cable[0]);
  23.             printf ("Introduce la resistencia entre %s: ",combinacion [i]);
  24.             scanf ("%f",&valor[i]);
  25.             if (i==0)
  26.             {
  27.                 mayor=valor[i];
  28.                 menor=valor[i];
  29.             }
  30.             if (i>0)
  31.             {
  32.                 if (valor[i]>mayor)
  33.                 {
  34.                     indice_mayor=i;
  35.                     mayor=valor[i];
  36.                 }
  37.                 if (valor[i]<menor)
  38.                 {
  39.                     indice_menor=i;
  40.                     menor=valor[i];
  41.                 }
  42.             }
  43.         }
  44.         indice_trabajo=0;
  45.         for (i=0;i<NCABLES;i++)
  46.         {
  47.             if (indice_trabajo==indice_menor || indice_trabajo==indice_mayor)
  48.             {
  49.                 indice_trabajo++;
  50.             }
  51.         }
  52.         printf ("El condensador va entre %s\n", combinacion[indice_mayor]);
  53.         printf ("La bobina de arranque esta entre %s\n",combinacion[indice_menor]);
  54.         printf ("La bobina de trabajo esta entre %s\n",combinacion[indice_trabajo]);
  55.  
  56.         for (i=0;i <NCABLES;i++){
  57.             if (strstr (combinacion[mayor],cable [i])==NULL){
  58.                 comun=i;
  59.                 break;
  60.             }
  61.         }
  62.         printf ("El comun es el %s. Conecta el neutro en el\n",cable[comun]);
  63.     }

Como dice enrieto, una posible mejora sería verificar que la suma los dos valores menores sea igual al mayor (con alguna tolerancia) para evitar datos erróneos.
Un saludo...ya me dirás si era eso o no me he enterado de la idea
__________________
Mi calculadora en Qt
  #8 (permalink)  
Antiguo 24/07/2016, 00:28
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Necesito orientacion con planteamiento de codigo en C

Cita:
Iniciado por dehm Ver Mensaje
Aquí va mi solución (si no he entendido mal):
Código C++:
Ver original
  1. #include <stdio.h>
  2.     #include <string.h>
  3.     #define NCABLES 3
  4.  
  5.     int main ()
  6.     {
  7.         char cable[NCABLES][25];
  8.         char combinacion [NCABLES][50];
  9.         int i=0,indice_mayor=0,indice_trabajo,indice_menor=0,comun;
  10.         int mayor=0;
  11.         int menor=0;
  12.         float valor [NCABLES];
  13.  
  14.  
  15.         for (i=0;i <NCABLES;i++)
  16.         {
  17.             printf ("Introduce el color %d: ",i+1);
  18.             scanf ("%s",cable[i]);
  19.         }
  20.         for (i=0;i<NCABLES;i++)
  21.         {
  22.             sprintf (combinacion[i],"el %s y el %s",cable[i], i<2?cable[i+1]:cable[0]);
  23.             printf ("Introduce la resistencia entre %s: ",combinacion [i]);
  24.             scanf ("%f",&valor[i]);
  25.             if (i==0)
  26.             {
  27.                 mayor=valor[i];
  28.                 menor=valor[i];
  29.             }
  30.             if (i>0)
  31.             {
  32.                 if (valor[i]>mayor)
  33.                 {
  34.                     indice_mayor=i;
  35.                     mayor=valor[i];
  36.                 }
  37.                 if (valor[i]<menor)
  38.                 {
  39.                     indice_menor=i;
  40.                     menor=valor[i];
  41.                 }
  42.             }
  43.         }
  44.         indice_trabajo=0;
  45.         for (i=0;i<NCABLES;i++)
  46.         {
  47.             if (indice_trabajo==indice_menor || indice_trabajo==indice_mayor)
  48.             {
  49.                 indice_trabajo++;
  50.             }
  51.         }
  52.         printf ("El condensador va entre %s\n", combinacion[indice_mayor]);
  53.         printf ("La bobina de arranque esta entre %s\n",combinacion[indice_menor]);
  54.         printf ("La bobina de trabajo esta entre %s\n",combinacion[indice_trabajo]);
  55.  
  56.         for (i=0;i <NCABLES;i++){
  57.             if (strstr (combinacion[mayor],cable [i])==NULL){
  58.                 comun=i;
  59.                 break;
  60.             }
  61.         }
  62.         printf ("El comun es el %s. Conecta el neutro en el\n",cable[comun]);
  63.     }

Como dice enrieto, una posible mejora sería verificar que la suma los dos valores menores sea igual al mayor (con alguna tolerancia) para evitar datos erróneos.
Un saludo...ya me dirás si era eso o no me he enterado de la idea
El código me da fallo de segmentación y creo que es por algún error al trabajar con los índices mayor y menor.
El código de en rito aun no lo pude probar porque estoy desde el movil usando c4ndroid y el móvil no me deja instalar gcc. En cuanto tenga un pc a mano lo probaré.
Ya digo que esta aplicación era por simple curiosidad y parece que era más complejo de lo que yo esperaba.
  #9 (permalink)  
Antiguo 24/07/2016, 09:11
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Necesito orientacion con planteamiento de codigo en C

Cita:
Iniciado por aguml Ver Mensaje
El código me da fallo de segmentación y creo que es por algún error al trabajar con los índices mayor y menor.
El código de en rito aun no lo pude probar porque estoy desde el movil usando c4ndroid y el móvil no me deja instalar gcc. En cuanto tenga un pc a mano lo probaré.
Ya digo que esta aplicación era por simple curiosidad y parece que era más complejo de lo que yo esperaba.
Qué raro. He probado todas las combinaciones y siempre me muevo entre 0 y 2.
El código es bastante malo, pero creo que funciona....sí me he dado cuenta de que las variables mayor y menor deben ser float, pero no creo que eso cause un error de segmentación. En fin, dejo aquí la corrección con una impresión de los valores de los indices. Espero que alguien te dé una mejor respuesta...además de la de enrieto (pero él se mueve en otra liga )
Código C++:
Ver original
  1. #include <stdio.h>
  2.     #include <string.h>
  3.     #define NCABLES 3
  4.  
  5.     int main ()
  6.     {
  7.         char cable[NCABLES][25];
  8.         char combinacion [NCABLES][50];
  9.         int i=0,indice_mayor=0,indice_trabajo=0,indice_menor=0,comun;
  10.         float valor[NCABLES];
  11.         float mayor;
  12.         float menor;
  13.  
  14.         for (i=0;i <NCABLES;i++)
  15.         {
  16.             printf ("Introduce el color %d: ",i+1);
  17.             scanf ("%s",cable[i]);
  18.         }
  19.         for (i=0;i<NCABLES;i++)
  20.         {
  21.             sprintf (combinacion[i],"el %s y el %s",cable[i], i<2?cable[i+1]:cable[0]);
  22.             printf ("Introduce la resistencia entre %s: ",combinacion [i]);
  23.             scanf ("%f",&valor[i]);
  24.             if (i==0)
  25.             {
  26.                 mayor=valor[i];
  27.                 menor=valor[i];
  28.             }
  29.             if (i>0)
  30.             {
  31.                 if (valor[i]>mayor)
  32.                 {
  33.                     indice_mayor=i;
  34.                     mayor=valor[i];
  35.                 }
  36.                 if (valor[i]<menor)
  37.                 {
  38.                     indice_menor=i;
  39.                     menor=valor[i];
  40.                 }
  41.             }
  42.         }
  43.         indice_trabajo=0;
  44.         for (i=0;i<NCABLES;i++)
  45.         {
  46.             if (indice_trabajo==indice_menor || indice_trabajo==indice_mayor)
  47.             {
  48.                 indice_trabajo++;
  49.             }
  50.         }
  51.         printf ("Mayor: %d\n",indice_mayor);
  52.         printf ("Menor: %d\n",indice_menor);
  53.         printf ("Trabajo: %d\n",indice_trabajo);
  54.         printf ("El condensador va entre %s\n", combinacion[indice_mayor]);
  55.         printf ("La bobina de arranque esta entre %s\n",combinacion[indice_menor]);
  56.         printf ("La bobina de trabajo esta entre %s\n",combinacion[indice_trabajo]);
  57.  
  58.         for (i=0;i <NCABLES;i++){
  59.             if (strstr (combinacion[indice_mayor],cable [i])==NULL){
  60.                 comun=i;
  61.                 break;
  62.             }
  63.         }
  64.         printf ("El comun es el %s. Conecta el neutro en el\n",cable[comun]);
  65.     }
__________________
Mi calculadora en Qt
  #10 (permalink)  
Antiguo 24/07/2016, 10:02
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Necesito orientacion con planteamiento de codigo en C

Ahora parece que si funciona. Sólo falta por mostrar un dato y no se como plantearlo. Ya muestras donde va el neutro y el fase va en el otro extremo de la bobina de trabajo.
Por ejemplo, imaginemos estos datos:
Cables: rojo, blanco y negro
-Entre blanco y negro hay 250
-Entre rojo y negro hay 200
-Entre rojo y blanco hay 450
Con esos datos sabemos que:
-El condensador va entre el rojo y el blanco porque es la mayor medición y es la suma de ambas.
-El comun es el negro.
-El fase es el blanco porque es el otro extremo de la bobina de trabajo. O sea, la bobina de trabajo lleva el neutro en un extremo y el fase en el otro.
No se si lo explico bien.
No tiene que ser el código como yo lo estaba haciendo, simplemente es lo que se me ocurrió. Si hay un modo más limpio y correcto soy todo oidos jejeje.
Lo digo más que nada porque la idea es poder indicar el número de velocidades que tiene el motor ya que por ejemplo el motor del split de un aire acondicionado tiene tres bobinas de trabajo con diferentes resistencias y cada una para una velocidad del motor. Si de entrada este código empieza siendo un churro, lo que puede terminar saliendo puede ser una bomba. Jajaja.

Última edición por aguml; 24/07/2016 a las 10:13
  #11 (permalink)  
Antiguo 24/07/2016, 14:09
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Necesito orientacion con planteamiento de codigo en C

Bueno pues al final me puse a repensar el código que tenia y después de mucho me ha quedado asi:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  typedef struct {
  6.             char cable[2] [25];
  7.             float resistencia;
  8. }Combi;
  9.  
  10. long factorial(int n)
  11. {
  12.     int c;
  13.     long result = 1;
  14.    
  15.     for (c = 1; c <= n; c++){
  16.         result *= c;
  17.     }
  18.     return result;
  19. }
  20.  
  21. int main ()
  22. {
  23.     int nCombinaciones,nCables;
  24.     char **cable;
  25.     int n=0, j, i=0, indice_mayor=0, indice_trabajo=0, indice_menor=0, comun,fase;
  26.     Combi *combinaciones;
  27.    
  28.     printf ("Introduce el numero de cables: ");
  29.     scanf ("%d",&nCables);
  30.     cable = malloc(sizeof(char*) * nCables);
  31.  
  32.     for (i=0;i <nCables;i++){
  33.         cable [i]=malloc (sizeof (char)*25);
  34.     }
  35.     nCombinaciones=factorial (nCables)/(2*factorial(nCables-2));
  36.    
  37.     combinaciones=malloc (nCombinaciones*sizeof (Combi));
  38.    
  39.     for (i=0;i <nCables;i++)
  40.     {
  41.         printf ("Introduce el color %d: ",i+1);
  42.         scanf ("%s",cable[i]);
  43.     }
  44.     for (i=0;i<nCables-1;i++)
  45.     {
  46.         for (j=i+1;j <nCables;j++)
  47.         {
  48.             strcpy (combinaciones[n].cable[0],cable [i]);
  49.             strcpy (combinaciones[n].cable[1],cable [j]);
  50.             printf ("Introduce la resistencia entre el %s y el %s: ",combinaciones [n].cable[0],combinaciones [n].cable[1]);
  51.             scanf ("%f",&combinaciones[n].resistencia);
  52.             n++;
  53.         }
  54.     }
  55.     indice_menor=0;
  56.     indice_mayor=0;
  57.     for (i=0;i <nCombinaciones;i++)
  58.     {
  59.         if (combinaciones [indice_menor].resistencia >combinaciones [i].resistencia){
  60.             indice_menor=i;
  61.         }
  62.         if (combinaciones [indice_mayor].resistencia<combinaciones [i].resistencia){
  63.             indice_mayor=i;
  64.         }
  65.     }
  66.     indice_trabajo=0;
  67.    
  68.     for (i=0;i<nCombinaciones;i++)
  69.     {
  70.         if (indice_trabajo==indice_menor || indice_trabajo==indice_mayor)
  71.         {
  72.             indice_trabajo++;
  73.         }
  74.     }
  75.     printf ("El condensador va entre el %s y el %s\n", combinaciones[indice_mayor].cable[0],combinaciones [indice_mayor].cable[1]);
  76.     printf ("La bobina de arranque esta entre el %s y el %s\n",combinaciones[indice_menor].cable[0],combinaciones [indice_menor].cable[1]);
  77.     printf ("La bobina de trabajo esta entre el %s y el %s\n",combinaciones[indice_trabajo].cable[0],combinaciones [indice_trabajo].cable[1]);
  78.  
  79.     for (i=0;i <nCables;i++){
  80.         if ( (strcmp(combinaciones[indice_mayor].cable[0],cable [i])!=0) && (strcmp (combinaciones [indice_mayor].cable[1],cable [i])!=0)){
  81.             comun=i;
  82.             break;
  83.         }
  84.     }
  85.     printf ("El comun es el %s. Conecta el neutro en el\n",cable[comun]);
  86.     if (strcmp(combinaciones[indice_trabajo].cable[0],cable [comun])!=0){
  87.         fase=0;
  88.     }else {
  89.         fase=1;
  90.     }
  91.     printf ("El fase es el %s. Conecta el fase en el\n",combinaciones[indice_trabajo].cable [fase]);
  92.     for (i=0;i <nCables;i++){
  93.         free (cable [i]);
  94.     }
  95.     free (cable);
  96.     free (combinaciones);
  97. }

Funciona aunque aún queda mucho trabajo ya que tengo que controlar que los malloc funcionen correctamente, que el número de cables sea mayor que 2, y además para los motores de más de tres cables tengo que ver bien como va el cálculo para saber cómo programarlo y no se si será mejor crear funciones separadas. Como dije, aun queda curro.
  #12 (permalink)  
Antiguo 26/07/2016, 02:28
 
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.
  #13 (permalink)  
Antiguo 26/07/2016, 16:51
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Necesito orientacion con planteamiento de codigo en C

Muy interesante los cambios. Tengo que verlo más tranquilo en el pc.
Ahora estaba liado con el tema de poder hacerlo con más cables pero no se porque con 3 cables va correcto pero si le pongo por ejemplo 5 da resultados erróneos. No termino de dar con el modo. Actualmente lo tenia asi: (queda pendiente los cambios sugeridos):
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  typedef struct {
  6.             char cable[2] [25];
  7.             float resistencia;
  8. }Combi;
  9.  
  10. long factorial(int n)
  11. {
  12.     int c;
  13.     long result = 1;
  14.    
  15.     for (c = 1; c <= n; c++){
  16.         result *= c;
  17.     }
  18.     return result;
  19. }
  20.  
  21. int main ()
  22. {
  23.     int nCombinaciones,nCables;
  24.     char **cable;
  25.     int n=0, j, i=0, comun,fase;
  26.     Combi *combinaciones,combinacion_aux;
  27.     do {
  28.         printf ("Introduce el numero de cables: ");
  29.         scanf ("%d",&nCables);
  30.         if (nCables <3){
  31.             printf ("Tiene que tener al menos 3 cables\n");
  32.         }
  33.     }while (nCables  <3);
  34.    
  35.     cable = malloc(sizeof(char*) * nCables);
  36.  
  37.     for (i=0;i <nCables;i++){
  38.         cable [i]=malloc (sizeof (char)*25);
  39.     }
  40.     nCombinaciones=factorial (nCables)/(2*factorial(nCables-2));
  41.    
  42.     combinaciones=malloc (nCombinaciones*sizeof (Combi));
  43.    
  44.     for (i=0;i <nCables;i++)
  45.     {
  46.         printf ("Introduce el color %d: ",i+1);
  47.         scanf ("%s",cable[i]);
  48.     }
  49.     for (i=0;i<nCables-1;i++)
  50.     {
  51.         for (j=i+1;j <nCables;j++)
  52.         {
  53.             strcpy (combinaciones[n].cable[0],cable [i]);
  54.             strcpy (combinaciones[n].cable[1],cable [j]);
  55.             printf ("Introduce la resistencia entre el %s y el %s: ",combinaciones [n].cable[0],combinaciones [n].cable[1]);
  56.             scanf ("%f",&combinaciones[n].resistencia);
  57.             n++;
  58.         }
  59.     }
  60.     for (i=0;i<nCombinaciones-1;i++)
  61.     {
  62.         for (j=i+1;j <nCombinaciones;j++)
  63.         {
  64.             if (combinaciones [i].resistencia > combinaciones [j].resistencia)
  65.             {
  66.                 combinacion_aux = combinaciones [i];
  67.                 combinaciones [i] = combinaciones [j];
  68.                 combinaciones [j] = combinacion_aux;
  69.             }
  70.         }
  71.     }
  72.  
  73.     printf ("El condensador va entre el %s y el %s\n", combinaciones[nCombinaciones-1].cable[0],combinaciones [nCombinaciones-1].cable[1]);
  74.     printf ("La bobina de arranque esta entre el %s y el %s\n",combinaciones[0].cable[0],combinaciones [0].cable[1]);
  75.    
  76.     for (i=0;i <nCables;i++){
  77.         if ( (strcmp(combinaciones[nCombinaciones-1].cable[0],cable [i])!=0) && (strcmp (combinaciones [nCombinaciones-1].cable[1],cable [i])!=0)){
  78.             comun=i;
  79.             break;
  80.         }
  81.     }
  82.     printf ("El comun es el %s. Conecta el neutro en el\n",cable[comun]);
  83.    
  84.     for (i=1,j=0;i<nCombinaciones-1;i++)
  85.     {
  86.         if (strcmp (cable [comun],combinaciones [i].cable [0])==0){
  87.             j++;
  88.             printf ("La bobina de trabajo %d esta entre el %s y el %s\n",j, combinaciones[i].cable[0],combinaciones [i].cable[1]);
  89.             printf ("El fase es el %s. Conecta el fase en el\n",combinaciones[i].cable [1]);
  90.         }else if (strcmp (cable [comun],combinaciones [i].cable [1])==0){
  91.             j++;
  92.             printf ("La bobina de trabajo %d esta entre el %s y el %s\n",j, combinaciones[i].cable[0],combinaciones [i].cable[1]);
  93.             printf ("El fase es el %s. Conecta el fase en el\n",combinaciones[i].cable [0]);
  94.         }
  95.     }
  96.    
  97.     for (i=0;i <nCables;i++){
  98.         free (cable [i]);
  99.     }
  100.     free (cable);
  101.     free (combinaciones);
  102. }
Os pongo un enlace a un video donde lo hace a mano para un motor de 5 cables con 3 velocidades: https://youtu.be/8g0vUVi3uvU
A ver si podéis echarme otro cable para saber como hacerlo.

Etiquetas: char, int, orientacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:34.