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.
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]
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.
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.
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.
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.
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
std::string
: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.
Cita de: "ethernet"std::string
seconded
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.
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.
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
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
Vaya, es muy interesante.
Mientras estudio el código ¿podriais explicarme ¿qué es C# y cual es la principal diferencia respecto al C++?
S2.
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.
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!
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.
Por partes:
- Te da error en la función atoi porque no has incluído el archivo de cabecera stdio.h. Lo siento se me olvidó :).
Por 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;
- El archivo de cabecera conio.h lo adjunté porque es necesario para la función getch, la cual espera la pulsación de una tecla.
- La línea:
while (MenuPrincipal ());
podría haberse escrito:
while (MenuPrincipal () == true) continue;
Como puedes ver, el bucle se está reproduciendo mientras MenuPrincipal esté devolviendo true, lo cual ocurre mientras el usuario no escoja la opción de salir (en cuyo caso devuelve false).
Otra forma de expresar el bucle que puede resultarte más clara:
bool bEjecutar = true;
while (bEjecutar == true) bEjecutar = MenuPrincipal();
- El motivo de la enumeración es debido a que de esta forma el código es más legible y se puede ampliar/modificar más fácilmente que si utilizases un número para identificar cada una de las opciones de menú.
Saludos.
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.
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 ;)
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.
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.