
Convertir un código en Visual Basic a C++ (convertidor de bases)
Publicado por José Carlos (2 intervenciones) el 12/09/2014 19:33:24
Buenas tardes. Tengo que hacer un programa en C++ que pida al usuario un número (con parte entera, parte fraccionaria o ambas), la base en la que esta ese número y la base a la que lo quiero convertir. Las bases a convertir son binario, octal, decimal y hexadecimal (2,8,10 y 16 respectivamente). Tengo este código en Visual pero tengo problemas para traducirlo.
----------------------------------------------------------------
Private Sub Boton_Convertir_Click()
Dim numero_inicial As String
Dim posicion, base_inicial As Integer
Dim base_final As Integer
Dim entero As String
Dim fraccion As String
base_inicial = Base_inicial_txt.Value
numero_inicial = numero_orig.Value
base_final = base_final_txt.Value
posicion = InStr(numero_inicial, ".")
If numero_inicial = "" Then
'mensage de error
Else
If posicion = 0 Then
entero = numero_inicial
Else
entero = Left(numero_inicial, (posicion - 1))
fraccion = Mid(numero_inicial, posicion + 1)
'obtener base 10 de fraccion
fraccion = convertir_a_base10(fraccion, base_inicial, -1)
fraccion = convertir_a_basefinal(fraccion, base_final, -1)
End If
End If
'obtener la base 10 del entero
entero = convertir_a_base10(entero, base_inicial, 0)
'Obtiene el numero desaedo en la base final
entero = convertir_a_basefinal(entero, base_final, 0)
entero_txt.Value = entero
fraccion_txt.Value = fraccion
'Resultado.Value = CStr(numero_orig.Value)
End Sub
Private Function convertir_a_base10(Num_a_Conv As String, base_dada As Integer, Es_fraccion As Boolean) As String
Dim tamano, posicion As Integer
Dim numero_base10, factor As Double
Dim digito As String
tamano = Len(Num_a_Conv)
posicion = 1
If Es_fraccion Then
potencia = -1
Else
potencia = tamano - 1
End If
For posicion = 1 To tamano Step 1
digito = Mid(Num_a_Conv, posicion, 1)
'si la base > que 10
If digito Like "[A-Z]" Then
digito = obtiene_numero(digito)
End If
factor = Val(digito) * (base_dada ^ potencia)
numero_base10 = numero_base10 + factor
potencia = potencia - 1
Next posicion
'################################### quitar
If Es_fraccion Then
fraccion10_txt.Value = numero_base10
End If
entero10_txt.Value = numero_base10
'###################################
convertir_a_base10 = numero_base10
End Function
Private Function convertir_a_basefinal(numero_base10 As String, base_final As Integer, Es_fraccion As Boolean) As String
Dim division As Double
Dim residuo As String
Dim entero As String
Dim numero_base_final As String
Dim Resultado As Double
residuo = ""
If Es_fraccion Then
' ejecutar fraccion
Resultado = Val(numero_base10)
For num_decimales = 1 To 6
Resultado = Resultado * base_final
entero = Fix(Resultado)
If entero > 9 Then
entero = obtiene_letra(entero)
End If
numero_base_final = numero_base_final + entero 'LTrim(Str(Fix(Resultado)))
Resultado = Resultado - Fix(Resultado)
Next
Else
division = Val(numero_base10)
Do While division >= base_final
residuo = division Mod base_final
If residuo > 9 Then
residuo = obtiene_letra(residuo)
End If
numero_base_final = residuo + numero_base_final
division = Fix(division / base_final)
Loop
If division > 0 Then
If division > 9 Then
numero_base_final = obtiene_letra(LTrim(Str(division))) + numero_base_final
Else
numero_base_final = LTrim(Str(division)) + numero_base_final
End If
End If
End If
convertir_a_basefinal = numero_base_final
End Function
Private Function obtiene_numero(letra As String) As String
Dim numero As String
Select Case letra
Case "A"
numero = 10
Case "B"
numero = "11"
Case "C"
numero = "12"
Case "D"
numero = "13"
Case "E"
numero = "14"
Case "F"
numero = "15"
End Select
obtiene_numero = numero
End Function
Private Function obtiene_letra(numero As String) As String
Dim letra As String
Select Case numero
Case 10
letra = "A"
Case 11
letra = "B"
Case 12
letra = "C"
Case 13
letra = "D"
Case 14
letra = "E"
Case 15
letra = "F"
End Select
obtiene_letra = letra
End Function
-----------------------------------------------------------------------------
Agradecería mucho que alguien me pudiera traducirlo.
El principal problema que tengo es la siguiente sección ya que no se como usar las equivalencias en c++.
------------------------------------------------------------------------------
posicion = InStr(numero_inicial, ".")
If numero_inicial = "" Then
'mensage de error
Else
If posicion = 0 Then
entero = numero_inicial
Else
entero = Left(numero_inicial, (posicion - 1))
fraccion = Mid(numero_inicial, posicion + 1)
'obtener base 10 de fraccion
fraccion = convertir_a_base10(fraccion, base_inicial, -1)
fraccion = convertir_a_basefinal(fraccion, base_final, -1)
End If
End If
---------------------------------------------------------------------------------
Apenas llevo una pequeña sección traducida (mal traducida), pero estoy trabado con la identificación del "." en el número que el usuario le da.
---------------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
void main ()
{
//Declaracion de variables
char* numeroi[1],
entero[100],
decimal[100];
int basei = 0,
basef = 0,
posicion = 0,
i = 0;
//Datos de entrada
while ( basei != 2 && basei != 8 && basei != 10 && basei != 16 )
{
printf ("Dame la base inicial:");
scanf ("%i", &basei);
}
while ( basei != 2 && basei != 8 && basei != 10 && basei != 16 )
{
printf ("Dame la base final: ");
scanf ("%i", &basef);
}
printf ("Dame el numero a convertir: ");
scanf ("%s", &numeroi);
for ( i = 0 ; i<strlen(numeroi) ; i++)
{
if ( numeroi[i] == '.')
{
entero = numeroi.substrc(0,i);
printf ("%s", entero);
}
}
//Proceso
//Datos de salida
//Fin del programa
puts ("Fin del programa V1");
scanf ("%");
}
---------------------------------------------------------------------------------
Finalmente, me urge bastante ya que lo tengo que entregar la siguiente semana. Poco tiempo, mucha batalla para tener el código en Basic.
Muchas gracias.
----------------------------------------------------------------
Private Sub Boton_Convertir_Click()
Dim numero_inicial As String
Dim posicion, base_inicial As Integer
Dim base_final As Integer
Dim entero As String
Dim fraccion As String
base_inicial = Base_inicial_txt.Value
numero_inicial = numero_orig.Value
base_final = base_final_txt.Value
posicion = InStr(numero_inicial, ".")
If numero_inicial = "" Then
'mensage de error
Else
If posicion = 0 Then
entero = numero_inicial
Else
entero = Left(numero_inicial, (posicion - 1))
fraccion = Mid(numero_inicial, posicion + 1)
'obtener base 10 de fraccion
fraccion = convertir_a_base10(fraccion, base_inicial, -1)
fraccion = convertir_a_basefinal(fraccion, base_final, -1)
End If
End If
'obtener la base 10 del entero
entero = convertir_a_base10(entero, base_inicial, 0)
'Obtiene el numero desaedo en la base final
entero = convertir_a_basefinal(entero, base_final, 0)
entero_txt.Value = entero
fraccion_txt.Value = fraccion
'Resultado.Value = CStr(numero_orig.Value)
End Sub
Private Function convertir_a_base10(Num_a_Conv As String, base_dada As Integer, Es_fraccion As Boolean) As String
Dim tamano, posicion As Integer
Dim numero_base10, factor As Double
Dim digito As String
tamano = Len(Num_a_Conv)
posicion = 1
If Es_fraccion Then
potencia = -1
Else
potencia = tamano - 1
End If
For posicion = 1 To tamano Step 1
digito = Mid(Num_a_Conv, posicion, 1)
'si la base > que 10
If digito Like "[A-Z]" Then
digito = obtiene_numero(digito)
End If
factor = Val(digito) * (base_dada ^ potencia)
numero_base10 = numero_base10 + factor
potencia = potencia - 1
Next posicion
'################################### quitar
If Es_fraccion Then
fraccion10_txt.Value = numero_base10
End If
entero10_txt.Value = numero_base10
'###################################
convertir_a_base10 = numero_base10
End Function
Private Function convertir_a_basefinal(numero_base10 As String, base_final As Integer, Es_fraccion As Boolean) As String
Dim division As Double
Dim residuo As String
Dim entero As String
Dim numero_base_final As String
Dim Resultado As Double
residuo = ""
If Es_fraccion Then
' ejecutar fraccion
Resultado = Val(numero_base10)
For num_decimales = 1 To 6
Resultado = Resultado * base_final
entero = Fix(Resultado)
If entero > 9 Then
entero = obtiene_letra(entero)
End If
numero_base_final = numero_base_final + entero 'LTrim(Str(Fix(Resultado)))
Resultado = Resultado - Fix(Resultado)
Next
Else
division = Val(numero_base10)
Do While division >= base_final
residuo = division Mod base_final
If residuo > 9 Then
residuo = obtiene_letra(residuo)
End If
numero_base_final = residuo + numero_base_final
division = Fix(division / base_final)
Loop
If division > 0 Then
If division > 9 Then
numero_base_final = obtiene_letra(LTrim(Str(division))) + numero_base_final
Else
numero_base_final = LTrim(Str(division)) + numero_base_final
End If
End If
End If
convertir_a_basefinal = numero_base_final
End Function
Private Function obtiene_numero(letra As String) As String
Dim numero As String
Select Case letra
Case "A"
numero = 10
Case "B"
numero = "11"
Case "C"
numero = "12"
Case "D"
numero = "13"
Case "E"
numero = "14"
Case "F"
numero = "15"
End Select
obtiene_numero = numero
End Function
Private Function obtiene_letra(numero As String) As String
Dim letra As String
Select Case numero
Case 10
letra = "A"
Case 11
letra = "B"
Case 12
letra = "C"
Case 13
letra = "D"
Case 14
letra = "E"
Case 15
letra = "F"
End Select
obtiene_letra = letra
End Function
-----------------------------------------------------------------------------
Agradecería mucho que alguien me pudiera traducirlo.
El principal problema que tengo es la siguiente sección ya que no se como usar las equivalencias en c++.
------------------------------------------------------------------------------
posicion = InStr(numero_inicial, ".")
If numero_inicial = "" Then
'mensage de error
Else
If posicion = 0 Then
entero = numero_inicial
Else
entero = Left(numero_inicial, (posicion - 1))
fraccion = Mid(numero_inicial, posicion + 1)
'obtener base 10 de fraccion
fraccion = convertir_a_base10(fraccion, base_inicial, -1)
fraccion = convertir_a_basefinal(fraccion, base_final, -1)
End If
End If
---------------------------------------------------------------------------------
Apenas llevo una pequeña sección traducida (mal traducida), pero estoy trabado con la identificación del "." en el número que el usuario le da.
---------------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
void main ()
{
//Declaracion de variables
char* numeroi[1],
entero[100],
decimal[100];
int basei = 0,
basef = 0,
posicion = 0,
i = 0;
//Datos de entrada
while ( basei != 2 && basei != 8 && basei != 10 && basei != 16 )
{
printf ("Dame la base inicial:");
scanf ("%i", &basei);
}
while ( basei != 2 && basei != 8 && basei != 10 && basei != 16 )
{
printf ("Dame la base final: ");
scanf ("%i", &basef);
}
printf ("Dame el numero a convertir: ");
scanf ("%s", &numeroi);
for ( i = 0 ; i<strlen(numeroi) ; i++)
{
if ( numeroi[i] == '.')
{
entero = numeroi.substrc(0,i);
printf ("%s", entero);
}
}
//Proceso
//Datos de salida
//Fin del programa
puts ("Fin del programa V1");
scanf ("%");
}
---------------------------------------------------------------------------------
Finalmente, me urge bastante ya que lo tengo que entregar la siguiente semana. Poco tiempo, mucha batalla para tener el código en Basic.
Muchas gracias.
Valora esta pregunta


0