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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: 1 ... 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [23] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ... 88
221  Programación / Programación C/C++ / Re: AYUDA FICHERO DE SALIDA C++ en: 14 Mayo 2020, 18:57 pm
Para guardar cualquier información en un archivo tienes que realizar los siguientes pasos:
  • Incluir los archivos de cabecera necesarios:
Código
  1. #include <iostream> // Para entrada y salida de datos: cout / cin
  2. #include <fstream> // Para flujos de entrada (ifstream) y salida (ofstream)
  3. #include <cstdlib> // Para la funcion exit() y la constante EXIT_FAILURE
  4.  
  5. using namespace std;

  • Abrir el flujo de salida:
Código
  1. string nombreFichero = "salida.txt";
  2. ofstream fichero(nombreFichero);
Puedes definir una ruta en el nombre del archivo si quieres que se cree en otra diferente a la actual.

  • Comprobar que se ha abierto correctamente:
Código
  1. if(!fichero){
  2.  cout << "Error al abrir el fichero: " << nombreFichero << endl;
  3.  exit(EXIT_FAILURE);
  4. }

  • Guardar los datos que quieras en el fichero:
Código
  1. for(size_t i = 0; i < filas; ++i){
  2.  for(size_t j = 0; j < columnas; ++j){
  3.    fichero << matriz[i][j] << "  ";
  4.  }
  5.  fichero << endl;
  6. }

  • Cerrar el flujo:
Código
  1. fichero.close();
222  Programación / Programación C/C++ / Re: ordenamineto de matrices c++ en: 14 Mayo 2020, 05:27 am
Problema 1: la variable <fila> no está inicializada. Tienes que darle un valor. No puedes crear la matriz primero en la línea 9 y pedir el número de filas que tendrá en la función que llamas después (línea 10).
Además es recomendable que utilices constantes o variables para guardar los datos, por ejemplo, el 3. Así si quieres cambiar dicho valor solo tendrás que cambiarlo en el lugar en el que declaras la variable/constante y no a lo largo de todo el programa. Digamos que es una buena práctica.

Consejo: Si la función es llenar(), que se encargue únicamente de rellenar la matriz. No tiene sentido que metas todo el programa dentro de dicha función. Separando el programa correctamente en funciones te será más fácil encontrar posibles errores en el futuro o poder hacer modificaciones en tu código.

Problema 2: El método para ordenar la matriz.
Lo mejor es tratar la matriz como un array unidimensional. Puedes utilizar un único índice que recorra todos los elementos.
Código
  1. for(int i = 0; i < FILAS * COLUMNAS; ++i){
  2.  cout << "Fila: " << i / COLUMNAS << " - Columna: " << i % COLUMNAS << endl;
  3. }

Utilizando esto puedes implementar el algoritmo burbuja como si de un array unidimensional se tratara. Te dejo el pseudocódigo para que lo conviertas a C++:
Código:
PARA i := 1 HASTA filas * columnas - 1 INCREMENTO 1 HACER
  PARA j := 0 HASTA filas * columnas - 2 INCREMENTO 1 HACER
    SI M[j / columnas][j % columnas] > M[(j+1) / columnas][(j+1) % columnas] ENTONCES
      swap(M[j / columnas][j % columnas], M[(j+1) / columnas][(j+1) % columnas])
    FIN SI
  FIN PARA
FIN PARA

Prueba a implementar el algoritmo en C++. Seguro que funciona.

PD: Al poner en el pseudocódigo (filas * columnas - 1) se incluye dicho valor. En C++ sería equivalente poner cualquiera de las dos siguientes expresiones:
Código
  1. for(int i = 1; i < filas * columnas; ++i){...}
  2. for(int i = 1; i <= filas * columnas - 1; ++i){...}
