Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jonicio96 en 15 Mayo 2014, 21:51 pm



Título: Cartero Pilas
Publicado por: jonicio96 en 15 Mayo 2014, 21:51 pm
Es un cartero que recibe n cartas para m casas. Entonces comienzas ingresando n m luego dices para que casa iba cada carta por ej 0,0,2,3 (es el destinatario) finalmente esto se agrega a pilas donde se dice cuantas cartas tiene cada casa y si le sobraron cartas porque no eran de ninguna casa. El programa funciona, pero me dicen que cada casa tiene que tener un buzón que es una PILA y no se como hacer m pilas diferentes ¿Podrían ayudarme por favor?
Código:
#include<iostream>
#include<string.h>
using namespace std;

struct pila {
int destino;
struct pila *sgt;
};

void push(struct pila **p, int destino){
struct pila *extra;
extra= new pila;
extra->destino=destino;
extra->sgt=*p;
*p=extra;
};

int pop(struct pila **p){
int auxiliar;
struct pila *extra;
extra=*p;
auxiliar=extra->destino;
*p=extra->sgt;
return auxiliar;
delete extra;
};


int main(){
struct pila *p, *mano, *buzon;
int cant_casas,cant_cartas,destino,cont,aux,tope;
    cin>>cant_casas>>cant_cartas;

cout<<"Ingrese destinos de las cartas"<<endl;
for(int a=0;a<cant_cartas;a++){ /*llena la pila con los destinos correspondientes*/
cin>>destino;
push(&p,destino);
}
cout<<"El cartero ha comenzado a trabajar"<<endl;
for (int i=0;i<cant_casas;i++){ /*itera la cantidad de casas*/
cont=0;
cout<<"El cartero ha llegado a la casa "<<i<<endl;
cout<<"Revisando cartas"<<endl;
tope=cant_cartas;
for(int j=0; j<tope;j++){
aux=pop(&p); /* almacena el primera carta con su destino y la elimina de la pila p*/
if (aux==i){/*compara el destino de la carta con la casa actual*/
cont++;
cant_cartas--;
push(&p,destino);
cout<<"Carta para esta casa"<<endl;
/*se supone que cada buzon es una pila tambien, falta implementar eso*/
}
else{
push(&mano,aux); /*si la carta no es para el destino, entonces se guarda en la "mano" */
cout<<"Carta para otra casa"<<endl;
}
}
for (int k=0;k<cant_cartas;k++){/*itera sobre las cartas restantes en "mano" para devolverlas a la pila "p"*/
int aux4=pop(&mano);
push(&p,aux4);
}
cout<<"Se han encontrado "<<cont<<" cartas para esta casa"<<endl;
cout<<""<<endl;
}
cout<<"No quedan mas casas que visitar"<<endl;
cout<<"Han sobrado "<<cant_cartas<<" cartas en el bolso"<<endl;
while(1);
}


Título: Re: Cartero Pilas
Publicado por: Flakito81 en 26 Junio 2014, 03:02 am
Antes de decir nada quisiera comentar tres cosas:
a) Que no he dedicado más que 45segundos para ver el codigo, por tanto puedo estar metiendo la pata
b) Que la duda ya estará resuelta
c) Quizás ayude a otra persona que se encuentre en una situacion similar.


Para tener 'm' buzones dado tu código no seria más que poner
Código
  1. struct pila *buzon[m];
  2.  

Donde m puede ser una constante (C++), una variable (se trata de C++, en C no es válido), una macro (C++/C) o simplemente un número.

Por ejemplo:
Código
  1. push(&p,destino);
  2. cout<<"Carta para esta casa"<<endl;
  3. /*se supone que cada buzon es una pila tambien, falta implementar eso*/
  4.  

Cambiaría a algo parecido a:
Código
  1. push(&buzon[i],1);
  2. cout<<"Carta para esta casa"<<endl;
  3.  

Notar que buzon es el buzon de la casa i. El valor 1 es por poner algo en la pila. En este caso representa una carta y como no hay datos del remitente ....

El codigo se simplificaria bastante si se plantea el problema como que el cartero tiene las cartas agrupadas por viviendas antes de salir de la oficina, de esta manera solo se tendría un array de pilas de tal modo que el cartero cogeria el monton de cartas de la vivienda i sin necesidad de revisar el resto. esto basicamente permitiría que el bucle de llenado de datos quedara tal que
Código
  1. for(int a=0;a<cant_cartas;a++){ /*llena la pila con los destinos correspondientes*/
  2. cin>>destino;
  3. push(&p[destino], 1 );
  4. }
  5.  
Y el bucle de entrega de cartas en:
Código
  1. for (int i=0;i<cant_casas;i++){ /*itera la cantidad de casas*/
  2.   cont=0;
  3.   cout<<"El cartero ha llegado a la casa "<<i<<endl;
  4.   cout<<"Revisando cartas"<<endl;
  5.   int total = 0;
  6.   while(pop(&p[i]))
  7.   {
  8.      cout << "carta entregada a la vivienda " << i << endl;
  9.      total++;
  10.   }
  11.   cout << total << " cartas entregadas en esta casa" << endl;
  12. }
  13.  

Suerte!