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


 


Tema destacado: Java [Guía] Patrones de diseño - Parte 1


  Mostrar Mensajes
Páginas: 1 ... 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 [598] 599
5971  Programación / Programación C/C++ / Re: ayuda arreglo c++ en: 26 Noviembre 2014, 22:20
ENTONCES COMO PUEDO HACER PARA QUE ME LEA TODA LA ORACION CREO QUE ES CON gets PERO NO SE COMO SE UTILIZA


Creas una variable de típo string, por ejemplo "entrada"

Luego sustituyes "cin" por "Getline (cin, entrada);

Al final obtienes toda la cadena introducida, incluyendo espacios hasta el fin de línea.

lo he reformado un poco (bastante)... pero a ver si entiendes como lo hago

Código:
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main(){
           string entrada;
           bool band= true;
           cout<<"ingresa la frase: ";
           getline (cin, entrada);
           char frase[entrada.size()+1];
           strcpy(frase, entrada.c_str());
           int tam = entrada.size();
           for (int i=0; i<tam; i++){
                if (frase[i] != frase[tam-i-1]) band = false;
                }

    if (band) cout << "si es palindromo";
    if (!band) cout << "no es palindromo";

    }

Quizás lo mas "exótico" es como se convierte el string de entrada en un array de caracteres (además del tamaño justo). Claro, si no te convence se puede hacer fácilmente una función para eso.

Algo interesante sería que pensaras que estrictamente hablando, un programa que comprueba frases palindromas debería de funcionar convirtiendo antes todo el texto a mayúsculas o minúsculas, porque la comprobación entre "A" y "a" te daría falso, y lo mismo para acentos (aunque no podrás usarlos en windows a menos que uses clocale)

Edito: Ahora que lo pienso un poco (que bruto que soy a veces) en realidad no necesitas hacer una comprobación de todo el arreglo, solo desde el principio hasta la mitad, ya que al comparar la primera con la última, la segunda con la penúltima, etc... a partir de la mitad del arreglo, estás comprobando de nuevo lo mismo.
5972  Programación / Programación C/C++ / Re: Empezando en C++ en: 26 Noviembre 2014, 21:47
Como IDE te recomiendo Codeblocks, que es bastante cómodo de usar

http://www.codeblocks.org/

Eso si, te recomiendo que te bajes el compilador "aparte", concretamente el mingw-w64

http://sourceforge.net/projects/mingw-w64/

En Internet hay vídeos de como instalarlo y configurarlo.

Te lo comento mas que nada, porque el compilador por defecto a mi me ha dado tremendos dolores de cabeza, ya que no soporta muy bien en estándar C++11 y hasta que me dí cuenta (por novato) de donde estaba el problema, pasé unos días muy entretenidos dándome cabezazos.

Hay otras opciones claro
5973  Programación / Programación C/C++ / Re: Elevacion cubica en: 26 Noviembre 2014, 14:54
Así a bote pronto, creo que estás pensando que "Pow" eleva al cubo.

Si, pero no... eleva a cualquier exponente.

El modo correcto de usarlo es (por ejemplo)

Código:
float base, exponente, resultado // tres valores. la base, o numero que quieres elevar al cubo, el exponente, en este caso 3 (al cubo) y obviamente el resultado.
base = 10.33 // (por ejemplo)
exponente = 3 // o cualquier otro numero
resultado = pow(base, exponente);

Obviamente puedes acortar mucho la cosa. No hace falta usar la variable exponente (ni que sea doble, lo he hecho por sencillez). Podrías tranquilamente usar:

Código:
resultado = pow(base, 3);

A ver si así consigues que funcione.
5974  Programación / Programación C/C++ / Re: ayuda arreglo c++ en: 25 Noviembre 2014, 21:59
Bueno, hay formas de invertir una cadena entera, pero asumo que esto es un ejercicio, no otra cosa.

Tu bucle está mal enfocado, en lugar de intentar averiguar si una palabra es un palindromo, deberías intentar demostrar que no lo es.

Me explico... la situación es sencilla. Tienes el string de caracteres, tienes la longitud de la palabra, y puedes comparar los caracteres... estupendo.

Pues entonces, haz que el bucle avise de que no existe una coincidencia. Es decir: si no es palindromo.

Compara los caracteres por parejas, y abandona el bucle en el mismo momento en que no haya una coincidencia.

Declara una variable bool que sea "true" indicando que es palíndromo, y que solo pase a false si dentro del bucle no se cumple alguna de las comparaciones, luego una vez que has salido del bucle puedes mostrar el resultado.

La diferencia puede parecer trivial, pero implica una forma de abordar el problema que debes de tener en cuenta, y es que debes de intentar siempre que el programa haga el mínimo esfuerzo posible.

