Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





If/else ¿que Falla Aqui Por Dios?

Iniciado por J_F_NASH, 24 de Septiembre de 2003, 10:32:27 PM

« anterior - próximo »

J_F_NASH

 void main()
{
   char ruta[1];

               cin >> ruta;

               if (ruta == "n")
      { cout <<"\n\nLA TABERNA DEL ROBLE\n\n" }
                else
                  { cout<<"\nmala eleccion\n }


}


Pues nada que no lo entiendo.
Quiero que al escribir "n" me imprima la correspondiente linea. Y si escribo "s" (o cualquier otra letra) lo que aparece en else.
Pero escriba "s" , "n" o "lo que sea" siempre me lee lo que pone else!!!!

¿Qué estoy haciendo mal? ¿cómo se hace?





S2.

BeRSeRKeR

 En todo caso, esto

if (ruta == "n")

sería esto

if (ruta[0] == 'n')

o

if (strnicmp(ruta, "n") == 0)

Ten en cuenta que en C no existe la sobrecarga del operador == para la comparación de cadenas de caracteres.

Saludos

PD: me he fijado que has reservado espacio sólo para 1 caracter. Ten en cuenta que el caracter de retorno también ha de almacenarse por lo que en todo caso deberías declarar el array como char ruta[2]
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

J_F_NASH

 Ok, ya veo. De momento quisiera entender el funcionamiento de c++ y no meterme en librerias (mas adelante lo haré).


Ahora tengo lo siguiente:

void main()
{
   char ruta[6];

   cin >> ruta[0];
   cout << "\n\nEl caracter " << ruta<< " ha sido almacenado en la variable ruta\n\n";
}

Escribo la palabra "norte" y cout solo me muestra como almacenado la "n"
¿Como hago para que me muestre la palabra entera?

Gracias de antemano.


S2.

BeRSeRKeR

 Con

cin >> ruta[0]

lo que haces es almacenar sólo el primer caracter de la cadena que escribas.

Lo correcto sería

cin >> ruta

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

J_F_NASH

 Entiendo.
El tema es que quiero indicarle al programa que si la variable "ruta" contiene LA PALABRA "norte" me imprima TXT1 sino imprima TXT2.

Con una letra 'n' funciona correctamente. Si coloco 'norte' me dice que SON DEMASIADOS CARACTERES y si los separo ('n', 'o', 'r', 't', 'e' ) me peta igualmente.

¿Cómo establezco condiciones con los caracteres? pensé que era lo mismo que con enteros.

   char ruta[6];

   cin >> ruta;

   if (ruta == 'n')
      cout << "\n\nporfin!!\n\n";
   else
      cout << "\n\nno has puesto norte\n\n";




S2.

BeRSeRKeR

 Es que una cosa son los caracteres y otra las cadenas. Los caracteres van entre comillas simples ('m') mientras que las cadenas van entre comillas dobles ("hola"). Puedes comparar dos caracteres con el operador == pero no dos cadenas. Para comparar dos cadenas sin atender a mayúsculas y minúsculas, utiliza la función strnicmp que devuelve 0 si las dos cadenas son iguales. Por ejemplo:

char cadena[] = "Hola mundo";

if(strnicmp(cadena, "HOLA MUNDO") == 0)
cout << "Las cadenas son iguales";
else
cout << "Las cadenas no son iguales";


En el código anterior, se ejecutará la línea

cout << "Las cadenas son iguales";

ya que las cadenas son iguales (como he dicho, la función strnicmp no tiene en cuenta mayúsculas/minúsculas).

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

HgH

 Una puntualización, que a lo mejor se sale del tema, pero te puede dar quebraderos de cabeza:

Citar
   char ruta[6];

   cin >> ruta;

   if (ruta == 'n')
  cout << "\n\nporfin!!\n\n";

Ten mucho cuidad con ese ruta=='n'
Estás comparando un caracter con un puntero a caracter. En todo caso deberías poner algo como
*ruta =='n'


Saludetes

gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

ethernet


J_F_NASH

 :rolleyes: Ya lo entiendo. :rolleyes:

El caso es que metí el nuevo "#include " y mirando en el libro de c++ menciona una funcion parecida a la que tu comentas "strcmp" (sin "ni").
Utilizando esta ultima funcion el programa se ejecuta correctamente, pero con "strnicmp" me ha dado un error "function does not take 2 parameters".
La funcion efectivamente existe pero ¿cuales son las diferencias? y ¿por que me peta esta ultima?

Gracias de antemano (de nuevo).




S2.

CoLSoN2

Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

BeRSeRKeR

 Perdona es que confundí strnicmp con stricmp. La primera necesita 3 parámetros (el último es el número de caracteres a comparar).

Así que la que quería decir es la función stricmp.

De todas formas ya que lo han dicho y puesto que parece que vas a utilizar C++, utiliza std:string :D

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

J_F_NASH

 No se como funciona "std:string"  :huh:

Por cierto:
Tengo un menú con SOLO 3 opciones. Si elijo cualquiera de ellas no hay problema, todo es seguir un "guion".
Pero si escojo una opcion erronea, por ejemplo la 4, que no existe, hago que aparezca un mensaje de error y... ¿cómo hago para regresar al menu de las 3 opciones y repetir la eleccion?
No se si me explico, en basic existe un "goto" a la linea que deseabas pero en c++ ¿como se resuelve esa situación?
Pienso meterme con el tema de las clases y herencias ¿es la solucion?

Ah! y otra cosa ¿como se visualizan los números de linea en visual c++?


S2.

BeRSeRKeR

 Estaba aburrido... :)

