Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Error 404: en 16 Mayo 2013, 21:47 pm



Título: Problema con un programa:
Publicado por: Error 404: en 16 Mayo 2013, 21:47 pm
Hola a todos muy buenas, me estoy iniciando en el mundillo de la programacion y me ha surgido un problemilla y es que no consigo hacer que un programa me compare dos  cadenas. Este es el codigo agradeceria una ayudita sobre en que me he confundido.  [Tiene muchos "cout << endl", es por pura estetica xd]
La finalidad del programa es que introduzcas un nombre y un telefono de 4 personas, y luego poder realizar la busqueda introduciendo su nombre (y te da el numero) o introduciendo el numero ( y te da el nombre). Pero cuando meto algun nombre o numero siempre me da la respuesta del primero que he introducido, y no el que corresponde :huh:. Gracias por adelantado   :rolleyes:

Código:
#include <iostream>
#include <cstring>
using namespace std;
struct A {
       char Nombre[40];
       int Telefono;
       } Fulanito[4];
int main()
{
    int i;
    int z;
    char buscaNombre[40];
    int buscaTel;
  for (i = 0; i < 4; i++)  
  {
     cout << " Introduce el nombre de la persona: ";cin >> Fulanito[i].Nombre; cout << endl;
     cout << " Introduce el numero telefonico de " << Fulanito[i].Nombre<< ": "; cin >> Fulanito[i].Telefono; cout << endl << endl; cin.get();
  }
  
  cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl;
  

Bucle:
  cout << "   ******************** MENU *********************      " << endl << endl; cout << endl << endl << endl;
  cout << "           1) Buscar por nombre                 " << endl << endl;
  cout << "           2) Buscar por numero                 " << endl << endl;
  cout << "           3) Salir                             " << endl << endl;
 
 
cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl;
  cout << " Que desea realizar: "; cin >> z; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl; cout << endl << endl << endl;
  
  
  if (z == 3) return 0;
  
  if (z == 1)
  {
        cout << " Introduce el nombre de la persona que desea buscar: ";
        cin >> buscaNombre; cout << endl << endl; cin.get();
        
        for (i = 0; i < 4 ;i++)
        {
            if (strcmp(Fulanito[i].Nombre, buscaNombre)==0); cout <<"    Telefono de "<< Fulanito[i].Nombre <<": " << Fulanito[i].Telefono; cout << endl << endl << endl;        
              cin.get(); goto Bucle;
        }
  }
  if (z == 2)
  {
        cout << " Introduce el numero de la persona que desea buscar: ";
        cin >> buscaTel; cout << endl << endl; cin.get();
        for (i = 0; i<4 ;i++)
        {
            if ((buscaTel, Fulanito[i].Telefono)==0); cout << " Nombre: " << Fulanito[i].Nombre; cout << endl << endl << endl;
              cin.get(); goto Bucle;
        }
  }
  cin.get();
  return 0;
}






PD: es en c++ jeje :silbar:


Título: Re: Problema con un programa:
Publicado por: Cönnectome en 16 Mayo 2013, 22:01 pm
Te compila?, veo que tienes varios errores, como:

Código:
cout << " Introduce el nombre de la persona: ";cin >> Fulanito.Nombre[i]; cout << endl;

Cuando intentas acceder a un array, tienes que decirle a QUE POSICION QUIERES ACCEDER., es decir, Fulanito.Nombre[posicion].

Eso en todos los que tengas.

Luego, para evitarte muchos cout << endl;, puedes hacer una funcion simple como la siguiente:

Código:
void MuchosCout(int numerodecouts)
{
    for(int i=0;i<numerodecouts;++i)
       cout << endl;
}

Luego, he visto otra cosa, como:

Código:
 if ((buscaTel, Fulanito.Telefono)==0); 

Varias cosas. Primero, la coma?, que es lo que quieres condicionar. Luego, el ; del final, si quieres que accede el bloque {}, tienes que quitarlo, ya que el compilador lo interpreta como una final de sentencia, y solo hace una "condicion", y no hace nada en el caso de que esta condición se cumpliera.

Y por último. OBLIDATE ABSOLUTAMENTE DE LOS GOTO. Son horrorosos. En cualquier lugar veras que no son nada recomendables, ya que dificulta la lectura de un programa.

Espero que esto resuelve tu problema. Y sino, corrige, y luego vuelve a preguntar!.

Saludos,


Cönnectome




Título: Re: Problema con un programa:
Publicado por: leosansan en 16 Mayo 2013, 23:01 pm
................................................
Luego, para evitarte muchos cout << endl;, puedes hacer una funcion simple como la siguiente:

Código:
void MuchosCout(int numerodecouts)
{
    for(int i=0;i<numerodecouts;++i)
       cout << endl;
}


Muy acertada la función. Aunque creo que lo que pretende es "pasar" líneas hasta que no se vea lo anterior y para eso yo le aconsejaría usar system("cls") para limpiar la pantalla, suponiendo esté en Windows y, eso sí, incluir la librería <cstdlib> para su uso.



Te compila?, veo que tienes varios errores, como:
Código:
cout << " Introduce el nombre de la persona: ";cin >> Fulanito.Nombre; cout << endl;

Cuando intentas acceder a un array, tienes que decirle a QUE POSICION QUIERES ACCEDER., es decir, Fulanito.Nombre[posicion].

Totalmente de acuerdo, pero es Fulanito[posicion].Nombre y aún en ese supuesto sí los tiene puestos. El problema radica en que al pegar el código sin usar las etiquetas GeSHi de C++, por favor usarlas y pegar el código en medio de esas etiquetas, pues a lo que iba, al no usar las susodichas etiquetas el código le sale en cursiva y se "come" los índices. Si editas su mensaje veras que si están puestos.

Saluditos!. .....  (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con un programa:
Publicado por: Error 404: en 17 Mayo 2013, 00:42 am
Muchisimas gracias era eso lo que me pasaba, que despues del (strcmp(......)); tenia que poner { , para que si cumpliera la condicion   :-X , y lo de la posicion del array como bien ha dicho si las tengo puestas pero no se porque no han salido xd
Bueno y para evitar el goto Bucle (que incluso en el manual que estoy leyendo me dice que lo evite) como lo sustituiria  :huh: . Y en cuanto a lo de tantos endl es por que quiero que se limpie la pantalla, me podrias explicar como usaria lo que has puesto del cls ???
Muchas gracias por la ayuda :)


Título: Re: Problema con un programa:
Publicado por: leosansan en 17 Mayo 2013, 08:26 am
Bueno y para evitar el goto Bucle (que incluso en el manual que estoy leyendo me dice que lo evite) como lo sustituiria  :huh: . Y en cuanto a lo de tantos endl es por que quiero que se limpie la pantalla, me podrias explicar como usaria lo que has puesto del cls ???
Muchas gracias por la ayuda :)

