Dev - C++ - Convertir un código en Visual Basic a C++ (convertidor de bases)

 
Vista:
sin imagen de perfil

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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Convertir un código en Visual Basic a C++ (convertidor de bases)

Publicado por José Carlos (2 intervenciones) el 12/09/2014 20:02:08
Por cierto y si alguien está interesado: no puedo usar nada muy complicado. Switches, cases, strings, etc. si, lo más básico posible.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Convertir un código en Visual Basic a C++ (convertidor de bases)

Publicado por martin (1 intervención) el 25/02/2022 17:51:38
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

char *invertir(char*cadena) {
int longitud = strlen(cadena);
char temporal;
for (int izquierda = 0, derecha = longitud - 1; izquierda < (longitud / 2);
izquierda++, derecha--) {
temporal = cadena[izquierda];
cadena[izquierda] = cadena[derecha];
cadena[derecha] = temporal;
}
return cadena;
}

char*convertido(char*convertidor){
int i;


for(i=0;i<strlen(convertidor);i++){

if(convertidor[i]=='1')
convertidor[i]='a';
if(convertidor[i]=='2')
convertidor[i]='e';
if(convertidor[i]=='3')
convertidor[i]='i';
if(convertidor[i]=='4')
convertidor[i]='o';
if(convertidor[i]=='5')
convertidor[i]='u';
}

return convertidor;
}




int main(void) {
char delimitador[] = " ";
const char* filename = "mensaje.txt";
char *token;

FILE* input_file = fopen(filename, "r");
if (!input_file)
exit(EXIT_FAILURE);

char *contents = NULL;
size_t len = 0;











printf("mensaje decifrado : \n");
while (getline(&contents, &len, input_file) != -1){
token = strtok(contents, delimitador);
token=invertir(token);
token=convertido(token);

if(token != NULL){
while(token != NULL){
// Sólo en la primera pasamos la cadena; en las siguientes pasamos NULL
printf(" %s ", token);
token = strtok(NULL, delimitador);
if(token!=NULL){
token=invertir(token);
token=convertido(token);

}
//printf("\n");
}
}

//printf("%s", contents);
}

fclose(input_file);
free(contents);

exit(EXIT_SUCCESS);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar