Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - leosansan

#81
Cita de: Blaster en  4 Agosto 2014, 01:22 AM
Seguro que obtienes uno ?... el seguimiento que realizas al proceso es equivocado, la multiplicación de 3 * 5 es realizada previamente y el resultado es recibido por la función para calcular el logaritmo del mismo.

Código (cpp) [Seleccionar]
digitos ( 3 * 5 ) =  log10 ( 3 * 5 ) = log10 ( 15 ) =  1.17 + 1  = 2


Creo que no has entendido mi exposición. Aclaro lo que decía.

En el caso de que en lugar de realizar la operación de 3 *5 apliques a la misma logaritmos, es decir :

Código (cpp) [Seleccionar]
log10 ( 3 *  5 ) = log10 (3) + log10 (5) = 0 + 0

es cuando se llegaría a un resultado incoherente si se trabaja con enteros en lugar de flotantes.

Para el caso del factorial que exponía, como no vamos a calcularlo directamente, haríamos:

Código (cpp) [Seleccionar]
log10(1500!) =  log10(1500) + log10(1499) +...+.log10(3) + log10(2)

Y si no tenemos en cuenta el trabajar con floats daría un resultado erróneo, toda vez  que en enteros  sería:

Código (cpp) [Seleccionar]
.....log10(8) + log10(9) = 0

Cuando en realidad deberían dar:

Código (cpp) [Seleccionar]
.....log10(8) + log10(9)= 1.85...==> 1

Y así sucesivamente.

Conste que era sólo una observación, no pretendía en ningún momento hacer crítica a tu comentario.  ;)


¡¡¡¡ Saluditos! ..... !!!!






#82
Cita de: gibranini en  3 Agosto 2014, 23:15 PM
tienes razon :) gracias, pero me puedes explicar por que razo se necesitaba poner el (float), porfavor :D ;D

Porque como tan acertadamente te comentó A.I. 3/4 es una división entre enteros con lo que el resultado es cero:

Código (cpp) [Seleccionar]
fact = 3/4 =  0

Puedes evitarlo como te dijo A.I. :

Código (cpp) [Seleccionar]
fact = (float) 3/4 =  0.75

O más simple:

Código (cpp) [Seleccionar]
fact =  3./4 = 0.75

Fíjate en la presencia del punto decimal en el tres que indica que se va a realizar una operación entre números en flotante.

¡¡¡¡ Saluditos! ..... !!!!


#83
Cita de: Blaster en 24 Julio 2014, 22:25 PM
Otra opción seria aplicar el logaritmo (en base 10) al número del que deseas saber las cifras y luego sumarle uno:

Log(1)=>0
Log(9)=>0,95
Log(10)=>1
Log(11)=>1,04

Código (cpp) [Seleccionar]
digitos = log10(num) + 1

En digitos tendrás el número de cifras de num

Saludos


Sólo una pequeña observación y es la referida a la importancia de trabajar con double si hay operaciones tipo producto o división implicadas.

Me explico con un simple ejemplo. Si queremos las cifras del resultado de 3 * 5 sin hacerlo podemos aplicar la propiedad de que el logaritmo de un producto es la suma de los logaritmos y, si estamos trabajando con enteros, el resultado sería:

Código (cpp) [Seleccionar]
digitos ( 3 * 5) =  log10 ( 3 * 5 ) = log10 (3) + log10 (5) + 1  = 0 + 0 + 1 = 1

En contra de lo que sabemos, 3 * 5 = 15 que tiene dos cifras. Lo anterior se evita trabajando don double, ya que entonces :

Código (cpp) [Seleccionar]
digitos ( 3 * 5) =  log10 ( 3 * 5 ) = log10 (3) + log10 (5) + 1  ==  2.176091

y tan sólo hay que tomar la parte entera para obtener el resultado deseado.

Código (cpp) [Seleccionar]

n_digitos 3 * 5 = 2.176091 ==> de aqui tomamos la parte entera :
n_digitos 3 * 5 = 2


Parece una nimiedad lo que comento ya que podíamos haber multiplicado previamente y aplicado el log10 en forma entera al resultado de 15.

¿Pero es esto siempre posible?. Pongo un caso práctico: calcular las cifras que tiene 1500!. En este caso no es tan simple obtener el resultado numérico y ojo que no digo que no sea posible hacerlo en C, incluso sin librerías externas, que sí que se puede. Pero como un factorial no es más que un producto se puede calcular la cifra como suma de logaritmos pero en tipo flotante y el resultado final pasarlo a entero obteniendo:

Código (cpp) [Seleccionar]
n_digitos [ 1500! ] = 4115.682325

n_digitos [ 1500! ] = 4115 ---> PERFECTO <----


Y la suma de los log10 se puede realizar con un simple for:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <math.h>
#define N  1500

int main( ) {
 double n_digitos = 1 ;
 int digitos , i ;
 for( i = 1 ; i <= N ; i++ )
   n_digitos += ( log10 ( i ) ) ;
 printf( "n_digitos [ 1500! ] = %lf\n\n" , n_digitos );
 digitos = ( int ) n_digitos ;
 printf( "n_digitos [ 1500! ] = %d\n\n" , digitos );
 return 0;
}


Y conste que empieza el for en 1 innecesariamente ya que su log es cero, por lo que podía haber empezado en 2, pero es por ponerlo "bonito".  ;)

Como comenté al principio, se trataba de una simple observación en la diferencia, y obligación en según qué casos, de trabajar con enteros o flotantes para no equivocar el resultado del cálculo del número de dígitos.

¡¡¡¡ Saluditos! ..... !!!!


#84
Cita de: A.I. en  3 Agosto 2014, 04:39 AM
Sí que lo ordena.

Código (bash) [Seleccionar]
$ gcc shellsort.c -o shellsort
$ ./shellsort
3 34 1 53 15 6 9
1 3 6 9 15 34 53



Totalmente de acuerdo con A.I. :

Código (cpp) [Seleccionar]
3   34    1   53   15    6    9
1    3    6    9   15   34   53

Process returned 0 (0x0)   execution
Press any key to continue.


¡¡¡¡ Saluditos! ..... !!!!


#85
"Creo" que esto te arregla el desajuste:

Código (cpp) [Seleccionar]
void Factorial::establecerFactorial()
{
int numeroMultiplicador = numeroFactorial ;
resultado = 1 ;

while (numeroMultiplicador != 0)
{
resultado  *=  numeroMultiplicador ;
--numeroMultiplicador;
}
}


¡¡¡¡ Saluditos! ..... !!!!



#86
Programación C/C++ / Re: string bidemencional
31 Julio 2014, 07:24 AM
Cita de: marchiali en 31 Julio 2014, 02:58 AM
hola queria saber, como puedo cargarle datos a un strin bidimencional. por ej. si quiero hacer un arreglo de 40 nombres.

char nombre[40][20];

¿como hago para cargar los nombres por teclados? probe con cin.getline() pero no funciona

Por ejemplo:

Código (cpp) [Seleccionar]
#include <iostream>

int main() {
  char nombre[40][21];
  std::cout << "Introduce los nombres: " << std::endl ;
  for ( int i = 0; i < 3 ; i++ )
    std::cin.getline( nombre [ i ] , 20 ) ;
  for ( int i = 0; i < 3 ; i++ )
    std::cout << nombre [ i ] << std::endl ;
  return 0;
}


¡¡¡¡ Saluditos! ..... !!!!


#87
Cita de: 718208 en 30 Julio 2014, 07:01 AM
Sinceramente estoy haciendo siempre en mis códigos clases por una manera de recordar las cosas, osea, en el capitulo donde estoy se separa la interfaz de la implementación y se hacen clases, es por esta razon que lo hago... con respecto a usar for no lo hago porque eso sigue en el capitulo que viene, muchas gracias por los consejos a todos saludos  ;D

"Raro, raro". Está bien lo de ir practicando Clases pero no haber visto previamente cosas tan primaria como los for, else y compañía es cuanto menos "rarito". Pero en fin, de todo hay en la viña del Señor.  ;)

No obstante puedes conseguir el mismo objetivo con while tal como te indicó rir3760:

Código (cpp) [Seleccionar]
void imprime() {
      int i = 0 , j = 0 , linea = 8;
      while ( i < linea ) {
        j = 0 ;
        while ( j < linea ){
          ( i % 2 != 0 && j == 0 ) ? cout << " *" : cout << '*' ;
          j++ ;
        }
        cout << endl ;
        i++ ;
      }
    }


¡¡¡¡ Saluditos! ..... !!!!


#88
Cita de: daryo en 26 Julio 2014, 18:16 PM
cierto yo lo probe y funciona bien

Sorry, Blaster no modifique bien. La salida es la correcta.  :-X

¡¡¡¡ Saluditos! ..... !!!!




#89
Cita de: Blaster en 26 Julio 2014, 17:08 PM
Con una pequeña modificación lo dibujaríamos tal como muestra el ejem:
.............................

Salida a tu código:

Código (cpp) [Seleccionar]
********
********
*********
*********
**********
**********
***********
***********
************
************
*************
*************
**************
**************
***************


Y de paso rectifico el mío:

Código (cpp) [Seleccionar]
void imprime() {
     for ( int i = 0 ; i < linea ; i++ ){
       for ( int j = 0 ; j < linea ; j++ )
       ( i % 2 != 0 && j == 0 ) ? cout << " *" : cout << '*' ;
     cout << endl ;
   }


Con la salida deseada:

Código (cpp) [Seleccionar]
********
********
********
********
********
********
********
********


¡¡¡¡ Saluditos! ..... !!!!


#90
Cita de: 718208 en 25 Julio 2014, 23:09 PM
Hola gente, estoy teniendo un problema con un código, el tema es que tengo que dibujar
esto en el programa:


********
********
********
********
********
********
********
********

...................................................
Desde ya agradezco cualquier ayuda   :)

Creo que "desparramas" el código, en buena parte por el uso de los while.

Un poco más "cortito":

Código (cpp) [Seleccionar]
public:
    void imprime() {
      for ( int i = 0 ; i < linea ; i++ ){
        for ( int j = 0 ; j < linea ; j++ )
        ( i % 2 != 0 && j == 0 ) ? cout << ' ' : cout << '*' ;
      cout << endl ;
    }
  }


¡¡¡¡ Saluditos! ..... !!!!