Mejor lo ves:

Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #define N      4
  5.  
  6. using namespace std;
  7. struct Fulanito {
  8.       char Nombre[40];
  9.       int Telefono;
  10.       } Fulanito[N];
  11. int main()
  12. {
  13.  
  14.    int i,z,buscaTel=0,indice;
  15.    char buscaNombre[40]={0};
  16.    for (i = 0; i < N; i++)
  17.        {
  18.            cout << " Introduce el nombre de la persona " << i+1 <<" de "<< N <<" :";
  19.            cin >> Fulanito[i].Nombre; cout << endl;
  20.            cout << " Introduce el numero telefonico de " << Fulanito[i].Nombre<< ": ";
  21.            cin >> Fulanito[i].Telefono;
  22.            cout << endl << endl;
  23.        }
  24.  
  25.    system("cls");
  26.  
  27.    while(1) {
  28.        indice=0;
  29.        cout << "   ******************** MENU *********************      " << endl << endl << endl << endl << endl;
  30.        cout << "           1) Buscar por nombre                 " << endl << endl;
  31.        cout << "           2) Buscar por numero                 " << endl << endl;
  32.        cout << "           3) Salir                             " << endl << endl;
  33.  
  34.        cout << " Que desea realizar: "; cin >> z;
  35.        system("cls");
  36.        if (z == 3) return 1;
  37.  
  38.        else if (z == 1)
  39.      {
  40.            cout << " Introduce el nombre de la persona que desea buscar: ";
  41.            cin >> buscaNombre; cout << endl << endl;
  42.  
  43.            for (i = 0; i < N ;i++)
  44.            {
  45.                if (strcmp(Fulanito[i].Nombre, buscaNombre)==0){
  46.                    cout <<"    Telefono de "<< Fulanito[i].Nombre <<": " << Fulanito[i].Telefono;
  47.                    cout << endl << endl << endl;
  48.                    indice++;
  49.                }
  50.            }
  51.            if (indice==0)
  52.                cout << "No existe en la base esa persona"<< endl<< endl<< endl;
  53.      }
  54.      else if (z == 2)
  55.      {
  56.            cout << " Introduce el numero de la persona que desea buscar: ";
  57.            cin >> buscaTel; cout << endl << endl;
  58.            for (i = 0; i<N ;i++)
  59.            {
  60.                if ((buscaTel==Fulanito[i].Telefono)){
  61.                    cout << " Nombre: " << Fulanito[i].Nombre;
  62.                    cout << endl << endl << endl;
  63.                    indice++;
  64.                }
  65.            }
  66.            if (indice==0)
  67.                cout << "No existe en la base ese numero"<< endl<< endl<< endl;
  68.      }
  69.      else
  70.        cout<<"Opcion equivocada"<<endl<<endl<< endl;
  71.    }
  72.  return 0;
  73. }
  74.  

Saluditos!. .... (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con un programa:
Publicado por: Error 404: en 17 Mayo 2013, 09:09 am
muchas gracias ya funciona perfectamente!!!!!  ;-)


Título: Re: Problema con un programa:
Publicado por: leosansan en 17 Mayo 2013, 09:38 am
muchas gracias ya funciona perfectamente!!!!!  ;-)

Lo reedite buscando la mejora visual. Espero hayas pillado "la última edición" y me alegra que te haya servido.

Saluditos!. ....
(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Problema con un programa:
Publicado por: amchacon en 17 Mayo 2013, 18:50 pm
Y por último. OBLIDATE ABSOLUTAMENTE DE LOS GOTO. Son horrorosos. En cualquier lugar veras que no son nada recomendables, ya que dificulta la lectura de un programa.
Ojo goto si que tiene sus usos (al igual que las variables globales). Por ejemplo si tenemos un montón de bucles anidados y queremos forzar su repetición en caso de error:

Código
  1. repetir:
  2.  
  3. for (int i = 0; i < 30; i++)
  4.   for (int j = 0; j < 30; j++)
  5.      for (int k = 0; k < 30; k++)
  6.         for (int l = 0; l < 30; l++)
  7.             if (Matriz[i][j][k][l] == ERROR)
  8.                      goto repetir;
  9.  
  10.  

También podría servir para forzar la salida en caso de que encontremos el resultado (recordemos que un break solo serviría para el primer for).


Título: Re: Problema con un programa:
Publicado por: Cönnectome en 18 Mayo 2013, 16:03 pm
Totalmente de acuerdo[/b], pero es Fulanito[posicion].Nombre hes.com/foro/images/smilies/aaaaa.gif[/img]

Es verdad!. Aaaah!. Gracias por la corrección.

Ojo goto si que tiene sus usos (al igual que las variables globales). Por ejemplo si tenemos un montón de bucles anidados y queremos forzar su repetición en caso de error:

Código
  1. repetir:
  2.  
  3. for (int i = 0; i < 30; i++)
  4.   for (int j = 0; j < 30; j++)
  5.      for (int k = 0; k < 30; k++)
  6.         for (int l = 0; l < 30; l++)
  7.             if (Matriz[i][j][k][l] == ERROR)
  8.                      goto repetir;
  9.  
  10.  

También podría servir para forzar la salida en caso de que encontremos el resultado (recordemos que un break solo serviría para el primer for).


Mmmmh, interesante. Pensaba que goto (sinceramente), no servia para nada, por que pensava que todo lo que utiliza goto lo podrias sustituir con un simple break o continue o una simple condición if, pero vista la posibilidad de bucles anidados, me tendré que replantear su uso.  Gracias ! :)

Saludos

Cönnectome



Título: Re: Problema con un programa:
Publicado por: leosansan en 18 Mayo 2013, 21:18 pm
Ojo goto si que tiene sus usos (al igual que las variables globales). Por ejemplo si tenemos un montón de bucles anidados y queremos forzar su repetición en caso de error:

Código
  1. repetir:
  2.  
  3. for (int i = 0; i < 30; i++)
  4.   for (int j = 0; j < 30; j++)
  5.      for (int k = 0; k < 30; k++)
  6.         for (int l = 0; l < 30; l++)
  7.             if (Matriz[i][j][k][l] == ERROR)
  8.                      goto repetir;
  9.  
  10.  

En caso de error en la introducción de un dato siempre podemos recurrir a :

Código
  1. for (int i = 0; i < 30; i++)
  2.   for (int j = 0; j < 30; j++)
  3.      for (int k = 0; k < 30; k++)
  4.         for (int l = 0; l < 30; l++)
  5.             if (Matriz[i][j][k][l] == ERROR){
  6.                puts("error");
  7.                l--;
  8.                }

Citar
También podría servir para forzar la salida en caso de que encontremos el resultado (recordemos que un break solo serviría para el primer for).

Y si quisiéramos salir, ya que con un break no se puede, podemos recurrir al uso de banderas o flags, tantas como deseemos, como ejemplo esta salida de un triple bucle:

Código
  1. a[0][0][0]= 10
  2. a[0][0][1]= 12
  3. a[0][0][2]= 15
  4. Sali de los bucles

del código de muestra que pongo a continuación:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int i,j,k,flag=0,a[30][30][30];
  6.        for (i=0;i<30 && flag==0;i++)
  7. for (j=0;j<30 && flag==0;j++)
  8. for (k=0;k<30 && flag==0;k++){
  9. printf("a[%d][%d][%d]= ",i,j,k);
  10.                                scanf("%d",&a[i][j][k]);
  11.                                if (a[i][j][k]==15)
  12.                                   flag++;
  13. }
  14.  
  15.    puts("Sali de los bucles");
  16.    return 0;
  17. }
  18.  

Y combinando flags y while o Do-While podemos hacer virguerias. Todo es cuestión de imaginación.

Todo lo dicho anteriormente no es una crítica al uso del goto, por algo está implementado en el lenguaje, sino a su abuso o uso innecesario en determinadas situaciones que con un poco de habilidad nos evita su uso y los posibles "efectos colaterales" que pueda originar si no se está al loro de dónde poner las etiquetas etc.

Resumiendo, yo lo uso en determinadas situaciones, aunque siempre le busco la vuelta para no tener que usarlo.

Saluditos!...... ...
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con un programa:
Publicado por: amchacon en 19 Mayo 2013, 01:02 am
Como te picas Leosan  ;-)

Es evidente, goto no es "imprescindible" pero es una herramienta que en alguna ocasiones resulta la salida más sencilla (y eficiente). Incluso Java que eliminó el goto de su repertorio permitió "algunos saltos" en determinadas circunstancias excepcionales (como la línea anterior a un for).

Yo personalmente nunca he necesitado usarlos. Pero defiendo que tiene algunos usos.


Título: Re: Problema con un programa:
Publicado por: leosansan en 19 Mayo 2013, 02:13 am
Como te picas Leosan  ;-)

