Jul 9, 2019 at 8:26pm UTC
ANDM hpp
#ifndef _ANDM_
#define _ANDM_
#include "Puerta.hpp"
#include <vector>
class AndM : public Puerta {
private:
std::vector<Puerta*> _pts;
public:
AndM(std::string nombre);
AndM() = default;
void conecta(Puerta* pt);
void conecta(Puerta* pt, int i);
virtual int salida();
virtual std::string info(int numEspacios = 0);
};
#endif
ANDM CPP
#include "AndM.hpp"
#include <sstream>
AndM::AndM(std::string nombre) : Puerta(nombre){
}
void AndM::conecta(Puerta* pt){
_pts.push_back(pt);
}
void AndM::conecta(Puerta* pt, int i){
if ( i <= _pts.size()){
_pts[i] = pt;
}else{
for ( int j = _pts.size(); j < i; j++){
_pts.push_back(NULL);
_pts[j] = nullptr;
}
//Ponemos todo a null hasta llegar a la posiciĆ³n indicada y luego conectamos la puerta
_pts.push_back(pt);
}
}
int AndM::salida() {
std::vector<int> entradas;
int entrada;
unsigned cuenta = 0;
unsigned cuentacero = 0;
unsigned cuentaND = 0;
for(size_t i = 0; i < _pts.size(); i++){
if(_pts[i] == nullptr){
entrada = ND;
entradas.push_back(entrada);
}else{
entrada = _pts[i]->salida();
entradas.push_back(entrada);
}
}
for (size_t i=0; i < entradas.size(); i++){
if(entradas[i] == ND){
cuentaND ++;
}
if(entradas[i] == 1){
cuenta ++;
}
if(entradas[i] == 0){
cuentacero ++;
}
}
if((cuentaND > 0) || (_pts.empty())){
return ND;
}else{
if(cuentacero > 0){
return 0;
}
if(cuenta == entradas.size()){
return 1;
}
}
}
std::string AndM::info(int numEspacios){
std::ostringstream oss;
std::string espacios(numEspacios,' ');
std::string esp2(numEspacios + 2,' ');
oss << espacios << "Puerta ANDM ";
if (_nombre != "SinNombre") {
oss << "[" << _nombre << "] ";
}
oss <<"(id=" << _id << ") salida = "
<< salida() << "\n";
for(size_t i = 0; i < _pts.size(); i++){
if (_pts[i] == nullptr){
oss << esp2 << "NO CONECTADA\n";
}else{
oss << _pts[i]->info(numEspacios +2);
}
}
return oss.str();
}
ORM HPP
#ifndef _ORM_
#define _ORM_
#include "Puerta.hpp"
#include <vector>
class OrM : public Puerta {
private:
std::vector<Puerta*> _pts;
public:
OrM(std::string nombre);
OrM() = default;
void conecta(Puerta* pt);
void conecta(Puerta* pt, int i);
virtual int salida();
virtual std::string info(int numEspacios = 0);
};
#endif
ORMCPP
#include "OrM.hpp"
#include <sstream>
OrM::OrM(std::string nombre) : Puerta(nombre){
}
void OrM::conecta(Puerta* pt){
_pts.push_back(pt);
}
void OrM::conecta(Puerta* pt, int i){
if ( i <= _pts.size()){
_pts[i] = pt;
}else{
for ( int j = _pts.size(); j < i; j++){
_pts.push_back(NULL);
_pts[j] = nullptr;
}
//Ponemos todo a null hasta llegar a la posiciĆ³n indicada y luego conectamos la puerta
_pts.push_back(pt);
}
}
int OrM::salida() {
std::vector<int> entradas;
int entrada;
unsigned cuenta = 0;
unsigned cuentaND = 0;
for(size_t i = 0; i < _pts.size(); i++){
if(_pts[i] == nullptr){
entrada = ND;
entradas.push_back(entrada);
}else{
entrada = _pts[i]->salida();
entradas.push_back(entrada);
}
}
for (size_t i=0; i < entradas.size(); i++){
if(entradas[i] == ND){
cuentaND ++;
}
if(entradas[i] == 1){
cuenta ++;
}
}
if((cuentaND > 0) || (_pts.empty())){
return ND;
}else{
if(cuenta != 0){
return 1;
}else{
return 0;
}
}
}
std::string OrM::info(int numEspacios){
std::ostringstream oss;
std::string espacios(numEspacios,' ');
std::string esp2(numEspacios + 2,' ');
oss << espacios << "Puerta ORM ";
if (_nombre != "SinNombre") {
oss << "[" << _nombre << "] ";
}
oss <<"(id=" << _id << ") salida = "
<< salida() << "\n";
for(size_t i = 0; i < _pts.size(); i++){
if (_pts[i] == nullptr){
oss << esp2 << "NO CONECTADA\n";
}else{
oss << _pts[i]->info(numEspacios +2);
}
}
return oss.str();
}