Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#21
Por un lado, no puedes utilizar el signo "=" para comparar. Este signo es el operador de asignación (da un valor), no de comparación. El signo de comparación para comparar datos primitivos o direcciones de memoria es "==".

Por otro lado, en tu caso no quieres comparar ni un dato primitivo (int, float, char, ...) ni una dirección de memoria sino el contenido de un objeto (String). Para ello necesitas utilizar el método equals().
#22
Programación C/C++ / Re: Duda de un programa
3 Noviembre 2021, 21:15 PM
Yo diría que tu algoritmo no es correcto.  :silbar: :silbar:
Un número omirp es un número primo no capicúa cuyo palíndromo también es primo. Por ejemplo: 13 - 31 | 17 - 71 | ...

Al ejecutar tu programa el resultado que obtengo es:

2 1/1
3 2/2
4 3/3
5 5/5
6 7/7
7 10/1
...

Con sólo estos resultados ya podemos ver que:
  • Los números {1, 2, 3, 5 y 7} no son considerados números omirp porque son capicúa (sus palíndromos son ellos mismos).
  • El 10 no es primo (y realmente el 1 tampoco)

    Es decir que de todos esos resultados no hay ninguno válido.
#23
Al realizar una operación entre 2 datos, el tipo del resultado es el mismo que el tipo de datos más grande de entre los dos operandos. Por ejemplo:
Operar 2 ints -> Resultado: int.
Operar int y float -> Resultado: float.
Operar int y short -> Resultado: int.
... Y así con cualquier tipo.

Si realizas una operación entre dos enteros, el resultado será un entero. Entonces:

int a = 3;
int b = 2;
printf("Resultado %d/%d = %d", a, b, a/b); // Resultado 3/2 = 1


Para obtener el resultado con decimales debes hacer una conversión de cualquiera de los datos a algún tipo decimal (float/double).

int a = 3;
int b = 2;
printf("Resultado %d/%d = %.1f", a, b, (float)a/b); // Resultado 3/2 = 1.5


PD: Para mostrar un número decimal hay que utilizar "%f". El ".1" indica que muestre el número con un solo dígito decimal.
#24
Bueno... A ver a ver. Parece que hay mucho trabajo por delante así que vamos a ir punto por punto:


  • Las funciones no siguen las normas básicas de las funciones:
    Una función debe realizar una función completa y autónoma. Una función es un fragmento de código que puedes reutilizar muchas veces. Para ello tiene que hacer una tarea muy bien definida y genérica. Por ejemplo: calcularMedia(...), mostrarMatriz(...), buscarMaximo(...), ... Si te fijas es muy sencillo saber qué hacen esas funciones, en cambio dos funciones que se llaman lista_de_personas_M() y lista_de_personas_F() no se sabe qué hacen a simple vista. Y además no hacen una tarea concreta sino que tienen dentro todo el programa en sí.

  • El nombre del struct no es del todo preciso. La estructura define una persona, no una lista de personas. Además estás definiendo en la línea 20 un array de struct global (no recomendable). Y cada vez que quieras usar el struct debes poner la palabra struct: en la línea 25 te falta el nombre de la variable. Poner: 'struct lista_de_personas;' es como poner: 'int;' Falta el nombre de la variable, sólo estás indicando el tipo que va a tener pero no cómo se llama. Seguramente este sea el primer error que te da al compilar.
    Otra cosa importante es que estás usando un char para guardar el nombre y otro para el apellido. Es decir, un único carácter para cada cosa, no una cadena.

    Una recomendación es usar 'typedef' para no tener que usar la palabra 'struct' todo el tiempo.

// Consejo EXTRA: Utiliza constantes para la longitud de los arrays estaticos
#define MAX_LONGITUD_NOMBRE 20
#define MAX_LONGITUD_APELLIDO 50

typedef struct {
  char nombre[MAX_LONGITUD_NOMBRE];
  char apellido[MAX_LONGITUD_APELLIDO];
  // El DNI lo guardaria como un char[] y no como un int
  //...
} Encuestado;

int main() {
  // Ahora para declarar un array de encuestados no hace falta hacer:
  struct Encuestado encuestados[];
  // Tan solo tienes que hacer:
  Encuestado encuestados[];
}


  • El main() de un programa de este estilo debería dar una visión general de lo que hace el programa (no cómo lo hace pero sí qué hace). En este caso si lees el main() te quedas más o menos así:  :huh:
    Yo apostaría por algo más de este estilo:

#define NUM_ENCUESTADOS 10
#define NUM_CANCIONES 5
//...

int main() {
  Encuestado encuestados[NUM_ENCUESTADOS];

  for(int i = 0; i < NUM_ENCUESTADOS; ++i) {
    printf("Introduce el nombre del encuestado %d: ", (i+1));
    // Consejo EXTRA: Las cadenas de texto se leen con fgets() no con scanf(). Volveremos a esto mas adelante
    fgets(personas[i].nombre, MAX_LONGITUD_NOMBRE, stdin);

    printf("Introduce la edad del encuestado %d: ", (i+1));
    scanf("%d", &personas[i].edad);

    //...
  }
  // Tambien puedes hacer una funcion que sea pedirDatosEncuestado(Encuestado encuestado) y dentro poner todos los mensajes pidiendo datos y guardando la entrada del teclado...

  // Aqui ya puedes usar las funciones que quieras en base a lo que necesites
  for(int i = 0; i < NUM_ENCUESTADOS; ++i) {
    printf("***** DATOS DEL ENCUESTADO %d *****\n", (i+1));
    // En el main() no necesito saber como va a mostrar los datos pero se lo que va a hacer. Para los detalles siempre puedes mirar dentro de la funcion
    mostrarDatosEncuestado(encuestados[i]);
    printf("\n");
  }
}


  • Entrada de datos: La función fflush() no debe usarse para limpiar el buffer de entrada (stdin). El fin de esta función (mal utilizada) es eliminar los saltos de línea '\n' que se insertan en el buffer de entrada al pulsar Enter. Aquí pueden darse 2 casos:

    • Lectura de cadenas de caracteres. La forma correcta/segura es mediante la función fgets(). Aquí pueden darse 2 casos también:

      • Se introducen más caracteres de los que se pueden almacenar en el array -> En el buffer quedarán todos los caracteres que no caben en el array y al final el salto de línea '\n'. Todo esto que queda en el buffer tiene que limpiarse.
      • Se introducen menos caracteres de los que se pueden almacenar en el array -> Se guardan todos los caracteres (incluido el salto de línea) y el buffer queda vacío.
      Para ambos casos se puede usar el siguiente código:

    char cadena[MAX_SIZE]; // La longitud maxima es indiferente
    printf("Introduce una cadena: ");
    fgets(cadena, MAX_SIZE, stdin);
    if(cadena[strlen(cadena) - 1] == '\n') // Si el ultimo caracter guardado es el salto de linea -> El buffer esta limpio
      cadena[strlen(cadena) - 1] = '\0'; // Eliminamos el salto de linea que es muy molesto
    else // En caso de que el ultimo caracter no sea un salto de linea, significa que quedan restos en el buffer de entrada -> Hay que limpiar todo
      while(getchar() != '\n'); // Elimina los caracteres que quedan en el buffer hasta encontrar el salto de linea (que es el ultimo caracter del buffer)

    • Lectura de datos que no sean cadenas de caracteres. Para este caso la función más común a utilizar es scanf(). Esta función nunca incluye el salto de línea dentro de la variable por lo que siempre quedará en el buffer. En este caso tan solo hay que limpiar todo el buffer justo después de un scanf() para asegurarnos de que siempre estará limpio.

    printf("Introduce un numero: ");
    scanf("%d", &numero);
    while(getchar() != '\n'); // Con el bucle podremos limpiar cualquier resto si se introduce un dato no valido ademas del salto de linea



    Y con esto creo que tienes ya recomendaciones para rato. Cualquier duda de estos temas tienes temas en este foro más antiguos donde se explican, puedes usar el botón de "Buscar" para encontrarlos.
    PD: Cuidado con los tipos de datos, tienes por ahí un %s para guardar un int...  :rolleyes: :rolleyes:
    PD2: Mencionas el método burbuja pero eso es un algoritmo de ordenación y hasta donde yo he entendido no necesitas ordenar nada en este programa... :huh:
#25
La respuesta a este problema es sencilla: tener una variable que almacene siempre el número de elementos insertados.
Cuando se tiene una colección de datos (array o similares) hay dos conceptos parecidos pero diferentes: size y capacity.
  • size -> Indica el número de elementos que contiene la colección
  • capacity -> Indica el máximo número de elementos que puede contener la colección

    Es un problema común cuando se recorre una colección, utilizar la condición (i < capacity) en vez de (i < size). En tu caso concreto parece que la variable j corresponde a capacity y la variable p corresponde a size (excepto cuando haces p=0 al mostrar). Corrige eso un poco y lo tendrás (usa siempre que puedas nombres descriptivos, esto no es necesario para los contadores de un for: i, j, k...; pero sí siempre que esas variables las uses para más cosas)

    PD: No le encuentro sentido a la función memset() que utilizas.


    Por otro lado te dejo algunos consejos extra:
  • Las cadenas de caracteres se recomienda leerlas con fgets() en vez de scanf(). En este foro hay muchos temas al respecto, puedes utilizar el botón de "Buscar" para encontrarlos.

  • Utiliza constantes para los valores predefinidos y evita siempre que sea posible escribir números directamente en el código. Así será más fácil entender por qué hay un 10 por ahí y no es un 15 por ejemplo.

    const int MAX_ELEMENTOS = 10;
    const int MAX_LONGITUD_ELEMENTO = 100;

    int main() {
        ...
    }

    Así si en un momento dado quieres cambiar alguno de esos valores, sólo tendrás que cambiarlo en un sitio y no en todas las líneas donde lo usas.

    Se puede mejorar alguna cosa más pero con esos dos puntos creo que ya se notará una mejora considerable.
    Suerte  :-X
#26
Básicamente el for interno escribe de izquierda a derecha porque es el flujo normal del texto cuando escribes y el for externo escribe de arriba hacia abajo porque en la línea 29 lo que estás haciendo es escribir un salto de línea (como si pulsaras Enter).
#27
Java / Re: Ayuda con Queue de array
6 Septiembre 2021, 23:17 PM
Estoy dispuesto a ayudarte sólo por las referencias a HP pero... tienes que poner algo más de código, no voy a dártelo hecho...
No se hacen tareas. Agrega el código que tengas hecho aunque esté mal para poder ayudarte.

PD: Utiliza etiquetas de código GeSHi para el código tal que así:

[code=java]
Aquí pones tu código
[/code]

El resultado tiene que quedar tal que así:
Código (java) [Seleccionar]

System.out.println("Codigo entre etiquetas de codigo GeSHi");
#28
Todo depende de hacia dónde quieras enfocarte. Hay lenguajes específicos para ciertas cosas.
Pero si no tienes nada en mente y quieres aprender algún lenguaje de propósito general, yo personalmente te recomiendo C# o Java en su defecto.
Puedes encontrar manuales, cursos, vídeos e infinidad de recursos didácticos en cualquier web (y la inmensa mayoría gratis). No necesitas gastar absolutamente nada de dinero.
#29
Programación C/C++ / Re: Devolver string con int
4 Septiembre 2021, 14:04 PM
Tienes que compilar para C++11 para que funcione. Ahí tienes la respuesta de Stackoverflow: https://stackoverflow.com/a/15569244
No sé cómo estés compilando el programa pero digamos que si la línea de compilación ahora era:
g++ tu_programa.cpp -o tu_programa
Debes modificarla para que sea:
g++ -std=c++0x tu_programa.cpp -o tu_programa
También puedes utilizar "-std=c++11" en vez de "-std=c++0x", dependiendo del compilador.

Si estás utilizando algún IDE tendrás que buscar cómo se hace esto en ese IDE en particular. Seguro que en Internet encuentras el modo rápidamente.
#30
Programación C/C++ / Re: Devolver string con int
4 Septiembre 2021, 13:36 PM
No sé si sea esto lo que estabas buscando:
Código (cpp) [Seleccionar]

string retornarString(int x) {
  return "El numero es: " + to_string(x);
}

int main() {
  cout << retornarString(2) << endl;
}


El operador << no se utiliza para concatenar (es un caso especial y más complejo de <cout>). El operador general para concatenar es +.