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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error en Ciclo "For" (C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Error en Ciclo "For" (C)  (Leído 4,712 veces)
Geg1

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Error en Ciclo "For" (C)
« en: 7 Marzo 2017, 20:32 pm »

Buenas a todos! Desde ya muchas gracias por su atención!
No encuentro la forma de evitar que ocurra esto en mi "lista de pedidos":
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct fecha{
  5.    int MM;
  6.    int AA;
  7.    int DD;
  8. }tfecha;
  9.  
  10. typedef struct pedido{
  11.    char nombrecliente[20],domicilioentrega[20];
  12.    tfecha fechadepedido;
  13. }tpedido;
  14.  
  15. //----------------------------------------------------
  16.  
  17. void cargarpedido (tpedido *R);
  18. void mostrarpedido (tpedido R);
  19. void cargarvectorpedidos (tpedido V[]);
  20. void mostrarvectorpedidos (tpedido V[]);
  21.  
  22. //----------------------------------------------------
  23.  
  24. int main()
  25. {
  26.    tpedido X[5];
  27.    int op;
  28.    while(op!=4)
  29.    {
  30.        printf("1.- Ingresar encomienda\n");
  31.        printf("2.- Anular encomienda\n");
  32.        printf("3.- Mostrar lista de encomiendas\n");
  33.        printf("4.- Salir\n");
  34.        printf("Indica la opcion: ");
  35.        scanf("%d", &op);
  36.        system("cls");
  37.  switch(op)
  38.          {
  39.  
  40.            case 1: cargarvectorpedidos(X);
  41.            break;
  42.            case 2: break;
  43.            case 3: mostrarvectorpedidos(X);
  44.            break;
  45.            case 4: break;
  46.        }
  47.  
  48.    }
  49. }
  50. //-----------------------------------------------------
  51.  
  52. void cargarpedido(tpedido *R){
  53. tpedido A;
  54. printf("\nIngrese nombre del cliente:\n");
  55. scanf("%s",&A.nombrecliente);
  56. fflush(stdin);
  57. printf("\nIngrese domicilio de entrega:\n");
  58. gets(A.domicilioentrega);
  59. fflush(stdin);
  60. printf("\nIngrese fecha de ingreso de la encomienda:\n");
  61. printf("\n\n");
  62. printf("\Ingrese numero de dia \n");
  63. fflush(stdin);
  64. scanf("%d",&A.fechadepedido.DD);
  65. printf("\Ingrese numero de mes \n");
  66. fflush(stdin);
  67. scanf("%d",&A.fechadepedido.MM);
  68. printf("\Ingrese numero de a%co\n",164);
  69. fflush(stdin);
  70. scanf("%d",&A.fechadepedido.AA);
  71. fflush(stdin);
  72. *R=A;
  73. }
  74.  
  75. //--------------------------------------------------------
  76.  
  77. void cargarvectorpedidos(tpedido V[]){
  78.        int cantidad,i;
  79.        tpedido aux;
  80.        printf("Ingrese la cantidad de encomiendas a cargar \n");
  81.        fflush(stdin);
  82.        scanf("%d",&cantidad);
  83.  
  84.        for(i=0;i<cantidad;i++){
  85.        printf("\nIngrese los datos para la encomienda %d:\n",i+1);
  86.        cargarpedido(&aux);
  87.        V[i]=aux;
  88.        system("cls");
  89.        }
  90.  
  91. }
  92.  
  93. //------------------------------------------------------------
  94.  
  95.  
  96. void mostrarvectorpedidos(tpedido V[]){
  97. int j;
  98. system("pause");
  99. system("cls");
  100. printf("\n Listado de encomiendas:\n");
  101. for(j=0;[color=red][b]j<5[/b][/color];j++){
  102.        mostrarpedido(V[j]);
  103. }
  104. system("pause");
  105. system("cls");
  106. }
  107.  
  108. //--------------------------------------------------------------
  109.  
  110. void mostrarpedido(tpedido R){
  111.  
  112.        printf("\nNombre del cliente: %s", R.nombrecliente);
  113.        printf("\nDomicilio de entrega: %s", R.domicilioentrega);
  114.        printf("\nFecha de ingreso de la encomienda: %d/%d/%d",R.fechadepedido.DD,R.fechadepedido.MM,R.fechadepedido.AA);
  115.        printf("\n");
  116.  
  117.    }
  118.  



En Rojo, creo yo, en donde esta el error... ya que al ingresar (Ejemplo) un pedido, y quererlo mostrar por pantalla, sale esto:







No se como lograr que solo muestre la cantidad puesta anteriormente asignada al entero "cantidad"


Por otra parte, necesito ayuda para anular un registro y asi crear la función "Anular pedido", digamos que estoy perdido y no se por donde empezar para crear dicha función, si me ayudan con un planteo se los agradecería muchísimo!


« Última modificación: 7 Marzo 2017, 21:20 pm por engel lex » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #1 en: 8 Marzo 2017, 12:53 pm »

¿Has visto listas enlazadas?
Lo que planteas es un problema que se resuelve con ellas.

Si no las has visto y solo puedes usar arrays tendrás podrías resolver el problema poniendo un campo más en tu estructura diciendo si el registro es útil. Cada vez que incluyas un registro buscas el primero que no sea útil (esté vacío) y lo incluyes allí. Para visualizar repasas toda la lista y solo muestras los marcados como útiles. Para borrar solo debes marcar el registro de interés como inútil.
También podrías hacer lo mismo sin ese campo pero creando un array paralelo, que tendrán que ser recorridos al mismo tiempo, en el que solo guardaría la información de si el registro es válido.


En línea

Geg1

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #2 en: 8 Marzo 2017, 16:55 pm »

¿Has visto listas enlazadas?
Lo que planteas es un problema que se resuelve con ellas.

Si no las has visto y solo puedes usar arrays tendrás podrías resolver el problema poniendo un campo más en tu estructura diciendo si el registro es útil. Cada vez que incluyas un registro buscas el primero que no sea útil (esté vacío) y lo incluyes allí. Para visualizar repasas toda la lista y solo muestras los marcados como útiles. Para borrar solo debes marcar el registro de interés como inútil.
También podrías hacer lo mismo sin ese campo pero creando un array paralelo, que tendrán que ser recorridos al mismo tiempo, en el que solo guardaría la información de si el registro es válido.
No he visto tal cosa :( pero me podrias explicar mas a fondo la nueva estructura que planteas? Gracias por tu respuesta!!
En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #3 en: 8 Marzo 2017, 17:59 pm »

el problema que tienes esta en la funcion
Código:
void mostrarvectorpedidos(tpedido V[]){
int j;
system("pause");
system("cls");
printf("\n Listado de encomiendas:\n");
for(j=0; j<5; j++){
        mostrarpedido(V[j]);
}
system("pause");
system("cls");
}

en la que tu ciclo for(); j<5 se repte 5 veces independiente del numero de pedidos que has ingrsado por ejemplo tu ingresaste 1 y te lo imprime pero tambien imprime otros 4 con contenido basura o no definido

lo que puedes hacer es mantener un contador que almacene el numero de pedidos ingresados que sera el mismo que le pases al ciclo for() como j<contador; para que solo te imprima la cantidad de pedidos ingresados

haora para las listas enlasadas te recomiendo este video
https://www.youtube.com/watch?v=vldM-3PYAmo
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #4 en: 8 Marzo 2017, 19:00 pm »

Algo así (solo se muestran las modificaciones al original):
Código
  1. typedef struct pedido{
  2.    char nombrecliente[20],domicilioentrega[20];
  3.    tfecha fechadepedido;
  4.    int esValido; // <-- inclusión
  5. }tpedido;
  6.  
  7. void inicializar_lista(tpedido lista[]) { // <-- Nueva función. Debe ser el primer código que se
  8.    int i;                                //         ejecute dentro de main(), después de la
  9.                                          //         declaración de las variables
  10.    for(i=0; i<5; ++i)
  11.        lista[i].esValido = 0;
  12. }
  13.  
  14. void cargarvectorpedidos(tpedido V[]){
  15.    int cantidad, i;
  16.    tpedido aux;
  17.  
  18.    printf("Ingrese la cantidad de encomiendas a cargar \n");
  19.    fflush(stdin);
  20.    scanf("%d", &cantidad);
  21.  
  22.    for(i=0; i<cantidad; i++){
  23.        printf("\nIngrese los datos para la encomienda %d:\n",i+1);
  24.        cargarpedido(&aux);
  25.        V[i]=aux;
  26.        V[i].esValido = 1; // <-- inclusión
  27.        system("cls");
  28.    }
  29. }
  30.  
  31. void mostrarvectorpedidos(tpedido V[]) {
  32.    int j;
  33.  
  34.    system("pause");
  35.    system("cls");
  36.    printf("\n Listado de encomiendas:\n");
  37.  
  38.    for(j=0; j<5; j++) {
  39.        if(V[j].esValido) // <-- inclusión
  40.            mostrarpedido(V[j]);
  41.        }
  42.    }
  43.  
  44.    system("pause");
  45.    system("cls");
  46. }
  47.  
  48.  
  49. int main()
  50. {
  51.    tpedido X[5];
  52.    int op;
  53.  
  54.    inicializar_lista(X); // <-- Llamada a la nueva función
  55.    while(op!=4)
  56.    // ...
  57. }
En línea

Geg1

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #5 en: 8 Marzo 2017, 19:49 pm »

el problema que tienes esta en la funcion
Código:
void mostrarvectorpedidos(tpedido V[]){
int j;
system("pause");
system("cls");
printf("\n Listado de encomiendas:\n");
for(j=0; j<5; j++){
        mostrarpedido(V[j]);
}
system("pause");
system("cls");
}

en la que tu ciclo for(); j<5 se repte 5 veces independiente del numero de pedidos que has ingrsado por ejemplo tu ingresaste 1 y te lo imprime pero tambien imprime otros 4 con contenido basura o no definido

lo que puedes hacer es mantener un contador que almacene el numero de pedidos ingresados que sera el mismo que le pases al ciclo for() como j<contador; para que solo te imprima la cantidad de pedidos ingresados

haora para las listas enlasadas te recomiendo este video
https://www.youtube.com/watch?v=vldM-3PYAmo

Entiendo, pero ese contador es justamente el entero "cantidad" como lo relaciono con la funcion "mostrarVectorPedidos"?

Disculpen es que soy bastante nuevo en esto de la programacion!  :rolleyes:
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #6 en: 8 Marzo 2017, 20:20 pm »

Sácalo de la función y conviértelo en global, así lo tendrás visible para todas las funciones.
En línea

Geg1

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #7 en: 8 Marzo 2017, 20:25 pm »

Sácalo de la función y conviértelo en global, así lo tendrás visible para todas las funciones.
Uf, que me hago un mate en la cabeza jajaj, solo el entero "cantidad" dices que saque de la funcion "Cargarvectorpedidos"?

En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #8 en: 8 Marzo 2017, 23:27 pm »

la variable 'cantidad' que tienes en la función void cargarvectorpedidos(tpedido V[]) declarala en la funcion main() y despues solo pasar la direccion de la variable cargarvectorpedidos(x, &cantidaad); y la revises como puntero en la funcion void cargarvectorpedidos(tpedido V[], int* cantidad); y despues solo lo pasas como reerencia en la uncion mostrarvectorpedidos(X, cantidad); y la usas en el ciclo for(); j<cantidad

si tienes mas dudad puedes ver este vídeo



· No hacer doble post, usa el botón "modificar"
>aquí las reglas del foro
-Engel Lex
« Última modificación: 8 Marzo 2017, 23:44 pm por engel lex » En línea

Geg1

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: Error en Ciclo "For" (C)
« Respuesta #9 en: 9 Marzo 2017, 02:38 am »

la variable 'cantidad' que tienes en la función void cargarvectorpedidos(tpedido V[]) declarala en la funcion main() y despues solo pasar la direccion de la variable cargarvectorpedidos(x, &cantidaad); y la revises como puntero en la funcion void cargarvectorpedidos(tpedido V[], int* cantidad); y despues solo lo pasas como reerencia en la uncion mostrarvectorpedidos(X, cantidad); y la usas en el ciclo for(); j<cantidad

si tienes mas dudad puedes ver este vídeo



· No hacer doble post, usa el botón "modificar"
>aquí las reglas del foro
-Engel Lex

No entiendo a que te refiieres con " la revises como puntero"
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines