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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con loop
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con loop  (Leído 1,924 veces)
jaxoR

Desconectado Desconectado

Mensajes: 93

?


Ver Perfil WWW
Problema con loop
« en: 1 Marzo 2014, 20:04 pm »

Bueno, estaba practicando con C antes de empezar la facultad, y quice hacer un programa en el cual se le pide al usuario que ingrese la cantidad de productos que quiere guardar en el programa y que luego se le pida escribir los nombres de los productos. Todo iba bien hasta la parte del for, en el cual solo puedo ingresar un producto y enseguida finaliza el programa. Nosé que es lo que hago mal:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    int i, j, x;
  7.    printf("Ingrese el numero de productos que quiere cargar:\n");
  8.    scanf("%d", &i);
  9.    x = 0;
  10.  
  11.    char productos[i];
  12.  
  13.    for(j; j==i; j++);
  14.    {
  15.        x++;
  16.        printf("Ingrese el nombre de su producto:\n");
  17.        scanf("%s", &productos[x]);
  18.    }
  19.  
  20.    return 0;
  21. }


En línea

dmacias

Desconectado Desconectado

Mensajes: 41


Ver Perfil WWW
Re: Problema con loop
« Respuesta #1 en: 1 Marzo 2014, 20:23 pm »

Te hablo desde el mas puro desconocimiento, asi que no me tengas mucho en cuenta, pero quizas sea que j no tiene ningun valor????

Código
  1. int i, j, x;
  2. for(j; j==i; j++);
  3.  

Si no es por eso, pues lo siento jajaja, estoy aprendiendo y ando muy muy verde aun.

Un saludo


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con loop
« Respuesta #2 en: 1 Marzo 2014, 22:52 pm »

Errores importantes hay dos:

* El primero como ya te comentaron esta en el bucle: no le das un valor inicial a la variable "j", la variable "x" sobra, la condición del bucle debe ser "j < i" y tienes un punto y coma demás justo antes del cuerpo del bucle.

* El segundo es utilizar un array de chars para almacenar las palabras cuando deberia ser un array de arrays de caracteres.

Otro detalle es utilizar un array de longitud variable ya que estos se soportan en C99 y son opcionales en C11. Para el caso puedes reservar memoria con malloc.

El programa con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_CHARS  128
  5.  
  6. int main(void)
  7. {
  8.   char (*palabra)[NUM_CHARS];
  9.   int num_pals;
  10.   int i;
  11.  
  12.   puts("Numero de productos:");
  13.   if (scanf("%d", &num_pals) != 1)
  14.      return EXIT_FAILURE;
  15.  
  16.   palabra = malloc(num_pals * sizeof *palabra);
  17.  
  18.   for (i = 0; i < num_pals; i++){
  19.      printf("Nombre del producto no %d:\n", i + 1);
  20.      scanf("%s", palabra[i]);
  21.   }
  22.  
  23.   /* ... */
  24.  
  25.   free(palabra);
  26.   return 0;
  27. }

Por ultimo hay que evitar el uso de scanf con "%s" ya que tiene los mismos riesgos que gets (mejor utilizar fgets).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
jaxoR

Desconectado Desconectado

Mensajes: 93

?


Ver Perfil WWW
Re: Problema con loop
« Respuesta #3 en: 2 Marzo 2014, 05:22 am »

Hola rir, ya arregle todo lo del bucle, lo que no te entiendo es lo del Array. Soy nuevo con los arrays, y no entiendo cuando te referís a un array de arrays de carácteres, me darías un ejemplo?
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con loop
« Respuesta #4 en: 2 Marzo 2014, 16:59 pm »

Soy nuevo con los arrays, y no entiendo cuando te referís a un array de arrays de carácteres, me darías un ejemplo?
1) Cuando se manejan valores del mismo tipo en lugar de un montón de variables se utiliza un array, por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_ELEM 10
  5.  
  6. int main(void)
  7. {
  8.   int num[NUM_ELEM]; /* array de int */
  9.   int i;
  10.  
  11.   for (i = 0; i < NUM_ELEM; i++){
  12.      num[i] = i;
  13.      printf("%d\n", num[i]);
  14.   }
  15.  
  16.   return EXIT_SUCCESS;
  17. }