Estimado y respetado amchacon, no era un pique sino una sugerencia a posibles maneras de no usar goto en tus planteamientos.

Ya aclare que yo soy el primero en usarlo y sólo quería poner de manifiesto que su uso por comodidad no es aconsejable ni la manera más efiente en según qué situaciones.

Así que de "piques" nada de nada, y mucho menos contigo, sólo eran una pequeña y humilde aportación al tema.

Saluditos!. .... . .
(http://smilies-gifs.com/hola-adios/2hola-adios.gif)


Título: Re: Problema con un programa:
Publicado por: amchacon en 19 Mayo 2013, 02:58 am
Así que de "piques" nada de nada, y mucho menos contigo, sólo eran una pequeña y humilde aportación al tema.
¡Pero no te enfades! Que te estaba tomando el pelo ;D

Esque me acuerdo de una vez que recomendé usar nodos enlazados en vez de realloc, creo que me contestastes 3-4 veces. Cada vez yo te ponía una traba más pero siempre me devolvias la pelota  ;-)

En fin que era una broma. Es mi avatar, que me da un aire muy serio  :xD


Título: Re: Problema con un programa:
Publicado por: Error 404: en 22 Mayo 2013, 14:18 pm
Por cierto, me dijisteis para que volviera sin usar el goto, poniendo lo de indice = 0 .....  Pero como funciona, es decir, una pequeña explicacion para saber utilizarlo yo en caso de necesidad, es que no se como funciona, simplemente lo he puesto, pero no me gusta poner cosas sin saber de donde vienen ni como usarlas xd, sabran a lo que me refiero xd.


Título: Re: Problema con un programa:
Publicado por: leosansan en 22 Mayo 2013, 16:57 pm
Por cierto, me dijisteis para que volviera sin usar el goto, poniendo lo de indice = 0 .....  Pero cómo funciona, es decir, una pequeña explicacion para saber utilizarlo yo en caso de necesidad, es que no se como funciona, simplemente lo he puesto, pero no me gusta poner cosas sin saber de donde vienen ni como usarlas xd, sabran a lo que me refiero xd.

El índice cero es lo que suele llamarse bandera o flag, avisa de que algo ha sucedido, en este caso si es distinto de cero, o no en cuyo caso toma el valor cero.

Tal como está implementado fíjate que al comparar las cadenas si éstas son iguales entras en el "cuerpo" del if y la variable índice se incrementa, tomando el valor 1, de forma que si no se incrementa, se queda en cero y es que no encontró  actuando entonces el cout "no encontrado". Observa que después de una comparación vuelve a actuar el while(1) para realizar la siguiente búsqueda, para lo cual vuelvo a inicializar índice a cero y se repite la historia.

Si te quedan dudas vuelve a preguntar.

Saluditos!. ... . ..
(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Problema con un programa:
Publicado por: rir3760 en 22 Mayo 2013, 17:23 pm
Si cada nombre es único se puede modificar el bucle para que este pare cuando se encuentre una coincidencia. Con ello se puede utilizar al contador del bucle como bandera de estado, mas o menos así:
Código
  1. else if (z == 1){
  2.   cout << " Introduce el nombre de la persona que desea buscar: ";
  3.   cin >> buscaNombre; cout << endl << endl;
  4.  
  5.   for (i = 0; i < N && strcmp(Fulanito[i].Nombre, buscaNombre) != 0; i++)
  6.      ;
  7.   if (i != N){
  8.      cout <<"    Telefono de "<< Fulanito[i].Nombre <<": " << Fulanito[i].Telefono;
  9.      cout << endl << endl << endl;
  10.   }else
  11.      cout << "No existe en la base esa persona"<< endl<< endl<< endl;
  12. }
Pero, de nuevo, solo aplica si no hay nombres repetidos.

Y para imprimir un carácter varias veces se puede utilizar un objeto de la clase string:
Código
  1. cout << string(num_reps, ch) << endl;
Donde ch es el carácter a imprimir y num_reps el numero de repeticiones.

Un saludo