Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jj1999A en 4 Diciembre 2020, 11:53 am



Título: ayudaa con pr0grama en c
Publicado por: jj1999A en 4 Diciembre 2020, 11:53 am
alguien me puede decir en que falla. por favor

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 20
  4. struct Fecha {
  5.    int dia, mes, año;
  6. };
  7. struct Lista {
  8.    int tam; //Cantidad de valores del array siguiente
  9.    struct Fecha vectorFechas[N];     // Array de fechas
  10. };
  11. void rellenar_lista(struct Lista *l);
  12. void escribir_lista(struct Lista l);
  13. int insertar(struct Lista *l,struct Fecha f);
  14. int main()
  15. {
  16.    struct Lista l;
  17.    l.tam=0;
  18.    rellenar_lista(&l);
  19.    escribir_lista(l);
  20.    return 0;
  21. }
  22.  
  23. int insertar(struct Lista *l,struct Fecha f){
  24.    int insertado=1;
  25.    if(l->tam<N){
  26.        l->vectorFechas[l->tam].dia=f.dia;
  27.        l->vectorFechas[l->tam].mes=f.mes;
  28.        l->vectorFechas[l->tam].año=f.año;
  29.        l->tam++;
  30.    }else{insertado=0;}
  31.    return insertado;
  32. }
  33. void rellenar_lista(struct Lista *l){
  34.    int acabar=0;
  35.    struct Fecha f;
  36.    printf("Introduce fechas, 0 0 0 para acabar.");
  37.    do{
  38.        printf("\nIntroduce dia, mes y año: ");
  39.        scanf("%d %d %d",&f.dia,&f.mes,&f.año);
  40.        if(f.dia==0 && f.mes==0 && f.año==0){
  41.            acabar=1;
  42.        }
  43.        else{
  44.            insertar(&l,f);
  45.        }
  46.    }while(!acabar);
  47. }
  48. void escribir_lista(struct Lista l){
  49.    int i;
  50.    if(l.tam!=0){
  51.        for(i=0;i<l.tam;i++){
  52.            printf("\n\t%02d/%02d/%d",l.vectorFechas[i].dia,l.vectorFechas[i].mes,l.vectorFechas[i].año);
  53.        }
  54.    }else{printf("\nLista vacia");}
  55. }

MOD: El código debe publicarse utilizando las etiquetas de Código GeSHi


Título: Re: ayudaa con pr0grama en c
Publicado por: K-YreX en 4 Diciembre 2020, 12:54 pm
Especifica qué problemas tienes para poder ayudarte.


Título: Re: ayudaa con pr0grama en c
Publicado por: Danielㅤ en 4 Diciembre 2020, 13:49 pm
Hola, el único error que ví apenas miré el código, es que tenés una variable "año" y los nombres de variables, funciones, clases, no pueden llevar acentos ni la letra ñ, es más incluso no va a funcionar porque el compilador seguramente dará error, en Python por ejemplo no se puede hacer eso, al menos hasta la versión 2.0 no era posible, de todas formas es una mala práctica.

Podes usar año en vez de año.


Saludos


Título: Re: ayudaa con pr0grama en c
Publicado por: jj1999A en 4 Diciembre 2020, 14:30 pm
la variable año la tengo como año solo que se ha cambiado al pasarlo aqui. El problema que tengo es que al compilar y ejecutar puede ingresar datos pero luego al querer escribir la lista me salta que esta vacía cuando en realidad he introducido datos.
 


Título: Re: ayudaa con pr0grama en c
Publicado por: K-YreX en 5 Diciembre 2020, 00:27 am
El error era un poco rebuscado. Y aunque lo que voy a decir no tiene importancia en este caso, cuando se tienen problemas y sobre todo cuando no se sabe de dónde provienen, es preferible copiar y pegar el código tal cual. Muchas veces hay errores tontos que al volver a escribir el programa en el mensaje no se cometen.

En este caso el error está en la función rellenar_lista(). Recibes un puntero a la lista (*l) por lo que llamas a esta función con &l como argumento. Ahora llamas a insertar() que recibe un puntero a la lista pero le pasas como argumento: &l (teniendo en cuenta que l ya es &l), es decir no le estás pasando el puntero a la lista sino la propia dirección de memoria en la que está el puntero, equivaldría a (&&l).
Es por esto que falla. Aunque me parece raro que lo hayas compilado y ejecutado sin problemas ya que a mí me ha saltado un warning al compilar y el programa se ha cerrado en la primera inserción.

Algunos otros consejos:
  • Puedes asignar el valor de evaluar una condición directamente a un int. Así ahorras líneas de if-else:
Código
  1. int insertado = (l->tam < N);
  2. int acabar = (f.dia == 0 && f.mes == 0 && f.año == 0);
Esto asignará un 1 si la condición es cierta y un 0 si es falsa.
  • En la función insertar_lista() creas una variable Fecha que luego pasas a insertar donde la deshaces para insertarla valor por valor. Puedes asignar la variable completa:
Código
  1. int insertar(struct Lista *l, struct Fecha f){
  2.  int insertado = (l->tam < N);
  3.  if(insertado){
  4.    l->vectorFechas[l->tam] = f;
  5.    l->tam++;
  6.  }
  7.  return insertado;
  8. }