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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ... 102
151  Programación / Programación C/C++ / Re: ayuda con un codigo en c en: 26 Marzo 2021, 12:15 pm
Antes que nada: el código debe ir entre etiquetas de Código GeSHi. Puedes seleccionar el código, ir al desplegable de "Código GeSHi" encima del cuadro de texto y elegir el lenguaje correspondiente (C en este caso) o escribir directamente tú las etiquetas en el cuadro de texto de la siguiente manera:
[code=c]
Aquí tu código C
[/code]


Claro que se puede simplificar ese código y además ya tienes comentado por ahí cómo hacerlo: utilizando arrays.
Otro consejo es que utilices constantes en vez de utilizar números sueltos que no se sabe lo que significan. Además si en algún momento quieres cambiar su valor, basta con cambiarlo al declarar la constante y no en todo el código.
Código
  1. // cabeceras
  2.  
  3. #define NUM_CARACTERES 37 // Constante para el numero de caracteres
  4.  
  5. int main() {
  6.  char abecedario[] = "abcd..";
  7.  char cifrado[] = "...";
  8.  int estadisticas[NUM_CARACTERES] = {0}; // Inicializamos todo el array a 0
  9.  // Se puede hacer una comprobacion para evitar errores en tiempo de ejecucion mediante <assert.h>
  10.  assert(strlen(abecedario) == strlen(cifrado) && NUM_CARACTERES >= strlen(abecedario)); // Lanza un error si la condicion no es cierta
  11.  
  12.  FILE *fichero_simple = fopen("texto_simple.txt", "r");
  13.  FILE *fichero_cifrado = fopen("texto_cifrado.txt", "wt");
  14.  // Comprobar que los ficheros se han abierto correctamente y en caso contrario, terminar el programa
  15.  
  16.  char caracterActual;
  17.  int encontrado = 0; // se puede usar bool mediante <stdbool.h>
  18.  while((caracterActual = fgetc(fichero_simple)) != EOF) {
  19.    for(int i = 0; i < strlen(abecedario) && !encontrado; ++i) {
  20.      encontrado = (caracterActual == abecedario[i]);
  21.      if(encontrado) {
  22.        caracter = cifrado[i];
  23.        ++estadisticas[i];
  24.      }
  25.    }
  26.    fputc(caracter, fichero_cifrado); // De esta forma si un caracter no lo encuentra, lo copia sin cifrar
  27.    encontrado = 0;
  28.  }
  29.  
  30.  // Cerrar ficheros de texto simple y cifrado
  31.  
  32.  FILE *fichero_estadisticas = fopen("estadisticas.txt", "wt");
  33.  // Comprobar que se ha abierto correctamente
  34.  
  35.  for(int i = 0; i < strlen(abecedario); ++i)
  36.    fprintf(fichero_estadisticas, "%c = %d\n", abecedario[i], estadisticas[i]);
  37.  
  38.  // Cerrar fichero de estadisticas
  39. }
152  Programación / Scripting / Re: Duda en python: comparar resultado de split. en: 24 Marzo 2021, 21:12 pm
Python puede llegar a ser tan compacto...
Código
  1. palabras = ["casa", "coche", "calle"]
  2. respuesta = input("Escribe una frase con alguna de estas palabras " + str(palabras) + ": ")
  3. valido = any(palabra in respuesta for palabra in palabras)
  4. print("Correcto!!" if valido else "Incorrecto...")
153  Programación / .NET (C#, VB.NET, ASP) / Re: convertir implícitamente una lista c# en: 24 Marzo 2021, 20:14 pm
Tu problema se puede resumir en:
Código
  1. int[] arrayNumeros;
  2. List<int> listaNumeros;
  3. arrayNumeros = listaNumeros; // Error!! Se esta asignando una List<int> a un int[]
  4. arrayNumeros = listaNumeros.ToArray(); // OK
  5. listaNumeros = arrayNumeros; // Error!! Se esta asignando un int[] a una List<int>
  6. listaNumeros = arrayNumeros.ToList(); // OK
154  Programación / Programación C/C++ / Re: [C++] Series de Taylor: sen(x) en: 24 Marzo 2021, 07:29 am
Lo primero: avisarte de que he borrado el otro tema que has abierto para el mismo problema.
Lo segundo: es mejor si los títulos de los temas son algo más descriptivos así que he cambiado el título de este tema.

En C++ el operador ^ es un XOR (OR exclusivo) que funciona bit a bit. Para usar potencias hay que utilizar la función pow(). Podrías hacerlo así limitándote a usar la fórmula con potencias y factoriales pero la cantidad de cálculos que va a tener que hacer tu programa va a ser muy grande.

Lo mejor es aprovechar que tu programa es iterativo para ahorrarte operaciones que ya tienes.
Piensa que si en una iteración tienes 1! y lo multiplicas por 2, ya tienes 2!. Si 2! lo multiplicas por 3, ya tienes 3!; y así sucesivamente sin tener que hacer todas las operaciones en cada iteración.
Lo mismo pasa con una potencia: si tienes x y lo multiplicas por x, ya tienes x^2. Si x^2 lo multiplicas por x, ya tienes x^3 y así sucesivamente también.

Ahora tienes que ver cómo ir almacenando estos resultados parciales en cada iteración.
No puedo ser más concreto ahora mismo porque no tengo tiempo.
155  Programación / Programación C/C++ / Re: duda codigo simple C en: 23 Marzo 2021, 21:52 pm
Tienes que estudiar las posibilidades que existen y lo que debería hacer tu función en cada caso:
  • Caso 1: strlen(cadena1) < strlen(cadena2) -> Copia tantos caracteres como tenga cadena1
Código:
cadena1 = Hola
cadena2 = Adios
resultado -> cadena1 = Adio

  • Caso 2: strlen(cadena1) = strlen(cadena2) -> Copia tantos caracteres como tengan ambas
Código:
cadena1 = Hola
cadena2 = aloH
resultado -> cadena1 = aloH

  • Caso 3: strlen(cadena1) > strlen(cadena2) -> Copia tantos caracteres como tenga cadena2 y corta la cadena
Código:
cadena1 = Adios
cadena2 = Hola
resultado -> cadena1 = Hola -> no cadena1 = Holas

Al final si sacamos un patrón de todo esto es que se copian tantos caracteres como tenga la cadena más corta de las dos y el siguiente caracter tiene que ser el de fin de cadena '\0'.
Para los casos 2 y 3 vistos antes bastaría con hacer la modificación que ha comentado @Eternal Idol porque la cadena más corta es cadena2; sin embargo, en el caso 1 nos generará problemas de acceso a memoria.

Para que funcione en todos los casos es necesario comprobar cuál es la cadena más corta de las dos:
Código
  1. char *my_strcpy(char *cadena1, char *cadena2) {
  2.  int longitud_minima = strlen(cadena1);
  3.  if(strlen(cadena2) < longitud_minima) longitud_minima = strlen(cadena2);
  4.  for(int i = 0; i <= longitud_minima; ++i) // la ultima iteracion servira para copiar el caracter '\0'
  5.    cadena1[i] = cadena2[i];
  6.  return cadena1;
  7. }
156  Programación / Programación C/C++ / Re: Ayuda con codigo de c++ en: 23 Marzo 2021, 21:32 pm
La verdad es que la explicación es un poco complicada para el que no sepa de qué le están hablando.
Intuyo que la historia empieza por las series de Taylor y su forma de aproximar funciones como el sen(x) mediante una sumatoria.
Para ver la fórmula de la serie de Taylor para sen(x): https://es.wikipedia.org/wiki/Serie_de_Taylor#Funciones_trigonom%C3%A9tricas
La fórmula dice algo así como:
Código:
sen(x) = SUM(n=0->inf) ((-1)^n / (2n+1)! * x^(2n+1)) =
       = x^1/1! - x^3/3! + x^5/5! - x^7/7! + x^9/9! - ...
Ahora igual ya sí podemos empezar a hacer algo...

Si te das cuenta tú estás calculando:
Código:
sen(x) = 1+x^1/1 + x^2/2 + x^3/4 + x^4/16 + ...
Por lo que parece que ahí fallan más cosas.

De todas formas, cambiar el signo es muy sencillo. Aunque no nos demos cuenta, cuando cambiamos el signo de algo lo estamos multiplicando por -1. Entonces:
Código
  1. int numero = 5;
  2. for(int i = 0; i < 10; ++i)
  3.  cout << numero << " ";
  4.  numero *= -1; // numero = numero * -1
  5. }
Salida:
Código:
5 -5 5 -5 5 -5 5 -5 5 -5
157  Programación / Programación C/C++ / Re: Trabajo de la universidad en: 23 Marzo 2021, 06:59 am
Para futuras consultas, el código debe ir entre etiquetas de Código GeSHi. Puedes seleccionarlas desde un desplegable que hay encima del cuadro de texto que dice "Código GeSHi" donde puedes elegir tu lenguaje de programación o escribiendo directamente:
[code=cpp]
Tu código aquí
[/code]


El problema es el cálculo que estás haciendo. Piensa que i va desde m hasta n entonces tienes que ir comprobando si cada i es primo o no y no es eso lo que haces. Para ello tendrías que hacer otro bucle dentro de ese que vaya desde 1 hasta i y comprobar ahí cuántos divisores tiene.
Código
  1. for(int i = m; i <= n; ++i) {
  2.  for(int j = 1; j <= i; ++j) {
  3.    // aqui compruebas la divisibilidad
  4.  }
  5. }

Este código no es el más eficiente pero es el mejor para empezar ya que se ve claramente lo que estás haciendo. Cuando consigas que te funcione puedes intentar mejorarlo poco a poco o comentarlo aquí.

Suerte  :-X
158  Programación / Java / Re: remove no funciona en: 18 Marzo 2021, 07:10 am
Supongo que <cartasEnMano> es un ArrayList<> de algún tipo de objeto que has creado tú, no?

Cuando se utiliza ArrayList.remove(Object o), se elimina el objeto i del array que cumpla Objects.equals(o, array.get(i)). En resumen, necesitas sobreescribir el método equals() para determinar cuándo dos objetos son iguales ya que si no lo haces sólo serán iguales cuando sean el mismo objeto (misma dirección de memoria).

Otra solución más sencilla si ya tienes el índice es usar ArrayList.remove(int index).
Código
  1. j.cartasEnMano.remove(op)
Además de más sencillo, es más seguro pues te aseguras de tirar exactamente la misma y no otra que sea igual a esa.

PD: Utiliza las etiquetas de Código GeSHi para el código ya sea abriendo el desplegable que se llama "Código GeSHi" y eligiendo Java o escribiendo directamente:
[code=java]
Tu código Java aquí
[/code]
159  Programación / Programación General / Re: Duda sobre creación de carpeta en netbeans en: 10 Marzo 2021, 06:41 am
Pues como ya ves, estás poniendo en la primera línea del main() la ruta de la carpeta mediante un String. Lo único que tendrías que hacer es solicitar al usuario ese String en vez de ponerlo por defecto y sería bueno comprobar que la ruta existe mediante los métodos de la clase File.

Una opción más visual para un usuario final es usar un JFileChooser para hacer la típica ventana que te permite elegir un fichero/directorio. En Internet hay ejemplos de cómo usarlo.
160  Programación / Programación C/C++ / Re: Problema fusionando pilas en: 9 Marzo 2021, 06:57 am
Bueno pues a ver... Varias cosas a mencionar:
  • Pongo esto lo primero porque creo que es el error más básico de todos: El código me hace sospechar que tienes un problema con el ámbito de las variables. La pila que creas en la línea 24, la utilizas únicamente en la 115 además de forma muy extraña.
Cuando en una función estableces el nombre de una variable, puede ser cualquiera. Este nombre solo sirve dentro de la función y realmente se corresponde con el argumento que hayas pasado al llamar a la función. Ver la función mostrarPila() más adelante...
  • La función Pilas_1() no es muy descriptiva. Sería mejor algo como push(p1, dato) simulando las funciones típicas de una pila (push, top, pop)
  • No tiene sentido hacer una función para mostrar una pila y otra para mostrar otra pila. La gracia es tener una única función y mediante parámetros decirle qué pila mostrar en cada momento.
  • Además si mueves el puntero, pierdes la referencia al inicio de la pila. Tienes que crear un puntero auxiliar.
Código
  1. void mostrarPila(Nodo *&p) {
  2.  Nodo *aux = p;
  3.  while(aux != NULL) { // En C++ para punteros no se debe usar NULL sino nullptr
  4.    cout << aux->dato << " ";
  5.    aux = aux->sig;
  6.  }
  7. }
  8. // Para mostrar las pilas 1 y 2:
  9. mostrarPila(p1); // Aqui la variable p que se usa en la funcion hace referencia a p1
  10. mostrarPila(p2); // Ahora la misma variable p hace referencia a p2

Yendo al grano ahora, la función para fusionar pilas deberías ser algo así:
Código
  1. void fusionarPilas(Nodo *&p1, Nodo *&p2, Nodo *&fusion) {
  2.  // Recorres p1 como si fueras a mostrarla pero en vez de mostrarla vas guardando cada elemento en fusion...
  3.  // Tu codigo aqui
  4.  // Recorres p2 como si fueras a mostrarla pero en vez de mostrarla vas guardando cada elemento en fusion...
  5.  // Tu codigo aqui
  6. }
  7. // Para llamar a la funcion:
  8. fusionarPilas(p1, p2, pila); // La fusion se guardara en la pila <pila> de la linea 24
  9.  
Es mejor hacerlo así para no modificar las pilas originales y guardar la fusion en otra diferente.
Si completas este código correctamente, debería funcionar y para comprobarlo ya sabes:
Código
  1. mostrarPila(pila);

Además fíjate que en tu función creas un nodo nuevo (línea 109) y luego apuntas a p1. Ese nodo nuevo se pierde, no sirve para nada.
PD: Estás trabajando con memoria dinámica (al utilizar new). Por tanto, antes de acabar el programa, debes eliminar toda esa memoria reservada mediante delete (nodo a nodo).

PD2: No es recomendable utilizar system("pause"). La mejor alternativa en C++ es utilizar cin.get() para el mismo propósito.

PD3: Las bibliotecas en C++ no llevan .h y en cambio llevan una c al principio: stdlib.h (versión C) -> cstdlib (versión C++) Funciona de todas formas por la compatibilidad con C pero no es lo más correcto.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines