Ayuda con programa

Iniciado por HectorSersi, 22 Noviembre 2018, 20:37 PM

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

HectorSersi

Hola buenas, me gustaria hacer que al escoger el modo A, se abriese un archivo de texto(el que el usuario teclee) para poder leer varios numeros. El problema es que creo que ya tengo el codigo bien pero no me ejecuta y no se que hacer para poder acabarlo... por favor una ayudita.

Gracias :)

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include<ctime>
#include<conio.h>
#include<fstream>
#include<string>
#include<istream>

using namespace std;
int menu();
int abrir();


int main()
{
int modo;


modo = menu();



system("PAUSE");

return 0;
}


int menu()
{
int modo;

bool exit = false;
do {

cout << "Introduce 1 para Modo A: cada jugador estara obligado, cuando le llegue el turno, a robar un numero concreto de cartas." << endl;
cout << "Introduce 2 para Modo B: cada jugador podra robar el numero de cartas que desee y plantarse si no quiere mas." << endl;
cout << "Introducir 0 para salir del juego." << endl;
cout << endl;
cout << "Introduce el modo al que quieres jugar; 1, 2 o 0: ";
cin >> modo;


switch (modo)
{
case 1: cout << "Ha elegido el modo A" << endl; break;
case 2: cout << "Ha elegido el modo B" << endl; break;
case 0: exit = true;
default: cout << "No ha seleccionado ningun modo." << endl;
}


} while (modo < 0 || modo > 2);


system("PAUSE");


return(modo);

}


int abrir(int menu)
{
int modo;


if (modo == 1)
{


ifstream archivo;
string text, texto;

cout << "Ingrese nombre o direccion del archivo a leer: ";
getline(cin, text);
text += ".txt";

archivo.open(text.c_str(), ios::in);


if (archivo.fail()) {

cout << "No se ha podido abrir el archivo";
exit(1);

}

while (!archivo.eof())
{
getline(archivo, text);
cout << text << endl;

}

archivo.close();

_getch();


}

return (menu);
}

K-YreX

No estás usando la función <abrir>, así es imposible que funcione. Además de eso no sé si el fallo es ese o es otra cosa entonces si te sale algún error de compilación inclúyelo en el mensaje.

PD: Por favor, no usar <conio.h>, ni <system("pause")> y creo recordar que la librería <istream> no es necesaria.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

HectorSersi

Cita de: YreX-DwX en 22 Noviembre 2018, 22:28 PM
No estás usando la función <abrir>, así es imposible que funcione. Además de eso no sé si el fallo es ese o es otra cosa entonces si te sale algún error de compilación inclúyelo en el mensaje.

PD: Por favor, no usar <conio.h>, ni <system("pause")> y creo recordar que la librería <istream> no es necesaria.


Hola, gracias por responder, he quitado el system("PAUSE") y las librerias que me has dicho pero sigo sin saber como hacer para usar la funcion abir... y los errores que me salen al compilar son estos:

"El identificador getch no esta definido"
"No se encontró el identificador _getch"

K-YreX

<getch()> es una función de la librería <conio.h> pero esta librería no es estándar por eso no se recomienda su uso. Hay alternativas estándar para <getch()> como por ejemplo <cin.get()>.
Prueba a cambiar eso y me comentas. Suerte.

Edit: El <system("pause")> también puede sustituirse por <cin.get()> ya que su objetivo es hacer una pausa pero de esta manera no tienes que hacer una llamada al sistema lo cual es bastante costoso.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

HectorSersi

Cita de: YreX-DwX en 24 Noviembre 2018, 14:31 PM
<getch()> es una función de la librería <conio.h> pero esta librería no es estándar por eso no se recomienda su uso. Hay alternativas estándar para <getch()> como por ejemplo <cin.get()>.
Prueba a cambiar eso y me comentas. Suerte.

Edit: El <system("pause")> también puede sustituirse por <cin.get()> ya que su objetivo es hacer una pausa pero de esta manera no tienes que hacer una llamada al sistema lo cual es bastante costoso.


Muchas gracias, solo me queda el tema de la funcion abrir... me salen 2 errores al compilar:

"abrir" no todas las rutas de acceso de control devuelven un valor
se utilizo la variable local "modo" sin inicializar

no entiendo muy bien lo de modo.

K-YreX

El prototipo de la función <abrir> no tiene parámetros pero luego en su implementación sí tiene un parámetro de tipo <int> :huh:
Si estás haciendo cambios en el programa vuelve a mandar el código para ver como lo tienes ahora ya que no es igual que el que mandaste al principio.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

HectorSersi

Cita de: YreX-DwX en 24 Noviembre 2018, 23:17 PM
El prototipo de la función <abrir> no tiene parámetros pero luego en su implementación sí tiene un parámetro de tipo <int> :huh:
Si estás haciendo cambios en el programa vuelve a mandar el código para ver como lo tienes ahora ya que no es igual que el que mandaste al principio.

Estos son los cambios que he hecho, y los errores son los mismos del mensaje anterior.

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include<ctime>
#include<fstream>
#include<string>


using namespace std;
int menu();
int abrir();


int main()
{
int modo;


modo = menu();



system("PAUSE");

return 0;
}


int menu()
{
int modo;

bool exit = false;
do {

cout << "Introduce 1 para Modo A: cada jugador estara obligado, cuando le llegue el turno, a robar un numero concreto de cartas." << endl;
cout << "Introduce 2 para Modo B: cada jugador podra robar el numero de cartas que desee y plantarse si no quiere mas." << endl;
cout << "Introducir 0 para salir del juego." << endl;
cout << endl;
cout << "Introduce el modo al que quieres jugar; 1, 2 o 0: ";
cin >> modo;


switch (modo)
{
case 1: cout << "Ha elegido el modo A" << endl; break;
case 2: cout << "Ha elegido el modo B" << endl; break;
case 0: exit = true;
default: cout << "No ha seleccionado ningun modo." << endl;
}


} while (modo < 0 || modo > 2);


system("PAUSE");


return(modo);

}


int abrir(int menu)
{
int modo;


if (modo == 1)
{


ifstream archivo;
string text, texto;

cout << "Ingrese nombre o direccion del archivo a leer: ";
getline(cin, text);
text += ".txt";

archivo.open(text.c_str(), ios::in);


if (archivo.fail()) {

cout << "No se ha podido abrir el archivo";
exit(1);

}

while (!archivo.eof())
{
getline(archivo, text);
cout << text << endl;

}

archivo.close();

cin.get();


}

}

K-YreX

Lo primero que no sé que idea tienes en la cabeza entonces no sé por qué haces algunas de las cosas que haces:
- El prototipo de la función <abrir()> no tiene parámetros, pero la definición de la función <abrir()> tiene un parámetro de tipo <int>. :huh:
- La función <menu()> está casi bien. Si la opción es 0 cambias el valor a una variable de tipo bool que no sé cual es su utilidad.  :huh:
- Además según tú, la función <abrir()> devuelve un valor de tipo <int> y tu función no devuelve nada. :huh:
- En la función <abrir()> compruebas que la variable <modo> sea 1 pero la variable <modo> no está inicializada.  :huh: Ahí lo único que tendría un poco de sentido sería que en vez de <modo == 1> quieras hacer <menu == 1>. Pero tienes que corregirlo.
- Y por último en todo el programa no llamas a la función <abrir()>  :huh:
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

HectorSersi

#8
Cita de: YreX-DwX en 25 Noviembre 2018, 13:43 PM
Lo primero que no sé que idea tienes en la cabeza entonces no sé por qué haces algunas de las cosas que haces:
- El prototipo de la función <abrir()> no tiene parámetros, pero la definición de la función <abrir()> tiene un parámetro de tipo <int>. :huh:
- La función <menu()> está casi bien. Si la opción es 0 cambias el valor a una variable de tipo bool que no sé cual es su utilidad.  :huh:
- Además según tú, la función <abrir()> devuelve un valor de tipo <int> y tu función no devuelve nada. :huh:
- En la función <abrir()> compruebas que la variable <modo> sea 1 pero la variable <modo> no está inicializada.  :huh: Ahí lo único que tendría un poco de sentido sería que en vez de <modo == 1> quieras hacer <menu == 1>. Pero tienes que corregirlo.
- Y por último en todo el programa no llamas a la función <abrir()>  :huh:


Vale, te explico. Lo que quiero hacer es un juego de cartas. He hecho un menú y lo que quiero hacer es que al seleccionar el modo A en el menú, ponga: "Se ha seleccionado el modo A" y depues de esto se me abra el archivo de texto que tiene una serie de numeros enteros ( que son las cartas)... lo que quiero es hacer el llamamiento del double modoA del archivo de texto a esta funcion pero no se como. Se me pide que el juego use •   double modoA(ifstream & file, int numCartas)  que permite a cualquiera de los dos jugadores realizar su turno en el modo de juego A. Recibe el archivo con el mazo y el número de cartas que hay que robar, y devuelve los puntos obtenidos tras robar ese número de cartas, obtener 7,5 o pasarse. El archivo que quiero abrir se llama: text, lo digo para indicarme el que cambiar.

Necesito ayuda con el codigo(lo he cambiado y creo que esta mejor), estoy perdido... Gracias.

Código (cpp) [Seleccionar]

#include <cstdlib>
#include<ctime>
#include<fstream>
#include<string>


using namespace std;

#define HUMANO =1;
#define MAQUINA =2;

int menu();
int abrir();

void lectura(int modo);

int main()
{
int modo;

modo = menu();
lectura(modo);

system("PAUSE");

return 0;
}


int menu()
{
int modo;

bool exit = false;
do {

cout << "Introduce 1 para Modo A: cada jugador estara obligado, cuando le llegue el turno, a robar un numero concreto de cartas." << endl;
cout << "Introduce 2 para Modo B: cada jugador podra robar el numero de cartas que desee y plantarse si no quiere mas." << endl;
cout << "Introducir 0 para salir del juego." << endl;
cout << endl;
cout << "Introduce el modo al que quieres jugar: 1, 2 o 0: ";
cin >> modo;


switch (modo)
{
case 1: cout << "Ha elegido el modo A" << endl; break;
case 2: cout << "Ha elegido el modo B" << endl; break;
case 0: exit = true;
default: cout << "No ha seleccionado ningun modo." << endl;
}


} while (modo < 0 || modo > 2);


system("PAUSE");


return(modo);

}


void lectura(int modo){

ifstream archivo;
string text,texto;
cout<<"Introduce el nombre o ubicacion del archivo: "<<endl;

archivo.open(text.c_str(),ios::in); //Abrimos el archivo en modo lectura

if(archivo.fail()){
cout<<"No se pudo abrir el archivo";
exit(1);
}

while(!archivo.eof()){ //mientras no sea final del archivo
getline(archivo,texto);
cout<<texto<<endl;
}

archivo.close(); //Cerramos el archivo

}

double modoA(ifstream & archivo, int numCartas)
{








}




PD: creo que la funcion void lectura() no deberia ser tipo void, pero no estoy seguro...

K-YreX

Lo siento pero sigo sin entender el funcionamiento del programa del todo. Como ya te comenté creo:
- Usar una variable <bool exit> que es <false> y si la opción es 0 se pone a <true> no tiene mucho sentido ya que esa variable no tiene ningún propósito.
- Y sustituye los <system("pause")> por <cin.get()>. Vas a conseguir lo mismo, una pausa hasta que teclees algo pero sin tener que hacer una llamada al sistema.
- Tienes que incluir el archivo de cabecera <iostream> ya que sino no puedes usar <cin> ni <cout>.

Ahora vamos a profundizar en el código:
- La función <menu()> la entiendo. Muestras un menú, el usuario elige una opción y esa se devuelve al programa principal. Hasta ahí todo bien. No sé que uso le vas a dar pero dentro de cada <case> puedes poner todo lo que hay que hacer en caso de elegir esa opción. Pero personalmente si la función se llama menú prefiero que sólo muestre el menú y no haga más todo lo demás se haga en el <main> o en otra función creada específicamente para esa tarea.
Lo que no sé es lo que vas a hacer en la función <lectura()> entonces no sé cómo ayudarte... :-X
Supongo que la función <lectura()> llama internamente a <modoA()> usando el fichero que ha abierto. Pero qué más hace? O qué hace la función <modoA()> porque sino sería hacer otro <switch> en la función <lectura()> y según el <modo> que le pases como parámetro llame a la función <modoA()> o <modoB()> (si existe) o lo que tenga que hacer.

Tampoco sé si te mandan usar unas funciones obligatorias o lo estás estructurando cómo tú quieres porque tal y como lo estás haciendo como la opción va de un lado para otro, tienes que estar comparándola un montón de veces para ver que hacer. Si puedes dime que funciones tienes o quieres usar y que tienes en la cabeza que haga cada una (si puedes especificar parámetros o valores de retorno mejor).
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;