220 lines
9.3 KiB
C#
220 lines
9.3 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace LogiksProject
|
|||
|
{
|
|||
|
//alternatywa, konjunkcja, równaważność, implikacja, negacja, lewy nawias, prawy nawias, zmienna, jakieś cudo
|
|||
|
|
|||
|
enum Signs { Alterantive, Conjuction, Equality, Implication, Negation, LeftBracket, RightBracket, Var, Unknown };
|
|||
|
//enum Brackets { LeftBracket, RightBracket};
|
|||
|
|
|||
|
|
|||
|
class LogicVar //Najprostsza klasa dla przechowywania zmiennych
|
|||
|
{
|
|||
|
public char Name { get; set; }
|
|||
|
}
|
|||
|
|
|||
|
class LogicRelation //(NIE UŻYWANE)
|
|||
|
{ //Prawdopodobnie można użyć przy wprowadzaniu nawiasów
|
|||
|
LogicVar v1;
|
|||
|
LogicVar v2;
|
|||
|
|
|||
|
Signs rel;
|
|||
|
|
|||
|
public void SetVarOne(LogicVar v1)
|
|||
|
{
|
|||
|
this.v1 = v1;
|
|||
|
}
|
|||
|
|
|||
|
public void SetVars(LogicVar v1, LogicVar v2)
|
|||
|
{
|
|||
|
this.v1 = v1;
|
|||
|
this.v2 = v2;
|
|||
|
}
|
|||
|
|
|||
|
LogicRelation(LogicVar l, Signs s)
|
|||
|
{
|
|||
|
v1 = l;
|
|||
|
rel = s;
|
|||
|
}
|
|||
|
|
|||
|
LogicRelation(LogicVar l1, LogicVar l2, Signs s)
|
|||
|
{
|
|||
|
v1 = l1;
|
|||
|
v2 = l2;
|
|||
|
rel = s;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
class LogicString // Najważniejsza klasa, która przyjmuje ciąq danych
|
|||
|
{ // i przetwarza dla sprawdzenia, czy wpisana formuła
|
|||
|
string input; // jest poprawna logicznie. W danym przypadku nie są uwzględniane nawiasy,
|
|||
|
// więc można przyjąć, że konjunkcja i alternatywa mają różne priorytety
|
|||
|
//LogicRelation rel;
|
|||
|
LogicVar[] vars; // <- Tablica zmiennych logicznych
|
|||
|
int[] StringRelVar; // <- tablica przechowująca informację o ciągu znaków (1 dla zmiennej, 0 dla funkcji, 2 - koniec ciągu), używana przy sprawdzaniu
|
|||
|
Signs [] sTab; // <- tablica zmiennych i funkcji logicznych, używana przy sprawdzaniu
|
|||
|
//Brackets [] bTab; // <- (NIE UŻYWANE) tablica nawiasów
|
|||
|
|
|||
|
public void GetInputString() // <- metoda GetInputString pryzjmuje wejście do zmienney typu string
|
|||
|
{
|
|||
|
Console.WriteLine("Please, input your string and press enter(with no spaces)");
|
|||
|
input = Console.ReadLine();
|
|||
|
}
|
|||
|
|
|||
|
public void AnalizeString() // <- metoda AnalizeString "przetwarza" dane z wejścia i "tłumaczy" je na zmienne i funkcje logiczne, które są później zapisywane w LogicVar[] vars, int[] StringRelVar i Signs[] sTab
|
|||
|
{
|
|||
|
sTab = new Signs [100]; // toporny sposób na tworzenie nowej tablicy
|
|||
|
vars = new LogicVar[100]; // to samo
|
|||
|
for (int j = 0; j < 100; j++) // cuda na kiju, ze aż wstyd
|
|||
|
{
|
|||
|
vars[j] = new LogicVar();
|
|||
|
}
|
|||
|
StringRelVar = new int[100];
|
|||
|
//bTab = new Brackets [100];
|
|||
|
for(int i = 0; i < input.Length; i++) // "chodzenie" po stringu input i "tłumaczenie" zmiennych i funkcji
|
|||
|
{
|
|||
|
if(input[i] == '=') // '=' równoważność
|
|||
|
{
|
|||
|
//Console.WriteLine("equality");
|
|||
|
sTab[i] = Signs.Equality;
|
|||
|
StringRelVar[i] = 0; // funkcja logiczna rozpoznawana jako "0"
|
|||
|
}
|
|||
|
else if(input[i] == '>') // '>' implikacja
|
|||
|
{
|
|||
|
//Console.WriteLine("implication");
|
|||
|
sTab[i] = Signs.Implication;
|
|||
|
StringRelVar[i] = 0;
|
|||
|
}
|
|||
|
else if(input[i] == '|') // '|' alternatywa
|
|||
|
{
|
|||
|
//Console.WriteLine("alternative");
|
|||
|
sTab[i] = Signs.Alterantive;
|
|||
|
StringRelVar[i] = 0;
|
|||
|
}
|
|||
|
else if(input[i] == '&') // '&' koniunkcja
|
|||
|
{
|
|||
|
//Console.WriteLine("conjuction");
|
|||
|
sTab[i] = Signs.Conjuction;
|
|||
|
StringRelVar[i] = 0;
|
|||
|
}
|
|||
|
else if(input[i] == '!') // '!' negacja
|
|||
|
{
|
|||
|
//Console.WriteLine("negation");
|
|||
|
sTab[i] = Signs.Negation;
|
|||
|
StringRelVar[i] = 0;
|
|||
|
}
|
|||
|
/*else if(input[i] == '(') // nawiasy
|
|||
|
{
|
|||
|
//Console.WriteLine("left bracket");
|
|||
|
sTab[i] = Signs.LeftBracket;
|
|||
|
StringRelVar[i] = 0;
|
|||
|
}
|
|||
|
else if(input[i] == ')')
|
|||
|
{
|
|||
|
//Console.WriteLine("right bracket");
|
|||
|
sTab[i] = Signs.RightBracket;
|
|||
|
StringRelVar[i] = 0;
|
|||
|
}*/
|
|||
|
else
|
|||
|
{
|
|||
|
//Console.WriteLine($"there is a variable called {input[i]}");
|
|||
|
vars[i].Name = input[i]; // (zbędne bez używania nawiasów) "rozpoznawanie" zmiennych i wpisywanie do tablicy,
|
|||
|
sTab[i] = Signs.Var;
|
|||
|
//Console.WriteLine($"there is a variable called {vars[i].Name}");
|
|||
|
//vars[i].SetName(input[i]);
|
|||
|
StringRelVar[i] = 1; // Zmienna oznaczana jako "1"
|
|||
|
}
|
|||
|
if(input[i] == ' ')
|
|||
|
{
|
|||
|
Console.WriteLine("You can't put spaces");
|
|||
|
}
|
|||
|
if(i == input.Length - 1)
|
|||
|
{
|
|||
|
StringRelVar[i+1] = 2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public bool ErrSearch() // metoda ErrSearch sprawdza czy formuła jest poprawna
|
|||
|
{
|
|||
|
int count = 0; // używane przy "chodzeniu" po StringRelVar
|
|||
|
int zeroCount = 0; // używane przy podliczaniu funkcji logicznych, występujacych pod rząd
|
|||
|
int oneCount = 0; // to samo przy podliczaniu zmiennych logicznych
|
|||
|
|
|||
|
|
|||
|
|
|||
|
while(StringRelVar[count] != 2)
|
|||
|
{
|
|||
|
//Console.Write(StringRelVar[count]);
|
|||
|
if(StringRelVar[count] == 1)
|
|||
|
{
|
|||
|
if (oneCount == 1) // nie można umieszczać obok siebie zmienne logiczne
|
|||
|
{
|
|||
|
Console.WriteLine("formula nie jest poprawna");
|
|||
|
return false;
|
|||
|
}
|
|||
|
if (oneCount == 0)
|
|||
|
{
|
|||
|
zeroCount = 0;
|
|||
|
oneCount++;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if(StringRelVar[count] == 0)
|
|||
|
{
|
|||
|
if (zeroCount > 0)
|
|||
|
{
|
|||
|
if (sTab[count] == Signs.Negation)
|
|||
|
{
|
|||
|
if ((sTab[count + 1] != Signs.Var)&&(sTab[count+1] != Signs.Negation)) //tylko negacja może się powtarzać wielokrotnie, przy tym negacja nie może się znajdować przed funkcją logiczną
|
|||
|
{
|
|||
|
Console.WriteLine("formula nie jest porpawna");
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Console.WriteLine("formula nie jest poprawna");
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
if (zeroCount == 0)
|
|||
|
{
|
|||
|
oneCount = 0;
|
|||
|
zeroCount++;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
count++;
|
|||
|
}
|
|||
|
Console.WriteLine("formula jest poprawna");
|
|||
|
return true;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void ShowVerRel() //zestaw zer i jedynek z dwójką na końcu, dokładnie jak historia z wejściówkami na logice
|
|||
|
{
|
|||
|
int count = 0;
|
|||
|
while(StringRelVar[count] != 2)
|
|||
|
{
|
|||
|
Console.Write(StringRelVar[count]);
|
|||
|
count++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
} //koniec
|