223  Programación / Programación C/C++ / Re: AYUDA EJERCICIO C++ en: 13 Mayo 2020, 19:17 pm
Para que no aparezcan puntos repetidos tienes varias opciones.
1. Seguir usando vectores y comprobar manualmente que no se muestren repetidos. Para ello a su vez tienes dos formas de conseguirlo, por lo pronto:
- Cuando (operacion = operacion_max), antes de insertar los nuevos x e y, compruebas que no existen ya.
Código:
SI (operacion == operacion_max) ENTONCES
  indice := 0
  MIENTRAS indice < vectorX.size() and !encontrado HACER
    SI vectorX[indice] == x ENTONCES
      encontrado = (vectorY[indice] == y)
    FIN SI
    indice := indice + 1
  FIN MIENTRAS
  SI !encontrado ENTONCES
    vectorX.push_back(x)
    vectorY.push_back(y)
  FIN SI
FIN SI

- La otra opción sería guardarlos todos y a la hora de mostrar comprobar que el elemento actual que vas a mostrar no lo has mostrado ya. La idea es la misma pero ahora tendrías que recorrer desde la actual hacia el inicio. Puedes probarlo pero es menos eficiente ya que estás gastando más memoria al guardarlos repetidos.

2. Crear una class/struct que guarde x e y. Y sustituir ambos vectores por un SET de la STL (http://www.cplusplus.com/reference/set/set/?kw=set).
Desde luego, esta opción es mejor que las anteriores. Primero porque es la más eficiente y segundo porque te permite demostrar un mayor dominio del lenguaje sabiendo encapsular la información dentro de un objeto y eligiendo la mejor estructura de datos para tu propósito.
La ventaja principal del SET es que no guarda valores repetidos. Si tienes una class/struct tal que:
Código
  1. class Punto {
  2.  private:
  3.    int x;
  4.    int y;
  5.  //...
  6. }
Y defines el operador de igualdad como que un Punto P1 es igual a un Punto P2 cuando ambos atributos (x e y) son iguales. Hecho esto será el SET el que se encargará cada vez que quieras meter un Punto en su interior de comprobar si ya existe un punto igual a ese. De existir, no lo meterá. Todo esto último sin que tú tengas que hacer nada más.

Te dejo que investigues por tu cuenta. Da más satisfacción si lo consigues tú que si te lo dan hecho.
Suerte.
224  Programación / Programación C/C++ / Re: AYUDA EJERCICIO C++ en: 13 Mayo 2020, 18:35 pm
En el segundo caso, si la operación actual es igual a la operación máxima, no tienes que vaciar los vectores usando clear() porque entonces te estarás cargando el resto de valores. El clear() es solo para cuando encuentras una operacion > operacion_max.

Además al final en vez de mostrar x_max, y_max, que son variables simples que contienen un único valor cada una (concretamente el último punto que cumpla la lógica del ejercicio), debes recorrer ambos vectores al mismo tiempo e ir mostrando cada uno de sus elementos.

Suerte.
225  Programación / Programación General / Re: ahorcados en: 13 Mayo 2020, 05:21 am
Utiliza las etiquetas de Código GeSHi para poner tu código. Tal y como está es imposible de interpretar...

Puedo ver que estás utilizando variables que no aparecen en ningún sitio. Estás seguro de que esas variables existen, es decir, que están declaradas como atributos de la clase??
Expón cuál es la lógica del método al menos. Sino es imposible saber qué es lo que quieres hacer. Deberías detallar qué precondiciones/postcondiciones debe cumplir tu método (es algo fundamental sobre todo en proyectos desarrollados por varias personas) para que todo funcione bien al unirlo.
226  Programación / Programación C/C++ / Re: Colgado jaja en: 12 Mayo 2020, 19:23 pm
Para colocar códigos utiiza las etiquetas de Código GeSHi (desplegable encima del cuadro de texto)

Tu propósito es trabajar con matrices cuadradas por lo que parece. Entonces no tiene sentido que pidas filas y columnas ya que podrían ponerte números diferentes y hacer que el programa falle. Es mejor que pidas un único valor que sea el orden de la matriz, es decir, el número de filas y columnas.

Si quieres recorrer la diagonal de una matriz cuadrada verás que las casillas que quieres recorrer son: (0,0), (1,1), (2,2),...; es decir, la i y la j avanzan a la vez o lo que es lo mismo solo utilizas una variable en el bucle:
Código
  1. for(int i = 0; i < orden; ++i){
  2.  matriz[i][i] = 1;
  3. }

Si quieres guardar los valores en otro array, tendrás que crearlo. Y si quieres guardar los valores originales poner la instrucción antes de modificar los valores por 1s y si lo que quieres guardar son los 1s (que no tiene mucho sentido) pues después:
Código
  1. #DEFINE SIZE 100 // Usa constantes para los numeros que aparezcan sueltos. Asi puedes cambiarlos todos de una vez
  2. //...
  3. int main(){
  4.  //...
  5.  int diagonal[SIZE];
  6.  //...
  7.  for(int i = 0; i < orden; ++i){
  8.    diagonal[i] = matriz[i][i];
  9.    matriz[i][i] = 1;
  10.  }
  11.  //...
  12. }

Luego recuerda usar <orden> para recorrer tanto la matriz como el array ya que son las posiciones que has ocupado realmente. El resto de posiciones desde orden hasta SIZE serán basura.
227  Programación / Programación C/C++ / Re: [C] Ordenamiento de datos en C en: 10 Mayo 2020, 00:46 am
Los algoritmos de ordenación más básicos son: Burbuja, Inserción y Selección. Los tres tienen un orden de eficiencia O(n2) pero son fáciles de implementar.
Si quieres algo más eficiente busca el algoritmo Quicksort o Mergesort (entre otros).
228  Programación / Bases de Datos / Re: Select SQL en: 8 Mayo 2020, 21:27 pm
1.Devolver la distancia de Manhattan entre dos puntos P1 y P2, siendo P1 el punto compuesto de la mayor latitud y la mayor longitud y el punto P2 compuesto por la menor latitud y la menor longitud. Redondea tu respuesta a 3 decimales. (En esta sé como obtener la mayor latitud y longitud y la menor latitud y longitud pero,  como lo uno para que se corresponda con el P1 y P2)
La distancia Manhattan entre dos puntos P1(x1, y1) y P2(x2, y2) se calcula como: dM = |x1 - x2| + |y1 - y2|
Por lo tanto, el tema de los puntos es "simbólico". Tienes que hacer esa operación y redondearla a 3 decimales usando:
Código:
x1 = MAX(latitud)
y1 = MAX(longitud)
x2 = MIN(latitud)
y2 = MIN(longitud)

2.De manera análoga al punto anterior, calcula la distancia Euclídea entre ambos puntos.(Y en esta no se que significa exactamente lo que se pide)

Espero que alguien pueda ayudarme con ello, un saludo.
La distancia Euclídea entre dos puntos P1 y P2 como antes se calcula como: dE(P1, P2) = SQRT((x2 - x1)2 + (y2 - y1)2)
Igual que antes el tema de los puntos P1 y P2 es para que puedas plantear el ejercicio.

Ambos son ejercicios para que uses un par de funciones matemáticas: raíz cuadrada, potencia, max/min,...
Suerte. ;D
229  Programación / Programación General / Re: Que lenguaje es mas facil para aprender? en: 6 Mayo 2020, 06:33 am
en este tiempo de cuarentena fue que me propuse a estudiar lenguaje de programación y ya se html, CSS y javascript lo que claro por mi cuenta. Nadie me enseña y tengo solo PDF no vídeos. Bueno gracias
Cuidado con esas afirmaciones... He visto matar a gente por menos :silbar: :xD :xD :xD

Bueno, bromas aparte. No sé si la instalación de Back Box trae por defecto el compilador de C/C++. Este es gcc: https://es.wikipedia.org/wiki/GNU_Compiler_Collection.
La verdad es que para mí no hay como programar en Linux desde la Terminal. Te bastará el propio Gedit o si quieres un editor de textos más avanzado, te recomiendo Atom (SublimeText es otra buena opción)
En caso de que no esté instalado, igual puedes instalarlo tú:
Código:
sudo apt-get install gcc && sudo apt-get install g++
El primero es para C y el segundo para C++.

Una vez tengas escrito tu programa en un fichero de texto con extensión .c (para C) o .cpp (para C++) por ejemplo:
Código
  1. // Hola Mundo en C. Fichero: hola_mundo.c
  2. #include <stdio.h>
  3.  
  4. int main(){
  5.  printf("Hola Mundo!\n");
  6.  return 0;
  7. }
o
Código
  1. // Hola Mundo en C++. Fichero: hola_mundo.cpp
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main(){
  6.  cout << "Hola Mundo!" << endl;
  7.  return 0;
  8. }

abres una Terminal en el mismo directorio que el fichero y escribes:
Código:
gcc hola_mundo.c -o hola_mundo
o
Código:
g++ hola_mundo.cpp -o hola_mundo
Para compilar el programa. Se te creará un nuevo fichero con el nombre que pongas después del -o.
Y para ejecutarlos:
Código:
./hola_mundo

PD: Muchas veces, cuando se empieza con estos dos lenguajes es muy fácil mezclarlos ya que C++ acepta todo lo de C. Investiga para conocer las principales diferencias entre ambos.
Suerte.
230  Programación / Programación C/C++ / Re: [ALGEBRA DE MATRICES] Matriz triangular INFERIOR DESCENDIENTE en C. en: 6 Mayo 2020, 05:43 am
  VAMOS A HACERLO DIFICIL, PERO DIFICILISMO !

Todo el mundo ve que hay dos bucles y dos variables

ESTE ES EL RETO:

PROGRAMAR LA SOLUCION USANDO SOLO UN BUCLE Y UNA SOLA VARIABLE DE CONTROL, A PARTE DE LAS QUE SE DAN POR PARAMETRO

(Por supuesto, el programa sera mas dificil de legible, pero sera igualmente correcto....)

Esto sí que promete.  ;-) ;-)
Después de darle unas cuantas vueltas creo que está cerca pero no consigo sacarlo así que dejo mi razonamiento por si alguien se anima a seguir mientras yo duermo... (Espero no soñar con esto :rolleyes:)