Los menús típicos de consola de desarrollan dentro de un bucle while.

Ejemplo:

#include <iostream>
#include <conio.h>

using namespace std;

enum eMenuPrincipal
{
MNUPRINCIPAL_JUGAR = 1,
MNUPRINCIPAL_OPCIONES,
MNUPRINCIPAL_SALIR,
};

enum eMenuOpciones
{
MNUOPCIONES_VIDEO = 1,
MNUOPCIONES_AUDIO,
MNUOPCIONES_VOLVER,
};

void OpcionDesconocida()
{
system("cls");

cout << "Opcion desconocida\n";
cout << "Presiona una tecla para continuar...";
getch();
}

void Principal_Jugar()
{
system("cls");

cout << "Se selecciono 'Jugar'\n";
cout << "Presiona una tecla para continuar...";
getch();
}

void Principal_Opciones()
{
system("cls");

cout << "Se selecciono 'Opciones'\n";
cout << "Presiona una tecla para continuar...";
getch();
}

void Principal_Salir()
{
system("cls");

cout << "Hasta la proxima!!\n";
cout << "Presiona una tecla para salir...";
getch();

system("cls");
}

void Opciones_Video()
{
system("cls");

cout << "Se selecciono 'Video'\n";
cout << "Presiona una tecla para continuar...";
getch();
}

void Opciones_Audio()
{
system("cls");

cout << "Se selecciono 'Audio'\n";
cout << "Presiona una tecla para continuar...";
getch();
}

bool MenuOpciones()
{
char szOpcion[2];

system("cls");

cout << "Menu Opciones\n";
cout << "-------------\n\n";

cout << "1. Video\n";
cout << "2. Audio\n";
cout << "3. Volver\n\n";
cout << "Opcion?: ";

cin >> szOpcion;

int iOpcion = atoi(szOpcion);

switch(iOpcion)
{
 case MNUOPCIONES_VIDEO:
  Opciones_Video();
  break;
 case MNUOPCIONES_AUDIO:
  Opciones_Audio();
  break;
 case MNUOPCIONES_VOLVER:
  return false;
 default:
  OpcionDesconocida();
  break;
}

return true;
}

bool MenuPrincipal()
{
char szOpcion[2];

system("cls");

cout << "Menu Principal\n";
cout << "--------------\n\n";

cout << "1. Jugar\n";
cout << "2. Opciones\n";
cout << "3. Salir\n\n";
cout << "Opcion?: ";

cin >> szOpcion;

int iOpcion = atoi(szOpcion);

switch(iOpcion)
{
 case MNUPRINCIPAL_JUGAR:
  Principal_Jugar();
  break;
 case MNUPRINCIPAL_OPCIONES:
  while(MenuOpciones());
  break;
 case MNUPRINCIPAL_SALIR:
  Principal_Salir();
  return false;
 default:
  OpcionDesconocida();
  break;
}

return true;
}

int main()
{
while(MenuPrincipal());

return 0;
}


No se si se podrán poner los números de línea en el margen izquierdo de Visual C++. Si no, en la barra de estado (abajo del todo) verás una sección que pone Ln. Ese es el número de línea actual.

Saludos.

PD: las tabulaciones del CODE están mal, ¿no? :D
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 Aclarar que en vez de utilizar un array de caracteres para recoger la opción escogida por el usuario, puedes utilizar directamente un entero. Así, por ejemplo, la función MenuPrincipal quedaría así:

bool MenuPrincipal()
{
int iOpcion;

system("cls");

cout << "Menu Principal\n";
cout << "--------------\n\n";

cout << "1. Jugar\n";
cout << "2. Opciones\n";
cout << "3. Salir\n\n";
cout << "Opcion?: ";

cin >> iOpcion;

.......
.......
.......

}


Saludos
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

J_F_NASH

 Vaya, es muy interesante.
Mientras estudio el código ¿podriais explicarme ¿qué es C# y cual es la principal diferencia respecto al C++?





S2.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.