Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: J_F_NASH en 24 de Septiembre de 2003, 10:32:27 PM

Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 24 de Septiembre de 2003, 10:32:27 PM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 24 de Septiembre de 2003, 10:42:58 PM
 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]
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 25 de Septiembre de 2003, 09:46:52 AM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 25 de Septiembre de 2003, 10:05:37 AM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 25 de Septiembre de 2003, 02:31:25 PM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 25 de Septiembre de 2003, 03:33:45 PM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: HgH en 25 de Septiembre de 2003, 04:24:58 PM
 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

Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: ethernet en 25 de Septiembre de 2003, 04:41:31 PM
 std::string
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 25 de Septiembre de 2003, 04:54:32 PM
 :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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: CoLSoN2 en 25 de Septiembre de 2003, 06:06:29 PM
Cita de: "ethernet"std::string
seconded
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 25 de Septiembre de 2003, 07:15:38 PM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 25 de Septiembre de 2003, 08:41:12 PM
 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.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 25 de Septiembre de 2003, 09:57:38 PM
 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
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 26 de Septiembre de 2003, 12:08:44 AM
 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
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 26 de Septiembre de 2003, 08:04:24 AM
 Vaya, es muy interesante.
Mientras estudio el código ¿podriais explicarme ¿qué es C# y cual es la principal diferencia respecto al C++?





S2.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 26 de Septiembre de 2003, 10:34:02 AM
 Buf!, a ver, el menu es muy bueno, es justo lo que quiero hacer. Ya me gustaria saber hacerlo a mi!.

Hay un termino que desconozco completamente ¿atoi? ¿eso que hace exactamente?

Y otra cosa ¿existe algún, no se como llamarlo, "diccionario de C++" donde busque culaquier termino y me diga lo que es y como emplearlo? aprendería mas rápido y os daría menos la vara. :(





S2.  
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: AgeR en 26 de Septiembre de 2003, 11:10:04 AM
Cita de: "J_F_NASH"Hay un termino que desconozco completamente ¿atoi? ¿eso que hace exactamente?

Y otra cosa ¿existe algún, no se como llamarlo, "diccionario de C++" donde busque culaquier termino y me diga lo que es y como emplearlo? aprendería mas rápido y os daría menos la vara. :(
atoi significa "ascii to integer" y lo que hace es que a partir de un string que tú le pases devuelve un número entero, o 0 si no ha podido convertir la cadena.

Sobre el "diccionario" puede bastarte la MSDN. La tienes en versión online si quieres : MSDN Online.

Venga, saludos!
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 26 de Septiembre de 2003, 03:33:58 PM
 Gracias AgeR, MSDN online parece que me será util, aunque los resultados de las busquedas suelen ser mastodonticos. Ahora creo que tengo demasiada info.  (uoh)

Respecto al codigo de menu principal tengo bastantes dudas:

A) Voy a probar atoi, de manera que escribo el siguiente código:

#include
#include


void main()
{
   int x;
   cin >> x;
   int i = atoi(x);

   cout << "Valor introducido: " << x <<"\n" <<"Pasado a entero: " << i <<"\n";
}

Me da este error:
error C2065: 'atoi' : undeclared identifier

Ya se que el código no tiene mucha lógica "yo le paso, por teclado, un entero y le digo que me lo convierta a entero" vamos, que el resultado deberia ser el mismo. Entonces  ¿por que el error?

En tu código la variable "szOpcion[2]" almacena... ¿¿un caracter?? (no lo entiendo, si yo tecleo un nº ¿como almacena el caracter?) que luego es pasado a entero.



B ) Para que se emplea ¿es parte de la biblioteca estandar
¿No se podría hacer el mismo menu con las bibliotecas estandar de C++?

C) En el main "while (MenuPrincipal ())" ¿me podeis decir lo que hace exactamente? ¿es una especie de  bucle estilo "Mientras se esté ejecutando el menu principal... entonces ocurre... ¿qué, qué demonios ocurre?" ?.

D) Ya se que es mucho pedir (y un coñazo) pero, si podeis, explicadme el código con //comentarios  ;)  o al menos como funciona realmente (para que enumeramos, ...)




S2.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 26 de Septiembre de 2003, 03:56:29 PM
 Por partes:
Saludos.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 26 de Septiembre de 2003, 04:01:51 PM
 Por cierto, esto que haces no tiene sentido:

int x;
cin >> x;
int i = atoi(x);


Estás intentando convertir un entero a un entero. Por otra parte, te dará un error de tipos (no se puede convertir int a const char *, o algo así)

Lo correcto en cualquier caso (siempre y cuando quieras utilizar atoi), sería:

char x[TAMAÑO_QUE_TU_DESEES];
cin >> x;
int i = atoi(x);


Saludos.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: BeRSeRKeR en 26 de Septiembre de 2003, 06:04:13 PM
Cita de: "J_F_NASH"Ya se que el código no tiene mucha lógica "yo le paso, por teclado, un entero y le digo que me lo convierta a entero" vamos, que el resultado deberia ser el mismo. Entonces  ¿por que el error?
Ok, disculpa el mensaje anterior ;)
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 26 de Septiembre de 2003, 06:19:07 PM
 Vaya, mil gracias por la explicación. Lo del bucle tiene su jugo.

CitarTe da error en la función atoi porque no has incluído el archivo de cabecera stdio.h. Lo siento se me olvidó :).
stdio.h no parece necesaria. El menu principal que escribiste funciona perfectamente sin ella, en cambio sigue dando un error 'undeclared identifier' el código sgte:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>

void main()
{
char x[3];
cin >> x;
int i = atoi(x);
cout << "Valor introducido: " << x <<"\n" <<"Pasado a entero: " << i <<"\n";
}

La verdad, no me entra en la cabeza eso que comentas:
CitarPor otra parte, como te dije en un mensaje anterior, en vez de un array de caracteres, puedes utilizar directamente un entero:

int iOpcion;
cin >> iOpcion;

¿A que te refieres?



S2.
Título: If/else ¿que Falla Aqui Por Dios?
Publicado por: J_F_NASH en 29 de Septiembre de 2003, 09:27:00 AM
 Vale, ya se a que te refieres con eso ultimo.

Una cosa mas:
Al principio del código pones "using namespace std"

¿Podría alguien explicarme para que se utliza esto exactamente?



S2.