Problema con un programa:

Iniciado por Error 404:, 16 Mayo 2013, 21:47 PM

0 Miembros y 2 Visitantes están viendo este tema.

Error 404:

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:


#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:
Si se puede imaginar, se puede programar.

Cönnectome

#1
Te compila?, veo que tienes varios errores, como:


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:


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


Luego, he visto otra cosa, como:

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



leosansan

#2
Cita de: Cönnectome en 16 Mayo 2013, 22:01 PM
................................................
Luego, para evitarte muchos cout << endl;, puedes hacer una funcion simple como la siguiente:


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.



Cita de: 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; 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!. .....  

Error 404:

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 :)
Si se puede imaginar, se puede programar.

leosansan

#4
Cita de: superkorlas en 17 Mayo 2013, 00:42 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 (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
#include <cstdlib>
#define N      4

using namespace std;
struct Fulanito {
      char Nombre[40];
      int Telefono;
      } Fulanito[N];
int main()
{

   int i,z,buscaTel=0,indice;
   char buscaNombre[40]={0};
   for (i = 0; i < N; i++)
       {
           cout << " Introduce el nombre de la persona " << i+1 <<" de "<< N <<" :";
           cin >> Fulanito[i].Nombre; cout << endl;
           cout << " Introduce el numero telefonico de " << Fulanito[i].Nombre<< ": ";
           cin >> Fulanito[i].Telefono;
           cout << endl << endl;
       }

   system("cls");

   while(1) {
       indice=0;
       cout << "   ******************** MENU *********************      " << endl << endl << endl << endl << endl;
       cout << "           1) Buscar por nombre                 " << endl << endl;
       cout << "           2) Buscar por numero                 " << endl << endl;
       cout << "           3) Salir                             " << endl << endl;

       cout << " Que desea realizar: "; cin >> z;
       system("cls");
       if (z == 3) return 1;

       else if (z == 1)
     {
           cout << " Introduce el nombre de la persona que desea buscar: ";
           cin >> buscaNombre; cout << endl << endl;

           for (i = 0; i < N ;i++)
           {
               if (strcmp(Fulanito[i].Nombre, buscaNombre)==0){
                   cout <<"    Telefono de "<< Fulanito[i].Nombre <<": " << Fulanito[i].Telefono;
                   cout << endl << endl << endl;
                   indice++;
               }
           }
           if (indice==0)
               cout << "No existe en la base esa persona"<< endl<< endl<< endl;
     }
     else if (z == 2)
     {
           cout << " Introduce el numero de la persona que desea buscar: ";
           cin >> buscaTel; cout << endl << endl;
           for (i = 0; i<N ;i++)
           {
               if ((buscaTel==Fulanito[i].Telefono)){
                   cout << " Nombre: " << Fulanito[i].Nombre;
                   cout << endl << endl << endl;
                   indice++;
               }
           }
           if (indice==0)
               cout << "No existe en la base ese numero"<< endl<< endl<< endl;
     }
     else
       cout<<"Opcion equivocada"<<endl<<endl<< endl;
   }
 return 0;
}


Saluditos!. ....

Error 404:

muchas gracias ya funciona perfectamente!!!!!  ;-)
Si se puede imaginar, se puede programar.

leosansan

#6
Cita de: superkorlas en 17 Mayo 2013, 09:09 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!. ....

amchacon

#7
Cita de: Cönnectome en 16 Mayo 2013, 22:01 PMY 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 (cpp) [Seleccionar]

repetir:

for (int i = 0; i < 30; i++)
  for (int j = 0; j < 30; j++)
     for (int k = 0; k < 30; k++)
        for (int l = 0; l < 30; l++)
            if (Matriz[i][j][k][l] == ERROR)
                     goto repetir;



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).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Cönnectome

Cita de: leosansan en 16 Mayo 2013, 23:01 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.

Cita de: amchacon en 17 Mayo 2013, 18:50 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 (cpp) [Seleccionar]

repetir:

for (int i = 0; i < 30; i++)
   for (int j = 0; j < 30; j++)
      for (int k = 0; k < 30; k++)
         for (int l = 0; l < 30; l++)
             if (Matriz[i][j][k][l] == ERROR)
                      goto repetir;



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


leosansan

#9
Cita de: amchacon en 17 Mayo 2013, 18:50 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 (cpp) [Seleccionar]

repetir:

for (int i = 0; i < 30; i++)
  for (int j = 0; j < 30; j++)
     for (int k = 0; k < 30; k++)
        for (int l = 0; l < 30; l++)
            if (Matriz[i][j][k][l] == ERROR)
                     goto repetir;



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

Código (cpp) [Seleccionar]
for (int i = 0; i < 30; i++)
  for (int j = 0; j < 30; j++)
     for (int k = 0; k < 30; k++)
        for (int l = 0; l < 30; l++)
            if (Matriz[i][j][k][l] == ERROR){
               puts("error");
               l--;
               }


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 (cpp) [Seleccionar]
a[0][0][0]= 10
a[0][0][1]= 12
a[0][0][2]= 15
Sali de los bucles


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

Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
int i,j,k,flag=0,a[30][30][30];
       for (i=0;i<30 && flag==0;i++)
for (j=0;j<30 && flag==0;j++)
for (k=0;k<30 && flag==0;k++){
printf("a[%d][%d][%d]= ",i,j,k);
                               scanf("%d",&a[i][j][k]);
                               if (a[i][j][k]==15)
                                  flag++;
}

   puts("Sali de los bucles");
   return 0;
}


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!...... ...