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

#191
Cita de: eferion en 30 Abril 2014, 14:52 PM
.......................................................................
Pifiarla?? yo creo que cuando se hacen propuestas de estas tampoco es plan de que nadie exija que la solución funcione a la perfección en todos los casos... Yo con mi código hice un par de pruebas... si fuese para un desarrollo real le programaría una tira de pruebas bastante contundente.

Además, si alguien cree que puede hacerlo mejor, en vez de criticar, que exponga su solución... así además aprenderemos los demás.

¿No?

Por cierto, me falta alguien en esta conversación con toques matemáticos... qué ha sido de yoel_alejandro??


Gracias, muchas gracias eferion por tus palabras de comprensión.

Y es cierto, hace días que yoel_alejandro no aparece por el foro, que no "forro" y la verdad es que se hecha de menos sus aportaciones en C, y especialmente, sus puntos de vista matemáticos Con eso de que es de Venezuela espero sinceramente que no le haya pasado nada y que su ausencia se deba a cuestiones de trabajo que tal como están las cosas le vendría muy bien, como a todos, claro.

¡Un fuerte saludo!.


#192
Cita de: eferion en 29 Abril 2014, 10:14 AM
¿Y hacerte una clase para manejar números grandes?

...............................................................................

Si estás programando en C el tema de las clases ya no te sirve... pero aún así sigue habiendo opciones.


Bueno si se trata de sumar números grandes en C, aunque no es necesaria, mejor con una función por si nos da por ampliar a resta, producto, etc y con arrays.

Y como comentó eferion:


Cita de: eferion en 29 Abril 2014, 11:41 AM

Como es de esperar... ni está optimizada ni completa... está hecha en un rato para satisfacer el insaciable apetito de vangodp... pero vale de ejemplo.


Todo por un colega como vangodp, ahí va mi más que modesta propuesta en C:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

#define MAX_DIGITOS 200

void suma (char a[], char b[], char c[]){
 int i,temp,residuo=0,lon_a,lon_b,dif;
 lon_a = strlen(a);
 lon_b = strlen(b);
 if (lon_a > lon_b){
   dif=lon_a-lon_b;
   for (i=lon_b-1; i >=0;i--)
     b[i+dif]=b[i];
   for (i=0; i < dif;i++)
       b[i]='0';
 }
 else if (lon_b > lon_a){
   dif=lon_b-lon_a;
   for (i=lon_a-1; i >=0;i--)
     a[i+dif]=a[i];
   for (i=0; i < dif;i++)
       a[i]='0';
 }
 for (i=strlen(a)-1; i>=0;i-- ){
   temp = a[i]-'0' + b[i]-'0' + residuo;
   c[i+1]=temp%10+'0';
   residuo=temp/10;
 }
 c[0] = residuo + '0';
 if (c[0]=='0'){
   for (i=0; i < strlen(a);i++ ){
     c[i]=c[i+1];
   }
   c[strlen(a)]='\0';
 }
 c[strlen(a)+1]='\0';
}

int main(void){
 char a[MAX_DIGITOS] = /*  "99" */ /* "99" */ "123456123456123456123456123456123123";
 char b[MAX_DIGITOS] = /* "199" */ /* "99" */  "983456123456123456123456123456123123";
 char c[MAX_DIGITOS+1];
 suma (a,b,c);
 printf ("\n  %s +\n  %s=\n\n %s\n ",a,b,c);
 return 0;
}


La verdad que viendo el código de eferion el mio es como pobre, demasiado cortito.

Y sí, ya, sé debía usar memoria dinámica pero sólo quería algo rapidito para vangodp, ya si procede lo mejoro con las observaciones que aporten. E insisto, es un código modestito, sólo pretendía sumar un par de números grandes.

