Bramki logiczne - wczytywanie działań z pliku i wypisanie wyników w konsoli

0

Witam
Probuje napisac program, ktory bedzie wczytywal dzialania z pliku, a nastepnie bedzie wypisywal wyniki w konsoli.
Przykladowo plik w srodku wyglada tak:

010101 XOR 111001
NOT 11100111
01010101 AND 11100111
010 OR 111
1010101 NAND 1100111

I zeby wypisywal wyniki tak:

01010101 AND 11100111 = 01000101
itd
.......

Nie mam pomyslu jak dokonczyc program. Wie ktos moze jak powinnien wygladac zeby dzialal bez problemu?
Kod:

#include <iostream>
#include <stdio.h>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

bool OR(bool a, bool b)
{ return a||b; }

bool AND(bool a, bool b)
{ return a&&b; }

bool NOR(bool a, bool b)
{ return !(a||b); }

bool XOR(bool a, bool b)
{ return ((!(a)&&b)||(a&&!(b))); }

bool NAND(bool a, bool b)
{ return !(a&&b); }

int main()
{
    bool pierwszy, drugi, wynik;
    string bramka;

    string linia;
    fstream dane;

    dane.open("dane.txt", ios::in);

        while(!dane.eof())
        {
            getline(dane, linia);

            dane >> pierwszy >> bramka >> drugi;

            if(bramka == "AND")
            {
                wynik = AND(pierwszy,drugi);
                cout << linia << endl;
                cout << wynik << endl;
            }

            if(bramka == "OR")
            {

            }

            if(bramka == "NOR")
            {

            }

            if(bramka == "XOR")
            {

            }

            if(bramka == "NAND")
            {

            }

            if(bramka == "NOT")
            {

            }
        }
        dane.close();


    system("PAUSE");
    return(0);

}
1
bool OR(bool a, bool b) { return a|b; }
bool AND(bool a, bool b) { return a&b; }
bool XOR(bool a, bool b) { return a^b; }
bool NOR(bool a, bool b) { return !OR(a,b); }
bool NAND(bool a, bool b) { return !AND(a,b); }

struct { const char *type; bool (*fun)(bool,bool); } Tb[]=
  {
     { "OR", &OR },
     { "AND", &AND },
     ...
  };

for(unsigned i=0;i<sizeof(Tb)/sizeof(*Tb);++i) if(bramka==Tb[i].type) cout<<linia<<endl<<Tb[i].fun(pierwszy,drugi)<<endl;
0

_13th_Dragon czy twoj sposob powinien wygladac tak? Bo program kompiluje sie ale nie nic nie wyswietla.

bool OR(bool a, bool b) { return a|b; }
bool AND(bool a, bool b) { return a&b; }
bool XOR(bool a, bool b) { return a^b; }
bool NOR(bool a, bool b) { return !OR(a,b); }
bool NAND(bool a, bool b) { return !AND(a,b); }

struct { const char *type; bool (*fun)(bool,bool); } Tb[]=
  {
     { "OR", &OR },
     { "AND", &AND },
     { "XOR", &XOR },
     { "NOR", &NOR },
     { "NAND", &NAND },
  };

int main()
{
    bool pierwszy, drugi, wynik;
    string bramka;

    string linia;
    fstream dane;

    dane.open("dane.txt", ios::in);

        while(!dane.eof())
        {
            getline(dane, linia);

            dane >> pierwszy >> bramka >> drugi;

            for(unsigned i=0;i<sizeof(Tb)/sizeof(*Tb);++i) if(bramka==Tb[i].type)
                cout<<linia<<endl<<Tb[i].fun(pierwszy,drugi)<<endl;
        }
        dane.close();

    system("PAUSE");
    return(0);

}
0
  1. Zmieniłem tylko twój kod na bardziej sensowny, nie zwróciłem uwagi na przykładowe dane z których to wynika że masz wczytać liczby w postaci binarnej.
  2. Twoje wczytywanie zakłada że argumenty są zmiennymi typu bool z danych wynika że to są liczba binarna.
  3. Około tygodnia twemu pokazywałem jak poprawnie wczytać takie dane, wydaje mi się że pytanie było od ciebie.
