PDA

View Full Version : مشکل در گذاشتن شرط برای نوشتن در یک رشته



Mahmood_M
جمعه 01 تیر 1386, 16:30 عصر
سلام
من یک دسته عدد به صورت رشته دارم ، مثلا : 2+3-4
من یک تابع نوشتم و با اون مقدار + رو به - و مقدا - رو به + تبدیل می کنم ...
حالا میخوام این شرط رو بزارم که اگه بعد از این تبدیل ، " اگر در ابتدای این رشته ( اولین حرف ) برابر با " + " یا برابر با " - " نبود " ، به اول رشته من " - " اضافه بشه ...
فرض کنید که میخواهید چند عدد رو به طرف دیگر یک تصاوی ببرید ( منفی ها به مثبت و مثبتها به منفی تبدیل میشن )
این کدیه که من نوشتم :

function TakeToLeft(Eq : String): String;
var
EqualPos : Integer;
RS : String;
LS : String;
begin
LS := Eq;
EqualPos := Pos('=', LS);
RS := Copy(LS, EqualPos+1, Length(Eq)-EqualPos);
RS := Replace(RS);
Delete(LS, EqualPos, (Length(LS)-EqualPos)+1);
if (Copy(RS, 1, 1) <> '-') and (Copy(RS, 1, 1) <> '+') then
RS := '-'+RS;
LS := LS+RS;
Result := LS;
end;
در کد بالا ، Replace ، اون تابعی هست که برای تبدیل مقدارها ( مثبت به منفی و بلعکس ) نوشتم ...
ولی نتیجه این کد به صورت زیر است :
اگر به این تابع مقداری بدم که اولین حرفش منفی یا مثبت نباشه ، همه چیز درسته و منفی رو اضافه میکنه ولی اگه اولش منفی باشه ، باز هم منفی رو اضافه می کنه !!!!
ولی من شرط گذاشتم که در صورت نبودن منفی و نبودن مثبت این کار رو بکنه ...

اینم بگم که فکر نکنم که مشکل از تابع Replace باشه ، چون تست شده و مشکلی نداشته ...

با تشکر از همگی ...

موفق باشید ...

Mahyaa
جمعه 01 تیر 1386, 17:32 عصر
مقدار result تابع Replace رو قبل از خروج از تابع Trim کن شاید درست بشه . در هر صورت مقدار RS و کلا رشته هایی رو که باهاش کار میکنی اگر مطمئن نیستی که ابتدا و انتها کاراکتر خالی ندارند ، Trim کن .
در ضمن از رشته ها اینطوری هم میتونی استفاده کنی :


if (RS[1] <> '-') and (RS[1] <> '+')
RS := '-'+RS;

و یک چیز دیگه اینکه
توی شرطی که نوشتی ، در واقع دوبار اومدی از تابع copy استفاده کردی و هردوبار هم قراره یک مقدار ، برگردونده بشه . در اینجور مواقع ، بهتره مقدار تابع رو در یک متغیر بریزی و اون رو چک کنی.

موفق باشی

SYNDROME
جمعه 01 تیر 1386, 17:41 عصر
با سلام
آقا محمود خودمان چطوره؟
به نظر من هم مشکلی نداره.تست کردم.
شاید مقدار ورودی مشکل دارد.(مثلا من بجای پاس کردن"1111-" این را "1111- " پاس کردم و چون کاراکتر اول Space بود دوباره "-" را اضافه کرد.)
البته این فقط در یک نگاه بود.
اگر مشکل حل نشد برنامه را به همراه مقداری که پاس می کنی قرار بده تا تست شود.
موفق باشی .

Mahmood_M
جمعه 01 تیر 1386, 19:07 عصر
سلام
بابت جوابها ممنونم ...
ولی با Trim هم درست نشد ... !!
مشکل اینجاست که با توجه به کدی که نوشتم ، اگه اولش مثبت باشه ، منفی اضافه میکنه و اگه منفی باشه مثبت اضافه می کنه و اگه چیزی نباشه ، منفی اضافه میکنه !!!

درواقع من قبل از این که این کد رو بنویسم ، کد رو به صورتی نوشته بودم که همون کارهای بالا رو انجام بده ( یعنی اگه مثبت بود منفی بزاره و اگه منفی بود مثبت بزاره ) ، ولی الان دیگه کد عوض شده و بازهم همون کار رو میکنه !!!!!!!!

با تشکر از همگی ...

Mahyaa
جمعه 01 تیر 1386, 19:11 عصر
ببین شرط و منطقی که استفاده کردی مشکلی نداره به نظر من . چرا Trace نمیکنی ؟
Trace کن و ببین اولین کاراکتر رشته رو چی میخونه که به این شکل عمل میکنه .

Mahmood_M
جمعه 01 تیر 1386, 19:43 عصر
سلام

اینم بگم که فکر نکنم که مشکل از تابع Replace باشه ، چون تست شده و مشکلی نداشته ...
دقیقا مشکل از همین تابع بود !! ;)

من توی این تابع از یه حلقه استفاده کرده بودم و توی اون حلقه به دنبالا منفی میگشتم و با مثبت جایگزین میکردم ، مشکل اینجا بود که توی حلقه ( For ) این طوری نوشته بودم :
For I := 0 to Length(S) do
و از مقدار I به عنوان Index در تابع Copy استفاده میکردم که چون اولین مقدارش صفر بود ، اولین کپی با با Index " صفر " انجام می شد ...

با تشکر از همگی ، مشکل حل شد ...

موفق باشید ...

SYNDROME
جمعه 01 تیر 1386, 19:46 عصر
با سلام
به هر خطی که در Trace رسیدی هر عملیات را انتخاب کن(مارک) و با Ctrl+F7 مقدار قسمت مورد نظر را برگردان.
اگر باز هم مشکلت حل نشد باز هم می گم اگر امکان دارد Source رو قرار بده.

supporter
جمعه 01 تیر 1386, 20:15 عصر
من تنها خط زیر رو به



if (Copy(RS, 1, 1) <> '-') and (Copy(RS, 1, 1) <> '+') then

به



if (Copy(trim(RS), 1, 1) <> '-') and (Copy(trim(RS), 1, 1) <> '+') then


تبدیل کردم و درست کار کرد.
البته من کار تابع Replace شما رو دستی انجام دادم.

Mahmood_M
جمعه 01 تیر 1386, 20:39 عصر
با سلام
به هر خطی که در Trace رسیدی هر عملیات را انتخاب کن(مارک) و با Ctrl+F7 مقدار قسمت مورد نظر را برگردان.
اگر باز هم مشکلت حل نشد باز هم می گم اگر امکان دارد Source رو قرار بده.



من تنها خط زیر رو به

کد:
if (Copy(RS, 1, 1) <> '-') and (Copy(RS, 1, 1) <> '+') thenبه

کد:
if (Copy(trim(RS), 1, 1) <> '-') and (Copy(trim(RS), 1, 1) <> '+') thenتبدیل کردم و درست کار کرد.
البته من کار تابع Replace شما رو دستی انجام دادم
با تشکر از دوستان ...
ولی همونطور که گفتم مشکل حل شد ...

موفق و پیروز باشید ...