[vbs] traduciendo un lio

Iniciado por flacc, 17 Noviembre 2010, 18:25 PM

0 Miembros y 1 Visitante están viendo este tema.

flacc

Hola, pues veran, hace un tiempo hice un programa para calcular la suma factorial o como se llame, en esos tiempos no tenia para un calculadora, y entre todos en el foro de c me ayudaron a hacerla en versión estandar, en ese tiempo estaba aprendiendo c y lo ise pensando en practicar whiley do while, ahora que estaba leyendo un manual de vbs, me dispuse a traducirlo desde el original ocupando la sentencia if, pero no me da...ojala me puedan ayudar, no logro ver en que fallo...


La versión vbs:

Código (vb) [Seleccionar]
Option Explicit
Dim n, k, nf, kf, resta, restaf, x, y

n = InputBox("Ingrese n" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7") 'ingreso de n y k
k = InputBox("Ingrese k" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7")

nf = 1
kf = 1
resta = n - k
restaf = 1

if n > 1 Then 'factorial de n
nf = nf * n
n = n - 1
End if

if k > 1 Then 'factorial de k
kf = kf * k
k = k - 1
End if


'calculando NCR

if resta > 1 Then
restaf = restaf * resta
resta = resta - 1
End if

x = kf * restaf
y = nf / x


'resultados

Dim var1
var1 = MsgBox("n factorial: " &nf &vbCrLf &"k factorial: " &kf &vbCrLf &"(n - k)! = " &restaf &vbCrLf &"k! * (n - k)! = " &x &vbCrLf &"n! / [k! (n - k)!] = " &y &vbCrLf &vbCrLf &"Resultado final: " &y,0,"NCR Calculator 1.0.7")


y aqui la versión original no estandar en c:


#include <stdio.h>
#include <stdlib.h>
#include <conio2.h>

int main(int argc, char *argv[])
{
 signed long n, k, nf, kf, resta, resta_f, x, y;
 for ( ; 1 ; ) /* bucle infinito */
 {
        gotoxy(17,1);
        printf("NCR calculator v.1.0.5 by mini_nauta@hotmail.com \n");
        gotoxy(30,3);
        printf("foro.elhacker.net\n");
        gotoxy(1,6);
        printf( "ingrese n y k\n" ); /* ingreso de n y k */
        scanf( "%d %d", &n, &k);
        nf = 1;
        kf = 1;
        resta = n - k;
        resta_f = 1;
        do /* factorial de n*/
        {
              nf = nf * n;
              n--;
              } while (n > 1);
        while (k > 1) /* factorial de k*/
        {
              kf = kf * k;
              k--;
              }
        /* calculando ncr*/
        while (resta > 1)
        {
              resta_f = resta_f * resta;
              resta--;
              }
        x = kf * resta_f;
        y = (float)nf / (float)x;
        /*resultados*/
        printf("n factorial: %d\n"
                 "k factorial: %d\n"
                 "(n - k)! = %d\n"
                 "k! * (n - k)! = %d\n"
                 "n! / [k! (n - k)!] = %d\n"
                 "--------------------------\n"
                 "resultado final(ncr): %d\n",nf, kf, resta_f, x, y, y);
        getch();
        clrscr();
        }
 return 0;
}


Si se fijan en c la hice así para practicar la sentencia do while y while, y aclarar que no soy un master del c, solo practicaba lo aprendido y que mejor si me hacia de una calculadora para ncr o suma factorial o como se llame.... y de practica me dispuse a traducirlo a vbs, el problema es que como en c me da el resultado perfecto, no así en vbs, da todo mal, no se que es, lo ise todo como se hacerlo y no me da... ojala ustedes vean el error...saludoss y gracias

Novlucker

Los inputbox devuelven un string, si sumas strings da cero, debes de convertir a valores usando CInt(texto)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

flacc

aaa... voy a probar a ver si funka

flacc

#3
Oyr Novlucker gracais por la auda pero me da error, el code actual es así(fragmento)

Código (vb) [Seleccionar]
n = InputBox("Ingrese n" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7") 'ingreso de n y k
k = InputBox("Ingrese k" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7")


CInt(n) 'conversión a enteros
CInt(k)


pero da error, dice " La variable utiliza un tipo de automatización no aceptado en CInt" codigo 800A01CA

si me pudieras dar una mano porfis...gracias

Novlucker

Código (vb) [Seleccionar]
n = InputBox("Ingrese n" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7")
a = cint(n)

'Segunda y mejor opcion

n = cint(InputBox("Ingrese n" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7"))


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

flacc

#5
si me di cuenta, estaba por responder que habia allado la solución, una pregunta, como le haces para poner en color el codigo, porque con code=vbs no sirve... pero me sigue dando lo mismo...  este es el code con CInt

Código (vb) [Seleccionar]
Option Explicit
Dim n, k, nf, kf, resta, restaf, x, y

n = CInt(InputBox("Ingrese n" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7")) 'ingreso de n y k
k = CInt(InputBox("Ingrese k" &vbCrLf& "(Solo valores numericos)", "NCR Calculator 1.0.7"))

nf = 1
kf = 1
resta = n - k
restaf = 1

if n > 1 Then 'factorial de n
nf = nf * n
n = n - 1
End if

if k > 1 Then 'factorial de k
kf = kf * k
k = k - 1
End if


'calculando NCR

if resta > 1 Then
restaf = restaf * resta
resta = resta - 1
End if

x = kf * restaf
y = nf / x


'resultados

Dim var1
var1 = MsgBox("n factorial: " &nf &vbCrLf &"k factorial: " &kf &vbCrLf &"(n - k)! = " &restaf &vbCrLf &"k! * (n - k)! = " &x &vbCrLf &"n! / [k! (n - k)!] = " &y &vbCrLf &vbCrLf &"Resultado final: " &y,0,"NCR Calculator 1.0.7")


me sigue dando los mismos resultados que sin CInt... ni idea de porque...

Novlucker

No había prestado suficiente atención a tu código :silbar:

Código (vb) [Seleccionar]
if n > 1 Then 'factorial de n
nf = nf * n
n = n - 1
End if

Donde hay un while ahí? El problema es que eso pasa solo una vez, así que como multiplicas por el primer valor de nf, el cual es 1, siempre da el mismo número que has ingresado :P (igual para el k)

Por cierto, no hay etiqueta de vbs, pero si de VB, y sintacticamente son iguales

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

flacc

#7
A con razon, pero eso significaría que yo al usar do while y while solo por practicar lo ise sin querer bien, entonces que lo que paso fue un error fortuito  :laugh: :laugh: ;-) ;-), interesante, nunca se me habría pasado por la cabeza, para mi era lo mismo usar while que if o for, aunque me cuestionaba el que pasaría si lo isiera de otra forma... primeramente el code hecho en era con if else, despues de largas horas de lectura cuando llegue a la parte de while, y ya que no podia hacer los ejercicios propuestos en el libro porque en el colegio todavia no nos pasan esa materia, ise la calculadora, ademas me sirvio porque n otenia dinero para comprar una casio con mas funciones... solo tenia un calculadora china .. esas de 2 dolares aprox...

pero que interesante descubrimiento...jajajaj.. esto es lo bello de aprender... voy a probar el misco code traducido a c, con los if a ver que tal... despues me paso a mostrar los resultados...saludoss y gracias

flacc

Efectivamente lo probe y da lo mismo que en vbs, aqui las capturas con n = 6 y k = 2:




asi que como hasta lo que tengo aprendido no conozco algun for en vbs voy a probar con for... y otra pregunta... se puede?

Código (vb) [Seleccionar]
var = CInt(n, k)

o s daria error?...
saludoss y gracais por toda la ayuda....

pd:( todavi no logro hacer que de decimales en c :xD)

Novlucker

Para lo de los decimales en C, no uses int entonces :rolleyes:

Sobre lo del Cint, la función acepta un único parámetro, así que se partiría

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein