LLevaba unos dias intentando registrarme y al fin lo he conseguido (el captcha no funciona pero de casualidad me he metido desde modo incognito y se mostraba sin problema ;-) ).
El caso es que estoy aprendiendo c con el "Manual Imprescindible de C/C++" y me gusta hacer mis chorradas y este codigo me da error en la linea -- .Cabe decir que llevo una semana con esto y supongo que mi codigo debe ser sucio de narices asi que cualquier consejo, lo agradezco, si me ayuda a quitar o evitar malos habitos.
Error que me dice CodeBlocks:
Citar
||=== Build file: "no target" in "no project" (compiler: unknown) ===|
Z:\8-Documentos\c\pau\versiencpp.cpp||In function 'int main()':|
Z:\8-Documentos\c\pau\versiencpp.cpp|40|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11|
Z:\8-Documentos\c\pau\versiencpp.cpp|43|error: expected primary-expression before 'do'|
Z:\8-Documentos\c\pau\versiencpp.cpp|43|error: expected '}' before 'do'|
Z:\8-Documentos\c\pau\versiencpp.cpp|43|error: expected ',' or ';' before 'do'|
Z:\8-Documentos\c\pau\versiencpp.cpp|94|error: expected '}' at end of input|
||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
Y aqui mi codigo, lo que busco es si no tienes "tienes" la llave y "abres" la puerta, no salgas del Switch ;D
/*Bibliotecas*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/*variables y constantes*/
int opcionnombreusuario;
char nombre[20];
int opcionllavepuertaventana;
int posesionllave = 0;
/*programa principal*/
int main (void)
{
/*titulo*/
printf ("Juego\n\n");
Sleep(200);
/*seleccion de nombre y confirmacion de este*/
do
{
printf ("\n\nInserte un nombre de usuario en minisculas y pulse Intro: ");
std::cin >> nombre;
fflush (stdin);
printf ("\nEntonces tu nombre es %s?" ,nombre);
printf ("\n1-Si\n2-No\n");
std::cin >> opcionnombreusuario;
fflush (stdin);
system("cls");
}
while (opcionnombreusuario != 1);
/*planteamiento llave ventana puerta*/
printf ("\nSaludos %s, bienvenido a mi lamentable aventura de texto, espero que disfrutes!", nombre);
Sleep (2000);
system("cls");
/*funcion primera pantalla para llamar en case2*/
int pantallallavespuertaventana {
/* do while para que se repita la pantalla mientras no tenga la llave */
do
{
printf("\n%s, acabas de aparecer en una habitacion extrana, puedes ver una ventana con rejas, una puerta y una llave.\nQue escojes?\n\n1-Ventana\n2-Puerta\n3-Investiga\n");
std::cin >> opcionllavepuertaventana ;
fflush (stdin);
/*Switch que da sentencias para las opciones de la primera pantalla */
switch (opcionllavepuertaventana)
{
case 1: printf ("Vaya, parece que la ventana tiene rejas, es imposible salir por aqui.");
Sleep (3000);
system ("cls");
break;
case 2: if (posesionllave != 1)
{
printf ("Que mal, parece que la cerradura necesita una llave");
Sleep (3000);
system ("cls");
pantallallavespuertaventana ();
}
if (posesionllave == 1)
{
printf ("Has abierto la puerta con la llave");
Sleep (3000);
}
break;
case 3: printf ("Investigando por el suelo te has encontrado una llave! Me pregunto como debe haber salido el que se la dejo dentro...");
posesionllave = 1;
Sleep (3000);
system ("cls");
break;
default: printf ("Escoje una opcion valida, %s", nombre);
Sleep (3000);
system ("cls");
}
}
while ((posesionllave != 1) && (opcionllavepuertaventana != 2));
printf ("Has abierto la puerta!");
}
}
Como soluciono esto?
eso es por que te has inventado una nueva estructura de control de flujo
int pantallallavespuertaventana{
/*codigo
...
...
...*/
no puedes poner esto en el código si quieres que se repita el código al llegar al caso 2 tienes que hacerlo de forma diferente, yo lo he echo de la siguiente manera
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/*variables y constantes*/
int opcionnombreusuario;
char nombre[20];
int opcionllavepuertaventana;
int posesionllave = 0;
/*programa principal*/
int main (int argc, char* argv[]){
/*titulo*/
printf ("Juego\n\n");
Sleep(200);
/*seleccion de nombre y confirmacion de este*/
do{
printf ("\n\nInserte un nombre de usuario en minisculas y pulse Intro: ");
std::cin >> nombre;
fflush (stdin);
printf ("\nEntonces tu nombre es %s?" ,nombre);
printf ("\n1-Si\n2-No\n");
std::cin >> opcionnombreusuario;
fflush (stdin);
system("cls");
}while (opcionnombreusuario != 1);
/*planteamiento llave ventana puerta*/
printf ("\nSaludos %s, bienvenido a mi lamentable aventura de texto, espero que disfrutes!", nombre);
Sleep (2000);
system("cls");
/* do while para que se repita la pantalla mientras no tenga la llave */
do{
printf("\nacabas de aparecer en una habitacion extrana, puedes ver una ventana con rejas, una puerta y una llave.\nQue escojes?\n\n1-Ventana\n2-Puerta\n3-Investiga\n");
std::cin >> opcionllavepuertaventana ;
fflush (stdin);
/*Switch que da sentencias para las opciones de la primera pantalla */
switch (opcionllavepuertaventana){
case 1: printf ("Vaya, parece que la ventana tiene rejas, es imposible salir por aqui.");
Sleep (3000);
system ("cls");
break;
case 2: if (posesionllave != 1)
{
printf ("Que mal, parece que la cerradura necesita una llave");
Sleep (3000);
system ("cls");
}
if (posesionllave == 1){
printf ("Has abierto la puerta con la llave");
Sleep (3000);
}
break;
case 3: printf ("Investigando por el suelo te has encontrado una llave! Me pregunto como debe haber salido el que se la dejo dentro...");
posesionllave = 1;
Sleep (3000);
system ("cls");
break;
default: printf ("Escoje una opcion valida, %s", nombre);
Sleep (3000);
system ("cls");
}
}while ((posesionllave != 1));
printf ("Has abierto la puerta!");
}
y me funciona perfecto
Cita de: Kenji-chan en 9 Mayo 2018, 16:59 PM
eso es por que te has inventado una nueva estructura de control de flujo
int pantallallavespuertaventana{
/*codigo
...
...
...*/
no puedes poner esto en el código si quieres que se repita el código al llegar al caso 2 tienes que hacerlo de forma diferente, yo lo he echo de la siguiente manera
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/*variables y constantes*/
int opcionnombreusuario;
char nombre[20];
int opcionllavepuertaventana;
int posesionllave = 0;
/*programa principal*/
int main (int argc, char* argv[]){
/*titulo*/
printf ("Juego\n\n");
Sleep(200);
/*seleccion de nombre y confirmacion de este*/
do{
printf ("\n\nInserte un nombre de usuario en minisculas y pulse Intro: ");
std::cin >> nombre;
fflush (stdin);
printf ("\nEntonces tu nombre es %s?" ,nombre);
printf ("\n1-Si\n2-No\n");
std::cin >> opcionnombreusuario;
fflush (stdin);
system("cls");
}while (opcionnombreusuario != 1);
/*planteamiento llave ventana puerta*/
printf ("\nSaludos %s, bienvenido a mi lamentable aventura de texto, espero que disfrutes!", nombre);
Sleep (2000);
system("cls");
/* do while para que se repita la pantalla mientras no tenga la llave */
do{
printf("\nacabas de aparecer en una habitacion extrana, puedes ver una ventana con rejas, una puerta y una llave.\nQue escojes?\n\n1-Ventana\n2-Puerta\n3-Investiga\n");
std::cin >> opcionllavepuertaventana ;
fflush (stdin);
/*Switch que da sentencias para las opciones de la primera pantalla */
switch (opcionllavepuertaventana){
case 1: printf ("Vaya, parece que la ventana tiene rejas, es imposible salir por aqui.");
Sleep (3000);
system ("cls");
break;
case 2: if (posesionllave != 1)
{
printf ("Que mal, parece que la cerradura necesita una llave");
Sleep (3000);
system ("cls");
}
if (posesionllave == 1){
printf ("Has abierto la puerta con la llave");
Sleep (3000);
}
break;
case 3: printf ("Investigando por el suelo te has encontrado una llave! Me pregunto como debe haber salido el que se la dejo dentro...");
posesionllave = 1;
Sleep (3000);
system ("cls");
break;
default: printf ("Escoje una opcion valida, %s", nombre);
Sleep (3000);
system ("cls");
}
}while ((posesionllave != 1));
printf ("Has abierto la puerta!");
}
y me funciona perfecto
Muchas gracias compañero! Voy a estudiar un poco el por qué de mi fallo! ;-)
Quiero entender por que no funcionaba.