C# İle İlgili Basit Ama Programa Dönüştürmek Zor...
-
Regexe girmene gerek yok.
http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm
Buradaki örnekte kullanıldığı gibi c# da dinamik kod çalıştırma özelliği var yani string olarak verdiğin kodu çalıştırabilir.
verdiğin matematik işlemi de C formatında olduğu için bunu çalıştırıp sonucu biyere yazdırabilirsin.
web için fazla anlamadan kullanmak çok sakattır, çünkü matematik işlemi yazilacak yere kod yazıp serverda dosya falan yaratabilir adam doğru permissionları vermezsen.
-
wking bunu yazdı:
-----------------------------
Hocam hiçbir şey anlamadım vallaha :/
Eğer sorunun çözülmediyse ve tekrar anlatmaya üşenmezsem yardım edebilirim.
-----------------------------hocam soru :textbox a (12+5*3/6) gibi bir ifade yi kullanıcı tek seferde girecek programda bunu hesaplayacak fakat işlem öncelik sırasına göre yani önce çarpma işlemi ve bölme işemi sonra toplama ve çıkarma işlemi.
grn arkadasımız yardımcı oldu binary tree (ikili ağaç)sistemiyle yapılabilinir dedi su an onu inceliyorum herkese teşekkürler..
-
bi kere verdiğin örnek saçma olmuş senin dediğin matematik kurallarına göre doğru önce çarpma ve bölme sonra toplama ve çıkarma yapılır ama şunu unutma çarpma ve bölmeden öncede parantez içindeki değerler toplanır. senin istediğin olayda logo programında kdv hesaplama alında var grid üzerinde, neyse adam şunu yazarsa ne olcak 10+6/3 senin mantığına göre bu işlemin sonucu = 12 çıkar önce çarpma ve bölme ya bana göre ise = 5,33 çıkar yani senin önce işlemi yazma esnasında kendin parantezlere aldırman lazım
bak şöyle bir mantık geldi aklıma sen bu işlemi yapabilmen için önce opertörlerini yakalaman lazım textbox changesinde operatörleri arat mesela adam 10+2/3 yazarsa sen önce operatörlere bak ve operatör öncesi ve sonrasındaki operand(yani sayıları) array içine at tek tek ve senin istediğin önceliklede array içinden döngü ile işlemi yaptır bu kadar basit.
-
herkese ilgisi için teşekkürler grn arkadasımız sınıf arkadasım aynı zamanda ona ulastım değişik bi metot kullanarak çözdü ama benim bi pok anladıgım söylenemez ..=) sizlerle de paylasmak istedim kodları..
ANA FORM
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
calculateButton.PerformClick();
}
private void calculateButton_Click(object sender, EventArgs e)
{
if ((label1.Text = textBox1.Text) == "")
return;
Calculator c = new Calculator(textBox1.Text);
label1.Text = c.Calculate().ToString();
}
}---------------------------------------İŞLEMLERi YAPTIGI KOD KISMIDA BURADA YER ALIYOR...------------------
class Calculator
{
Tokens m_tokens;
char[] m_spcChars = new char[] { '*', '/', '+', '-' };
public Calculator(string str)
{
m_tokens = new Tokens();
SeparateTokens(str);
}
private void SeparateTokens(string str)
{
int bfindex, i, j;
for (bfindex = i = 0; i < str.Length; ++i)
{
for (j = 0; j < m_spcChars.Length; ++j)
{
if (str[i] == m_spcChars[j])
{
m_tokens.AddToken(str.Substring(bfindex, i - bfindex), TypeExpression.number);
m_tokens.AddToken(m_spcChars[j].ToString(), TypeExpression.expression);
bfindex = i + 1;
break;
}
}
}
m_tokens.AddToken(str.Substring(bfindex), TypeExpression.number);
}
public double Calculate()
{
Token tk, tkadd;
double db = 0;
for(int i = 0; i < 4; i+= 2)
for (tk = m_tokens.m_root; tk != null; tk = tk.m_Next)
{
if (tk.m_type != TypeExpression.expression)
continue;
if (!(tk.m_value[0] == m_spcChars[i] || tk.m_value[0] == m_spcChars[i + 1]))
continue;
/*operatorun sagini ve solunu isleme sokuyoruz ;)*/
db = Operate(tk.m_Prev, tk.m_Next, tk);
//uzerinde bulundugumuzun soldakinin solu yoksa en bastayizdir;)
if (tk.m_Prev.m_Prev == null)
{
tk.m_Prev.m_value = db.ToString();
//sagdakinin sagi yoksa artik bitmistir gayri :)
if (tk.m_Next.m_Next == null)
break;
tk.m_Next.m_Next.m_Prev = tk.m_Prev;
tk.m_Prev.m_Next = tk.m_Next.m_Next;
}
else
{
//listede islem yaptigimiz dugumler cikartip. islem sonucunu onlarin yerine koyuyoruz;)
tkadd = new Token(db.ToString(), TypeExpression.number,
tk.m_Prev.m_Prev, tk.m_Next.m_Next);
tk.m_Prev.m_Prev.m_Next = tkadd;
if (tk.m_Next.m_Next != null)
tk.m_Next.m_Next.m_Prev = tkadd;
}
tk = tk.m_Next;
}
return double.Parse(m_tokens.m_root.m_value);
}
private double Operate(Token tk1, Token tk2, Token tkexp)
{
switch (tkexp.m_value[0])
{
case '+':
return double.Parse(tk1.m_value) + double.Parse(tk2.m_value);
case '-':
return double.Parse(tk1.m_value) - double.Parse(tk2.m_value);
case '*':
return double.Parse(tk1.m_value) * double.Parse(tk2.m_value);
case '/':
return double.Parse(tk1.m_value) / double.Parse(tk2.m_value);
}
return 0;
}
}
//linked list of tokens
//bu bagli liste atomlari tutucak.(it contains tokens)
class Tokens
{
public Token m_root = null;
public Token m_cur = null;
public int m_count = 0;
public Token AddToken(string value, TypeExpression tp)
{
if (m_root == null)
{
m_cur = m_root = new Token(value, tp, null, null);
m_root.m_index = m_count++;
return m_root;
}
m_cur.m_Next = new Token(value, tp, m_cur, null);
m_cur.m_Next.m_index = m_count++;
return m_cur = m_cur.m_Next;
}
public Token InsertToken(Token tkind, string value, TypeExpression tp)
{
Token tk = new Token(value, tp, tkind, tkind.m_Next);
tkind.m_Next.m_Prev = tk;
tkind.m_Next = tk;
m_count++;
return tk;
}
public Token RemoveToken(Token tk)
{
Token tktr = m_root;
for (; tktr != null; tktr = tktr.m_Next)
{
if (tktr.m_value == tk.m_value && tktr.m_type == tk.m_type)
{
tktr.m_Prev.m_Next = tktr.m_Next;
tktr.m_Next.m_Prev = tktr.m_Prev;
m_count--;
return tktr.m_Prev;
}
}
return null;
}
public Token RemoveToken(string value)
{
Token tktr = m_root;
for (; tktr != null; tktr = tktr.m_Next)
{
if (tktr.m_value == value)
{
tktr.m_Prev.m_Next = tktr.m_Next;
tktr.m_Next.m_Prev = tktr.m_Prev;
m_count--;
return tktr.m_Prev;
}
}
return null;
}
}
//Bagli listenin bir dugumu(one node of linked list)
class Token
{
public Token m_Next;
public Token m_Prev;
public TypeExpression m_type;
public string m_value;
public int m_index;
public Token(string value, TypeExpression tp, Token Prev, Token Next)
{
m_Next = Next;
m_Prev = Prev;
m_type = tp;
m_value = value;
}
}
enum TypeExpression : int
{
number = 0,
expression,
} -
Benim de yaptığım bir hesap makinem vardı split kullanarak baya bi kasmıştım:)
Belki birinin işine yarar.. Tabi geliştirilmesi gerekiyor yarıda bırakmıştım..
kodlar:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
string a;
public Form1()
{
InitializeComponent();
}
private void btn1_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
txtislem.Text = btn1.Text.ToString();
}
txtislem.Text = a+""+btn1.Text;
}
private void btn2_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn2.Text.ToString();
}
txtislem.Text = a + "" + btn2.Text;
}
private void btn3_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn3.Text.ToString();
}
txtislem.Text = a + "" + btn3.Text;
}
private void btn4_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn4.Text.ToString();
}
txtislem.Text = a + "" + btn4.Text;
}
private void btn5_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn5.Text.ToString();
}
txtislem.Text = a + "" + btn5.Text;
}
private void btn6_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn6.Text.ToString();
}
txtislem.Text = a + "" + btn6.Text;
}
private void btn7_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn7.Text.ToString();
}
txtislem.Text = a + "" + btn7.Text;
}
private void btn8_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn8.Text.ToString();
}
txtislem.Text = a + "" + btn8.Text;
}
private void btn9_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn9.Text.ToString();
}
txtislem.Text = a + "" + btn9.Text;
}
private void btn0_Click(object sender, EventArgs e)
{
if (txtislem.Text != string.Empty)
{
a = txtislem.Text;
}
else
{
// MessageBox.Show(a); kontrol mekanizması
txtislem.Text = btn0.Text.ToString();
}
txtislem.Text = a + "" + btn0.Text;
}
private void btntemizle_Click(object sender, EventArgs e)
{
txtislem.Text = "";
a = "";
}
private void btntopla_Click(object sender, EventArgs e)
{
string z = txtislem.Text;
txtislem.Text = z + " + ";
//MessageBox.Show(txtislem.Text); kontrol mekanizması
}
private void btncikar_Click(object sender, EventArgs e)
{
string z = txtislem.Text;
txtislem.Text = z + " - ";
}
private void btnbol_Click(object sender, EventArgs e)
{
string z = txtislem.Text;
txtislem.Text = z + " / ";
}
private void btncarp_Click(object sender, EventArgs e)
{
string z = txtislem.Text;
txtislem.Text = z + " X ";
}
private void btnesittir_Click(object sender, EventArgs e)
{
string z = txtislem.Text;
string[] satirlar = z.Split(' ');
if (satirlar[1].ToString() == "+")
{
int sayi1 = Int32.Parse(satirlar[0]);
int sayi2 = Int32.Parse(satirlar[2]);
int toplam = sayi1 + sayi2;
txtislem.Text = z + " = " + toplam.ToString();
return;
}
if (satirlar[1].ToString() == "-")
{
int sayi1 = Int32.Parse(satirlar[0]);
int sayi2 = Int32.Parse(satirlar[2]);
int sonuc = sayi1 - sayi2;
txtislem.Text = z + " = " + sonuc.ToString();
return;
}
if (satirlar[1].ToString() == "X")
{
int sayi1 = Int32.Parse(satirlar[0]);
int sayi2 = Int32.Parse(satirlar[2]);
int sonuc = sayi1 * sayi2;
txtislem.Text = z + " = " + sonuc.ToString();
return;
}
if (satirlar[1].ToString() == "/")
{
int sayi1 = Int32.Parse(satirlar[0]);
int sayi2 = Int32.Parse(satirlar[2]);
int sonuc = sayi1 / sayi2;
txtislem.Text = z + " = " + sonuc.ToString();
return;
}
}
}
} -
Hocam şimdi google amcaya girip. "Infix,Prefix,Postfix" yazıyosun. Ne olduklarını öğreniyosun.
Senin Infix'i Postfix e çeviren bir fonksiyon yazman lazım sonra kolayca işleyebilirsin verileri :)
-
C# da kolay bir yolu olabilir fakat cözümde Recursive Descent Parser işine yaracaktır.
Biz bu sorunun biraz daha karmasığı ile ugraşmıştık.Recursive Descent Parser kullanarak yapılabiliyor.
Bunun yanında 2 li ağaçla yapan arkadaşlarda olmuştu ama onlarda recursive kullanmışlar.Yığıt kullanılalarakta
yapılabilir fakat onu yapmk biraz zor olabilir.
Kolay gelsin..
-
Aynen hoca expression parser lazim sana ilk. Switchle neyi sorgulayacaksn bir suru ic ice olabilir.