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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 ... 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [36] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 ... 102
351  Programación / Programación C/C++ / matriz transpuesta c en: 18 Mayo 2020, 15:09 pm
El mensaje 'matriz transpuesta c  ' fue bloqueado
Reapertura de tema antiguo
Leer reglas:
http://foro.elhacker.net/reglas
352  Programación / Programación C/C++ / Re: Dividir cadena en subcadena C++ en: 17 Mayo 2020, 19:27 pm
Además de la opción que ya te ha dado EdePC para la que no necesitas de funciones preexistentes; hay otras opciones como utilizar la función strtok(): https://en.cppreference.com/w/cpp/string/byte/strtok que permite separar una cadena de caracteres en base a una serie de limitadores que puedes establecer tú (en este caso: "a").

Fíjate en su uso ya que es un poco peculiar.

Suerte.
353  Programación / Programación C/C++ / Re: Comparar matrices en: 17 Mayo 2020, 19:16 pm
El problema está en que en la parte de verificar si son iguales o no, lo que realmente estás haciendo es comprobar si el último elemento de la matriz es igual o no. Para comprobarlo correctamente puedes hacerlo declarando una variable de tipo bool y usándola como condición de salida de los bucles:
Código
  1. bool iguales = true;
  2. for(int i = 0; i < filas && iguales; ++i){
  3.  for(int j = 0; j < columnas && iguales; ++j){
  4.    iguales = (matriz1[i][j] == matriz2[i][j]);
  5.  }
  6. }
  7.  
  8. if(iguales)
  9.  cout << "Las matrices son iguales" << endl;
  10. else
  11.  cout << "Las matrices no son iguales" << endl;


Además de eso, otras mejoras serían:
  • No utilizar un char[] para guardar la respuesta. Si solo es un carácter, usa un char.
  • Para comparar varias cadenas char[] es mejor usar strncmp() que strcmp(). La primera permite indicar la cantidad de caracteres a comparar.
  • C++ tiene la ventaja de las variables tipo <string>. Úsalas y te ahorrarás quebraderos de cabeza con char[].
  • Declara el tamaño de las matrices como constantes. Así podrás modificar su tamaño modificando el valor en un único lugar.
Código
  1. // cabeceras...
  2. const int FILAS = 3;
  3. const int COLUMNAS = 3;
  4.  
  5. int main(){
  6.  int matriz[FILAS][COLUMNAS];
  7.  //...
  8. }

  • Para pedir los valores al usuario, utiliza un bucle. Así valdrá para cualquier tamaño y te ahorras las variables auxiliares:
Código
  1. for(int i = 0; i < FILAS; ++i){
  2.  for(int j = 0; j < COLUMNAS; ++j){
  3.    cout << "Introduce el valor M[" << i << "][" << j << "]: ";
  4.    cin >> matriz[i][j];
  5.  }
  6. }
354  Programación / Programación C/C++ / Re: Fallo al dar valores a un array de chars en: 16 Mayo 2020, 03:24 am
Hay varias incorrecciones pero digamos que el problema principal está en el operador =. Cuando se trabaja con punteros el operador = hace que el puntero de la izquierda apunte a la dirección de memoria que se especifique a la derecha.
En tu caso, cada uno de los punteros del array <array> están apuntando a la dirección de memoria de <input> e <input> contiene la última cadena introducida por la entrada estándar. Por lo tanto, todos los punteros del array están apuntando a una misma cadena, cuando muestras todas en el último bucle estás mostrando la misma cadena (<input>) n veces.

Otro error es el de usar un array de punteros. Como ves esto no sirve pues todos los punteros acabarán apuntando a un mismo sitio y cuando cambies el valor de esa variable, perderás todos los anteriores.
La solución: usar una matriz. Cada fila será una entrada y cada columna un carácter.
Código
  1. #define MAX_ENTRADAS 20 // Numero maximo de entradas por teclado
  2. #define MAX_LONGITUD 50 // Longitud maxima de cada entrada
  3.  
  4. int main(){
  5.  char matriz[MAX_ENTRADAS][MAX_LONGITUD];
  6. }
Aprovecho el código para decirte que utilices mejor constantes. Así si en algún momento quieres cambiar un valor, solo tendrás que cambiarlo en el lugar en el que lo has declarado.

Además de eso, otra incorrección es utilizar sscanf() para eliminar el salto de línea final (que supongo que lo haces para eso). Esto no es válido porque sscanf() no recoge los espacios por lo que una cadena con espacios (ej: "hola mundo") la truncará al primer espacio que encuentre ("hola").
Una alternativa para hacerlo es la siguiente:
Código
  1. #define SIZE 100
  2. //...
  3. char entrada[SIZE];
  4. fgets(entrada, SIZE, stdin);
  5. if(entrada[strlen(entrada)-1] == '\n') // el ultimo caracter siempre es '\0'. Entonces si el anterior es un salto de linea '\n'...
  6.  entrada[strlen(entrada)-1] = '\0'; // ... le pones el fin de cadena uno antes para eliminar el '\n'
  7.  

Otra cuestión es el tema de comparar cadenas. Si utilizas strcmp() y usas una longitud máxima de 5, al escribir "exit\n" solo se va a guardar "exit" y al compararlo no va a coincidir. Por esto es más seguro utilizar strncmp():
Código
  1. strncmp(matriz[n], "exit\n", strlen(matriz[n]))
Así compararás tantos caracteres como tenga la primera cadena. Si introduces "exit\n" y solo se guarda "exit", se compararán los 4 primeros caracteres de cada cadena y por tanto saldrá del bucle. Además si introduces "ex" pensando que va a comparar los dos primeros de la cadena, no saldrá porque comparará "ex\n" con "exi".

Y para futuras ocasiones, para copiar el contenido de una cadena en otra, tienes que utilizar las funciones strcpy() o strncpy(). Recomendable usar la segunda ya que puedes especificar la longitud.

Dicho esto puedes utilizar algo así:
Código
  1. while(n < MAX_ENTRADAS && fgets(matriz[n], MAX_LONGITUD, stdin) && strncmp(matriz[n], "exit\n", strlen(matriz[n]))){
  2.    if(matriz[n][strlen(matriz[n])-1] == '\n')
  3.        matriz[n][strlen(matriz[n])-1] = '\0';
  4.    ++n;
  5. }
Como puedes ver te ahorras los otros arrays auxiliares. Y debes comprobar primero que n no sobrepase el límite de entradas para que matriz[n] no produzca un error en memoria al intentar acceder a espacio de memoria no permitido.
355  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();
356  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){...}
357  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.
358  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.
359  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.
360  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.
Páginas: 1 ... 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [36] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines