#include<stdio.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int Capital=20;
int cantidadItems(char* c){ //Funcion que calcula cuantos repuestos disponemos
int i=0;int k=0;
do{
if(*(c+i)==' '){
k++;
}
i++;
}while(*(c+i)!=('\0'));
return(k+1);
};
int cant(char* c, int k){
do{
k++;
}while((*(c+k)!=('\0')) && (*(c+k)!=(' ')));
return(k);
};
//no se puede utilizar "set"
class Vehiculo{
string placa;
char puerta;
int averiado;
public:
Vehiculo(string placa, char puerta, int averiado){
this->placa = placa;//this es un puntero que se referencia a si mismo, es decir a mi clase!
this->puerta = puerta;
this->averiado = averiado;
}
string get_placa(){
return placa;
}
char get_puerta(){
return puerta;
}
int get_averiado(){
return averiado;
}
};
class Cola{
class Nodo{
Vehiculo *v;
Nodo *siguiente;
public:
Nodo(Vehiculo *v){
this->v = v;
siguiente = NULL;
}
Vehiculo* get_v(){
return v;
}
void set_siguiente(Nodo *n){
siguiente = n;
}
Nodo* get_siguiente(){
return siguiente;
}
};
Nodo *pri, *ult;
public:
Cola(){
pri = ult = NULL;
}
Vehiculo* primero(){
return pri->get_v();
}
void encolar(Vehiculo* v){
Nodo *nuevo = new Nodo(v);
if(ult==NULL){
pri = ult = nuevo;
}else{
ult->set_siguiente(nuevo);
ult = nuevo;
}
}
void desencolar(){
Nodo *aux = pri;
pri = pri->get_siguiente();
delete aux;
if(pri==NULL)
ult = NULL;
}
bool esVacia(){
return pri==NULL;
}
};
int i = 0;
void mostrar(char puerta, Cola *c){
while(!c->esVacia()){
if(puerta=='A'){
cout << "Vehiculo " << ++i << ": " << c->primero()->get_placa() << endl;
}else if(puerta=='B'){
cout << "Vehiculo " << ++i << ": " << c->primero()->get_placa() << endl;
}c->desencolar();
}
}
void verificar(Lista *l, Cola *a, Cola *b){
if(!l->esVacia()){
Lista *aux = new Lista(); aux->p = l->primero();
while(aux->p!=NULL){
if(aux->acceder(aux->p)=='A'){
mostrar(aux->acceder(aux->p),a);
}else if(aux->acceder(aux->p)=='B'){
mostrar(aux->acceder(aux->p),b);
}aux->p = aux->siguiente(aux->p);
}delete aux;
}
};
//LISTA DE ORDEN
class Lista{
class Nodo{
char orden;
Nodo *siguiente;
public:
Nodo(char orden){
this->orden = orden;
siguiente = NULL;
}
char get_orden(){
return orden;
}
void set_siguiente(Nodo *n){
siguiente = n;
}
Nodo* get_siguiente(){
return siguiente;
}
};
Nodo *head;
int cantidad;
typedef Nodo* Posicion;
public:
Posicion p;
Lista(){
head = NULL;
cantidad = 0;
}
void insertar(Posicion p, char orden){
Nodo *nuevo = new Nodo(orden);
if(nuevo!=NULL){//COMPRUEBO QUE HAYA MEMORIA
if(head==NULL){
head = nuevo;
cantidad++;
}else{
Nodo* r = head;
while(r->get_siguiente()!=p){
r = r->get_siguiente();
}
if(p==NULL){
r->set_siguiente(nuevo);
}else{
nuevo->set_siguiente(r->get_siguiente());
r->set_siguiente(nuevo);
}
}
}
}
Posicion fin(){
Nodo *r = head;
while(r->get_siguiente()!=NULL){
r = r->get_siguiente();
}return r;
}
Posicion primero(){
if(head!=NULL){
return head;
}else{
return fin();
}
}
Posicion siguiente(Posicion p){
return p->get_siguiente();
}
char acceder(Posicion p){
return p->get_orden();
}
bool esVacia(){
return head==NULL;
}
};
class myString{
public:
Lista *primero;
Lista *ultimo;
Lista *aux;
int contador;
public:
myString(){;
primero = NULL;
ultimo = NULL;
aux = NULL;
contador = 0;
}
void Insertar (char c);
void Mostrar ();
};
void myString::Insertar(char aux){
Lista* nuevo= new nodoLista();
nuevo->caracter=aux;
if(primero==NULL && ultimo==NULL){
primero=nuevo;
ultimo=nuevo;
}else{
ultimo->siguiente=nuevo;
ultimo=nuevo;
contador++; //revisar no estoy segura de si hace falta
}
};
void myString::Mostrar(){
aux=primero;
do{
cout<<aux->caracter;
aux=aux->siguiente;
}while(aux!=NULL);
};
class Repuestos{ //Pila donde voy a guardar los Repuestos
public:
nodoCola *ultimo;
nodoCola *aux;
nodoCola *tope;
int contador;//cantidad de carros que entran
public:
Repuestos(){
tope=NULL;
contador=0;
ultimo=NULL;
aux=NULL;
}
void Insertar(char placa[], char puerta, char averiado, char* item, int contador);
void Mostrar();
void Usados(int i);
};
void Repuestos :: Usados(char placa[], char puerta, char averiado ,char* item,int contador){// FALTA por resolver!!!!!!!!!!!!
int Ing=Capital;
int egreso=0;
int ingreso=0;
int c;
if(ultimo->Averiado=='0'){ // se repara y factura a la vez
egreso=((ultimo->contador)*1); //Contador indica la cantidad de repuestos a reparar en el carro que esta siendo atendido
ingreso=((ultimo->contador)*0);
Capital +=(ingreso-egreso); //Indica la ganancia obtenida por Liam tras la reparacion del carro atendido
};
aux=ultimo;
ultimo=aux->siguiente;//eliminacion del carro: se libera el nodo
cout<<"Vehiculo "<<i<<": ";
for(k=0;k<9;k++)
{
cout<<aux->Placa[k];
}
cout<<"\n"<<-1*(egreso)<<"\n"<<ingreso<<endl;
//apilamos FALTA POR REVISAR Y TERMINAR DE HACER!!!!
nodoCola *aux
aux->siguiente=ultimo;
ultimo=aux;
};
void Repuestos::Insertar(char placa[], char puerta, char averiado ,char* item,int contador){
nodoCola* nuevo=new nodoCola();
int k=0;
for(k=0;k<9;k++){
nuevo->placa[k]=placa[k];
};
nuevo->puerta = puerta;
nuevo->averiado = averiado;
nuevo->Item = item;
nuevo->contador = contador;
//se empiezan ha armar los Repuestos
if(ultimo==NULL){
ultimo=nuevo;
}else{
nuevo->siguiente=ultimo;
ultimo=nuevo;
};
contador++; //cantidad de carros
};
void Repuestos::Mostrar(){ //Muestra la placa del ultimo carro en insertar repuestos
int k=0;
for(k=0;k<9;k++){
cout<<aux->placa[k];
}
};
void Repuestos::Reparar(int i){
int Ing=Capital;
int egreso=0;
int ingreso=0;
int k;
if(ultimo->averiado=='1'){ // se repara y factura a la vez
egreso=((ultimo->contador)*2);
ingreso=((ultimo->contador)*3);
Capital +=(ingreso-egreso);
}else if((Ing-ultimo->contador)>0){ //si averiado es igual a cero verificamos si tenemos capital para comprar
Capital-=ultimo->contador; //en caso de que el capital sea positivo, se pueda comprar.Se realiza una sustraccion al ingreso ingreso neto de Liam
egreso=ultimo->contador;
};
aux=ultimo;
ultimo=aux->siguiente;//eliminacion logica
cout<<"Vehiculo "<<i<<": ";
for(k=0;k<9;k++)
{
cout<<aux->placa[k];
}
cout<<"\n"<<-1*(egreso)<<"\n"<<ingreso<<endl;
//desapilamos
delete(aux);//eliminacion del carro atendido
};
// MENU PRINCIPAL DEL PROGRAMA
int main(){
int n,i,k;
char *c=NULL;//entrada
Vehiculo *v;
string placa = "";
char averiado, puerta, orden;
char aux;
char *items=NULL;
Repuestos A;
Repuestos B;
myString string;
Cola *puertaA = new Cola(), *puertaB = new Cola();
Lista *lorden = new Lista();
cin>>n; //cantidad de vehiculos a ingresar
cin.ignore();
for(i=0;i<n;i++)
{
c=new char[15];
cin.getline(c,15);
k=0;
do{
placa[k]=*c; //calcula la cantidad de atributos necesarios para la placa
k++; c++; //placa
}while(*c!=' ');
while(k<10){
placa[k]=' '; //si la placa posee menos de 10 elementos alfanumericos,se completan los espacios con "vacio"
k++;
}
puerta=(*(c+1)); //calcula el atributo: puerta
averiado=(*(c+3)); //calcula el atributo: averiado
items=new char[1002];
cin.getline(items,1002);
k=cantidadItems(items);
cin >> placa >> puerta >> averiado;
v = new Vehiculo(placa,puerta,averiado);
if(puerta=='A' || puerta=='a') //Insertamos teniendo en cuenta la puerta
{
puertaA->encolar(v);
A.Insertar(placa,puerta,averiado,items,k);
}
else if(puerta=='B' || puerta=='b')
{
puertaB->encolar(v);
B.Insertar(placa,puerta,averiado,items,k);
}
}
for(int j = 0; j < n; ++j){
cin >> orden;
lorden->insertar(NULL,orden);
}
verificar(lorden,puertaA,puertaB);
delete puertaA, puertaB, v, lorden;
for(i=0;i<n;i++){
cin>>aux;
string.Insertar(aux);
}
string.aux=string.primero;
for(i=0;i<n;i++){
if(string.aux->caracter=='A' || string.aux->caracter=='a'){
if(A.ultimo!=NULL){
A.Reparar(i+1);
}else{
B.Reparar(i+1);
}
}else if(puerta=='B' || puerta=='b'){
if(B.ultimo!=NULL){
B.Reparar(i+1);
}else{
A.Reparar(i+1);
}
}
string.aux=string.aux->siguiente;
}
cout<<Capital<<endl;
return 0;
};
}