PDA

View Full Version : محاسبه کردن یک جمع رشته



www.pc3enter.tk
چهارشنبه 29 شهریور 1396, 09:24 صبح
سلام دوستان یک سوال دارم ممنون میشم کمکم کنید
فرض کنید که یک کاربر یک مقداری به این شکل وارد می‌کنم
42+1+0+20
بعد حالا ما به چه روشی و به چه کدی میتوانیم. این String را محاسبه کنیم.
که جواب به ما بده 63
ممنون میشم راهنمایی ام کنید

hp1361
شنبه 01 مهر 1396, 10:40 صبح
سلام دوستان یک سوال دارم ممنون میشم کمکم کنید
فرض کنید که یک کاربر یک مقداری به این شکل وارد می‌کنم
42+1+0+20
بعد حالا ما به چه روشی و به چه کدی میتوانیم. این String را محاسبه کنیم.
که جواب به ما بده 63
ممنون میشم راهنمایی ام کنید

اگر مطمئن اید که در رشته فقط عدد و علامت +-/* هستش، رشته رو از ابتدا شروع به خوندن کنید(حرف به حرف) تا به اولین کاراکتر عملیات چهارگانه برسید و نتیجه رو در یک متغیر بریزید و این کار رو دوباره از اینکس بعد از اون علامت اولی که یافتین تکرار کنید الی آخر.

persia_hrn
شنبه 01 مهر 1396, 12:38 عصر
سلام دوست عزیز
شما یه زحمت میکشید یه Edit و یه Button و یه label به فرمتون اضافه میکنید و بعد کد زیر رو اضافه کنید :

Function Calc(Input: String): String;
var
Txt, S1, S2: String;
Ps1, Ps2, Loop1, Loop2: Integer;
Sum: Real;
begin
Txt:=Input;
Loop1:=0;
S1:=Copy(Txt,1,1);
while S1<>'' do
begin
Loop1:=Loop1+1;
S1:=Copy(Txt,Loop1,1);
if (S1='+') or (S1='-') or (S1='*') or (S1='/') then
begin
Ps1:=Loop1;
For Loop2:=Loop1+1 to Length(Txt) do
begin
S2:=Copy(Txt,Loop2,1);
if (S2='+') or (S2='-') or (S2='*') or (S2='/') then
begin
Ps2:=Loop2;
Break;
end
else
if Loop2=Length(Txt) then
begin
Ps2:=length(Txt)+1;
Break;
end;
end;
if S1='+' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))+StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
if S1='-' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))-StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
if S1='*' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))*StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
if S1='/' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))/StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
Txt:=FloatToStr(Sum)+Copy(Txt,Ps2,Length(Txt));
Loop1:=0;
end;
end;
Result:=FloatToStr(Sum);
end;

نحوه استفادشم اینجوریه :
توی OnClick مربوط به button بنویسید :

Label1.Caption:=Calc(Edit1.Text);

اگر جاییش ایراد داره خودتون رفعش کنید و در ضمن این فانکشن اولویت عملیات رشته ریاضی رو در نظر نمیگیره .

موفق باشید .

persia_hrn
دوشنبه 03 مهر 1396, 15:05 عصر
سلام فانکشن بالا یه مشکل کوچولو با اعداد منفی داشت که درستش کردم :

Function Calc(Input: String): String;
var
Txt, S1, S2: String;
Ps1, Ps2, Loop1, Loop2: Integer;
Sum: Real;
begin
Txt:=Input;
Loop1:=0;
S1:=Copy(Txt,1,1);
while S1<>'' do
begin
Loop1:=Loop1+1;
S1:=Copy(Txt,Loop1,1);
if (S1='+') or (S1='-') or (S1='*') or (S1='/') then
begin
Ps1:=Loop1;
For Loop2:=Loop1+1 to Length(Txt) do
begin
S2:=Copy(Txt,Loop2,1);
if (S2='+') or (S2='-') or (S2='*') or (S2='/') then
begin
Ps2:=Loop2;
Break;
end
else
if Loop2=Length(Txt) then
begin
Ps2:=length(Txt)+1;
Break;
end;
end;
if Ps1<>1 then
begin
if S1='+' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))+StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
if S1='-' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))-StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
if S1='*' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))*StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
if S1='/' then Sum:=StrToFloat(Copy(Txt,1,Ps1-1))/StrToFloat(Copy(Txt,Ps1+1,(Ps2-Ps1)-1));
Txt:=FloatToStr(Sum)+Copy(Txt,Ps2,Length(Txt));
Loop1:=0;
end;
end;
end;
Result:=FloatToStr(Sum);
end;

موفق باشید .

www.pc3enter.tk
دوشنبه 03 مهر 1396, 18:25 عصر
ممنون، ببخشید من تازه کد نویسی را شروع کردم و چیزی زیادی بلد نیستم
فقط یک سوال من فقط میخوام علامت + را حساب کنه
نیازی به * / و - ندارم.
اون چطوریه

hp1361
سه شنبه 04 مهر 1396, 07:54 صبح
procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
Sum, PlusIndex: Integer;
begin
Sum := 0;
PlusIndex := -1;

Str := Edit1.Text;
// تعیین ایندکس اولین جایی که علامت + در رشته وجود دارد
PlusIndex := Str.IndexOf('+');
while PlusIndex > 0 do
begin
// از ابتدای رشته تا محل علامت + رو کپی کرده و بعد از تبدیل به عدد، با مقدار قبلی متغیر مجموع جمع میکنیم
Sum := Sum + StrToInt(Copy(Str, 1, PlusIndex));
//برای حذف کاراکتر های قبل از اولین + و همچنین خود +، کارکترهای بعد از علامت + از رشته را کپی کرده و مجددا درون متغیر رشته میریزیم
Str := Copy(Str, PlusIndex + 2, Length(Str) - PlusIndex);
PlusIndex := Str.IndexOf('+');
end;
if Str.Length > 0 then
Sum := Sum + StrToInt(Str);

ShowMessage('نتیجه : ' + IntToStr(Sum));
end;

یوسف زالی
جمعه 07 مهر 1396, 01:37 صبح
procedure TForm1.Button1Click(Sender: TObject);
var
i, sum: integer;
s: string;
lst: TStringList;
begin
s := '42+1+0+20';
lst := TStringList.Create;
lst.Text := StringReplace(s, '+', #13#10, [rfReplaceAll]);
sum := 0;
for i := 0 to lst.Count -1 do
sum := sum + StrToInt(lst[i]);
lst.Destroy;
ShowMessage(IntToStr(sum));
end;