6 may 2011

Los diferentes lenguajes y la compilación

Un lenguaje utilizado para escribir programas para computadora permite la comunicació Usuario-Máquina. Unos programas especiales llamados traductores traductores (Compilador, Interprete) convierten las instrucciones escritas en lenguajes de programación en lenguajes escritos en lenguaje máquina (0-1 bits) que ésta pueda entender.
Lenguaje Maquina. Utiliza cadenas que son cadenas binarias (Serie de caracteres de 0 y 1) escritas en código de máquina o código binario, que son directamente intelegibles por su ordenador y puede obedecer inmediatamente sin traducción alguna.
El codigo binario depende del hardware de la computadora.

Lenguaje Objeto. Lenguaje o juego de instrucciones codificado a los cuales es traducido un lenguaje fuente por medio de un compilador, el lenguaje objeto es un lenguaje maquina directamente comprensible por su ordenador.
Lenguaje de Bajo Nivel. Lenguaje básico o lenguaje en el cual cada instrucción se corresponde con un equivalente en codigo máquina, las instrucciones son una cadena de instrucciones alfabeticas.
Lenguaje de Alto Nivel. Es un lenguaje natural, están diseñados para que las personas escriban y entiendan los programas de un modo más facil a los programas escritos en lenguaje máquina. El lenguaje de Alto Nivel es portable, es decir no dependen del hardware de la PC.

Lenguaje Fuente. (Source Languaje) Un lenguaje de programación que no puede ser directamente procesado por el hardware de un ordenador y exige ser compilado y convertido en un programa objeto compuesto por instrucciones en lenguaje máquina que el ordenador pueda entender.

Compilación

La traducción de un lenguaje fuente de Alto Nivel a programas ejecutables en lenguaje máquina suele implicar más de un paso de traducción, el proceso mismo de compilación puede comprender un cierto número de pasos que traducen progresivamente el lenguaje a varias formas intermedias antes de producir el programa final.

El proceso de traducción de programas de un lenguaje a otro equivalente, que realiza un compilador se conoce como "Compilación".

3 may 2011

Convertir Número a Letras en VB

Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, cheque, etc, el cliente desea ver el monto en numeral asi como en literal.

Por ejemplo:

877866,50 = ochocientos setenta y siete mil ochocientos sesenta y seis 50/100 Bolivianos
Pues bien, la siguiente clase a la que llame NumLetra.cs realiza justamente esa operacion, esta extracomentada y trate de hacerla lo mas entendible posible. El proyecto en C#, lo llame con_NumLetraC

La logica que se utliza es la siguiente:

La clase recibe un numero ej. 123456789,50
valida este numero, si el numero no es valido devuelve NULL
Si el numero es valido segun sea este unidad, decena, centena, mil o millon,  va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea:
nuestro numero de ejemplo es 123456789,50, entonces separa en 123456789 y 50, siendo 50 nuestra parte decimal.

El  numero entero, 123456789 es clasificado = es millon, entonces llama a la funcion getMillones, esta funcion a la vez divide el numero en miles y millones
123456789 = 123 456789 donde 123 corresponde a millones y 456789 a miles
entonces la misma funcion llama a las funciones getMiles, getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades.

Espero se entienda :)


Imports System.Text.RegularExpressions

