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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  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 ... 102
51  Programación / Programación C/C++ / Re: problemas con if en: 11 Marzo 2022, 18:58 pm
Comprobar que una fecha (ej: 22/03) está dentro de un rango (ej: [21/03 - 19/04]) tiene alguna complicación.

Hola, primero que nada debes saber que dia y mes comienza y termina aries, por ejemplo:
Aries comienza el 21/03 y termina el 19/04.
Con esos datos ya puedes hacer los if's
Ejemplo:

si ((dia >= 21) y (mes >= 3) y (dia <= 19) y (mes <= 4))
   imprimir ("Tu signo es aries")
   
Luego ya puedes continuar con los otros if's
Salu2.
Ahí se puede ver el problema. Si se cumple la primera condición (dia >= 21) es imposible que se cumpla la tercera (dia <= 19). Esas dos condiciones son mutuamente excluyentes.

Una solución es calcular la fecha (fecha = día + mes) en base al número de días que han pasado desde el 1 de enero.
Para hacer esto podrías tener un array (una lista) donde cada índice i indica el número de días que tiene el mes i+1. Vamos a código que se ve más fácil:
Código
  1. #include <iostream> // La cabecera de entrada/salida estandar de C++ es <iostream>, no <iostream.h>
  2. using namespace std;
  3.  
  4. const int NUM_MESES = 12; // Longitud del array con los dias de cada mes (12 meses)
  5.  
  6. int calcularDiasAnuales(int dia, int mes) {
  7.  // El indice i indica el numero de dias del mes (i+1) => i = 0 -> dias del mes 1 (enero) -> diasMes[0] = 31
  8.  int diasMes[NUM_MESES] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  9.  
  10.  int diasAnuales = 0; // Se puede inicializar aqui con: 'diasAnuales = dia' pero asi es mas visual
  11.  for(int i = 0; i < mes - 1; ++i)
  12.    diasAnuales += diasMes[i];
  13.  
  14.  diasAnuales += dia;
  15.  return diasAnuales;
  16. }
  17.  
  18.  
  19. int main() {
  20.  int diasMes[NUM_MESES] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  21.  
  22.  int dia = 22;
  23.  int mes = 3; // Marzo
  24.  
  25.  int diaAnual = calcularDiaAnual(dia, mes);
  26.  cout << "El dia " << dia << "/" << mes << " es el dia " << diaAnual << " contando desde el 01/01" << endl;
  27. }

Usando este sistema te será más sencillo poder comparar cuando una fecha es mayor o menor que otra.
Si te das cuenta, tal y como está diseñado ahora mismo, sólo sirve para fechas que se encuentren en el mismo año natural.



Ahora vamos a las correcciones que alguna cosilla tiene tu código:
  • Como he dicho en el código: La cabecera correcta es <iostream>, no <iostream.h>
  • No utilices la función getche() de <conio.h>. Esta librería no es estándar y es preferible no usarla nunca. Utiliza la función cin.get() que pertenece a <iostream>.
  • No estás utilizando la cabecera <math.h> (ni la vas a necesitar).
  • Las condiciones que estás utilizando no existen. Tienes que utilizar las variables 'd' y 'm' (que deberías llamar 'dia' y 'mes' para tener nombres más claros)
  • Las variables 'd' y 'm' deberías declararlas dentro del main() como variables locales, no fuera como variables globales.
52  Programación / Programación C/C++ / Re: Ayuda urgente en: 3 Marzo 2022, 21:54 pm
El código es mejorable pero a simple vista parece que funciona correctamente. (No lo he ejecutado, sólo lo he revisado por encima)
Si no es así y el programa da algún error o muestra resultados inesperados, agrega un ejemplo de ejecución donde se muestre el error.

Según el enunciado que has puesto en el primer mensaje veo un pequeño error:
Citar
Dato: ALU [N, 4] (donde ALU es un arreglo bidimensional de tipo real de N filas y cuatro columnas que almacena calificaciones de alumnos, 1 < N < 50).
Te piden que el número de filas de la matriz sea exactamente N y no 50. Esto debes hacerlo usando memoria dinámica y al finalizar el programa debes liberar dicha memoria.
Si no has visto el uso de memoria dinámica puedes obviar este detalle aunque siendo precisos con el enunciado, eso es lo que te están pidiendo.

Por si te interesa mejorarlo:
  • La función main() debe ser de tipo int.
    Aunque en ciertas fuentes antiguas puede aparecer la función main() de tipo void. Lo correcto es que sea de tipo int.
    Además es la única función que no necesitas indicar expresamente al final el 'return 0' ya que el compilador lo agregará automáticamente si no lo haces tú.
  • Las variables y funciones se escriben con minúsculas.
    La nomenglatura camelCase (ej: numAlumnos, calcularPromedio()) está aceptada tanto para variables como funciones.
    La nomenglatura snake_case (ej: num_alumnos) está mayormente aceptada para variables que para funciones.
    La nomenglatura SCREAMING_SNAKE_CASE (ej: NUM_ALUMNOS) está única y exclusivamente aceptada para constantes.
    La nomenglatura PascalCase (ej: NumAlumnos) se utiliza para structs.
  • Utiliza funciones bien definidas y nómbralas con nombres que permitan identificar su funcionalidad.
    Qué será mejor? Tener una función que se llame como la primera o como la segunda:
Código
  1. // PRIMERA OPCION
  2. float calcularPromedio(float matriz[][NUM_NOTAS], int numAlumnos, int alumno);
  3. // USO
  4. for(int i = 0; i < numAlumnos; ++i) {
  5.  printf("El promedio del alumno %d es: %.2f", i+1, calcularPromedio(matriz, numAlumnos, i));
  6. }
  7.  
  8. // SEGUNDA OPCION
  9. float funcion1(float A[][EXA], int T);
  10. // USO
  11. // ??? Pues no se como usarla porque no se que parametros tengo que pasarle ya que no son descriptivos
    53  Programación / Programación C/C++ / Re: Ayuda urgente en: 3 Marzo 2022, 19:44 pm
    Chicos, tengo que hacer un programa en C para mañana y no tengo idea de cómo hacerlo.

    A la clase de Estructuras de Datos del profesor Serrano asiste un grupo numeroso de alumnos. El profesor es muy exigente y aplica cuatro exámenes durante el semestre. Escribe un programa en C que resuelva lo siguiente:

    a) El promedio de calificaciones de cada alumno.
    b) El promedio del grupo en cada examen.
    c) El examen que tuvo el mayor promedio de calificación.
    Dato: ALU [N, 4] (donde ALU es un arreglo bidimensional de tipo real de N filas y cuatro columnas que almacena calificaciones de alumnos, 1 < N < 50).

    No encuentro la forma de pedirle al usuario la cantidad de filas (cantidad de estudiantes) y hacer el ciclo for para el mismo, y tambien de que no se me mezcle con las columnas que ya las tengo.
    Por favor, si pudieran iluminarme, estoy muy desesperado.

    Así de simple es pedir al usuario la cantidad de filas:
    Código
    1. int num_filas;
    2. printf("Introduce la cantidad de filas: ");
    3. scanf("%d", &num_filas);
    4.  
    5. printf("La cantidad de filas es: %d", num_filas);

    PD: No se hacen tareas.
    Si quieres ayuda sobre una parte específica de tu programa, agrega tu código antes.
    54  Programación / Programación C/C++ / Re: duda sobre punteros en c++ en: 1 Marzo 2022, 21:27 pm
    Gracias por su respuesta pero creo que no me hice entender muy bien
    Asi que voy a ser mas directo
    En esta linea de codigo se muestra el valor al que apunta el puntero
    Código
    1. //codigo1
    2. cout<<"edad: "<<(punteroemp+pos)->edad<<endl;
    3.  
    //Codigo2
    Mientras en esta otra tengo que poner los astericos por que de lo contrario solo me va a mostrar la direccion de memoria y no el valor
    Código
    1. //codigo2
    2. cout<<*(*(matriz+i)+j)<<" ";
    3.  
    Porque en el primer caso no es necesario poner los astericos mientras en el segundo si hay que ponerlo?
    Esto es porque en el primer caso no estás mostrando el contenido de un puntero sino de una variable "normal" (edad) aunque estés accediendo a esa variable por medio de un puntero.
    Si ves en tu código original, (línea 8) 'edad' es una variable de tipo int.

    Supongamos que en lugar de tu código original, tienes el siguiente:
    Código
    1. struct Empleado {
    2.  int* edad;
    3. };
    4.  
    5. int main() {
    6.  Empleado *puntero_empleado = new Empleado; // Reservamos memoria para el puntero a 'Empleado' -> No relevante ahora mismo
    7.  
    8.  // 'puntero_empleado->edad' es equivalente a: '(*puntero_empleado).edad'
    9.  // La primera sintaxis es mas elegante y mas facil de leer pero significa exactamente lo mismo
    10.  puntero_empleado->edad = new int; // Reservamos memoria para poder guardar un int (ahora es necesario porque edad es un puntero) -> No relevante ahora mismo
    11.  puntero_empleado->edad = 5; // ERROR!! Estas asignando un int (5) a un puntero
    12.  *(puntero_empleado->edad) = 5; // CORRECTO!!
    13.  *(*(puntero_empleado).edad) = 5; // Esto tambien es correcto pero se lee peor
    14.  
    15.  cout << puntero_empleado->edad << endl; // Esto te mostrara la direccion de memoria del puntero 'edad'
    16.  cout << *(puntero_empleado->edad) << endl; // Esto te mostrara el contenido de la direccion de memoria del puntero 'edad': 5
    17.  
    18.  // Si reservamos memoria dinamica mediante 'new', al dejar de usarla hay que liberarla con 'delete' -> No relevante ahora mismo
    19.  delete(puntero_empleado->edad);
    20.  delete(puntero_empleado);
    21. }
    Como ves, si la variable 'edad' que es la que tú realmente estás usando fuera un puntero, también tendrías que usar el asterisco

    En cambio, en el segundo caso que muestras, estás accediendo a una variable que es un puntero (más concretamente una matriz = puntero a punteros) y por eso tienes que usar el asterisco.

    Entendiendo bien los operadores (* y &) puedes concatenar tantos punteros/no punteros como quieras. Claro que si concatenas demasiado perderás el hilo de a qué estás accediendo:
    • Operador * -> Sólo se puede usar con punteros: Devuelve el contenido que está almacenado en la dirección de memoria a la que apunta el puntero.
    • Operador & -> Se puede usar con cualquier tipo de variable: Devuelve la dirección de memoria de esa variable.

      Código
      1. int var = 5; // Variable "normal"
      2.  
      3. // NOTA: Cuando se asigna un valor (direccion de memoria) a un puntero al mismo tiempo que se declara estamos ante una situacion especial
      4. // Aunque estemos usando el asterisco realmente no estamos accediendo al contenido al que apunta, en este momento el asterisco solo significa que hemos declarado un puntero
      5. int *p_var = &var; // Puntero a int
      6. // La linea anterior es equivalente a:
      7. // int *p_var;
      8. // p_var = &var;
      9.  
      10. cout << var << endl; // Muestra el contenido de var: 5
      11. cout << &var << endl; // Muestra la direccion de memoria donde se esta guardando 'var'. Imaginemos que es: 0x1 (realmente sera un numero mas largo)
      12.  
      13. // Ahora estamos accediendo al contenido del puntero p_var -> ¿Que guarda un puntero? Una direccion de memoria, en este caso la de 'var'
      14. cout << p_var << endl; // Muestra: 0x1
      15. cout << *p_var << endl; // Muestra el contenido guardado en la direccion de memoria guardada en 'p_var' -> p_var = 0x1 -> Contenido en 0x1: 5
      16. cout << &p_var << endl; // Muestra la direccion de memoria donde se esta almacenando el puntero 'p_var'. Supongamos 0x5 (realmente sera otro numero largo)
      17.  
      18. // Ahora complicamos mas la situacion:
      19. int **pp_var; // Doble puntero -> Significa que tiene que guardar una direccion de memoria pero no una cualquiera. Tiene que guardar la direccion de memoria de un puntero
      20. pp_var = &p_var; // Aqui tenemos la direccion de memoria de un puntero (0x5), nos sirve.
      21.  
      22. // Y ahora llega lo divertido. Te reto a entender que se esta mostrando en cada momento y si lo consigues, ya tendras los punteros mucho mas dominados de lo que pensabas:
      23. cout << pp_var << endl;
      24. cout << &pp_var << endl;
      25. cout << *pp_var << endl;
      26. cout << **pp_var << endl;
      27.  

      Puedes hacer un programa con el código anterior y ejecutarlo para verlo con valores de verdad.
      Verás que aunque las direcciones de memoria son más largas, se cumple que el valor real de lo que yo he llamado 0x1 en la línea 11 es el mismo que en la línea 14. Y así con 0x5 también.

      PD: Soluciones:
      Código
      1. cout << pp_var << endl; // Muestras lo que esta guardando el puntero doble 'pp_var' -> Guarda la direccion de memoria de 'p_var' -> 0x5
      2. cout << &pp_var << endl; // Muestra la direccion de memoria propia de 'pp_var' -> Sera otra diferente: 0x15 por ejemplo
      3. cout << *pp_var << endl; // Muestra el contenido de 'p_var' -> 'p_var' contiene la direccion de memoria de 'var' -> 0x1
      4. cout << **pp_var << endl; // Muestra el contenido del contenido de 'p_var' -> 'p_var' contiene la direccion de memoria de 'var' (0x1) -> Esta direccion contiene el valor de 'var' -> 5
    55  Programación / Programación C/C++ / Re: Error de instalación de la biblioteca SFML en Code::Blocks en: 1 Marzo 2022, 20:42 pm
    Nunca he usado esa biblioteca por lo que no tengo mucha idea pero he encontrado este problema muy similar al tuyo:
    https://stackoverflow.com/questions/63891624/setting-up-sfml-in-codeblocks-cant-find-lsfml-graphics

    En ese tema se menciona el siguiente tutorial para instalar SFML en Windows con Code::Blocks y gcc que creo que se ajusta bastante (por no decir a la perfección) a lo que estás haciendo.

    Espero que te sirva.
    56  Programación / Programación C/C++ / Re: Duda con expresion en: 22 Febrero 2022, 21:20 pm
    No entiendo tu respuesta

    ¿podrias por favor dejarte de ir por las ramas y hablar de una manera simple?,

    ¿que es parasing?, tampoco entendi lo que quisites decir
    Después del tiempo que llevo en el foro, todavía me sigo sorprendiendo con este tipo de usuarios...
    En serio: "Vemos la paja en el ojo ajeno, y no vemos la viga en el nuestro"

    Quiero decir, abres un tema para preguntar una duda, dando una explicación nefasta (por si no entendiste lo de "nefasto": https://dle.rae.es/nefasto).
    Por si hacia falta una segunda opinión, ahí va la mía: No hay forma de entender qué es lo que se está preguntando...
    Con todo y con ello, un tema que tenía todas las papeletas de ser ignorado, consigues que 2 3 usuarios inviertan parte de su tiempo en intentar ayudarte y ¿qué reciben a cambio? Desprecio...

    ¿De verdad piensas que son formas de responder a personas que no te conocen de nada y que te están intentando ayudar desinteresadamente?

    PD: Mencionaron "parsing", no "parasing". Esto es lo primero que aparece cuando buscas "parsing" sin más en Internet:
    https://diccionario.reverso.net/ingles-espanol/parsing
    https://en.wikipedia.org/wiki/Parsing
    No me ha hecho falta entrar en la Dark Web para encontrar algún resultado...
    57  Programación / Programación C/C++ / Re: buenas tardes necesito ayuda para este codigo en arduino, para motores a paso de una cnc y quiero apagar y prender 1 en: 19 Febrero 2022, 21:37 pm
    Obviamente, si en la línea 16 defines la función:
    Código
    1. void setup()
    Y en la línea 32, vuelves a definir la misma función, el compilador cómo va a saber cuál de las 2 tiene que usar??
    58  Programación / Programación C/C++ / Re: Necesito hacer un programa en C en: 17 Febrero 2022, 22:22 pm
    Estaría bien si te da un error, que pusieras el error para facilitar el trabajo a quienes intentan ayudar...

    Seguramente el error diga algo así como que la función 'busqueda()' no devuelve ningún valor y es porque qué pasa si metes un número? La función busqueda() recorre todas las letras, no encuentra el número y qué? Qué devuelve? Ahora mismo: NADA.

    Por estandarizar se suele hacer que cuando no se encuentra un índice, se devuelva un -1:
    Código
    1. int findAlphabeticIndex(char character) {
    2.  int index = -1;
    3.  char alphabet[] = "abcd...";
    4.  char lower_character = tolower(character);
    5.  for(int i = 0; i < strlen(alphabet) && index == -1; ++i)
    6.    if(lower_character == alphabet[i]) index = i + 1;
    7.  return index;
    8. }

    O sino... MAGIC!!  :o :o
    Código
    1. int findAlphabeticIndex(char character) {
    2.  char lower_character = (character >= 'A' && character <= 'Z') ? character + ('a' - 'A') : character;
    3.  return (lower_character >= 'a' && lower_character <= 'z') ? lower_character - 'a' + 1 : -1;
    4. }

    PD: Yo cambiaría la línea 8 de tu programa por:
    Código
    1. fgets(cadena, 200, stdin);
    59  Programación / Programación C/C++ / Re: duda urgente sobre vector en: 17 Febrero 2022, 22:01 pm
    Es sencillo y complejo a la vez, veamos:
    (Voy a dar por supuesto que tienes nociones básicas sobre punteros)

    Aquí tengo mi lista en la que voy a guardar punteros char (char*):
    Código:
    lista = [] // la lista esta vacia

    Ahora creo el puntero 'linea' y le asigno un espacio de 5 caracteres (pongo 5 para simplificarlo más):
    Código:
    linea = [_, _, _, _, _] // linea apunta a la direccion de memoria 0x1 (por ejemplo) 

    Vamos a leer la primera línea del fichero: "Hola" y lo guardamos en 'linea' (recordemos: está en memoria 0x1):
    Código:
    linea = [H, o, l, a, \0] // Podemos obviar el \0 
    Y ahora guardamos el puntero en la lista:
    Código:
    lista = [linea]
    // Esto realmente es lo mismo que:
    lista = [0x1] // Guardamos la dirección a la que esta apuntando el puntero 'linea'

    Ahora leemos la segunda línea del fichero "Mundo" y lo guardamos en 'linea':
    Código:
    linea = [M, u, n, d, \0] // UPS! No cabe (no importa porque fgets() lo soluciona solito) 
    Y lo guardamos en la lista de nuevo:
    Código:
    lista = [linea, linea]
    // O lo que es lo mismo (seguro que ya has visto el problema):
    lista = [0x1, 0x1]

    Y ahora te muestro ambos elementos de la lista:
    Código:
    Elemento 0 -> Vamos a 0x1 y tenemos: [M, u, n, d, \0]
    Elemento 1 -> Vamos a 0x1 y tenemos: [M, u, n, d, \0]

    Parece que el "Hola" ha desaparecido (y así es).

    Para solucionar esto tienes que reservar memoria para cada elemento que insertes en la lista para que cada uno esté en un espacio de memoria diferente y no se pisen unos elementos con otros
    Esquematizado sería:
    Código:
    MIENTRAS !fin(fichero) HACER
      linea = leerLinea(fichero)
      lista.agregar(new char[SIZE])
      copiar(linea, lista[ultimoElemento])
    FIN MIENTRAS
    Recuerda copiar (strcpy()) el contenido del char* y no asignarlo sin más (=) pues sino te verás en las mismas.
    Y cuando tu programa termine tendrás que liberar toda la memoria de la lista.

    Un par de consejos extra:
    • Estás utilizando C++, por lo que puedes aprovechar el tipo string para facilitarte el trabajo con los char*.
    • Utiliza una constante para el tamaño del array y en el fgets() aprovecha el mismo tamaño. Para qué sino reservar un array de tamaño 100 si luego sólo vas a copiar como máximo 50 caracteres??
    Código
    1. const int LINE_SIZE = 100;
    2.  
    3. int main() {
    4.  char* linea[LINE_SIZE]; // Puede ser estatico (mas sencillo)
    5.  //...
    6.  fgets(linea, LINE_SIZE, file);
    7.  char *nuevo_puntero = new char[strlen(linea) + 1]; // Puedes ahorrar espacio creando los arrays con la longitud justa necesaria
    8.  strcpy(nuevo_puntero, linea);
    9.  // Ahora ya puedes modificar 'linea' todo lo que quieras que no afectara a nuevo_puntero
    10. }
    60  Programación / Programación C/C++ / Re: Lista enlazada en c en: 10 Febrero 2022, 19:56 pm
    No he mirado todo el código por falta de tiempo pero te daré una pista:
    El problema está en la línea 94. Si asignas un char[] usando el operador '=' estás haciendo que el puntero de la izquierda apunte al mismo sitio que el puntero de la derecha. Es decir, realmente sólo tienes la cadena guardada en un sitio y ambos punteros están apuntando ahí. ¿Qué pasa entonces? Que si cualquiera de los dos punteros cambia esa cadena, cuando el otro puntero quiera leer su contenido, también lo verá modificado.

    La solución está en la línea 93... Pero con un pequeño detalle: Para poder guardar una copia del contenido, primero tienes que reservar el espacio necesario para ello.

    Si corrigiendo eso, sigues teniendo algún problema, agrega además del código un ejemplo de ejecución para poder ver la salida y no tener que revisar todo el código.
    Suerte.  :-X
    Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 102
    WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines