4 İşlem
-
ajan1111 bunu yazdı:
-----------------------------iqsuz bunu yazdı:
-----------------------------ajan olaydı çakardı cevabı iki dakkada
-----------------------------gördüm konuyuda biraz dağılmıştı mevzuu.
vbasic olaydı bi şekilde yapılırdı ama .net istiyor ;)
text'in her karakteri tek tek kontrol edilir.
selstart'la toplam karakter. mid komutuylada "(" karakteri kontrol edilir.
for i=1 to text1.selstart
if mid(text1.text,1,i)="(" then
a=mid(text1.text,1,i+1)
b=mid(text1.text,1,i+3)
if mid(text1.text,1,i+4)=")" then exit for
c=mid(text1.text,1,i+5)
d=a mid(text1.text,1,i+2) b mid(text1.text,1,i+4)
end if
next i
not: yazdıklarım vbasic 6.0 için. ezberden hatırladığım kadarıyla yazdım. yazım veya mantık hatası olabilir. eksikte olabilr. ama kabataslak böyle bişey olurdu.
Mesaj 22 Temmuz 2012 (Pazar) Saat: 03:08'da ajan1111 tarafından düzenlendi.
-----------------------------
demiştim siker geçer diye:) -
iqsuz bunu yazdı:
-----------------------------......
demiştim siker geçer diye:)
-----------------------------
:) söylemek istememiştim ama kurduğu mantık yanlış, her zaman en içteki parenteze göre çözülüp geriye doğru ya da ileriye doğru açılma yapılmalıdır. mesela
( .... + ....* (.... * (.....+...)/ ... + ....) .... ) gibi işlemde çöker mantığı. o yüzden ilk başta ) parentezini bulup ondan sonra geriye gidip ( arayıp ikisi arasındaki işlemi
çözmek gerekli.. zamanım olursa bunun örneğini vb.net ya da c# için yaparım
Mesaj 22 Temmuz 2012 (Pazar) Saat: 16:14'da unbalanced tarafından düzenlendi. -
Zamanın birinde VB6 kullanarak benzer bir şey yapmıştım.
- Doğru çalışan kısımlar:
1) Parantezler doğru ele alınıyor.
2) İşlem önceliğine dikkat ediliyor.
3) Parantez sayısı + 1 (fazladan bir yinelemeyi de biz ekliyoruz. Kısaca ifadenin tamamı parantez içinde olmak zorunda, kodlara baktığınızda göreceksiniz) öz yineleme yapıyor.
4) Geri kalan işlemler iterasyon ile gerçekleşiyor. Dinamik bellek yönetimi yerine hedef ifade parçalarının işi biten kısımları "b" olarak işaretleniyor. Karmaşıklık logaritmik azalıyor.
5) Eşit önceliğe sahip işleçler soldan sağa yapılıyor (bu şekilde yazdığımı hatırlıyorum).
- Yapamadıkları (ve hataları):
1) Tekli işleç desteklenmiyor. Örneğin (4 + -1) ifadesini çözemiyor olması lazım. Yalnız istediğiniz şey için sorun çıkarmayacaktır.
2) Parantez içindeki tek ifadeler (örneğin (5)) doğru hesaplanmıyor.
3) Parantez işaretlerinin tam olmadığı durumlar (unbalanced parantheses, örneğin "( 4 +4 * (4*4)") yakalanmıyor. Fakat ufak bir değişiklikle yakalanması kolay.
4) Herhangi bir hata yakalama mekanizması mevcut değil.
Proje kodları burada: http://speedy.sh/C5Fdb/mathexpr.rar
Mesaj 22 Temmuz 2012 (Pazar) Saat: 21:59'da YeniHarman tarafından düzenlendi. -
win form için değilde konsol için bi örnek var, benim baya işime yaramıştı
http://www.daniweb.com/software-development/csharp/code/217185/console-calculator-part-1-the-scanner
http://www.daniweb.com/software-development/csharp/code/217186/console-calculator-part-2-the-parser
-
parantez olması zorunlu değil ki c# da zaten ekranda parantez gösteripte işlem yaptırmak biraz mesele. ordaki parantezler işlemi bölmek neyin nerde ne iş yapacağını göstermek amacıyla konulmuş sanırım. dört tane textboxun içine farklı sayılar yazılıyor bunların ilk ikisi toplanıyor o toplamın sonucu ücüncüyle çıkarılıyor ve dördünc textboxa bölünüyor . bunlar da tek butana basınca oluyor :) muş..
c# dışında bir dillede yapılır ancak benim diğer dillerde program yazacak kadar bilgim yok...
-
ağaç yapısını araştır müride (:
al hatta tam olarak konuyu anlatan slayt sana (: veri yapıları konularını araştırarak bulabilirsin
http://logicalarea.com/img/8.ppt
-
Bunu kullanarak bahsettiğin şeyi aşşağıdaki gibi component haline getirmiştim. kullanışlı.
Değişken olayını kapsadığını sanmıyorum
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.CodeDom.Compiler; using System.Collections; using System.Text.RegularExpressions; using System.Reflection; using Microsoft.CSharp; using System.IO; using System.CodeDom; namespace HolyOne.Controls { public class MathTextBox:TextBox { /* ICodeCompiler CreateCompiler() { //Create an instance of the C# compiler CodeDomProvider codeProvider = null; codeProvider = new CSharpCodeProvider(); ICodeCompiler compiler= codeProvider.CreateCompiler(); return compiler; } */ CSharpCodeProvider loCompiler = new CSharpCodeProvider();//.CreateCompiler(); /// /// Creawte parameters for compiling /// /// CompilerParameters CreateCompilerParameters() { //add compiler parameters and assembly references CompilerParameters compilerParams = new CompilerParameters(); compilerParams.CompilerOptions = "/target:library /optimize"; compilerParams.GenerateExecutable = false; compilerParams.GenerateInMemory = true; compilerParams.IncludeDebugInformation = false; compilerParams.ReferencedAssemblies.Add("mscorlib.dll"); compilerParams.ReferencedAssemblies.Add("System.dll"); compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll"); //add any aditional references needed // foreach (string refAssembly in code.References) // compilerParams.ReferencedAssemblies.Add(refAssembly); return compilerParams; } string RefineEvaluationString(string eval) { // look for regular expressions with only letters Regex regularExpression = new Regex("[a-zA-Z_]+"); // track all functions and constants in the evaluation expression we already replaced ArrayList replacelist = new ArrayList(); // find all alpha words inside the evaluation function that are possible functions MatchCollection matches = regularExpression.Matches(eval); foreach (Match m in matches) { // if the word is found in the math member map, add a Math prefix to it bool isContainedInMathLibrary = _mathMembersMap[m.Value.ToUpper()] != null; if (replacelist.Contains(m.Value) == false && isContainedInMathLibrary) { eval = eval.Replace(m.Value, "Math." + _mathMembersMap[m.Value.ToUpper()]); } // we matched it already, so don't allow us to replace it again replacelist.Add(m.Value); } // return the modified evaluation string return eval; } public string LastError { get; set; } void InitializeFields() { // Value = ""; LastError = ""; } /// /// Compiles the c# into an assembly if there are no syntax errors /// /// private CompilerResults CompileAssembly() { // create a compiler // ICodeCompiler compiler = CreateCompiler(); // get all the compiler parameters CompilerParameters parms = CreateCompilerParameters(); // compile the code into an assembly CompilerResults results = loCompiler.CompileAssemblyFromSource(parms, _source.ToString()); // CompilerResults results = CompileCode(compiler, parms, _source.ToString()); return results; } protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.Return) try { this.Text = Value.ToString(); this.SelectionStart = this.Text.Length; } catch (Exception) { } base.OnKeyDown(e); } [System.ComponentModel.DefaultValue(false)] public bool CalculateOnEnter { get; set; } /// /// Compiles the code from the code string /// /// /// /// /// private CompilerResults CompileCode(ICodeCompiler compiler, CompilerParameters parms, string source) { //actually compile the code CompilerResults results = compiler.CompileAssemblyFromSource( parms, source); //Do we have any compiler errors? if (results.Errors.Count > 0) { foreach (CompilerError error in results.Errors) Console.WriteLine("MathCode Compile Error:" + error.ErrorText); return null; } return results; } private void Calculate() { // Blank out result fields and compile result fields InitializeFields(); // change evaluation string to pick up Math class members string expression = RefineEvaluationString(this.Text); // build the class using codedom BuildClass(expression); // compile the class into an in-memory assembly. // if it doesn't compile, show errors in the window CompilerResults results = CompileAssembly(); Console.WriteLine("...........................\r\n"); Console.WriteLine(_source.ToString()); // if the code compiled okay, // run the code using the new assembly (which is inside the results) if (results != null && results.CompiledAssembly != null) { // run the evaluation function RunCode(results); } else { } } ArrayList _mathMembers = new ArrayList(); Hashtable _mathMembersMap = new Hashtable(); void GetMathMemberNames() { // get a reflected assembly of the System assembly Assembly systemAssembly = Assembly.GetAssembly(typeof(System.Math)); try { //cant call the entry method if the assembly is null if (systemAssembly != null) { //Use reflection to get a reference to the Math class Module[] modules = systemAssembly.GetModules(false); Type[] types = modules[0].GetTypes(); //loop through each class that was defined and look for the first occurrance of the Math class foreach (Type type in types) { if (type.Name == "Math") { // get all of the members of the math class and map them to the same member // name in uppercase MemberInfo[] mis = type.GetMembers(); foreach (MemberInfo mi in mis) { _mathMembers.Add(mi.Name); _mathMembersMap[mi.Name.ToUpper()] = mi.Name; } } //if the entry point method does return in Int32, then capture it and return it } //if it got here, then there was no entry point method defined. Tell user about it } } catch (Exception ex) { Console.WriteLine("Error: An exception occurred while executing the script", ex); } } private double calcresultdbl = 0; public double Value { get { Calculate(); return calcresultdbl; } } /** public string ValueStr { get { Calculate(); return calcresultflt; } } */ private void WriteLine(string txt, params object[] args) { string lst = string.Format(txt, args); ; LastError = lst; } /// /// Runs the Calculate method in our on-the-fly assembly /// /// private void RunCode(CompilerResults results) { Assembly executingAssembly = results.CompiledAssembly; try { //cant call the entry method if the assembly is null if (executingAssembly != null) { object assemblyInstance = executingAssembly.CreateInstance("ExpressionEvaluator.Calculator"); //Use reflection to call the static Main function Module[] modules = executingAssembly.GetModules(false); Type[] types = modules[0].GetTypes(); //loop through each class that was defined and look for the first occurrance of the entry point method foreach (Type type in types) { MethodInfo[] mis = type.GetMethods(); foreach (MethodInfo mi in mis) { if (mi.Name == "Calculate") { object result = mi.Invoke(assemblyInstance, null); calcresultdbl = (double)result; LastError = ""; // calcresultflt = result.ToString(); } } } } } catch (Exception ex) { WriteLine("Error: An exception occurred while executing the script", ex); } } CodeMemberField FieldVariable(string fieldName, string typeName, MemberAttributes accessLevel) { CodeMemberField field = new CodeMemberField(typeName, fieldName); field.Attributes = accessLevel; return field; } CodeMemberField FieldVariable(string fieldName, Type type, MemberAttributes accessLevel) { CodeMemberField field = new CodeMemberField(type, fieldName); field.Attributes = accessLevel; return field; } /// /// Very simplistic getter/setter properties /// /// /// /// /// CodeMemberProperty MakeProperty(string propertyName, string internalName, Type type) { CodeMemberProperty myProperty = new CodeMemberProperty(); myProperty.Name = propertyName; myProperty.Comments.Add(new CodeCommentStatement(String.Format("The {0} property is the returned result", propertyName))); myProperty.Attributes = MemberAttributes.Public; myProperty.Type = new CodeTypeReference(type); myProperty.HasGet = true; myProperty.GetStatements.Add( new CodeMethodReturnStatement( new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), internalName))); myProperty.HasSet = true; myProperty.SetStatements.Add( new CodeAssignStatement( new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), internalName), new CodePropertySetValueReferenceExpression())); return myProperty; } public MathTextBox() { // InitializeComponent(); GetMathMemberNames(); // track all members of the math namespace } StringBuilder _source = new StringBuilder(); /// /// Main driving routine for building a class /// void BuildClass(string expression) { // need a string to put the code into _source = new StringBuilder(); StringWriter sw = new StringWriter(_source); //Declare your provider and generator CSharpCodeProvider codeProvider = new CSharpCodeProvider(); ICodeGenerator generator = codeProvider.CreateGenerator(sw); CodeGeneratorOptions codeOpts = new CodeGeneratorOptions(); CodeNamespace myNamespace = new CodeNamespace("ExpressionEvaluator"); myNamespace.Imports.Add(new CodeNamespaceImport("System")); myNamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms")); //Build the class declaration and member variables CodeTypeDeclaration classDeclaration = new CodeTypeDeclaration(); classDeclaration.IsClass = true; classDeclaration.Name = "Calculator"; classDeclaration.Attributes = MemberAttributes.Public; classDeclaration.Members.Add(FieldVariable("answer", typeof(double), MemberAttributes.Private)); //default constructor CodeConstructor defaultConstructor = new CodeConstructor(); defaultConstructor.Attributes = MemberAttributes.Public; defaultConstructor.Comments.Add(new CodeCommentStatement("Default Constructor for class", true)); defaultConstructor.Statements.Add(new CodeSnippetStatement("//TODO: implement default constructor")); classDeclaration.Members.Add(defaultConstructor); //property classDeclaration.Members.Add(this.MakeProperty("Answer", "answer", typeof(double))); //Our Calculate Method CodeMemberMethod myMethod = new CodeMemberMethod(); myMethod.Name = "Calculate"; myMethod.ReturnType = new CodeTypeReference(typeof(double)); myMethod.Comments.Add(new CodeCommentStatement("Calculate an expression", true)); myMethod.Attributes = MemberAttributes.Public; myMethod.Statements.Add(new CodeAssignStatement(new CodeSnippetExpression("Answer"), new CodeSnippetExpression(expression))); // myMethod.Statements.Add(new CodeSnippetExpression("MessageBox.Show(String.Format(\"Answer = {0}\", Answer))")); myMethod.Statements.Add( new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "Answer"))); classDeclaration.Members.Add(myMethod); //write code myNamespace.Types.Add(classDeclaration); generator.GenerateCodeFromNamespace(myNamespace, sw, codeOpts); sw.Flush(); sw.Close(); } } }Mesaj 23 Temmuz 2012 (Pazartesi) Saat: 12:58'da HolyOne tarafından düzenlendi. -
a (label) | 16 | (tekxtBox)
b (label) | 7 | (tekxtBox)
c (label) | 3 | (tekxtBox)
d (label) | 4 | (tekxtBox)
Formül (label) | (a+b-c)/d | (tekxtBox)
hesapla (button) : 5 (label)
görüntü böyle olacak
-
Up Muride kardesimize yardim.
-
resimdeki formul kısmına kullanıcı tarafından girilen değerleri programın okuyup işlem yapması gerekiyor kod kısmına tanımladığımızda sadece orda tanımlanan formule işlem yapıyor. ancak kullanıcı farklı formuller girdiğindede o girilen formule göre işlem yapacak .. nasıl yapabilirim?ekran görüntüsü bu linkte
http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash3/557325_3594490388029_1271683623_n.jpg