Claro, podemos comprobar todas las letras, y si son iguales decir que es palindromo, pero lo contrario tiene la ventaja de que si en la primera pasada no hay coincidencia, podemos salir inmediatamente del bucle sin necesidad de comprobar el resto.

Esto en una palabra de 5, 10 o 12 caracteres es irrelevante, pero si abordamos un caso similar, donde haya cientos, o miles de casos la cuestión ya no es tan simple, porque el programa debe de intentar siempre "atajar" los problemas lo mas rápido posible y con el menor uso posible de recursos. Bueno, no siempre se consigue, pero al menos intentarlo.

Es un poco como la "política" a la hora de comprobar una condición que contiene comparadores lógicos como && or !! de poner primero el mas simple, ya que el programa entonces si el primer caso no se cumple, no comprueba nada mas ahorrando tiempo y recursos.

A todo esto, si no me equivoco mucho (y si lo estoy que me corrijan) no es necesario declarar el #include<string.h> porque la biblioteca string forma parte de iostream.

Igualmente, puedes averiguar la longitud de un string sin necesidad de usar otras bibliotecas usando el método string::size();

Así en este caso, podrías usar

Código:
tam = frase.size();

En lugar de

Código:
tam = strlen(frase);

Ni que decir, que como te han señalado es posible invertir directamente la cadena usando algo como:

Código:
tekst = string ( tekst.rbegin(), tekst.rend() );

Pero claro, este no es el propósito del ejercicio
5975  Programación / Programación C/C++ / Re: Ayuda con manejo de ficheros en c++ en: 24 Noviembre 2014, 23:00
Si pudieras pegar un trozo del archivo a procesar sería probablemente mas fácil entender lo que quieres hacer exactamente, y se podrían hacer algunas pruebas.

Se puede ademas reducir un poco el código, pero si así te aclaras está bien
5976  Programación / Programación C/C++ / Re: Dudas varias programa en: 24 Noviembre 2014, 20:24
El tema de control de errores por parte del usuario es... una batalla perdida, los usuarios tontos son muy inteligentes  ;D

Pero, puedes hacer obviamente controles... por ejemplo (una opción, hay otras) la entrada por CIN haz que sea un string, ya que un string virtualmente se lo come "todo". Luego compruebas que lo introducido es efectivamente un número, y si es así lo "das por bueno".

Intenta por ejemplo en una función convertir ese string en un objeto istringstream, y sacas "a piñón" un entero. Si la lectura tiene éxito, el contenido es un entero, si no tiene éxito obras en consecuencia.

Por ejemplo:

Código:
#include <iostream>
#include <sstream>

using namespace std;

int numero(string entrada, bool& correcto){
    int valor;
    istringstream S(entrada);
    if (!(S >> valor)) correcto = false;
    return valor;
}


int main(){
    bool lectura = true;
    string In;
    int X;
    int Y;
    int N;
    cout << "Enter the first term: \n";
    cin >> In;
    X = numero(In, lectura);
    cout << "Enter the second term: \n";
    cin >> In;
    Y = numero(In, lectura);
    cout << "Enter the number of terms: \n";
    cin >> In;
    N = numero(In, lectura);
    // -------------------------
    cout << "Valor de X = " << X << endl;
    cout << "Valor de Y = " << Y << endl;
    cout << "Valor de N = " << N << endl;
    if (!lectura) cout << "Uno de los valores es erroneo" << endl;
}

Eso si, aquí tenemos un "medio problema", y es que tal y como te lo planteo, solo te dice que uno de los valores es erróneo, no cual, y además si introduces un valor como por ejemplo "125df" tomará solo 125 e ignorará el resto.

Espero que te sirva de algo, aunque seguro que a alguien se le ocurre como meter un dato erróneo.
5977  Programación / Programación C/C++ / Re: Problema con vectores en una función en: 24 Noviembre 2014, 19:34
El problema lo tengo también en que no tengo claro como declarar que el vector tiene "x" filas y "x columnas", y para empeorar la referencia oficial no me aclara mucho al respecto.

Si, se que el vector se crea vacio, por eso uso precisamente push_back, que supuestamente aumenta el tamaño del vector para acomodar nuevos datos de forma automática

Por ejemplo:

Código:
vector<string> Concatena (const vector<string>& A, const vector<string>& B){
    vector<string> Salida;
    Salida = A;
    int tam = B.size();
    for (int i=0; i<tam; i++){
        Salida.push_back(B[i]);
    }
    return Salida;
}

El vector Salida lo creo vacío, lo lleno con el contenido del vector A, y luego añado una por una las posiciones del vector B, sin cambiar su tamaño. Teóricamente push_back incluye nuevos datos al final del vector y cambia su tamaño.

Y si, en vectores de una dimensión funciona sin problemas, pero nada, algo se me escapa, probablemente en la notación al pasar a 2 dimensiones.

Entiendo, que :

Código:
vector <vector<int> > Entrada(4);

Debería teóricamente de crearme un vector de vectores enteros, inicializando un valor inicial de 4 filas. ¿Es así?... porque incluso intentando entonces introducir datos de las columnas, por ejemplo así

Código:
   vector <vector<double> > Datos(4);
    Datos[0].push_back(0.1);
    Datos[0].push_back(0.2);
    Datos[0].push_back(0.3);
    Datos[0].push_back(0.4);
    Datos[1].push_back(2.2);
    Datos[1].push_back(1.1);
    Datos[1].push_back(0.0);
    Datos[3].push_back(-15.0);
    Datos[3].push_back(-14.0);
    Datos[3].push_back(-13.0);

También "casca", a no ser claro está, que el 4 sea el valor de las columnas (lo cual explicaría porque casca), pero entonces me quedo sin tener claro como declaro las filas.

Esta es la parte que mas me está costando del tema de vectores, el resto lo llevo bastante "sueltito" y progreso sin problemas, pero esa cuestión de vectores en 2D me lleva por la calle de la amargura

PDD. Una solución que me han sugerido... habilitar el standar C++11 en el compilador

Código:
int main(){
vector< vector<int> > v ( 3, vector<int> (3) );
v = {
{1,2,3},
{4,5,6},
{7,8,9}
};

cout << v[0].size() << endl;
cout << v[1].size() << endl;
cout << v[2].size() << endl;
}

Y... de momento no explota y parece que funciona.

Actualización

Parece que si... pero no.

Aparentemente mi problema real, es que a la hora de pasar a una función por referencia el vector, no lo hago correctamente, y en el mismo momento en que intente, no ya modificar algo del mismo, sino incluso leer sus propiedades el programa "casca"

Os pongo al corriente...

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


vector<int> aplana(const vector< vector<int> >& v , int filas){
       vector<int> Salida;
       for (int i=0; i<filas; i++){
        cout << v[i].size();
       }
}


int main(){
    vector< vector<int> > v ( 3, vector<int> (4) );
    v = {
    {1,2,3},
    {4,5},
    {6,7,8,9}
    };
    int filas = v.size();
    cout << filas << endl;
    //aplana(v, 3);
    for (int i=0; i<filas; i++){
        cout << v[i].size() << endl;
       }
}

Como podéis ver, el constructor es "diferente", pero funciona, al menos en C++11 funciona.

Mi duda es si estoy pasando el vector a la función correctamente

Código:
const vector< vector<int> >& v

Algo estoy obviamente haciendo mal ahi, porque si paso el vector, e intento leer su longitud dentro de la función el programa se cuelga, ya sea intentando leer el número de filas, como intentando leer el número de columnas de cada una.

No obstante, si intento exactamente lo mismo dentro del "main", entonces el problema no aparece y funciona correctamente.

Tengo la impresión (no confirmada) de que cuando paso un vector por referencia a una función, en realidad estoy pasando un puntero (o algo así) y dentro de una función no se comporta como espero (bueno, eso es obvio) y aunque el programa compile, se cuelga.

Supongo que al no haber pasado bien por referencia (o eso creo) el vector, al intentar leerlo es posible que se intenten leer zonas de memoria incorrectas.

Claro, podría hacer las cosas dentro del main, donde ese problema no lo tengo, pero la intención es que la función sea capaz de "desmontar" un vector de vectores y devolverme un solo vector con los contenidos consecutivos, no un caso aislado

Nueva actualización.

Estimados compañeros de foro... quiero matar a alguien, o suicidar a alguien... o pegarle fuego a algo, pero me contendré

Tras días de darle vueltas, tras dolores de cabeza y desesperación, resulta que aparentemente, mi problema es (era) el compilador GNU.

Con el mismo código, me he instalado el compilador MinGw64, y... funciona.

No me da errores, no explota el programa y el resultado es el esperado.

A falta de que alguien con mas conocimientos que yo (lo cual no es dificil) me diga que "es posible, pero estabas haciendo tal o tal cosa mal", la verdad es que me he quedado bastante "a cuadros" al ver que aparentemente la fuente de mis problemas era esa.

De momento voy a mantener este compilador como "por defecto" y continuaré haciendo experimentos, pero ahora parece que las cosas empiezan a tener sentido.

5978  Programación / Programación C/C++ / Problema con vectores en una función en: 24 Noviembre 2014, 11:00
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.



5979  Programación / Programación C/C++ / Re: Ayuda con manejo de ficheros en c++ en: 23 Noviembre 2014, 21:52
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

5980  Programación / Programación C/C++ / Re: Ayuda con manejo de ficheros en c++ en: 23 Noviembre 2014, 13:30
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.
Páginas: 1 ... 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 [598] 599
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines