این برنامه رو آقای حسنپور لطف کردن و نوشتن ، سوالی بود میتونین از ایشون بپرسین
برنامه میاد روی لیست پیمایش میکنه و عددی رو که وارد کردیم میاد بصورت جز جز اعداد رو نمایش میده مثلا 123 رابصورت 1، 2، 3 نمایش میدهد
کلاس:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace tokenizing
{
public class MathString
{
string datapart = "";
string tavanpart = "";
string inputstring = "";
int int_datapart = 0;
int int_tavanpart = 0;
public string InputString
{
set
{
inputstring = value;
}
get
{
return inputstring;
}
}
/// <summary>
/// Returns a string representing Data part of expression
/// </summary>
public string FirtsPartString
{
set
{
datapart = value;
}
get
{
return datapart;
}
}
/// <summary>
/// Returns an integer representation of Data part of expression
/// </summary>
public int FirstPartValue
{
set
{
int_datapart = value;
}
get
{
return int_datapart;
}
}
/// <summary>
/// Returns a string representing Tavan part of expression
/// </summary>
public string SecondPartString
{
set
{
tavanpart = value;
}
get
{
return tavanpart;
}
}
/// <summary>
/// Returns an integer representation of Tavan part of expression
/// </summary>
public int SecondPartValue
{
set
{
int_tavanpart = value;
}
get
{
return int_tavanpart;
}
}
//joda sazi yek reshte mesle (10x^2) va meghdar dehi kardane property ha
public void Calculate(string inputstr, Int32 Sign)
{
int end = inputstr.Length;
int index = 0;
if (inputstr.IndexOf('^') > 0)
{
index = inputstr.IndexOf('^');
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace tokenizing
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace tokenizing
{
public partial class Form2 : Form
{
Int32[] ExpressionsSign1;// برای نگه داری علامث مثبت یا منفی هر عبارت در رشته ورودی اول
Int32[] ExpressionsSign2;//این هم برای نگه داری علامت مثبت منفی عبارت های تیکه شده از ورودی دوم هست
string inputStr1 ;
string inputStr2 ;
char[] delimiters = new char[]{'+','-'};
String[] tokenizedStr1 ;//این هم یک آرایه برای ذخیره کردن عبارت های جدا شده از متن ورودی هست
String[] tokenizedStr2 ;//این هم آرایه دوم برای متن ورودی دوم . که عبارت های جدا شده توش قرار بگیرن.
MathString[] MathExpression1 ; //این هم یک آرایه از عبارات ریاضی .این همون کلاسی هست که ما عبارتهای جداشدمونرو توش قرار میدیم و بعدش به تک تک عضوهای رشتمون دسترسی پیدا میکنیم.
MathString[] MathExpression2;
bool[] CalculatedExpression;//برای جمع کردن عبارتها یک آرایه نوشتیم که مشخص کنیم کدوم عبارتها قبلا محاسبه شدن و تو حلقه فور دوباره محاسبه نشن.
bool[] CalculatedExpression2;
tokenizedStr1 = inputStr1.Split(delimiters); //joda sazi ebarat va zakhire onha dar ye string
tokenizedStr2 = inputStr2.Split(delimiters);
MathExpression1 = new MathString[tokenizedStr1.Length];//به تعداد رشته های جدا شده خونه بساز. هر رشته باید یکی از این خونه های برای خودش داشته باشه.
MathExpression2 = new MathString[tokenizedStr2.Length];
//چون ما از تابع اسپلیت برای جدا کردن عبارتها استفاده کردیم .
//علامت پشت هر عبارت رو از دست دادیم .و معلوم نیست کدوم عبارت منفی بود کدوم مثبت بود
//بنابراین وقتی بخواییم عبارتها رو محاسبه کنیم .نمیدونیم باید جمعشون کنیم یا کم
//برای همین باید بفهمیم هر عبارت چه علامتی پشتش بود. مثبت بود یا منفی
//برای همین یه آرایه برای هر ورودی ساختیم .
//این آرایه قراره علامت هر عبارت رو تو خودش داشته باشه .پس تعداد
//خونه های این آرایه با تعداد عبارت های جدا شده ما برابره.
ExpressionsSign1 = new Int32[tokenizedStr1.Length];
ExpressionsSign2 = new Int32[tokenizedStr2.Length];
//قدم اول ما اینه که تو رشته ورودی ,اول بگردیم علامت های جمع و کم رو پیدا کنیم
//این تابع وظیفش همینه. بعد از اینکه کار این تابع تموم شد . آرایه های بالایی مقدار دهی شدن
GetSignLocations(inputStr1,ref ExpressionsSign1);//علامتهای جمع و کم رو پیدا میکنه و تو یه ارایه ذخیره میکنه.
GetSignLocations(inputStr2,ref ExpressionsSign2);
for (int i = 0; i < tokenizedStr1.Length; i++) //هر رشته جدا شده رو وارد یکی از این اشیاء میکنه تا بعدا بتونیم از طریق هر کدوم از این اشیاء بخش توان و داده ه رشته رو داشته باشیم
{
MathExpression1[i] = new MathString(tokenizedStr1[i], ExpressionsSign1[i]);
//txtResult.Text += MathExpression1[i].FirtsPartString + " ► " + MathExpression1[i].SecondPartString + " " + MathExpression1[i].FirstPartValue.ToString() +" " + MathExpression1[i].SecondPartValue.ToString() + Environment.NewLine;
}
for (int i = 0; i < tokenizedStr2.Length; i++)
{
MathExpression2[i] = new MathString(tokenizedStr2[i], ExpressionsSign2[i]);
//txtResult.Text += MathExpression2[i].FirtsPartString + " ► " + MathExpression2[i].SecondPartString + " " + MathExpression2[i].FirstPartValue.ToString() + " " + MathExpression2[i].SecondPartValue.ToString() + Environment.NewLine;
}
for (int i = 0; i < MathExpression1.Length; i++)
{
for (int j = 0; j < MathExpression2.Length; j++)
{
if (MathExpression1[i].SecondPartString == MathExpression2[j].SecondPartString && (MathExpression1[i].FirstPartValue != 0 && MathExpression2[j].FirstPartValue != 0))
{
dataresult = (MathExpression1[i].FirstPartValue + MathExpression2[j].FirstPartValue);
if ((dataresult > 0) && (counter!=0))
{
result += "+"+dataresult.ToString() + MathExpression1[i].SecondPartString + " ";
}
else if (dataresult < 0)
{
result += "-"+dataresult.ToString() + MathExpression1[i].SecondPartString + " ";
}
else
{
result += dataresult.ToString() + MathExpression1[i].SecondPartString + " ";
}
CalculatedExpression[i] = true;
CalculatedExpression2[j] = true;
counter++;
}
}
}
result += CheckanyRemainingExpression(MathExpression1, ExpressionsSign1, CalculatedExpression);
result += CheckanyRemainingExpression(MathExpression2, ExpressionsSign2, CalculatedExpression2);
return result;
}
private string CheckanyRemainingExpression(MathString[] Exp, int[] FinalizedOperators,bool[] calculated)
{
string result = "";
for (int i = 0; i < Exp.Length; i++)
{
if (calculated[i] == false)
{
if (Exp[i].SecondPartString != "")
{
if (FinalizedOperators[i] == 1)
{
result += "+" + Exp[i].InputString;
}
else if (ExpressionsSign2[i] == -1)
{
result += "-" + Exp[i].InputString;
}
}
}
}
return result;
}
private void GetSignLocations(string inputStr,ref Int32[] ExpressionsSign)
{
Int32[] operators = new int[inputStr.Length];
SignFinder(inputStr, ref operators); //ghadame aval moshakhas kardane + va - dar ebarate koli
Finalize(operators,ref ExpressionsSign); //ghadame dovom zakhire + va - dar yek araye betori ke har andise in araye mote alegh be yek ebarat ast.
}
private void Finalize(int[] operatorssource, ref int[] FinalizedOperators)
{
int x = 0;
for (int i = 0; i < operatorssource.Length; i++)
{
if ( operatorssource[i] == 1 )
{
FinalizedOperators[x] = 1;
x++;
}
else if ( operatorssource[i] == -1 )
{
FinalizedOperators[x] = -1;
x++;
}
}
}
private void SignFinder(string exp, ref int[] operators)
{
int x = 0;
while (x < exp.Length)
{
if (x == 0)
{
if (Char.IsDigit(exp[x]))
{
operators[x] = 1;
}
else if (exp[x]=='-')
{
operators[x]= -1;
}
else if (exp[x]=='+')
{
operators[x]= 1;
}
}
else
{
if (exp[x] == '+')
{
operators[x] = 1;
}
else if(exp[x] == '-')
{
operators[x] = -1;
}
else
{
operators[x] = 0;
}
}
x++;
}
}
}
}
کلاس مورد نیاز در فرم سوم:
//in the name of GOD
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace tokenizing
{
class MathExpressionOptimised
{
public MathExpressionOptimised()
{
}
public struct Expression
{
public string inputstring ;
public string DataNodeString ; //first section
public string VarNodeString ; //second section
public int DataNodeValue;
public int VarNodeValue;
public int Sign;
}
public Expression [] Expressions;
String[] tokenizedStrings;
Int32[] ExpressionsSign;
bool[] CalculatedExpression;
bool[] CalculatedExpression2;
char[] delimiters;
string _InputString = "";
int _TokenizedString = 0;
public string InputString//از پراپرتی استفاده کرده و مقدار دهی را انجام داده است
{
set { _InputString = value; }
get { return _InputString; }
}
public int NumberOfTokenizedString
{
set { _TokenizedString = value; }
get { return _TokenizedString; }
}
public char[] Delimiters
{
set{delimiters = value;}
get{return delimiters;}
}
private void FillExpressions()
{
Expressions = new Expression[NumberOfTokenizedString];
for (int i = 0; i < NumberOfTokenizedString; i++) //هر رشته جدا شده رو وارد یکی از این اشیاء میکنه تا بعدا بتونیم از طریق هر کدوم از این اشیاء بخش توان و داده ه رشته رو داشته باشیم
{
Calculate(ref Expressions[i], tokenizedStrings[i], ExpressionsSign[i]);
}
}
private void Calculate()
{
throw new NotImplementedException();
}
private void GetSignLocations(string inputStr, ref Int32[] ExpressionsSign)
{
Int32[] SignsInString = new int[inputStr.Length];
SignFinder(inputStr, ref SignsInString); //ghadame aval moshakhas kardane + va - dar ebarate koli
Finalize(SignsInString, ref ExpressionsSign); //ghadame dovom zakhire + va - dar yek araye betori ke har andise in araye mote alegh be yek ebarat ast.
}
private void SignFinder(string expression, ref int[] SignsInString)
{
int x = 0;
while (x < expression.Length)
{
if (x == 0)
{
if (Char.IsDigit(expression[x]))
{
SignsInString[x] = 1;
}
else if (expression[x] == '-')
{
SignsInString[x] = -1;
}
else if (expression[x] == '+')
{
SignsInString[x] = 1;
}
}
else
{
if (expression[x] == '+')
{
SignsInString[x] = 1;
}
else if (expression[x] == '-')
{
SignsInString[x] = -1;
}
else
{
SignsInString[x] = 0;
}
}
x++;
}
}
private void Finalize(int[] SignsInString, ref int[] ExpressionsSign)
{
int x = 0;
for (int i = 0; i < SignsInString.Length; i++)
{
if (SignsInString[i] == 1)
{
ExpressionsSign[x] = 1;
x++;
}
else if (SignsInString[i] == -1)
{
ExpressionsSign[x] = -1;
x++;
}
}
}
public void Calculate(ref Expression expression, string str, Int32 Sign)
{
int end = str.Length;
int index = 0;
public string Solve(MathExpressionOptimised.Expression[] expression, MathExpressionOptimised.Expression[] expression_2)
{
string result = "";
int dataresult = 0;
int counter = 0;
CalculatedExpression = new bool[expression.Length];
CalculatedExpression2 = new bool[expression_2.Length];
result += CheckanyRemainingExpression(expression, CalculatedExpression);
result += CheckanyRemainingExpression(expression_2, CalculatedExpression2);
return result;
}
private string CheckanyRemainingExpression(MathExpressionOptimised.Expression[] Exp, bool[] calculated)
{
string result = "";
for (int i = 0; i < Exp.Length; i++)
{
if (calculated[i] == false)
{
if (Exp[i].VarNodeString != "")
{
if (Exp[i].Sign == 1)
{
result += "+" + Exp[i].inputstring;
}
else if (Exp[i].Sign == -1)
{
result += "-" + Exp[i].inputstring;
}
}
}
}
return result;
}
}
}
فراخونی در فرم سوم:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace tokenizing
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
برای فرم سوم کلاسش رو قرار ندادین
فرم دوم و فرم سوم یک برنامه هستن . یکی با استفاده از کلاسها نوشته شده و یکی دیگه بصورت معمولی .
فرم اول هم برای جدا سازی یا tokenizing بوده ( معادل split ) .( در اصل توضیح پست اول درمورد این فرم هست )
دوتا فرمی که اول گفتم قرار بوده دوتا عبارت ریاضی رو بصورت رشته دریافت کنن و بعد نتیجش رو باز بفرم ریاضی نمایش بدن . ( فکر میکنم یه همچین چیزی بود ) .
اون کلاس فرم سه رو هم بزارید لطفا تا برنامتون کامل باشه
بازم از زحمتی که میکشید ممنونم
بله حتما....ولی آقای حسنپور فقط همینا بودن... فکر نکنم چیز دیگه ای بود؟! دوباره چک میکنم ...ممنون از تذکرتون
نه حتما وجود داره . نگاه کنید به فرم سوم : MathExpressionOptimised این کلاس رو شما هیچ جای این پروژه قرار ندادین .
من خودم بار اول دیدم گیج شدم چون یادم بود یه ورژن هم نوشته بودم که فقط از کلاس استفاده میکرد و یه ورژن هم ساده ترش بود ( فرم دوم) که از کلاس استفاده نمیکرد و نقش توضیحی داشت بیشتر . بعدا که دوباره نگاه کردم به فرم سوم یادم اومد شما کلاس MathExpressionOptimised رو جا انداختین
براتون مقدور هست اگه نسخه ای از برنامه دارین برام بفرستین؟ ممنون میشم بااحترام
باید بگردم ببینم میتونم پیداش کنم یا نه . معمولا پاک میکنم پروژه هارو یا تو تغییر ویندوز پاک میشن .
شما فرم سوم رو باز کنین . روی کلاس MathExpressionOptimised راست کلیک کنین و Goto Definition رو بزنین کلاس رو بهتون نشون میده .
علاقه مندی ها (Bookmarks)