Saludos Programadores de Todos los Confines del Universo
Deseo entregar como un legado a la comunidad de programadores un pequeño pero significativo aporte.
Programa que convierte números a letras
Cualquier sugerencia, comentario o sugerencia hacérmela saber a
Los programas fueron hecho en C y C++ y probados en Turbo C++ 3.0.
El primero está hecho bajo el paradigma estructurado o sea que es un solo programa.
El segundo bajo el paradigma orientado a objetos. Donde primero se escribe la cabecera y se definen primero los miembros y el archivo CPP donde se escribe la puesta en práctica.
A cualquiera que los quiera usar o modificar o distribuir tiene mi consentimiento para hacerlo.
// Programa que convierte n£meros a letras
// Elaborado por [email protected]
// Este programa puede ser distribuido, copiado, modificado y mejorado
// sin ninguna restricci¢n
#include <iostream.h>
#include <signal.h>
#include <stdlib.h>
#define MILLON 1000000
#define MIL 1000
#define CIEN 100
#define DIEZ 10
// Esta funci¢n regresa una parte de la cadena
char *enletras(int indice1, int indice2) {
char *numeros[]={"un","uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve"};
char *dieces[]={"once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve"};
char *decenas[]={"diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa"};
char *centenas[]={"cien", "doscientos", "trescientos", "cuatrocientos","quinientos", "seiscientos" ,"setecientos","ochocientos" ,"novecientos"};
char *millares[]={"mil", "mill¢n", "millones"};
switch(indice2) {
case 0: return numeros[indice1];
case 1: return dieces[indice1];
case 2: return decenas[indice1];
case 3: return centenas[indice1];
}
return millares[indice1];
}
// Funci¢n de utiler¡a para los millares, relacionada con funci¢n enletras
void millares(const int a_numerode, const int indice) {
int indice2=0, indice3=0;
if(indice == 0) indice3 = 0;
else {indice2 = 2; indice3 = 1;}
if(a_numerode > 1) cout << " " << enletras(indice2,4);
else cout << enletras(0,0) << " " << enletras(indice3,4);
}
// Hace la llamada a funci¢n enletras
void i_enletras(const long a_numerode) {
if(a_numerode == 1) cout << " " << enletras(a_numerode,0);
else if(a_numerode > 1 && a_numerode < 10) cout << " " << enletras(a_numerode,0);
else if(a_numerode > 10 && a_numerode < 20) cout << " " << enletras(a_numerode % DIEZ - 1,1);
else if((a_numerode % DIEZ) == 0 && a_numerode < CIEN) cout << " " << enletras((a_numerode/DIEZ)-1,2);
else if((a_numerode % CIEN) == 0 && a_numerode < MIL) {
cout << " " << enletras((a_numerode/CIEN)-1,3);
if(a_numerode==100) cout << "to ";
}
else if((a_numerode % MIL) == 0 && a_numerode < MILLON) millares(a_numerode / MIL,0);
else if((a_numerode % MILLON) == 0) millares(a_numerode / MILLON,1);
}
// Resta a la cantidad para seguir con el ciclo de evaluaci¢n
void residuo(long *cantidad, const long valor) {
i_enletras(*cantidad-(*cantidad % valor));
*cantidad = *cantidad % valor;
}
// Funci¢n principal de evaluaci¢n
void imprimir(long a_cantidad) {
if(a_cantidad < 1 || a_cantidad > 2147483647) raise(SIGFPE); // Desbordamiento
while(a_cantidad > 0) {
if(a_cantidad >= MILLON) {
if(a_cantidad/MILLON > 1) { imprimir (a_cantidad/MILLON); } // --> Recursi¢n
residuo(&a_cantidad, MILLON);
}
else if(a_cantidad >= MIL) {
if(a_cantidad/MIL > 1) { imprimir (a_cantidad/MIL); } // --> Recursi¢n
residuo(&a_cantidad, MIL);
}
else if(a_cantidad >= CIEN) {
residuo(&a_cantidad, CIEN);
}
else if(a_cantidad == DIEZ || a_cantidad > 19) {
residuo(&a_cantidad, DIEZ);
if(a_cantidad > 0) cout << " y";
}
else
residuo(&a_cantidad, a_cantidad);
}
}
void mensaje_error(int error) {
cout << "Error " << error << "\n" ;
cout << "N£mero fuera de rango, introduzca un valor entre 1 y 2,147,483,647";
exit(EXIT_SUCCESS);
}
void main(int argc, char *argv[]) {
if(argc > 2) cout << "Demasiados par metros\n\n"
<< "Sint xis: monedas [cantidad]\n"
<< "cantidad es un n£mero no mayor de 2,147,483,647";
else {
signal(SIGFPE, mensaje_error);
cout << "\n\nLa cantidad es:" << argv[1] << "\nLa cadena es: \n";
imprimir(atol(argv[1]));
}
}
[Cabecera] [Puesta en Práctica]
[arriba]// Archivo de cabecera monedas.h
// Hecho por [email protected]#ifndef monedas_h
#define monedas_h
class monedas {
public:
monedas(void); // Constructor
void m_establecer_valor(long); // Establecer valor v lido
private:
// Funciones de utiler¡a para la clase monedas
void m_imprimir(long); // Funci¢n principal
char *m_c_enletras(const int, const int);
void i_enletras(const long);
void m_millares(const int, const int);
void m_residuo(long*, const long);
};
#endif
// Puesta en práctica de la clase monedas
// Hecho por [email protected]#include "monedas.h"
#include <iostream.h>
#include <stdlib.h>
#define MILLON 1000000
#define MIL 1000
#define CIEN 100
#define DIEZ 10
// Constructor de clase monedas
monedas::monedas(void) { cout <<"\n\nLa cantidad es: ";}
// Funciones miembros p£blicas de clase monedas
void monedas::m_establecer_valor(long cantidad) {
if(cantidad < 1 || cantidad > 2147483647) { // Desbordamiento ?
cout << "Par metro no v lido -->[" << cantidad << "]\n"
<< "Valor debe ser mayor que 0 y menor que 2,147,483,647";
}
else {
cout << cantidad << "\n";
m_imprimir(cantidad);
}
}
// Funciones miembros privadas de clase monedas
void monedas::m_imprimir(long cantidad) {
while(cantidad > 0) {
if(cantidad >= MILLON) {
if(cantidad/MILLON > 1) { m_imprimir(cantidad / MILLON); } // --> Recursi¢n
m_residuo(&cantidad, MILLON);
}
else if(cantidad >= MIL) {
if(cantidad/MIL > 1) { m_imprimir(cantidad / MIL); } // --> Recursi¢n
m_residuo(&cantidad, MIL);
}
else if(cantidad >= CIEN) {
m_residuo(&cantidad, CIEN);
}
else if(cantidad == DIEZ || cantidad > 19) {
m_residuo(&cantidad, DIEZ);
if(cantidad > 0) cout << " y";
}
else
m_residuo(&cantidad, cantidad);
}
}
char *monedas::m_c_enletras(const int indice1, const int indice2) {
char *numeros[]={"un","uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve"};
char *dieces[]={"once", "doce", "trece", "catorce", "quince", "dieciseis", "diecisiete", "dieciocho", "diecinueve"};
char *decenas[]={"diez", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa"};
char *centenas[]={"cien", "doscientos", "trescientos", "cuatrocientos","quinientos", "seiscientos" ,"setecientos","ochocientos" ,"novecientos"};
char *millares[]={"mil", "mill¢n", "millones"};
switch(indice2) {
case 0: return numeros[indice1];
case 1: return dieces[indice1];
case 2: return decenas[indice1];
case 3: return centenas[indice1];
}
return millares[indice1];
}
void monedas::i_enletras(const long numerode) {
if(numerode == 1) cout << " " << m_c_enletras(numerode,0);
else if(numerode > 1 && numerode < 10) cout << " " << m_c_enletras(numerode,0);
else if(numerode > 10 && numerode < 20) cout << " " << m_c_enletras(numerode % DIEZ - 1,1);
else if((numerode % DIEZ) == 0 && numerode < CIEN) cout << " " << m_c_enletras((numerode/DIEZ)-1,2);
else if((numerode % CIEN) == 0 && numerode < MIL) {
cout << " " << m_c_enletras((numerode/CIEN)-1,3);
if(numerode==100) cout << "to ";
}
else if((numerode % MIL) == 0 && numerode < MILLON) m_millares(numerode / MIL,0);
else if((numerode % MILLON) == 0) m_millares(numerode / MILLON,1);
}
void monedas::m_millares(const int numerode, const int indice) {
int indice2=0, indice3=0;
if(indice == 0) indice3 = 0;
else {indice2 = 2; indice3 = 1;}
if(numerode > 1) cout << " " << m_c_enletras(indice2,4);
else cout << m_c_enletras(0,0) << " " << m_c_enletras(indice3,4);
}
void monedas::m_residuo(long *cantidad, const long valor) {
i_enletras(*cantidad-(*cantidad % valor));
*cantidad = *cantidad % valor;
}