.....Bueno, está bien, lo mejoro. ¿Cómo?, pues lo de la memoria dinámica lo dejaré otra ocasión, ahora se me apetece otra cosa .......¿y si intentamos que los número grandes puedan estar en cualquier base de 2 a 36?. Es decir poder sumar números grandes en decimal o binario o octal o hexadecimal o ... y así sumar números grandes que estén entre las ya mencionadas bases de 2 a 36, los dos números en la misma base, claro...... otra cosa a mejorar. :)

De antemano aclaro que para bases superiores  a 10 no lo tengo del todo testado, pero creo que sí, que funciona:


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

#define MAX_DIGITOS 300 /* o 3000*/
#define DIGITOS   "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define BASE  16

void suma (char a[], char b[], char c[]){
 int i,temp,temp_a,temp_b,residuo=0,lon_a,lon_b,dif,digit;
 lon_a = strlen(a);
 lon_b = strlen(b);
 if (lon_a > lon_b){
   dif=lon_a-lon_b;
   for (i=lon_b-1; i >=0;i--)
     b[i+dif]=b[i];
   for (i=0; i < dif;i++)
       b[i]='0';
 }
 else if (lon_b > lon_a){
   dif=lon_b-lon_a;
   for (i=lon_a-1; i >=0;i--)
     a[i+dif]=a[i];
   for (i=0; i < dif;i++)
       a[i]='0';
 }
 for (i=strlen(a)-1; i>=0;i-- ){
   if(a[i]-48>9 )
     temp_a = a[i] -55 ;
   else
     temp_a = a[i] - '0';
   if(b[i]-48>9)
     temp_b = b[i] -55;
   else
     temp_b = b[i] - '0';
   temp = temp_a + temp_b + residuo;
   digit = DIGITOS [temp % BASE];
   if (digit<10)
     c[i+1]=DIGITOS [temp % BASE] + '0';
   else
     c[i+1]=DIGITOS [temp % BASE] ;
   residuo = temp / BASE;
 }
 c[0] = residuo + '0';
 if (c[0]=='0'){
   for (i=0; i < strlen(a);i++ )
     c[i]=c[i+1];
   c[strlen(a)]='\0';
 }
 c[strlen(a)+1]='\0';
}

int main(void){
 /** ¡¡¡ NO OLVIDES CAMBIAR LA BASE DE (2-36) EN #DEFINE¡¡¡ **/
 /** Tienes tres ejemplos: base 16, base 2, base 10 **/
 char a[MAX_DIGITOS] = "A33A15FADBC9"  /*"1001001110111001" */ /*"123456123456123456123456123456123123"*/;
 char b[MAX_DIGITOS] = "FFC593C5BA33A" /*"1001001110111001" */ /* "983456123456123456123456123456123123"*/;
 char c[MAX_DIGITOS+1];
 suma (a,b,c);
 printf ("\n  %s +\n  %s=\n\n %s\n ",a,b,c);
 return 0;
}


Y para que no digan, explico brevemente lo que hace el código:

* Calcula los tamaños de  ambos números y diferencio al de mayor tamaño del de menor.

* Al más pequeño lo relleno con ceros a la izquierda, previo movimiento hacia la derecha de todos sus dígitos para hacer espacio al principio a los ceros, hasta igualar las cifras del mayor.

* Y ya casi está, voy sumando los dígitos de cada uno de los dos números big y si suman más de 10, supuesto están en decimal, pongo el resto como dígito y "me llevo una", eso es el residuo que se sumará, si procede a los dos dígitos siguientes.

* Y para que quede bonito, si el primer caracter del resultado de la suma es cero lo quito moviendo  todos sus dígitos a la izquierda y acortando el tamaño en uno.

La intención es lo que cuenta, como suele decirse. De antemano disculpas si la he pifiado en algo,cosa que espero no haya ocurrido pero ....somos humanos y las prisas no son buenas consejeras. Así que si detectan bugs, porfi avisar.

Y sí, ya sé, el primer código podría usarlo para bases de 2 a 10 sin más que cambiar el "10" que aparece en el mencionado código , por "base" y esta tomar valores de 2 a 10, pero me apetecía ir más allá de la base en decimal xD.


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


#193

Algo como esto:
Código (cpp) [Seleccionar]
.................
}while(x!=9999);
    if (contador!=1)
      printf("\n\nEl promedio total es: %f",promedio);
    return 0;
}



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


#194
Cita de: eferion en 28 Abril 2014, 22:51 PM
Eso también lo comenté en el primer mensaje :)

Sorry, se me paso por alto.

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


#195
Cita de: meoit ARG en 28 Abril 2014, 21:56 PM
Hola gente :)
.................................

Código (cpp) [Seleccionar]
if ((numero > 99999999999999999999) && (numero < 10000000000000000)) //si numero tiene 21 caracteres
{
}


............................................

Salu2 meoit =)

Antes que nada revisa esas condiciones ya que no puede ser a la vez:

Código (cpp) [Seleccionar]
numero>99999999999999999999  y
numero<10000000000000000


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


#196
Cita de: amchacon en 28 Abril 2014, 20:29 PM
Nombres de variables poco descriptivos, nada de indentación...

Todo eso son malas prácticas que debemos editar. Voy a usar mi plugin mágico para identarte el código:


¡Secretitos en reunión es de mala educación!.

¿Vamos como activas/descargas el dichosito plugin?

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


#197
Cita de: noele1995 en 28 Abril 2014, 12:39 PM
A mi si que me funciona, a ver lo dejo comentado y con un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

const int ARRAY_LEN = 6; //numero de elementos del array

int arreglo[] = { 10, 20, 30 ,40 ,50,60};
..........................

..................

Por un lado no es aconsejable declarar arreglo como global, no le veo el sentido y por otro lado tampoco veo declarar la longitud del array, esta vendrá determinada en este caso por su contenido: si cambias su valor a uno mayor, por ejemplo, te irás a posiciones fuera del array y, en cambio, si cambias el contenido del array, aumentándolo por ejemplo, te quedarás corto con ARRAY_LEN . Es decir para un cambio en el contenido  del array tienes que hacer dos cambios, en el array y en su longitud.

Mejor calcular la longitud del array en función de su contenido, yo lo hago tipo C, y así si cambias el array no tienes que cambiar su longitud ya que la calculas a posteriori:

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

using namespace std;

int main (void){
int arreglo[] = { 10, 20, 30 ,40 ,50,60};
int indice ,ARRAY_LEN = sizeof arreglo/ sizeof *arreglo;
cout << "Introduzca el indice (0-" <<ARRAY_LEN-1<<"):";
cin >> indice;
if(indice < 0 || indice >= ARRAY_LEN) // entonces no es un indice de nuestro arreglo
cout << "fuera del array" << endl;
else{
if(indice != 0) //si es 0 no h
.........................


Y amigo vangodp quidadito con esto:

Cita de: vangodp en 28 Abril 2014, 14:38 PM
¿¿¿Estoy perdonado???  ;D ;D ;D
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
using namespace std;
   ................................................
system("pause>nul"); <==ESTOOOOOOOOOO
return 0;
}


El "system("pause>nul")" te crea un fichero null.txt. Mejor usar getchar si lo que quieres es parar el programa.

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


#198

Lo que no tiene ningún sentido es pasarle a la función "i" ya que no aporta ninguna información a la misma. Bastaría declarar int i en la función menmay y dejarla así:

Código (cpp) [Seleccionar]
void menmay (int vector[10], double promedio);

Código (cpp) [Seleccionar]

..............
menmay(vector,promedio);
..................


Código (cpp) [Seleccionar]
void menmay (int vector[10], double promedio)
{
.............
int i,j=0,k=0;
.................


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


#199

Muchas Thanks, campeón.

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


#200
En mi Code::Blocks, activando la opción C++11, van perfecto.

¿Qué versión de SFML tienes instalada?

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