2) En C una cadena se almacena en un array de caracteres. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char palabra[] = "Jeremias"; /* array de caracteres */
  7.  
  8.   printf("%s\n", palabra);
  9.  
  10.   return EXIT_SUCCESS;
  11. }

Combinando los puntos anteriores si tu programa debe procesar varias cadenas estas se almacenan en un array de cadenas y como las cadenas se almacenan en arrays de caracteres eso resulta en un array de arrays de caracteres:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char pal[][5] = {
  7.      "Hugo",
  8.      "Paco",
  9.      "Luis"
  10.   };
  11.   int num_pals = (int) (sizeof pal / sizeof pal[0]);
  12.   int i;
  13.  
  14.   for (i = 0; i < num_pals; i++)
  15.      printf("%s\n", pal[i]);
  16.  
  17.   return EXIT_SUCCESS;
  18. }

El uso de sizeof lo veras mas adelante, esta ahí porque lo políticamente correcto es no indicar el numero de elementos de un array si se utiliza (como en el ejemplo) una lista de valores para inicializarlo.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con loop
« Respuesta #5 en: 2 Marzo 2014, 18:01 pm »


Como comentó tan certeramente rir3760, otra forma es con un array de longitud variable, una vez ingresado el número de palabras:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_CHARS  128
  5.  
  6. int main(void)
  7. {
  8.  int num_pals;
  9.  int i;
  10.  
  11.  puts("Numero de productos:");
  12.  if (scanf("%d", &num_pals) != 1)
  13.    return EXIT_FAILURE;
  14.  while (getchar()!='\n');
  15.  
  16.  char palabra[num_pals][NUM_CHARS];
  17.  
  18.  for (i = 0; i < num_pals; i++){
  19.    printf("Nombre del producto no %d:\n", i + 1);
  20.    scanf("%s", palabra[i]);
  21.   }
  22.   /* ... */
  23.   return EXIT_SUCCESS;
  24. }
  25.  

En realidad el formato que ha usado rir3760 para el scanf tan sólo asegura que la entrada es un número.

Me explico:

* si introduces as canta error.
* si introduces 12 todo O.K
* Si introduces 12as por error el scanf toma el 12 y de paso se salta otro scanf porque en  el llamado buffer o memoria intermedia queda el resto, en este caso la "as" que toma el siguiente scanf de forma automática. De ahí el uso del while para "limpiar" el buffer. Haz la prueba con él activado y desactivado y veras lo que sucede.

¿Qué habría entonces que hacer?. Sencillamente comprobar que la variable "num_pals" se corresponde con un entero y sólo un entero. Pero imagino que ya tendrás tiempo más adelante de ir viendo esos detallitos que parecen chorradas y que pueden arruinar un código que parecía impecable.


¡¡¡¡ Saluditos! ..... !!!!


En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Problema con loop
« Respuesta #6 en: 2 Marzo 2014, 20:38 pm »

Más clara imposible la explicación de por qué se llama "array de arrays" de caracteres.

De acuerdo también con el aporte de leosansan de verificar la integridad del dato suministrado por el usuario, y limpiar el búfer de entrada descartando los caracteres encontrados hasta llegar al fin de línea.

Creo que no tengo aportes que hacer a este tema ... ya se ha dicho todo, al menos al nivel que requiere quién inició la pregunta.
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
jaxoR

Desconectado Desconectado

Mensajes: 93

?


Ver Perfil WWW
Re: Problema con loop
« Respuesta #7 en: 2 Marzo 2014, 21:30 pm »

Muchisimas gracias a todos! Ya lo pude hacer andar a mi manera
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con Do Loop
Programación Visual Basic
stork32 6 1,948 Último mensaje 22 Octubre 2008, 01:31 am
por seba123neo
[Autoit] Loop
Scripting
mubimeiquer 2 4,525 Último mensaje 13 Febrero 2009, 16:36 pm
por gna08
Problema con loop while « 1 2 »
Programación C/C++
miketru 10 3,967 Último mensaje 11 Septiembre 2010, 05:41 am
por miketru
[Resuelto] Problema con while (Loop)
Programación C/C++
jaxoR 7 1,839 Último mensaje 28 Abril 2014, 03:27 am
por jaxoR
problema con el do while loop
Programación C/C++
josephb401 3 1,100 Último mensaje 4 Abril 2016, 19:03 pm
por crack81
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines