Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ThronerAXE en 15 Marzo 2013, 00:52 am



Título: Dar una salida en forma de lista en leguaje C
Publicado por: ThronerAXE en 15 Marzo 2013, 00:52 am
Buenas.
Tengo la duda, o mejor dicho, nose como hacer esto. tengo que hacer un ejercicio en lenguaje C (utilizo el Builder) en donde debo dar una salida en forma de lista, pero los datos que deben salir en esa lista deben cumplir unas condiciones previamente. Tengo que usar arreglos unidimensionales. Queria saber si alguien me podria ilustrar con un ejemplo explicandome brevemente lo que se debe hacer, o si me pueden facilitar una guia donde expliquen este tema (dar una salida en forma de lista) gracias !


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: pacoperico en 15 Marzo 2013, 01:05 am
Dar una salida en forma de lista ¿Te refieres a algo asi?:

Código
  1. int arreglo[4] = {1,2,3,4,5};
  2.  
  3. for (int i = 0; i<4; i++)
  4.     printf("%d\n", arreglo[i]);
  5.  
  6.  

La salida en pantalla seria:
Código:
1
2
3
4
5


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: ThronerAXE en 15 Marzo 2013, 01:48 am
algo asi, solamente que el arreglo que tengo que utilizar es una cadena de caracteres


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: naderST en 15 Marzo 2013, 02:30 am
Tal cual, usas strlen para obtener el número de caracteres de la cadena.


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: ThronerAXE en 15 Marzo 2013, 02:45 am
Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #define MAX 30
  6.  
  7. void main()
  8. {
  9. int i=0;
  10. float deuda[MAX];
  11. char codigo[MAX][20],tipo[MAX],resp,clie_b[MAX];
  12. //Carga de los Vectores
  13. do
  14. { clrscr();
  15.   printf("\n\nIndique el codigo del Cliente: ");
  16.   scanf("%s",&codigo[i]);
  17.   printf("\n\nQue tipo de cliente es (B=Bueno, R=Regular, M=Malo)? ");
  18.   scanf("%c",&tipo[i]);
  19.   tipo[i]=toupper(getchar());
  20.   printf("\n\nIndique su deuda en Bolivares: ");
  21.   scanf("%f",&deuda[i]);
  22.     if(tipo[i]=='B' && deuda[i]<10000)
  23.     {strcmpi(clie_b[i],codigo[i]);
  24.      strlen(clie_b[i]);
  25.     }
  26.   printf("\n\nHay otro cliente?...S/N ");
  27.   scanf("%c",&resp);
  28.   resp=toupper(getchar());
  29. }while(resp=='S' && i<MAX);
  30. clrscr();
  31. printf("\n\nLos Clientes Buenos con deuda menor de 10000bs son %s\n"clie_b[MAX]);
  32. }

Esto es mas o menos lo que llevo, a partir de la linea 22 es donde no se como escribir el codigo para que me guarde las cadenas de caracter cumpliendo con las condiciones y luego mostrarlas todas en una salida, estuve leyendo un poco de la funcion strlen, pero me dice que lo que me da es la longitud de la cadena de caracteres, entonces no creo que me pueda servir


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: 85 en 15 Marzo 2013, 02:57 am
Todas juntas? cuando juntás varias cadenas en 1, eso se le dice 'concatenar cadenas'. Se hace normalmente con STRCAT. No se si es lo que requerís, pero te lo digo solamente..


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: pacoperico en 15 Marzo 2013, 11:19 am
Creo que lo estas buscando es hacer un arreglo de cadenas. Por lo que veo en tu programa quieres imprimir por pantalla todos los clientes que cumplan dos condiciones; que sean buenos, y que tengan una deuda menor de 10.000. Estos clientes los guardas en el arreglo clie_b[MAX].

Cada cliente esta representado por una cadena pero tu arreglo es un arreglo de caracteres no de cadenas. Para ello cambia tu tipo de arreglo clie_b[MAX] a un arreglo de tipo bidimensional o mejor a un arreglo de punteros por ejemplo, en donde si podras almacenar cadenas:

Código
  1. /*arreglo de punteros*/
  2. char *clie_b[MAX];
  3.  
  4. /*comprobacion de condiciones y llenado del arreglo*/
  5. int cont = 0;
  6. if(tipo[i]=='B' && deuda[i]<10000)
  7.     strcpy(clie_b[cont++],codigo[i]);
  8.  
  9. /*y para evitar sorpresas terminamos de rellenar el arreglo */
  10.  
  11. while(cont != MAX)
  12.    clie_b[cont++] = '\0';
  13.  
  14.  
  15. /*Para imprimir los datos por pantalla*/
  16. for(int i=0; i <= MAX ; i++)
  17.       print("%s\n", clie_b[i]);
  18.  
  19.  


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: ThronerAXE en 17 Marzo 2013, 03:48 am
ya me explicaron mas o menos como hacer para mostrar esas listas xd, tambien decidi reestructurar el codigo y hacerlo por partes para no enredarme mucho, este es 
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #define MAX 30
  6.  
  7. //Carga de datos en los vectores
  8.  
  9. void main()
  10. {
  11. int cod[MAX],i=0,j,k,aux;
  12. float deuda[MAX],mayor=-1;
  13. char tipo[MAX],resp;
  14.  
  15.   do
  16.   { clrscr();
  17.     printf("\n\nIngrese el codigo del cliente: ");
  18.     scanf("%d",&cod[i]);
  19.     printf("\n\nIngrese el tipo de cliente(B=Bueno,R=Regular,M=Malo): ");
  20.     scanf("%c",&tipo[i]);
  21.      tipo[i]=toupper(getchar());
  22.     printf("\n\nIngrese el saldo deudor en bolivares: ");
  23.     scanf("%f",&deuda[i]);
  24.     printf("\n\nHay otro cliente...S/N? ");
  25.     scanf("%c",&resp);
  26.     resp=toupper(getchar());
  27.     i++;
  28.   }while(resp=='S' && i<MAX);
  29. //Listar los codigos de los clientes buenos
  30. printf("\n\nClientes Buenos con deuda menor a 10000 bs");
  31. printf("\n\nCodigo del cliente");
  32.  for(j=0;j<MAX;j++)
  33.  { if(tipo[j]=='B' && deuda[j]<10000)
  34.    printf("\n\n%d",cod[j]);
  35.  }
  36.  getch();
  37. //Mostrar el codigo de los clientes malos
  38.  
  39. for(k=0;k<MAX;k++)
  40. { if(tipo[k]=='M' && deuda[k]>mayor)
  41.     mayor=deuda[k];
  42.     aux=cod[k];
  43. }
  44. printf("\n\nEl codigo de cliente que tiene la mayor dueda de tipo MALO es %d",aux);
  45. getch();
  46.  
  47. }

tengo un problema tratando de mostrar la salida del cliente malo, resulta que al compilar, y meter el codigo(entero), cuando me da la salida, me da otro numero diferente ¿por que pasa eso?


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: pacoperico en 17 Marzo 2013, 11:20 am
En la parte final de tu codigo:

Código
  1. //Mostrar el codigo de los clientes malos
  2.  
  3. for(k=0;k<MAX;k++)
  4. { if(tipo[k]=='M' && deuda[k]>mayor)
  5.     mayor=deuda[k];
  6.     aux=cod[k];
  7. }

Las dos sentencias que dependen del if deberian ir en un bloque:

Código
  1. //Mostrar el codigo de los clientes malos
  2.  
  3. for(k=0;k<MAX;k++)
  4. { if(tipo[k]=='M' && deuda[k]>mayor)
  5.     {
  6.     mayor=deuda[k];
  7.     aux=cod[k];
  8.     }
  9. }


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: rir3760 en 17 Marzo 2013, 17:06 pm
Ademas de la corrección que ya te indico pacoperico otras dos son:

1) Al pedir confirmación si se debe continuar o no:
Código
  1. scanf("%f",&deuda[i]);
  2. printf("\n\nHay otro cliente...S/N? ");
  3. scanf("%c",&resp);
La variable "resp" terminara almacenando el avance de linea generado al introducir el monto de la deuda, para que funcione correctamente debes utilizar " %c":
Código
  1. scanf("%f",&deuda[i]);
  2. printf("\n\nHay otro cliente...S/N? ");
  3. scanf(" %c",&resp);

2) Asumes se introducirá el máximo numero de registros:
Código
  1. //Listar los codigos de los clientes buenos
  2. printf("\n\nClientes Buenos con deuda menor a 10000 bs");
  3. printf("\n\nCodigo del cliente");
  4. for(j=0;j<MAX;j++)
  5. {
  6.   /* ... */
  7. }
  8.  
  9. //Mostrar el codigo de los clientes malos
  10. for(k=0;k<MAX;k++)
  11. {
  12.      /* ... */
  13. }
Lo que generara resultados incorrecto si el numero de registros es menor, debes cambiar las comparaciones que controlan los bucles a:
Código
  1. //Listar los codigos de los clientes buenos
  2. printf("\n\nClientes Buenos con deuda menor a 10000 bs");
  3. printf("\n\nCodigo del cliente");
  4. for(j=0;j<i;j++)
  5. {
  6.   /* ... */
  7. }
  8.  
  9. //Mostrar el codigo de los clientes malos
  10. for(k=0;k<i;k++)
  11. {
  12.      /* ... */
  13. }
Para así procesar solo los registros introducidos.

Un saludo


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: ThronerAXE en 19 Marzo 2013, 02:03 am
Muchas gracias por sus consejos y ayudas que me han servido mucho para seguir aprendiendo.

1) Al pedir confirmación si se debe continuar o no:
Código
  1. scanf("%f",&deuda[i]);
  2. printf("\n\nHay otro cliente...S/N? ");
  3. scanf("%c",&resp);
La variable "resp" terminara almacenando el avance de linea generado al introducir el monto de la deuda, para que funcione correctamente debes utilizar " %c":
Código
  1. scanf("%f",&deuda[i]);
  2. printf("\n\nHay otro cliente...S/N? ");
  3. scanf(" %c",&resp);


Tengo una duda con esto, noto que la unica diferencia que hubo en este codigo fue que colocaste un space en el scanf de la variable de resp, pero no termino de entender por que??


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: rir3760 en 19 Marzo 2013, 04:42 am
Por partes:

* La función scanf con casi todos los especificadores como "%d", "%s", etc. lo primero que hace es descartar el espacio blanco, tomando tu programa como ejemplo no hay problema al introducir (cuando se pide la deuda):
Código:
    12.34{ENTER}

Pero con los especificadores "%[]" y "%c" ese descarte no sucede, la función retorna el primer carácter que encuentre en el bufer de la entrada estándar.

* Regresando al ejemplo, al pedir la deuda si se introdujo:
Código:
    12.34{ENTER}
La función scanf con "%f" descarta los espacios, con los caracteres "12.34" genera el numero y lo almacena en deuda[ i ], el avance de linea o '\n' se queda en el bufer de la entrada estándar y, cuando se llama a scanf con "%c", es almacenado en la variable resp.

* Para evitarlo se utiliza " %c", el espacio en la cadena de formato indica "leer y descartar una secuencia de cero o mas caracteres de espacio blanco". En otras palabras la función primero descarta los caracteres de ese tipo (en tu caso el avance de linea) y solo entonces lee un carácter y lo almacena en la variable resp.

* Por ultimo con scanf los caracteres ' ', '\t', '\n' no se toman literalmente (salvo dentro de "%[]"), en su lugar generan el comportamiento ya mencionado. Para explicarlo mejor puedes utilizar " %c", "\t%c", "\n%c" y el efecto sera el mismo.

Un saludo


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: ThronerAXE en 22 Marzo 2013, 02:44 am
Código
  1. scanf("%f",&deuda[i]);
  2. printf("\n\nHay otro cliente...S/N? ");
  3. scanf("%c",&resp);

Pensando un poco en la estetica, y tambien en otra forma de hacerlo, ¿existe algun codigo para que al momento de que en la pantalla me pregunte "Hay otro cliente...?S/N" y yo ingrese un caracter, ese caracter no se vea en la pantalla, nose si me explique bien xd un ejemplo grafico sería:

en la pantalla:
Hay otro cliente...?S/N s (estoy ingresando el caracter s y se repite el bucle)
Hay otro cliente...?S/N   (ingreso el caracter s pero no se ve en la pantalla)


Otra duda es, que hay unos codigos que he visto que estan asi:
Código
  1. printf("\n\nHay otro cliente...S/N? ");
  2. fflush(studin);

mi duda es, que en ningun momento veo q guarden el dato ¿ no se deberia usar el scanf para guardarlo en la variable?


Título: Re: Dar una salida en forma de lista en leguaje C
Publicado por: rir3760 en 22 Marzo 2013, 04:01 am
Pensando un poco en la estetica, y tambien en otra forma de hacerlo, ¿existe algun codigo para que al momento de que en la pantalla me pregunte "Hay otro cliente...?S/N" y yo ingrese un caracter, ese caracter no se vea en la pantalla
Es posible pero debes utilizar una biblioteca especifica de tu compilador (por ejemplo conio o ncurses) o el API de tu SO (por ejemplo la Win32 API).

Otra duda es, que hay unos codigos que he visto que estan asi:
Código
  1. printf("\n\nHay otro cliente...S/N? ");
  2. fflush(studin);

mi duda es, que en ningun momento veo q guarden el dato ¿ no se deberia usar el scanf para guardarlo en la variable?
Lo hacen: la función getchar obtiene el carácter, este se pasa a mayúsculas con toupper y finalmente se almacena en la variable "resp".

Y disculpa lo repetitivo pero no se recomienda el uso de "fflush(stdin)".

Un saludo