Logic-Formulae-Validator-dl.../Classes.cs

220 lines
9.3 KiB
C#
Raw Normal View History

2019-05-25 18:22:08 +02:00
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