0
  1. W takim razie jaki typ rozwiaze ten problem?

uint8_t lub zwyczajny int, jak tam wolisz.

0

Podmienilem typ argumentu na int i nie dziala, wyswietlajac w konsoli dostaje tylko to:

01010101 AND 11100111
0

1

0

1

Gdyby mogl ktos wstawic dzialajacy kod, bylbym bardzo wdzieczny.

0

Wrzuć aktualny kod.

0
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <cstdlib>
#include <string.h>

using namespace std;

bool OR(int a, int b) { return a|b; }
bool AND(int a, int b) { return a&b; }
bool XOR(int a, int b) { return a^b; }
bool NOR(int a, int b) { return !OR(a,b); }
bool NAND(int a, int b) { return !AND(a,b); }

struct { const char *type; bool (*fun)(int,int); } Tb[]=
  {
     { "OR", &OR },
     { "AND", &AND },
     { "XOR", &XOR },
     { "NOR", &NOR },
     { "NAND", &NAND },
  };

int main()
{
    int pierwszy, drugi, wynik;
    string bramka;

    string linia;
    fstream dane;

    dane.open("dane.txt", ios::in);

        while(!dane.eof())
        {
            getline(dane, linia);

            dane >> pierwszy >> bramka >> drugi;

            for(unsigned i=0;i<sizeof(Tb)/sizeof(*Tb);++i) if(bramka==Tb[i].type) cout<<linia<<endl<<Tb[i].fun(pierwszy,drugi)<<endl;
        }
        dane.close();

    system("PAUSE");
    return(0);

}
0

Co tam robi bool?

0

Zrób wczytywanie oraz wypisywanie liczby binarnej lub zrób obróbkę dwóch napisów.

0
int main()
{ 
int pierwszy[8] = {0};
int drugi[8] = {0};
string bramka[5];
FILE *f = fopen("dane.txt", "r");
while(fscanf(f, "%d %s %d", pierwszy, &bramka, drugi) != EOF)
    {
       printf("%d %s %d = \n", pierwszy, &bramka, drugi);
    }
fclose(f);
system("PAUSE");
return(0);
}

W jaki sposob umiescic petle for zeby wyswietlic wszystkie elementy z tablic pierwszy i drugi?

0

Wszystkie trzy części masz wczytać jako napisy.
Ewentualnie liczby binarne można wczytywać znak po znaku.

0
int i=0;
while (fscanf(f, "%d %s %d", &pierwszy[i], &bramka[i], &drugi[i]) != EOF)
	{
		printf("%d %s %d = \n", pierwszy[i], &bramka[i], drugi[i]);
		i++;

	} 

dodanie znacznika <code class="c"> - furious programming

1
#include <vector>
#include <sstream>
#include <string>
#include <bitset>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <iterator>
using namespace std;

class Line : public string {
  friend istream& operator>>(istream& in, Line& line) {
    return getline(in, line);
  }
};

string tobin(int val) {
  string res = bitset<32>(val).to_string();
  return res.erase(0, res.find_first_of('1'));
}

int frombin(string str) {
  int result = 0, i = 0;
  for_each(str.rbegin(), str.rend(), [&](const char c) {
    result += (c == '0' ? 0 : 1 << i); ++i;
  });
  return result;
}

int main(int argc, char *argv[])
{
  string first, second, third;
  map<string, function<int(int, int)>> gates = {
    { "OR",   [](int a, int b) { return a | b; } },
    { "AND",  [](int a, int b) { return a & b; } },
    { "NOR",  [](int a, int b) { return !(a | b); } },
    { "XOR",  [](int a, int b) { return a ^ b; } },
    { "NAND", [](int a, int b) { return !(a & b); } }
  };

  for_each(istream_iterator<Line>(cin), istream_iterator<Line>(), [&](const string& str) {
    int result;
    istringstream(str) >> first >> second >> third;
    if(first == "NOT") result = !frombin(second);
    else if(gates.find(second) != gates.end()) result = gates[second](frombin(first), frombin(third));
    else return;

    cout << str << "\t-> " << tobin(result) << "\n";
  });
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1