C# :: Aufgabe #198 :: Lösung #2
3 Lösungen
#198
Logische Ausdrücke 'ausklammern'
Fortgeschrittener - C#
von polie
- 25.01.2018 um 19:12 Uhr
Schreibe ein Programm welches aus dem Ausdruck
A&(B|C)&(D|E)
den folgenden erzeugt:
A&B&D|A&B&E|A&C&D|A&C&E
Hier ist das & ein logisches UND und das | das logische ODER. Die Klammern sind wie bei der Multipikation/Division zu behandeln.
A&(B|C)&(D|E)
den folgenden erzeugt:
A&B&D|A&B&E|A&C&D|A&C&E
Hier ist das & ein logisches UND und das | das logische ODER. Die Klammern sind wie bei der Multipikation/Division zu behandeln.
#2
von hollst (13980 Punkte)
- 07.05.2018 um 11:03 Uhr
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
Schreibe ein Programm welches aus dem Ausdruck
A&(B|C)&(D|E)
den folgenden erzeugt:
A&B&D|A&B&E|A&C&D|A&C&E
Hier ist das & ein logisches UND und das | das logische ODER.
Die Klammern sind wie bei der Multipikation/Division zu behandeln.
*/
namespace aufgabe_198
{
class Program
{
static string NL = Environment.NewLine;
static void Main()
{
//string input = "A*(B+C)*(D+E)";
string input = "(B+C)*(D+E)*A";
WriteLine("input: " + NL + input);
Dictionary<string, string> output = Substituts(input);
List<string> init_strings = plus_token(output["all"]);
List<string> expanded = expand(init_strings, output);
StringBuilder sb = new StringBuilder();
for (var i = 0; i < expanded.Count; i++)
sb.Append(expanded[i] + "+");
string result = sb.ToString();
WriteLine("result:" + NL + result.Remove(result.Length - 1));
ReadKey(true);
}
static string eliminate_brackets(string token, string sub,
ref int subi, ref Dictionary<string, string> dic)
{
string ssub = sub + subi.ToString();
subi++;
char[] c = token.ToCharArray();
char[] ct = new char[c.Length - 2];
Array.Copy(c, 1, ct, 0, ct.Length);
dic.Add(ssub, new string(ct));
return ssub;
}
static Dictionary<string, string> Substituts(string input)
{
//step 0: remove spaces
Char LZ = ' ';
string result = string.Empty;
for (var i = 0; i < input.Length; i++)
if (input[i] != LZ)
result += input[i].ToString();
int kmax = int.MaxValue;
string sub = "sub";
int subi = 0;
Dictionary<string, string> dic = new Dictionary<string, string>();
//step 1: substitute brackets
while (kmax > 1)
{
int[] klammer = new int[result.Length];
int[] ebene = new int[result.Length];
int ka = 0;
kmax = 0;
for (var i = 0; i < result.Length; i++)
{
if (result[i] == '(')
{ klammer[i] = ka++; if (ka > kmax) kmax = ka; };
ebene[i] = ka;
if (result[i] == ')')
{ klammer[i] = ka; ka--; };
}
string token = result[0].ToString();
int index = ebene[0];
string ohne_klammer = string.Empty;
for (var i = 1; i < result.Length; i++)
{
if (ebene[i] == index)
token += result[i].ToString();
else
{
if (token[0] == '(' && token[token.Length - 1] == ')')
token = eliminate_brackets(token, sub, ref subi, ref dic);
ohne_klammer += token;
index = ebene[i];
token = result[i].ToString();
}
}
if (token[0] == '(' && token[token.Length - 1] == ')')
token = eliminate_brackets(token, sub, ref subi, ref dic);
ohne_klammer += token;
result = ohne_klammer;
}//while
dic.Add("all", result);
return dic;
}
static List<string> plus_token(string input)
{
string[] inputs = input.Split('+');
List<string> result = new List<string>();
for (var i = 0; i < inputs.Length; i++)
result.Add(inputs[i]);
return result;
}
static List<string> expand(List<string> input, Dictionary<string, string> substitutes)
{
List<string> result = new List<string>();
for(var i = 0; i < input.Count; i++)
{
string mult_token = input[i];
string[] factors = mult_token.Split('*');
string new_mult_token = string.Empty;
bool bo_key = false;
for (var j = 0; j < factors.Length; j++) {
if (substitutes.Keys.Contains(factors[j])) {
bo_key = true;
string plus_factor = substitutes[factors[j]];
List<string> Lplus_factor = plus_token(plus_factor);
for (var k = 0; k < Lplus_factor.Count; k++) {
string new_mult_token_temp = new_mult_token;
new_mult_token_temp += Lplus_factor[k] + "*";
for (var kk = j + 1; kk < factors.Length; kk++)
new_mult_token_temp += factors[kk] + "*";
new_mult_token_temp =
new_mult_token_temp.Remove(new_mult_token_temp.Length - 1);
result.Add(new_mult_token_temp);
}
}
else
new_mult_token += factors[j] + "*";
if (bo_key)
break;//j
}//j
if (!bo_key)
result.Add(new_mult_token.Remove(new_mult_token.Length - 1));
}//i
if (result.Count == input.Count)
return result;
else
return expand(result, substitutes);
}
}
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
