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

[email protected]

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.

 


Paradigma Estructurado

// 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]));

}

}

 


Paradigma Basado en Objetos

[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

 

[arriba]

// 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;

}