Dar una salida en forma de lista en leguaje C

Iniciado por ThronerAXE, 15 Marzo 2013, 00:52 AM

0 Miembros y 2 Visitantes están viendo este tema.

ThronerAXE

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 !

pacoperico

Dar una salida en forma de lista ¿Te refieres a algo asi?:

Código (cpp) [Seleccionar]

int arreglo[4] = {1,2,3,4,5};

for (int i = 0; i<4; i++)
    printf("%d\n", arreglo[i]);



La salida en pantalla seria:
1
2
3
4
5

ThronerAXE

algo asi, solamente que el arreglo que tengo que utilizar es una cadena de caracteres

naderST

Tal cual, usas strlen para obtener el número de caracteres de la cadena.

ThronerAXE

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#define MAX 30

void main()
{
int i=0;
float deuda[MAX];
char codigo[MAX][20],tipo[MAX],resp,clie_b[MAX];
//Carga de los Vectores
do
{ clrscr();
   printf("\n\nIndique el codigo del Cliente: ");
   scanf("%s",&codigo[i]);
   printf("\n\nQue tipo de cliente es (B=Bueno, R=Regular, M=Malo)? ");
   scanf("%c",&tipo[i]);
   tipo[i]=toupper(getchar());
   printf("\n\nIndique su deuda en Bolivares: ");
   scanf("%f",&deuda[i]);
     if(tipo[i]=='B' && deuda[i]<10000)
     {strcmpi(clie_b[i],codigo[i]);
      strlen(clie_b[i]);
     }
   printf("\n\nHay otro cliente?...S/N ");
   scanf("%c",&resp);
   resp=toupper(getchar());
}while(resp=='S' && i<MAX);
clrscr();
printf("\n\nLos Clientes Buenos con deuda menor de 10000bs son %s\n"clie_b[MAX]);
getchar();
}


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

85

#5
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..
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

pacoperico

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 (cpp) [Seleccionar]

/*arreglo de punteros*/
char *clie_b[MAX];

/*comprobacion de condiciones y llenado del arreglo*/
int cont = 0;
if(tipo[i]=='B' && deuda[i]<10000)
     strcpy(clie_b[cont++],codigo[i]);

/*y para evitar sorpresas terminamos de rellenar el arreglo */

while(cont != MAX)
    clie_b[cont++] = '\0';


/*Para imprimir los datos por pantalla*/
for(int i=0; i <= MAX ; i++)
       print("%s\n", clie_b[i]);


ThronerAXE

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  #include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#define MAX 30

//Carga de datos en los vectores

void main()
{
int cod[MAX],i=0,j,k,aux;
float deuda[MAX],mayor=-1;
char tipo[MAX],resp;

   do
   { clrscr();
     printf("\n\nIngrese el codigo del cliente: ");
     scanf("%d",&cod[i]);
     printf("\n\nIngrese el tipo de cliente(B=Bueno,R=Regular,M=Malo): ");
     scanf("%c",&tipo[i]);
      tipo[i]=toupper(getchar());
     printf("\n\nIngrese el saldo deudor en bolivares: ");
     scanf("%f",&deuda[i]);
     printf("\n\nHay otro cliente...S/N? ");
     scanf("%c",&resp);
     resp=toupper(getchar());
     i++;
   }while(resp=='S' && i<MAX);
//Listar los codigos de los clientes buenos
printf("\n\nClientes Buenos con deuda menor a 10000 bs");
printf("\n\nCodigo del cliente");
  for(j=0;j<MAX;j++)
  { if(tipo[j]=='B' && deuda[j]<10000)
    printf("\n\n%d",cod[j]);
  }
  getch();
//Mostrar el codigo de los clientes malos

for(k=0;k<MAX;k++)
{ if(tipo[k]=='M' && deuda[k]>mayor)
     mayor=deuda[k];
     aux=cod[k];
}
printf("\n\nEl codigo de cliente que tiene la mayor dueda de tipo MALO es %d",aux);
getch();

}


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?

pacoperico

En la parte final de tu codigo:

Código (cpp) [Seleccionar]
//Mostrar el codigo de los clientes malos

for(k=0;k<MAX;k++)
{ if(tipo[k]=='M' && deuda[k]>mayor)
     mayor=deuda[k];
     aux=cod[k];
}


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

Código (cpp) [Seleccionar]
//Mostrar el codigo de los clientes malos

for(k=0;k<MAX;k++)
{ if(tipo[k]=='M' && deuda[k]>mayor)
     {
     mayor=deuda[k];
     aux=cod[k];
     }
}

rir3760

Ademas de la corrección que ya te indico pacoperico otras dos son:

1) Al pedir confirmación si se debe continuar o no:
scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
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":
scanf("%f",&deuda[i]);
printf("\n\nHay otro cliente...S/N? ");
scanf(" %c",&resp);


2) Asumes se introducirá el máximo numero de registros:
//Listar los codigos de los clientes buenos
printf("\n\nClientes Buenos con deuda menor a 10000 bs");
printf("\n\nCodigo del cliente");
for(j=0;j<MAX;j++)
{
   /* ... */
}
getch();

//Mostrar el codigo de los clientes malos
for(k=0;k<MAX;k++)
{
      /* ... */
}

Lo que generara resultados incorrecto si el numero de registros es menor, debes cambiar las comparaciones que controlan los bucles a:
//Listar los codigos de los clientes buenos
printf("\n\nClientes Buenos con deuda menor a 10000 bs");
printf("\n\nCodigo del cliente");
for(j=0;j<i;j++)
{
   /* ... */
}
getch();

//Mostrar el codigo de los clientes malos
for(k=0;k<i;k++)
{
      /* ... */
}

Para así procesar solo los registros introducidos.

Un saludo
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