La idea es tratarlo algo así como un array unidimensional, es decir, un único índice que se incrementa desde 1 hasta n siendo n el número de casillas a recorrer. Resulta que n = (N*(N-1)/2). Iremos incrementando el contador en 1 a no ser que una casilla no sea nula en cuyo caso podemos concluir que esa matriz no es triangular inferior.
Código:
i := 1
MIENTRAS i <= (N*(N-1)/2) and i != 0 ENTONCES
    i = (A[f(i)][g(i)] == 0) * (i+1)
FIN MIENTRAS
RETURN i
Como se puede apreciar falta definir las funciones f() y g() que determinen la fila y columna del siguiente elemento en función de i.

Parece sencillo usando los operadores de división entera y módulo pero no es tan simple. Probando con matrices de orden N >= 2 (ya que de orden 1 sería triangular sin entrar por el bucle) he encontrado lo siguiente:
Código:
N = 2 -> M = (N*(N-1)/2) = 1
i    -> 1
f(i) -> 0
g(i) -> 1

N = 3 -> M = 3
i    -> 1 - 2 - 3
f(i) -> 0 - 0 - 1
g(i) -> 1 - 2 - 2

N = 4 -> M = 6
i    -> 1 - 2 - 3 - 4 - 5 - 6
f(i) -> 0 - 0 - 0 - 1 - 1 - 2
g(i) -> 1 - 2 - 3 - 2 - 3 - 3

N = 5 -> M = 10
i    -> 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
f(i) -> 0 - 0 - 0 - 0 - 1 - 1 - 1 - 2 - 2 - 3
g(i) -> 1 - 2 - 3 - 4 - 2 - 3 - 4 - 3 - 4 - 4

N = 6 -> M = 15
i    -> 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - 13 - 14 - 15
f(i) -> 00 - 00 - 00 - 00 - 00 - 01 - 01 - 01 - 01 - 02 - 02 - 02 - 03 - 03 - 04
g(i) -> 01 - 02 - 03 - 04 - 05 - 02 - 03 - 04 - 05 - 03 - 04 - 05 - 04 - 05 - 05
Y así sucesivamente. Yo creo que se ve perfectamente el patrón. El problema como ya he dicho es sacar la que sería la fórmula cerrada de f() y g().
Si alguien se quiere animar a intentar seguir o a exponer su razonamiento... :rolleyes: :rolleyes:
Páginas: 1 ... 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [23] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ... 88
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines