elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 ... 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 [622]
6211  Programación / Programación C/C++ / Problema con vectores en una función en: 24 Noviembre 2014, 11:00 am
Probablemente esto sea una tontería, y obviamente algo estoy haciendo mal, pero a ver si podéis iluminarme.

Código:
#include <iostream>
#include <vector>
using namespace std;

void Poner_Datos(vector< vector<int> >& v, int Fila[], int row, int cantidad){
    vector<int> Parcial;
    for (int i=0; i<cantidad; i++){
        Parcial.push_back(Fila[i]);
    }
    v[row] = Parcial;
}

int main(){
    vector <vector<int> > Entrada;
    int Fila0[4] = {0, 1, 2, 3};
    int Fila1[2] = {4, 5};
    int Fila2[3] = {6, 7, 8};
    int Fila3[6] = {9, 10, 11, 12, 13, 14};
    Poner_Datos(Entrada, Fila0, 0, 4);
    //Poner_Datos(Entrada, Fila1, 1, 2);

}

Obviamente esto está incompleto, pero lo que quiero hacer, es definir unos arrays (Fila0, Fila1, etc...) cada uno con un tamaño arbitrario.

Y, meter estos datos en las diferentes filas de un vector de 2 dimensiones.

El problema que encuentro, por muchas vueltas que le de, es que aparentemente no puedo utilizar una variable para indicar en la función la fila en la que se deben de introducir los elementos en el vector. El programa compila si, pero "peta" lamentablemente al ejecutarse.

Que algo estoy haciendo mal es obvio, mi problema es que no se exactamente donde estoy metiendo la pata.

He intentado también meter directamente los datos de otro modo, algo como:

Código:
v[row].push_back(Fila[i]);

Ni que decir que aunque el compilador traga, el programa también deja de funcionar.

Obviamente tengo otra opción, que es crear unos ficheros con los datos y meterlos "a piñon", eso lo he hecho en alguna ocasión y funciona, pero claro, lo que quiero saber es porque no me funciona.



6212  Programación / Programación C/C++ / Re: Ayuda con manejo de ficheros en c++ en: 23 Noviembre 2014, 21:52 pm
Debería de echarle un vistazo con mas detenimiento, pero te aclaro algunas cosas.

Código:
(S >> numero)

¿Que hace esta línea?... veamos, debemos de irnos antes a la creación del objeto S

Código:
istringstream S(linea);

Anteriormente, hemos usado Getline, que es una función que coge toda una cadena de texto, incluyendo espacios (hasta el caracter de retorno de carro, el que indica que termina la línea) y lo mete en la variable string linea.

Linea acepta una cantidad de caracteres arbitraria, no necesitamos en principio conocer su tamaño, ni lo que contiene, de manera que estamos seguros de que ha leido una línea entera del fichero de texto.

Pero, como bien has dicho, lo que queremos leer son enteros, no un string. Si tenemos un string y sabemos que los números están separados por espacios, podemos "currarnos" una función que se dedique a buscar los espacios, identifique lo que son numeros, y construya numeros a partir de la misma, pero no nos hace falta, porque tenemos el istringstream

Esta clase, permite meter un string "linea" en un objeto, y aunque a priori nos puede parecer que "es un string con otro nombre" en realidad es mucho mas, se comporta como un dispositivo de entrada (o de salida, o ambos, pero ese es otro tema)

Y ahora llegamos a la línea que te tiene "escamado"

Código:
while (S >> numero);

Estos operadores, los ">>" y "<<" indican la dirección desde donde, o hacia donde fluye la información entre un contenedor y las instrucciones que usan esos datos.

Un ejemplo, es el comando CIN o COUT de C++, que permiten leer desde el teclado o sacar cosas por pantalla.

Tu usas "printf  ("%i\n",vector);", pero podemos usar perfectamente:

cout << "lo que queremos sacar" << vector << "cualquier otra cosa";

Las flechas indican que las cadenas de texto, la variable o cualquier otra cosa va desde ahi, hasta el cout, que las saca por pantalla en consola.

Así pues:

while (S >> numero)

Quiere decir "mientras podamos sacar números enteros (la variable numero es un entero) del objeto S". Al mismo tiempo, asigna a esa variable a cada pasada un nuevo valor que lee del objeto S (siempre que sea un entero)

El bucle se mantendrá mientras podamos sacar enteros de ese objeto, cuando llegue al final de mismo y no se pueda sacar ninguno mas, simplemente la condición será false, y por lo tanto saldrá del bucle.

Al margen de todo esto, te recomiendo no llames "vector" a lo que es un array. Una variable como "int vector[100];" es perfectamente válida, pero puede dar lugar a malinterpretaciones y te puede incluso liar a ti mismo si consideras un array como un vector, ya que C++ tiene precisamente un tipo de array especial llamado "vector" que permite redimensionar la cantidad que almacena.

Tal que asi

Código:
vector <int> Nombre[100];

Con la particularidad de que puedes incluso declararlo vacio, y rellenarlo con los datos que estimes conveniente, ajustándose su tamaño a los datos que introduzcas. Supongo que aún no has llegado a esa parte

Un detalle que no entiendo muy bien, ¿porque en el fichero te indica el número de objetos a leer, si en realidad ya lo conoces de antemano?

De todos modos, creo que deberías de hacer dos "getline" antes de empezar la lectura del fichero, uno para separar el nombre de la instacia (y manejarlo como quieras) y otro para la segunda linea, y a partir de ahi tratar los datos que entran.

No se si te sería quizás mas claro usar un array de dos dimensiones si conoces de antemano el tamaño del mismo, algo como int nombre[10][10]; para una matriz de 10 elementos por 10 elementos

6213  Programación / Programación C/C++ / Re: Ayuda con manejo de ficheros en c++ en: 23 Noviembre 2014, 13:30 pm
Creo que el problema principal, es que no nos has explicado detalladamente que pretendes hacer.

Entiendo, que tienes un fichero de texto "1.txt", y que este contiene números separados por uno o mas espacios en cada línea

Luego, veo que declaras "i" a cero, lo cual es irrelevante si luego la declaras de nuevo en el bucle for, pero vamos, eso no tiene importancia, lo mismo que el de la variable Temp que tampoco le veo uso, o "cap". Asumo que les das uso mas adelante.

Lo que si que veo, es que abres fichero... correcto. Coges una línea entera del fichero, y la almacenas en el string linea. Correcto... creas un objeto istringstream con ella, y haces un while para sacar todos los números que contiene

Lo que "no entiendo", es porque una vez tienes un numero, lo introduces a continuación en todas las posiciones del entero "vector", y luego tras el while imprimes únicamente un valor de ese array de enteros.

Creo que por ahí está tu problema. Cuando llegas al bucle

Código:
 for(int i=0;i<100;i++) vector[i] = numero;

Lo que estás haciendo es introducir en cada vuelta del while (S >> numero) el entero que sacas del objeto S en todas y cada una de las casillas de vector

Finalmente tras el while, imprimes un solo valor. Si interpreto bien tu codigo,lo que haces es imprimir el último entero que obtienes de cada linea, ya que en cada vuelta del while (S >> numero) coges ese valor y lo pones en todas.

No se si me estoy explicando bien, pero es que tampoco tengo muy claro que pretendes hacer exactamente con los números que obtienes del fichero.
6214  Programación / Programación C/C++ / Re: Consulta sobre declaración de vectores en: 23 Noviembre 2014, 11:59 am
Aha... gracias por la aclaración. Me temo que el compilador GNU no contempla de momento todo el estándar C++11, de manera que tiraré "por la calle de enmedio" y hace una función para estas cosas. Afortunadamente según estoy viendo, si C++ no te deja hacer una cosa por un camino, puedes siempre intentarlo por otro sitio



Un tema que posiblemente muchos conocen, pero aprovecho para los que no.

No es necesario hacer una función para asignar un string a un vector, es posible hacerlo mediante el propio constructor del mismo:

Código:
    char A[] = {'K', 'R', 'O', 'N', 'O', 'S'};
    vector<char> Salida(A, A +sizeof(A) / sizeof(char));

    string S_Uno[] = {"Uno", "Dos", "Tres"};
    string S_Dos[] = {"Cuatro", "Cinco", "Seis"};
    vector<string> Uno(S_Uno, S_Uno +sizeof(S_Uno) / sizeof(string));
    vector<string> Dos(S_Dos, S_Dos +sizeof(S_Dos) / sizeof(string));

Tengo problemas a la hora de construir vectores de mas de una dimensión, pero para los vectores "normales" esta solución es bastante rápida
6215  Programación / Programación C/C++ / Re: [C++] Problema con vocales con tilde y caracteres especiales. en: 23 Noviembre 2014, 11:56 am
Un pequeño problema, es que por ejemplo en Linux no existe ese problema de acentos y caracteres "raros", mientras que en consola de DOS (en sistemas windows) si que existe.

La solución del Locale a mi al menos me funciona en sistemas windows, quizás es un poco "parche", pero mejor eso que nada.
6216  Programación / Programación C/C++ / Consulta sobre declaración de vectores en: 22 Noviembre 2014, 21:51 pm
Una consulta de la que los expertos se van a reir, pero como no lo soy  ;D

Un string cualquiera de una dimensión puede declararse directamente.

Código:
int a[5] = {-1, 1, 5, 12, -4}

Creo que no es posible (al menos el compilador me regaña), pero ¿existe algún constructor que me permita algo parecido con un vector?

¿y con un vector de mas de una dimensión?

Soy plenamente consciente de que puedo "apañar" una función a la que le pase un string o un array y lo meta en un vector, pero me pregunto si existe una forma diferente de hacerlo

Supongamos que tengo un vector tal que:

Código:
vector <vector<int> > Por_ejemplo

¿Existe algún modo de construir por ejemplo la fila 0 mediante una declaración del estilo de los arrays?

Si me decís "no, no puedes", pues me apaño una función para pasar los valores, pero si existe una forma diferente de hacerlo, sería mas que interesante conocerla

Según la referencia oficial de C++ esto no se puede, pero claro, preguntar no cuesta nada, y lo mismo aprendo algo
6217  Programación / Programación C/C++ / Re: ¿matematicas para programar? en: 22 Noviembre 2014, 21:44 pm
Obviamente, pero hay casos y casos.

Estoy completamente de acuerdo en que hace falta un cierto nivel de matemáticas para programar, pero no creo que (por ejemplo) para programar una aplicación que maneje textos o datos (bases de datos, conversiones de texto, cosas por el estilo) necesitemos grandes conocimientos de matemáticas. Obviamente si pretendemos manejar un objeto en 3D no es el caso, o si queremos un programa que haga calculos de estructuras.

Obviamente cuanto mas mejor, pero creo que como mínimo necesitamos conocer las matemáticas que necesita el problema a solucionar. Otro tema es que el código sea elegante, tenga la mejor solución o sea el mas eficaz. Hay métodos de "fuerza bruta" que pueden aligerarme mucho teniendo conocimientos matemáticos, de eso no cabe duda.

Obviamente si no tenemos una fuerte base matemática, dificilmente nos vamos a "inventar" un método de compresión eficiente, pero nadie dice que en cambio no podamos hacer otras cosas, dentro de las limitaciones de cada uno.
6218  Programación / Programación C/C++ / Re: ¿matematicas para programar? en: 22 Noviembre 2014, 19:13 pm
Buenas compañeros!! bueno lo primero deciros que me cambie a minidosi.org, y la verdad esque voy bastante fluido (de momento), y lo segundo haceros una preguntilla. ahi va:

que significa <iostream> y <fstream>?

gracias de antemano. un saludo!

Ahi estoy aprendiendo yo XD

Extendiendome en la respuesta anterior (que es correcta)

El núcleo de C++ tiene una serie de instrucciones y capacidades, y es capaz en principio de hacer "cualquier cosa", pero no resulta ni practico ni eficaz el tener que comerte tu todo el trabajo de determinadas cosas.

Por ejemplo, C++ no tiene "de por si" herramientas de trigonometría, logaritmos, raices, etc... pero existen una serie de programas, funciones y clases ya creadas por otras personas, que se agrupan en librerias que tu puedes usar, y que forman un estandar de ese lenguaje

¿Necesitas usar por ejemplo raices cuadradas?

Puedes o bien currarte una función que las haga (y no, no es sencillo) o incluir en tu programa la librería <cmath> que incluye ya muchas funciones ya hechas.

¿Necesitas acceder a ficheros?.. la librería <fstream> te da acceso a leer y escribir ficheros en diferentes modos.

¿Necesitas manejar cadenas de texto (strings) y otras funciones como entradas y salidas por consola?... pues la librería <iostream>

Luego, a la hora de hacer un programa eliges que "ayudas" necesitas, y las incluyes en la cabecera de tu programa. Esto te da acceso a una enorme cantidad de librerias que contienen... casi de todo.

Obviamente, si tu programa (por ejemplo) no va a manejar ficheros, no necesitas incluir esa librería, si no vas a usar funciones matemáticas complejas, no necesitas incluir la librería correspondiente.

Miralo como lo que son: Librerías con "trabajo ya hecho"
6219  Programación / Programación C/C++ / Re: [C++] Problema con vocales con tilde y caracteres especiales. en: 22 Noviembre 2014, 18:54 pm
Si, buscando por internet encontré esa solución con la librería locale.h, pero me da error. No encontré nada de que hubiera que linkear ninguna librería al proyecto ni nada parecido.

Desde mi modestísimo conocimiento (aún estoy aprendiendo de forma autodidacta C++) creo que puedo darte una posible solución

Pones obviamente la cabecera "<clocale>

Y en la primera línea del "Main"

Código:
#include <iostream>
#include <clocale>
using namespace std;

int main(){
    setlocale(LC_ALL, "");

}

Esto hace que uses el "locale" en el que actualmente se encuentre tu equipo. Y modificando algunos valores en el setlocale puedes también cambiar a un país específico, pero no he llegado tan lejos.

He probado manipulando cadenas de diferentes maneras, que incluyen acentos o "ñ", como meterlas en strings, vectores, etc... y me funciona, igualmente me permite mostrarlos por consola.

Supongo que hay mejores formas, pero esta de momento me funciona, si te funciona para lo que quieres, mejor que mejor
Páginas: 1 ... 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 [622]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines