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 - eferion

#491
Las sumatorias te permiten calcular el número de veces que se va a ejecutar el bucle... no el tiempo de ejecución.

for( i=1; i<n; i++ )
Este bucle se ejecuta n veces.

for( j=i+1, j<=n; j++ )
Este bucle se va a ejecutar desde i+1 hasta n... n veces, teniendo en cuenta que i va a ir variando en cada una de esas n veces. Es decir, se va a ejecutar n+(n-1)+(n-2)+(n-3)+...+1. Para expresar esta ecuación de forma genérica necesitas un sumatorio.

for( k=1; k<=j; k++ )
El número de veces que se ejecuta este bucle depende de j, por lo que también depende de i. En este caso necesitas un sumatorio doble porque dependes de dos variables que van variando en cada iteración.
#492
Vaya, si que me he perdido cosas durante mi ausencia este puente...

A ver, yo entiendo la postura de Eternal Idol, las normas son muy claras al respecto.

Sin embargo también entiendo a la otra vertiente.

Mi punto de vista personal es que, si bien puede que éste no sea el foro adecuado, si que debería existir una sección donde poder tratar este tipo de temáticas:

* Diferentes versiones de un mismo código para compararlas y discutirlas.
* Proponer retos y juegos de programación varios
* Tratar temas técnicos que, por su naturaleza propia, no son aptos para los que están comenzando.

Este tipo de contenidos siempre enriquece los foros, no hay más que ver codeproject, por ejemplo, y no es el único.

El problema general que se encuentra entre los hispanoparlantes es que no somos capaces de crear una comunidad semejante... eso hace que salga muchísimo más rentable hacer publicaciones en inglés... en nuestro perjuicio.

La verdad es que disponer de un portal tipo codeproject en español sería algo increíble, pero también es perfectamente entendible que dicha empresa no esté en el horizonte de objetivos para este portal.

Yo creo que los ingenieros de habla hispana somos, al menos, tan buenos como los americanos... yo al menos de ellos solo envidio su sueldo y portales como el mencionado anteriormente.

Y para terminar, repito, es mi opinión personal.

Un saludo.

#493
Cita de: leosansan en 30 Abril 2014, 16:55 PM
En Code::Blocks, sin el #include "stdafx.h" funciona O.K, poniendo, eso sí, la dirección correcta de la ventana, tipo:

"C:\\Users\\Administrador\\Documents\\C\\Analisis Numerico"

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



stdafx es un inventillo de VS para gestionar las cabeceras precompiladas, según creo recordar.
#494
Cita de: leosansan en 30 Abril 2014, 15:08 PM
Gracias, muchas gracias eferion por tus palabras de comprensión.

¿Gracias? no hace falta :), yo también aprendo cosas en este foro... las gracias son mutuas.
#495
¿Y qué errores te salen ahora?
#496
Te faltan unas comillas en el include

#include "stdafx.h // <-----
#497
Cita de: leosansan en 30 Abril 2014, 14:15 PM
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.

En su momento me planteé hacerlo en C... pero claro, la idea que tenía en mente era usar la codificación binaria en vez de por cadena de caracteres... y meter todas las funciones en C dejó de parecerme buena idea XD

Cita de: leosansan en 30 Abril 2014, 14:15 PM
La verdad que viendo el código de eferion el mio es como pobre, demasiado cortito.

Eso es porque tu, al usar cadenas de caracteres, no tienes que realizar conversiones...

Cita de: leosansan en 30 Abril 2014, 14:15 PM
¿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...

Es en esta parte donde el usar la codificación binaria ofrece una solución más sencilla... claro que antes me he tenido que currar el proceso de convertir base 10 a base 2...

Aclaro que me refiero a combinar diferentes bases en una misma operación.

Cita de: leosansan en 30 Abril 2014, 14:15 PM
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.

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??
#498
"nombre" como tal no es nada... el identificador real es "struct nombre"

puntero = (struct nombre*)malloc(N * sizeof(struct nombre));
#499
Programación C/C++ / Re: Memoria dinamica?
30 Abril 2014, 12:13 PM
Cita de: vangodp en 30 Abril 2014, 11:54 AM
Como aun no se na de template ...

Un template es una plantilla. Las plantillas son como prototipos de clases... están incompletas. Un template sirve para crear una clase genérica ( como un contenedor ). Digo genérica porque hay tipos que se dejan abstractos, en el caso del ejemplo de amchacon, la famosa "class T".

El compilador, cuando se encuentra con un template, digamos que lo "memoriza", pero no lo compila ( no puede porque la clase no está completamente definida). Cada vez que encuentra un uso de ese template, revisa su lista de clases. Si aún no existe una especialización del template para esa clase, compila una versión personalizada del template, en caso contrario, se limita a enlazar con la versión compilada anteriormente.

Es decir. Si tu tienes un código tal que:

Código (cpp) [Seleccionar]

std::vector< int > intVector;
std::vector< bool > boolVector;


El compilador va a crear dos versiones especializadas del template, una en la que sustituye "T" por "int", y otra en la que lo sustituye por "bool". Al ser clases independientes, no puedes tirar de "herencia" para tratar los diferentes tipos de vectores de forma genérica.

Esto no puedes hacerlo:

Código (cpp) [Seleccionar]

std::vector< T >* intVector = new std::vector< int >( );
std::vector< T >* floatVector = new std::vector< float >( );


Realmente, cada versión de "vector" es completamente independiente de las demás, no comparten nada de código ( cada versión está adaptada a los tipos concretos que usa esa versión ).

El tema de los templates da para escribir durante varias horas... es mejor que también trastees un poco por la red por tires de manuales que tengas en casa. Si bien es cierto que se pueden hacer auténticas maravillas con los templates, también es cierto que abusar de ellos sin control puede complicar demasiado el mantenimiento del código. Estás avisado.

Cita de: vangodp en 30 Abril 2014, 11:54 AM
... ni lo que hacen no se que hace T* &array de void Realloc(T* &array,int tam,int tam_final)

Como te comenté, los templates son clases "incompletas", en este caso concreto, se define un tipo T que es indefinido.

La llamada que no entiendes, "T* &array", lo que hace es definir una suerte de puntero doble... solo que usando sintaxis propia de C++. Bueno, la definición real sería un puntero a una referencia. La idea de usar un puntero doble es que te permite modificar la posición a la que apunta "array", desde dentro de la función, por lo que el realloc es transparente para ti.

Sin el puntero doble, podrías modificar el contenido de la memoria apuntada por "array", pero no podrías reubicar ese contenido en el mapa de memoria del programa.
#500
Recuerda que ifstream está pensado para realizar lecturas en ficheros... para las escrituras deberás utilizar ofstream.

Si miras documentación acerca de la clase ifstream ( en este mundillo es imprescindible saber cómo se usan las cosas ), verás que tiene los siguientes constructores:

Código (cpp) [Seleccionar]

ifstream();

explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);

explicit ifstream (const string& filename, ios_base::openmode mode = ios_base::in);

ifstream (ifstream&& x);


Tienes 3 formas básicas de abrir un "lector" de archivos... pero en ninguna de ellas hay que pasar el entero a localizar como argumento.

Básicamente hay dos formas de abrir el fichero:

1. Crear el stream utilizando el constructor por defecto, indicarle el fichero destino y forzar su apertura:

Código (cpp) [Seleccionar]

ifstream stream;
stream.open( "fichero.txt", ofstream::in);


2. Al crear el stream, pasarle el fichero destino.

Código (cpp) [Seleccionar]

ifstream stream( "fichero.txt", ofstream::in);


Una vez realizado esto ya puedes leer el stream. Ten en cuenta que no sabes, a priori, dónde se encuentra almacenado cada dato...

Código (cpp) [Seleccionar]

istream& operator>> (bool& val);
istream& operator>> (short& val);
istream& operator>> (unsigned short& val);
istream& operator>> (int& val);
istream& operator>> (unsigned int& val);
istream& operator>> (long& val);
istream& operator>> (unsigned long& val);
istream& operator>> (long long& val);
istream& operator>> (unsigned long long& val);
istream& operator>> (float& val);
istream& operator>> (double& val);
istream& operator>> (long double& val);
istream& operator>> (void*& val);

int get();
istream& get (char& c);
istream& get (char* s, streamsize n);
istream& get (char* s, streamsize n, char delim);

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

istream& read (char* s, streamsize n);

streamsize readsome (char* s, streamsize n);


No voy a explicar el funcionamiento de cada una, que son bastantes y para eso está la documentación. Tampoco puedo ponerte la forma correcta de leer tu fichero porque se desconoce información tan básica como su formato y estructura. Pero vamos, que leer del fichero puede ser algo tan sencillo como:

* Usar el operador de extracción '>>':

Código (cpp) [Seleccionar]

stream >> numero;


* Usar el método 'get' (solo sirve con caracteres sueltos):

Código (cpp) [Seleccionar]

// Este metodo tiene mas sentido si lo metes dentro de un for
char c;
stream.get( c );


* Usar el método 'read' (pensado para leer ficheros binarios):

Código (cpp) [Seleccionar]

int numero;
stream.read( (char*)&numero, sizeof(numero) );