<div dir="ltr">Hola Guru,<br><div class="gmail_extra"><br><div class="gmail_quote">2015-03-25 1:05 GMT-04:00 Ing CuCei <span dir="ltr"><<a href="mailto:guru_wissens@outlook.com" target="_blank">guru_wissens@outlook.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<div><div dir="ltr">Buenos dias amigos soy nuevo en el grupo y programando fijence que tengo un codigo el cual quieren que le ponga la opcion de buscar que ya la tiene pero al momento de modificar un arreglo en x posicion lo que pasa es que me modifica el primer arreglo en vez que el seleccionado alguien me podria decir el problema Les dejo el codigo Muchas Gracias<div><br></div></div></div></blockquote><div><br></div><div>Bienvenido al grupo y a este mundo de la programación.</div><div><br></div><div>Viendo un poco el código fuente que has escrito, hay varios matices a destacar en cuanto al diseño. Voy a ir comentando el programa a medida que lo vaya viendo.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div></div><div>//Hecho Por Guru_wissens<br><div><br></div><div><div>#include<iostream></div><div>#define MAX 3</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>En C++, no es necesario usar constantes simbólicas. De hecho, se aconseja usar constantes; esto es,</div><div><br></div><div>const int MAX = 3;</div><div><br></div><div>o incluso,</div><div><br></div><div>constexpr int MAX = 3;  // desde C++11</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div>int ban=0;</div><div>int cont_prod=0;</div></div></div></div></div></blockquote><div><br></div><div>No es NADA aconsejable usar variables globales; sobre todo, si las usas en las implementaciones de funciones miembro.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div>using namespace std;</div><div>class Empleados</div><div>{</div><div>  public:</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Los datos miembro no deberían ser públicos, sino privados.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div><span style="white-space:pre-wrap">        </span>int Id,Sal,i,contador;</div><div><span style="white-space:pre-wrap">   </span>char cliente[25],Fec[10],RFC[25],Dir[30],ultc[10],Nss[20];</div><div><span style="white-space:pre-wrap">       </span>long int Tel[3];</div></div></div></div></div></blockquote><div><br></div><div>Aconsejo definir constantes para los tamaños de los arrays; por ejemplo,</div><div><br></div><div>public:<br>  const int CLIENTE_MAX = 25;  // permitido a partir de C++11</div><div><div>  const int FECHA_MAX = 10;  // permitido a partir de C++11</div></div><div>  ...</div><div><br></div><div>private:<br>  int Id, Sal;</div><div>  char cliente[CLIENTE_MAX], Fec[FECHA_MAX];<br></div><div>  ...</div><div><br></div><div>Además, aquí tienes algunas variables que no deberían pertenecer a la representación interna de esta clase, como por ejemplo, 'i', que debería ser local a cada función miembro; y luego tenemos '<span style="font-size:12.8000001907349px">contador' que no usas.</span></div><div><span style="font-size:12.8000001907349px"><br></span></div><div><span style="font-size:12.8000001907349px">Por último, en general, no aconsejo representar un número de teléfono con un tipo numérico. Algunos números requieren más dígitos que la cantidad máxima que un tipo numérico pueda representar. Además, a veces se agregan otros símbolos junto con los dígitos de un número de teléfono. Por estas razones, recomiendo representar un teléfono como una cadena de caracteres.</span></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div>    public:</div><div><br></div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Te falta crear constructores para esta clase. Aconsejo crear al menos el constructor sin parámetros:<br><br>Empleados();<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div>    void capturar();</div><div>    void mostrar();</div><div><span style="white-space:pre-wrap"> </span>void buscar();</div><div><span style="white-space:pre-wrap">   </span>void modificar(int x);</div><div>}e;</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Instancias este objeto globalmente, pero no lo usas; deberías eliminarlo.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div>Empleados em[10];</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Nuevamente, no es nada recomendado crear variables globales. Este array debería existir localmente en 'main()'.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div>void Empleados::capturar()</div><div>{</div><div>  cout<<"\t\nID:" <<endl;</div><div>  cin>>Id;</div></div></div></div></div></blockquote><div><br></div><div>Ten cuidado al leer diferentes tipos de datos, especialmente cadenas de caracteres y números. En este caso, lees un entero al que sigue la lectura de una cadena de caracteres. El problema es que en el canal entrante, 'cin', existe el carácter '\n', por lo que al leer una cadena, no pregunta al usuario porque el canal no está vacía, al leer y extraer el carácter, '\n', de la lectura previa. Esto implica que el programa parece saltarse la lectura de 'Nss'.</div><div><br></div><div>La solución es extraer todos los caracteres posteriores a la lectura anterior del entero. Puedes sacar el carácter, '\n', así,<br></div><div><br></div><div>cin.get();  // para extraer '\n'</div><div><br></div><div>Si crees que pudiere haber más, porque al usuario le importó poco ser "amable" con tu programa, entonces invoca 'ignore()'; por ejemplo,</div><div><br></div><div>cin.ignore();</div><div><br></div><div><br></div><div>[CORTE]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div>void Empleados::buscar()</div><div>{</div><div>    int Clave;</div><div><span style="white-space:pre-wrap">  </span>cout<<"\nID del Cliente:"<<endl;</div><div>    cin>>Clave;</div><div><span style="white-space:pre-wrap">     </span>if(Id==Clave)</div><div><span style="white-space:pre-wrap">    </span>   {</div><div><span style="white-space:pre-wrap">            </span>   cout<<"\nEmpleado:"<<cliente;</div><div><span style="white-space:pre-wrap">          </span>   cout<<"\nID: "<<Id;</div><div><span style="white-space:pre-wrap">            </span>   cout<<"\nNss: "<<Nss;</div><div><span style="white-space:pre-wrap">          </span>   cout<<"\nR.F.C: "<<RFC;</div><div><span style="white-space:pre-wrap">                </span>   cout<<"\nPuesto: "<<ultc;</div><div><span style="white-space:pre-wrap">              </span>   for(i=0;i<3;i++)</div><div>           {</div><div>             cout<<"\t\nTelefono:"<<i+1<<Tel[i] <<endl;</div><div><br></div><div><br></div><div>           }</div><div><span style="white-space:pre-wrap">               </span>   cout<<"\nDireccion: "<<Dir;</div><div><span style="white-space:pre-wrap">            </span>   cout<<"\nFecha: "<<Fec;</div><div><br></div><div><br></div><div>       }</div><div><br></div><div>}</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Esta función solamente muestra los datos guardados si la clave concuerda con la ID de un registro. Sin embargo, esto realmente no es buscar un empleado, porque esta función sólo sirve para un empleado en particular, y no en una lista de empleados. Esto tiene que ver con el diseño que has realizado. Hablo de esto al final del correo-e.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div>void Empleados :: modificar(int x)</div><div>{</div><div>    int opc=0;</div><div><span style="white-space:pre-wrap">     </span>int tam=4;</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>En primer lugar, no necesitas que 'tam' sea una variable, sino una constante. En segundo lugar, 'tam' representa la cantidad de elementos en el array, 'em', que obviamente no es 4, sino 10.</div><div><br></div><div>He aquí la razón de usar constantes en lugar de usar el valor directamente.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div><span style="white-space:pre-wrap">    </span>for(int j=0;j<tam;j++)</div><div><span style="white-space:pre-wrap">        </span>{</div><div><br></div><div><span style="white-space:pre-wrap">               </span>if(x==Id)</div><div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>cout<<"\nEl Codigo es: \n";</div><div>            mostrar();</div><div><span style="white-space:pre-wrap">                   </span>while(opc!=5)</div><div><span style="white-space:pre-wrap">                    </span>{</div><div><span style="white-space:pre-wrap">                                </span>cout<<"\n\nQue deseas modificar "<<endl;</div><div><span style="white-space:pre-wrap">                           </span>cout<<"\n1. Codigo "<<endl;</div><div><span style="white-space:pre-wrap">                                </span>cout<<"\n2. Nombre "<<endl;</div><div><span style="white-space:pre-wrap">                                </span>cout<<"\n3. Fecha "<<endl;</div><div><span style="white-space:pre-wrap">                         </span>cout<<"\n4. Nss "<<endl;</div><div><span style="white-space:pre-wrap">                           </span>cout<<"\n5. Ir a menu de servicio"<<endl;</div><div>                cin>>opc;</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Cada función debe realizar la tarea imputada; ni más ni menos. En esta función, 'modificar()' debería realizar tal tarea: modificar un objeto de 'Empleados'. Sin embargo, esta función realiza varias tareas: modificar un miembro y comunicarse con el usuario. No es la responsabilidad de esta función comunicarse con el usuario, por lo que no debería estar aquí.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div>                switch (opc){</div><div>                    case 1: cout<<"\nCodigo: ";</div><div><span style="white-space:pre-wrap">                                               </span>cin>>em[j].Id;</div></div></div></div></div></blockquote><div><br></div><div>Esto no es NADA aconsejable. Básicamente, cualquier objeto de 'Empleados' accederá a un array global de objetos de 'Empleados'.</div><div><br></div><div>Al final del correo-e hablo del diseño y rediseño de este programa.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div>                        break;</div><div>                    case 2:cin.ignore(100,'\n');</div><div>                        cout<<"\nNombre: ";</div><div><span style="white-space:pre-wrap">                                              </span>cin.getline(em[j].cliente,20,'\n');</div></div></div></div></div></blockquote><div><br></div><div>Debería ser 25, porque 'cliente' ocupa 25 caracteres. Nuevamente, el uso de constantes soluciona este problema de usar diferentes valores cuando deberían ser el mismo valor.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div>                        break;</div><div><span style="white-space:pre-wrap">                                     </span>case 3: cout<<"\nFecha: ";</div><div><span style="white-space:pre-wrap">                                               </span>cin>>em[j].Fec;</div><div><span style="white-space:pre-wrap">                                            </span>break;</div><div><span style="white-space:pre-wrap">                                   </span>case 4: cout<<"\nNss: ";</div><div><span style="white-space:pre-wrap">                                         </span>cin>>em[j].Nss;</div><div><span style="white-space:pre-wrap">                                            </span>break;</div><div><span style="white-space:pre-wrap">                                           </span> }</div><div><br></div><div><span style="white-space:pre-wrap">                      </span>}</div><div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span>else ban=1;</div></div></div></div></div></blockquote><div><br></div><div>Aquí te comunicas con la variable global, 'ban'. Si necesitas comunicación con el exterior a modo de resultado, entonces usa el mecanismo de las funciones y retorno de valores usando el vocablo, 'return'. Esto es,</div><div><br></div><div><span style="font-size:12.8000001907349px">int Empleados::modificar( int x )<br></span>{<br>  ...<br>  return resultado;   // antes era 'ban'</div><div>}</div><div><br></div><div>Ya la hora de invocar esta función, obtendríamos el valor retornado. Por ejemplo,</div><div><br></div><div>for( int x=1; x<Idx; x++ )<br></div><div><div><span style="white-space:pre">  ban = </span>em[x].modificar( Idx );</div></div><div><br></div><div>if( 1 == ban )<br>{</div><div>  ...</div><div>}</div><div><br></div><div>Por otro lado, parece que 'ban' sólo se usa para guardar el valor 0 (cero) o 1. Como es binario, seguramente se beneficiaría de un tipo booleano; por ejemplo,</div><div><div><br></div><div>bool Empleados::modificar( int x )</div><div>{</div><div>  ...</div><div>  return resultado;   // antes era 'ban'</div><div>}</div></div><div>...</div><div><br></div><div>bool ban = false;<br></div><div>...</div><div><div>for( int x=1; x<Idx; x++ )</div><div>  ban = em[x].modificar( Idx );</div></div><div><br></div><div>if( ban )</div><div>{</div><div>  ...<br>}</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div><span style="white-space:pre-wrap">    </span>}</div><div><br></div><div>};</div><div><br></div></div></div></div></div></blockquote><div><br></div><div>Este punto y coma no es necesario; puedes eliminarlo.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div> <br></div></div></div></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div></div><div><br></div><div>int main()</div><div>{</div><div></div></div></div></div></div></blockquote><div><br></div><div>[CORTE]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div dir="ltr"><div><div><div> }</div></div></div></div></div></blockquote><div><br></div><div>Debes retornar un entero, que por convenio, 0 (cero) indica una terminación exitosa.</div><div><br></div><div><br></div><div>El diseño que has realizado no es el más apto a las necesidades del problema que se te haya dado. Por lo que veo, necesitas crear una lista de empleados. Esto implica que tenemos dos conceptos importantes:<br>1. Empleado, y</div><div>2. Lista de Empleados</div><div><br></div><div>Por lo tanto, interesa representar cada idea compleja con una clase, como por ejemplo,</div><div><br></div><div>class Empleado<br>{<br>  ...<br>};</div><div><br></div><div><div>class ListaEmpleado</div><div>{</div><div>  ...</div><div>};</div></div><div><br></div><div>Para poder representar cada idea, tienes que diseñar la representación interna de cada idea a nivel de datos al igual que sus operaciones y tareas que ofrecen para comunicarse con el exterior: otras ideas, funciones, y el programa (principal). Por ejemplo,</div><div><br></div><div><div>class Empleado</div><div>{</div><div>public:<br>  const int MAX_CLIENTE = 25;</div><div><div>  const int MAX_FECHA = 10;</div></div><div>  ...</div><div><br></div><div>private:<br>  int nID;</div><div>  float fSalario;  // creo que "salario" debería ser 'float'</div><div>  char szCliente[MAX_CLIENTE];</div><div>  ...</div><div><br></div><div>public:<br>  Empleado();</div><div>  Empleado( int id, float salario, char cliente[], ... );</div><div><br></div><div>  // Get y Set</div><div>  int getID() const   { return nID; }</div><div>  void setID( int id )  { nID = id; };</div><div><br></div><div><div>  float getSalario() const   { return nSalario; }</div><div>  void setSalario( float salario )  { nSalario = salario; };</div></div><div>  ...</div><div>};</div></div><div><br></div><div>Como puedes ver, no tiene las funciones miembro de 'capturar()', 'mostrar()', etc. porque no definen las operaciones básicas para manipular objetos de la clase 'Empleado'. Sí puedes crear funciones globales que realicen estas tareas más elevadas (menos básicas) como funciones auxiliares; por ejemplo,</div><div><br></div><div>void mostrar( const Empleado &e )<br>{</div><div>  cout << "ID: " << e.getID() << endl;<div>  cout << "Nss: " << e.getNSS() << endl;</div><div>  cout << "Cliente: " << e.getCliente() << endl;</div><div>  ...</div><div>}<br></div></div><div><br></div><div>Lo mismo sucede con otras funciones como 'capturar()'.</div><div><br></div><div>Tenemos que hacer lo mismo que con 'Empleado' pero con 'ListaEmpleados'; por ejemplo,</div><div><br></div><div>class ListaEmpleados<br>{</div><div>public:<br>  const int MAX_EMPLEADOS = 10;</div><div><br>private:<br>  Empleado lista[MAX_EMPLEADOS];</div><div><br></div><div>public:<br>  ListaEmpleados();</div><div><div><br></div></div><div>  // Leer: 1 empleado</div><div>  const Empleado & getEmpleado( int n ) const;</div><div><br></div><div><div>  // Modificar: 1 empleado</div></div><div>  void modificar( int n );</div><div><br></div><div>  // Buscar: 1 empleado => índice al Empleado encontrado</div><div>  int buscar( int id ) const;</div><div>};</div><div><br></div><div>Esto es una forma bastante más organizada de diseñar, desglosando los conceptos importantes que existen para componer un programa.</div><div><br></div><div><br></div><div>Espero que esto te oriente.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>