Public Class NumLetra

    Dim UNIDADES As String() = {"", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve "}
    Dim DECENAS As String() = {"diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ", "diecisiete ", "dieciocho ", "diecinueve", "veinte ", "treinta ", "cuarenta ", "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa "}
    Dim CENTENAS As String() = {"", "ciento ", "doscientos ", "trecientos ", "cuatrocientos ", "quinientos ", "seiscientos ", "setecientos ", "ochocientos ", "novecientos "}

    Dim r As Regex


    Sub NumLetra()
    End Sub

    Public Function Convertir(ByVal numero As String, ByVal mayusculas As Boolean) As String
        Dim literal As String = ""
        Dim parte_decimal As String = ""
        'si el numero utiliza (.) en lugar de (,) -> se reemplaza
        numero = Replace(numero, ".", ",")
        'si el numero no tiene parte decimal, se le agrega ,00        
        If numero.IndexOf(",") = -1 Then
            numero = numero & ",00"
        End If
        'se valida formato de entrada -> 0,00 y 999 999 999,00
        'if (Pattern.matches("\\d{1,9},\\d{1,2}", numero)) {

        r = New Regex("\d{1,9},\d{1,2}")
        Dim mc As MatchCollection = r.Matches(numero)
        If mc.Count > 0 Then
            'se divide el numero 0000000,00 -> entero y decimal
            Dim Num As String() = numero.Split(",")
            'de da formato al numero decimal
            parte_decimal = Num(1) & "/100 Bolivianos."
            'se convierte el numero a literal            
            If Num(0) = 0 Then
                literal = "cero "
            ElseIf Num(0) > 999999 Then
                literal = getMillones(Num(0))
            ElseIf Num(0) > 999 Then
                literal = getMiles(Num(0))
            ElseIf Num(0) > 99 Then
                literal = getCentenas(Num(0))
            ElseIf Num(0) > 9 Then
                literal = getDecenas(Num(0))
            Else
                literal = getUnidades(Num(0))
            End If
            'devuelve el resultado en mayusculas o minusculas
            If mayusculas Then
                Return (literal & parte_decimal).ToUpper
            Else
                Return literal & parte_decimal
            End If
        Else
            Return ""
        End If

    End Function

    ' funciones para convertir los numeros a literales

    Private Function getUnidades(ByVal numero As String) As String '1 - 9
        'si tuviera algun 0 antes se lo quita -> 09 = 9 o 009=9
        Dim num As String = numero.Substring(numero.Length - 1)
        Return UNIDADES(num)
    End Function

    Private Function getDecenas(ByVal numero As String) As String '99
        If numero < 10 Then 'para casos como -> 01 - 09
            Return getUnidades(numero)
        ElseIf numero > 19 Then 'para 20...99
            Dim u As String = getUnidades(numero)
            If u.Equals("") Then 'para 20,30,40,50,60,70,80,90
                Return DECENAS(numero.Substring(0, 1) + 8)
            Else
                Return DECENAS(numero.Substring(0, 1) + 8) & "y " & u
            End If
        Else
            Return DECENAS(numero - 10)
        End If
    End Function

    Private Function getCentenas(ByVal numero As String) As String
        If numero > 99 Then 'es centena
            If numero = 100 Then 'caso especial
                Return "cien "
            Else
                Return CENTENAS(numero.Substring(0, 1)) & getDecenas(numero.Substring(1))
            End If
        Else 'se quita el 0 antes de convertir a decenas
            Return getDecenas(numero)
        End If
    End Function


    Private Function getMiles(ByVal numero As String) As String
        'obtiene las centenas'
        Dim c As String = numero.Substring(numero.Length - 3)
        'obtiene los miles
        Dim m As String = numero.Substring(0, numero.Length - 3)
        Dim n As String = ""
        'se comprueba que miles tenga valor entero
        If m > 0 Then
            n = getCentenas(m)
            Return n & " mil " & getCentenas(c)
        Else
            Return "" & getCentenas(c)
        End If
    End Function

    Private Function getMillones(ByVal numero As String) As String
        'se obtiene los miles
        Dim miles As String = numero.Substring(numero.Length - 6)
        'millones
        Dim millon As String = numero.Substring(0, numero.Length - 6)
        Dim n As String = ""
        If millon > 9 Then
            n = getCentenas(millon) & " millones "
        Else
            n = getUnidades(millon) & " millon "
        End If
        Return n & getMiles(miles)
    End Function
End Class
 Esta clase, recibe  un numero de 0,00 a 999999999.00 en formato String, el separador decimal puede ser un punto (.) o una coma (,), ademas tiene un parametro booleano "mayusculas" el cual sea verdadero (true) o falso (false), retorna el resultado en mayusculas o minusculas, esta clase no acepta numeros negativos ni tampoco numero mayores o iguales a mil millones, aunque claro trate de escribir esta clase para que sea facilmente comprensible y asi pueda ser ampliado o modificado segun sus necesidades.

La forma de llamara a esta clase es:


Module Module1

    Sub Main()
        Dim NL As New NumLetra
        Dim a As String
        a = NL.Convertir("123456789,50", False)
        Console.WriteLine(a)

        a = NL.Convertir("4524011.50", False)
        Console.WriteLine(">" & a)

        a = NL.Convertir("999999999,50", False)
        Console.WriteLine(">" & a)

        a = NL.Convertir("001000925,50", False)
        Console.WriteLine(">" & a)

        a = NL.Convertir("0,50", True)
        Console.WriteLine(">" & a)

        a = NL.Convertir("7,50", False)
        Console.WriteLine(">" & a)

        a = NL.Convertir("69,50", True)
        Console.WriteLine(">" & a)

        a = NL.Convertir("6969,50", False)
        Console.WriteLine(">" & a)

        Console.ReadKey()
    End Sub

End Module

Y al ejecutar el proyecto tenemos:
 Puedes ver el proyecto original en java, desde aqui

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification