Presento proyecto, Conversor a euro

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Kainz
Mensajes: 21
Registrado: 03/05/2011 7:43 am

Presento proyecto, Conversor a euro

#1 Mensaje por Kainz » 06/05/2011 3:49 pm

Bueno, pues por fin he terminado este codigo y aqui les dejo mi programa:
Un conversor de varias monedas a euro, disponible en Ingles y Español, las monedas son:
-Dolar
-Kaks Krooni (Estonia)
-Bolivar
-Pesos Uruguayos
-Pesos (Mexicanos)
-Libra Egipcia
-Rupia India
-Real Brasileño

Hecho totalmente por mi es mi "autoevaluacion", y bueno ya que funciona, pues se lo dejo por si lo quieren.

Por supuesto es más que gratis y de codigo abierto, solo pido dos cosas:
-No me pongan verde con que el que codigo es muy largo o mal escrito

-Cualquier modificacion me avisen.
Espero les sirva, para lo que sea. Un saludo.

http://mygnet.net/it/descargas/codigos/ ... o.3398.zip

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#2 Mensaje por polly » 07/05/2011 4:52 am

No te pondré verde, pero supongo que querrás críticas:

1.- Duplicas funciones solo para cambiar de idioma. Deberías tener las cadenas en distintos idiomas en un fichero externo (o como constantes) y mantener una sola versión de tus funciones.

2.- Además tus funciones no tienen parámetros de entrada y salida. Por tanto no serán generales. Lees los datos (una y otra vez) dentro de cada función. Plantéate leerlos fuera y dejar a las funciones que hagan lo que se suponen que tienen que hacer y nada más. Ejmplo:

Código: Seleccionar todo

double pesos_a_euros(float cantidad) {
    return  cantidad*CONSTANTE;
}
Donde CONSTANTE es eso, una constante que especifica el factor de conversión.

3.- Puedes usar un switch-case para elegir las monedas...

4.- Aunque no sea imprescindible ... puedes pasar de conio, de gotoxy y de clrscr().


PD: puedes incluso hacerlo en pocas líneas, si te interesa, con el tema de punteros a funciones.

S2

Kainz
Mensajes: 21
Registrado: 03/05/2011 7:43 am

#3 Mensaje por Kainz » 07/05/2011 1:54 pm

polly escribió:No te pondré verde, pero supongo que querrás críticas:

1.- Duplicas funciones solo para cambiar de idioma. Deberías tener las cadenas en distintos idiomas en un fichero externo (o como constantes) y mantener una sola versión de tus funciones.

2.- Además tus funciones no tienen parámetros de entrada y salida. Por tanto no serán generales. Lees los datos (una y otra vez) dentro de cada función. Plantéate leerlos fuera y dejar a las funciones que hagan lo que se suponen que tienen que hacer y nada más. Ejmplo:

Código: Seleccionar todo

double pesos_a_euros(float cantidad) {
    return  cantidad*CONSTANTE;
}
Donde CONSTANTE es eso, una constante que especifica el factor de conversión.

3.- Puedes usar un switch-case para elegir las monedas...

4.- Aunque no sea imprescindible ... puedes pasar de conio, de gotoxy y de clrscr().


PD: puedes incluso hacerlo en pocas líneas, si te interesa, con el tema de punteros a funciones.

S2
no me gusta lo que voy a decir, pero en cuanto e leido lo tuyo me he quedado con cara de poker.

1.- Duplicas funciones solo para cambiar de idioma. Deberías tener las cadenas en distintos idiomas en un fichero externo (o como constantes) y mantener una sola versión de tus funciones.

Eso si lo he entendido, pero dicen que se necesita un linkeador o algo a si ¿no?

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#4 Mensaje por polly » 07/05/2011 2:11 pm

No es necesario. Simplemente lee el fichero de texto y almacena las lineas en un array. Suponiendo que esten ordenadas, puedes usarlas donde quieras.

S2

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#5 Mensaje por rir3760 » 07/05/2011 4:42 pm

Lo primero: muevo el tema al foro apropiado, Principiantes C/C++.

No es mi intencion desanimarte pero el programa si es demasiado largo, esto porque estas tratando de avanzar demasiado rapido y, como resultado, todavia no manejas ciertas caracteristicas del lenguaje que (eventualmente) te haran la vida mucho mas facil.

El programa de su tamaño original (286 lineas sin espaciado) se puede reducir bastante (95 lineas contando el espaciado) con la funcion principal ocupando solo 27 lineas. Se puede reducir un poco mas, es cuestion de buscarle con mas calma y detalle.

El programa:

Código: Seleccionar todo

#include <iostream>

using namespace::std;

char *msj[][5] = {
	{
		"Ha elegido Español", 
		"Selecciona la moneda que deseas pasar a Euro",
		
		"1.-Dolar(EE.UU.)\n2.-Kaks Krooni(Estonia-No utilizada)\n3.-Bolivar(Venezuela)\n"
		"4.-Pesos Uruguayos(Uruguay)\n5.-Peso Mexicano(Mexico)\n6.-Libra Egipcia(Egipto)\n"
		"7.-Rupia India(India, Pakistan, Sri Lanka, Nepal, Mauricio, Seychelles)\n8.-Real Brasileño(Brasil)", 
		
		"Ingrese la cantidad en ", 
		"Usted tiene "
	}, 
	
	{
		"You have choosen English", 
		"Select the currency you want to convert to Euro",
		
		"1.-Dolar(USA)\n2.-Kaks Krooni(Estonia-No used)\n3.-Bolivares(Venezuela)\n"
		"4.-Paraguayan Pesos(Paraguay)\n5.-Pesos(Mexico)\n6.-Egiptian Pound(Egipt)\n"
		"7.-Indian Rupees(India, Pakistan, Sri Lanka, Nepal, Mauricio, Seychelles)\n8.-Brasilians Reales(Brazil)", 
		
		"Put the amount in ", 
		"You have "
	}
};

char *nombre[][8] = {
	{
		"dolar", 
		"Kaks Krooni", 
		"bolivares", 
		"Pesos uruguayos", 
		"Pesos mexicanos", 
		"Libras egipcias", 
		"Rupias", 
		"Reales del Brasil"
	}, 
	
	{
		"dollars",
		"Kaks Krooni",
		"Bolivares",
		"Uruguayan pesos",
		"Mexican Pesos",
		"Egiptian Pounds",
		"Rupees",
		"Brasilians Reales"
	}
};

double conv[] = {
	0.68,		// Dolar
	0.06,		// Kaks Krooni
	0.16,		// Bolivar
	0.034,	// Pesos uruguayos
	0.05,		// Pesos Mexicanos
	0.11,		// Libra Egipcia
	0.015,	// Rupias
	0.43		// Real Brasil
};


int main()
{
    int lang;
	int tipo_moneda;
	double cantidad;
	
	cout << "Bienvenido al Conversor de Monedas/Welcome to money conversor" << endl;
	cout << "Por Alejandro Martinez" << endl;
	cout << "Elija Opcion/Chose an option: " << endl;
	cout << "1.-Español" << endl << "2.-English" << endl;
	if (!(cin >> lang) || lang < 1 || lang > 2)
		return 1;
	lang--;
	
	for (int i = 0; i < 3; i++)
		cout << msj[lang][i] << endl;
	if (!(cin >> tipo_moneda) || tipo_moneda < 1 || tipo_moneda > 8)
		return 1;
	tipo_moneda--;
	
	cout << msj[lang][3] << nombre[lang][tipo_moneda] << ": ";
	if (!(cin >> cantidad))
		return 1;
	
	cout << msj[lang][4] << (cantidad * conv[tipo_moneda]) << " euros" << endl;
	
	return 0;
}
De nuevo el consejo: ve paso a paso en tu aprendizaje de C++, parece lento y aburrido pero al final las cosas (como este programa) te seran mucho mas faciles.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Kainz
Mensajes: 21
Registrado: 03/05/2011 7:43 am

#6 Mensaje por Kainz » 08/05/2011 9:01 am

----
Editado por el moderador (rir3760): por favor cuando respondas en el tema NO cites el mensaje anterior completo (no tiene caso).
----

Si la verdad es que voy un poco rapido (es mas, ya quiero aprender SDL), intentare seguir con el c solo, pero no se por donde seguir

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#7 Mensaje por rir3760 » 08/05/2011 10:05 am

Supongo te refieres a C++, ¿Correcto?

En la seccion "Cursos" de este sitio hay algunas recomendaciones (el libro de Bruce Eckel entre otros).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#8 Mensaje por untio » 09/05/2011 8:37 am

Hola,
He leído este post y os voy a comentar un poco el problema que me encuentro a nivel personal:

Cuando hago un programa, las cadenas las defino así:

#define CASTELLANO
//#define INGLES

#ifdef CASTELLANO
#define SZCADENATITULO "Mi programa y número de versión"
#elif INGLES
#define SZCADENATITULO "My program and version number"
#endif
-----------------------------------------
Después lo uso:
printf("%s", SZCADENATITULO);
-----------------------------------------
La duda que me asalta en este momento es que estoy pensando en poner todas las cadenas de cada idioma en un fichero de texto y cargarlas en tiempo de ejecución.
Pero el lío con el que me encuentro es que con mis ejecutables incluyo, cada vez más, dlls. Son dlls pensadas para funcionar con más de un ejecutable y ahí está el lío.
Me parece excesivo crear un fichero con las cadenas para el ejecutable y otro para cada dll.
Por otra parte, también he pensado en crear un sólo fichero de texto y asignar ciertos ids para las dlls, pero también le veo defectos.

En fin, a ver si me podéis comentar alguna solución óptima.

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#9 Mensaje por rir3760 » 09/05/2011 3:42 pm

untio escribió:La duda que me asalta en este momento es que estoy pensando en poner todas las cadenas de cada idioma en un fichero de texto y cargarlas en tiempo de ejecución.
Pero el lío con el que me encuentro es que con mis ejecutables incluyo, cada vez más, dlls. Son dlls pensadas para funcionar con más de un ejecutable y ahí está el lío.
Me parece excesivo crear un fichero con las cadenas para el ejecutable y otro para cada dll.
Mi manejo de Win32 esta muy oxidado asi que toma lo siguiente con sus reservas ...

Hasta donde recuerdo (y revisando por segundos la Internet) puedes colocar todas las cadenas (resource strings) en una DLL y que sea esta el contenedor para tus programas.

Dos paginas de interes:
About Resource Files
Creating a Resource-Only DLL

Espero te sean de utilidad.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#10 Mensaje por untio » 10/05/2011 2:38 am

Hola,
Gracias por contestar.
El problema es que debería crear una dll con las cadenas de texto para el ejecutable y otra para cada dll.
Creo que al final pondré la directa y crearé un fichero de texto para el ejecutable y otro para cada dll.
Además, de ese modo, dejo abierta la posibilidad de que alguien los traduzca y me envíe la traducción.

De nuevo gracias por contestar.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados