PDA

View Full Version : palindram strings



akb_behnam
شنبه 09 دی 1385, 10:16 صبح
با سلام خدمت دوستان
راستی این سایت انجمنی برای پاسکال نداره ؟
بگزریم


لطفا به این برنامه دقت کنید :

برنامه ایی بنویسید که رشته ایی به طول حداکثر 50 کاراکتر را خوانده و مشخص کند آیا این رشته هست یا خیر .

حالا ممنون میشم در رابطه با الگوریتمش راهنماییم کنید
آیا باسد از مقایسه کدهای اسکی استفاده کنم ؟ (پاسکال تابعی برای این کار داره ؟)
چه طور برنامه رو محدود کنم حداکثر 50 کاراکتر بگیره

اَرژنگ
شنبه 09 دی 1385, 11:03 صبح
لطفا به این برنامه دقت کنید :

برنامه ایی بنویسید که رشته ایی به طول حداکثر 50 کاراکتر را خوانده و مشخص کند آیا این رشته هست یا خیر .

رشته ایی به طول حداکثر 50 کاراکتر ،رشته هست.

whitehat
شنبه 09 دی 1385, 15:54 عصر
رشته palindram رشته های متقارن هستند مانند AbA یا abcdcba
اگر شما به دنبال تشخیص جملات palindram هستید کافیه رشته ورودی را به دو قسمت تقسیم کنید. اگر طول رشته زوج بود رشته دقیقا به دوقسمت مساوی تقسیم می شود، اما در صورت فرد بودن از کاراکتر وسط صرف نظر کنید.
سپس قسمت اول را با معکوس قسمت دوم مقایسه کنید(از تابع Reverse استفاده کنید) در صورتی که مساوی باشد رشته palindram است
راه حل دیگر استفاده از پشته ( Stack) می باشد
موفق باشید

akb_behnam
یک شنبه 10 دی 1385, 15:42 عصر
ممنون

پس نیازی به استفاده از کد اسکی کاراکتر ها و مقایسه اون ها نیست؟
باچه تابعی میشه رشته رو به چند قسمت تقسیم کرد ؟
راهی نداره کاربرو همون زمان تایپ مجبور کنیم

whitehat
یک شنبه 10 دی 1385, 15:58 عصر
پس نیازی به استفاده از کد اسکی کاراکتر ها و مقایسه اون ها نیست؟
نیازی به این کار ندارید ، بسته به نوع الگوریتمی که می خواهید پیاده سازی کنید باید تک تک کاراکتر ها را مقایسه کنید یا کل دو رشته ای که در بالا گفتم مقایسه کنید.


باچه تابعی میشه رشته رو به چند قسمت تقسیم کرد ؟
substr


راهی نداره کاربرو همون زمان تایپ مجبور کنیم
خیر شما حتما باید وسط رشته را بدانید.
موفق باشید

akb_behnam
دوشنبه 11 دی 1385, 09:06 صبح
خیلی ممنون برای به دست آوردن وسطش اینجوری باید عمل کنم ؟


strLen(STR div 2)


راستی تابعی به اسم REVERSE تو توربو پاسکال 7 داریم ؟ من که نتونستم اجرا کنم همین طور substr

اَرژنگ
دوشنبه 11 دی 1385, 10:50 صبح
for i = 1 to Length of String do begin
if String[i] <> String[String Length -1 ] then String IS NOT a palindrom
end

whitehat
دوشنبه 11 دی 1385, 12:20 عصر
کد فوق مشکل کوچکی دارد یعنی برای رشته های با طول فرد کار نمی کند، فرض کنید رشته ما AbA باشد در اولین بار تکرار حلقه شرط A<>b چک می شود چون طول رشته برابر 3 است و کاراکتر اول برابر A و کاراکتر یکی ماند به آخر یعنی طول رشته منهای یک برابر 2 یعنی کاراکتر b است و تابع عدم پالیندروم بودن را نمایش می دهد، دقت کنید که در پاسکال رشته از 1 شروع می شود.
---------------------------

برای به دست آوردن وسطش اینجوری باید عمل کنم ؟
شما باید ابتدا قسمت اول عبارت پالیندروم را بدست آورید برای عبارات زوج از تابع زیر استفاده کنید


Count:=Lenght(PalindramString)/2

و برای رشته های با طول فرد از تابع زیر استفاده کنید


Count:=Ceil(Length(palindramString)/2)

تابع Ceil یا Ceiling باید وجود داشته باشه لطفا خودتان جستجو کنید

من که نتونستم اجرا کنم همین طور substr
از تابع Copy استفاده کنید (خیلی وقت هست با پاسکال کار نکردم شاید این تابع در پاسکال 7 وجود نداشته باشه همینطور Reverse ولی Copy صد در صد وجود داره)
حال دو قسمت پالیندروم را بدست آورید


HalfPalindram:=Copy(PalindramString,1,Count)
HalfPalindram2:=Copy(PalindramString,Count+1,Count )



راستی تابعی به اسم REVERSE تو توربو پاسکال 7 داریم ؟
همانطور که گفتم یادم نیست وجود دارد یا نه اما می توانید آنرا به صورت زیر شبیه سازی کنید


st:='Your String';
Location := POS(Space, St);
Len := Length(St);
Last := COPY(St, 1, Location - 1);
First := COPY(St, Location + 1, Len - Location);
St := First + Space + Last

موفق باشید

اَرژنگ
دوشنبه 11 دی 1385, 12:36 عصر
۳ خط کد را چرا اینقدر پیچیده میکنند؟:متفکر:

behnam_akb
دوشنبه 11 دی 1385, 18:25 عصر
ممنون لطف کردید. درسته 4 خط کد ساده بیشتر نیست ولی من مشکل اصلیم این بود که خیلی پاسکال یادم نیست و بیشتر دنبال اسم توابع بودم که دوستان کمک کردید و فکر کنم حل شد.


(باید به فکر یه راهنمای کاربر درست و حسابی و آنلاین برای این زبون های علمی و داشگاهی رو وب باشیم)

akb_behnam
سه شنبه 12 دی 1385, 10:11 صبح
سلام

ممنون می شم یه نگاهی به این کد بندازید و نظرتون رو بگید .



program palindram;
{uses crt;}
uses strings;
var
str : array [0..90] of char ;
reverse,half1,half2 : string;
count,len,i : integer ;
begin
{clrscr;}
writeln ('Please enter a string (maximum 50 characters) :');
readln (str);
if (str[0] = '') or (str[0] = #0)then
begin
writeln('Please enter the string !');
end
else
begin
if (StrLen(str)<50) then
begin
len := StrLen(str);
if (len > 1) then
begin
if (len mod 2 = 0) then
begin
count := strLen(str) div 2;
half1 := copy(str,1,count);
half2 := copy(str,count+1,len-count);
for i:=count-1 downto 0 do
reverse := reverse + str[i];
end
else
begin
count := round((strLen(str) div 2+(0.6)));
half1 := copy(str,1,count-1);
half2 := copy(str,count+1,len-count);
for i:=count-2 downto 0 do
reverse := reverse + str[i];
end;
if(reverse = half2)then
writeln ('String is palindram !')
else
writeln ('String is not palindram !');
end;
end
{
else
writeln ('your string is only one character');
}
else
writeln('Your string is bigger than fifty characters !');
end;
end.


فقط دو تا نکته
1 : کدش خیلی جالب نشد چی کارش کنم مرتب تر و اصولی تر بشه ؟
2 : طبق تعریف زیر این برنامه نباید علامات و نقطه گذاری رو در نظر بگیره برای اون چی کار کنم ؟
palindrame : زشته ایی که از چپ و راست بدون در نظر گرفتن علاوئم نقطه گذاری به یک صورت خوانده شود.

whitehat
سه شنبه 12 دی 1385, 11:36 صبح
طبق تعریف زیر این برنامه نباید علامات و نقطه گذاری رو در نظر بگیره برای اون چی کار کنم ؟
ابتدا تابعی بنویسید که علامات و نقطه گذاری را از رشته حذف کند، سپس در مورد پالیندروم بودن تصمیم بگیرید

کدش خیلی جالب نشد چی کارش کنم مرتب تر و اصولی تر بشه ؟
برای اینکه کد شما بهینه شود ابتدا عبارات تکراری را از شرط خارج کنید
به جای استفاده از عمل معکوس سازی 2 اندیس تعریف کنید که یکی از ابتدا تا وسط رشته حرکت می کند و دیگری از انتها تا وسط رشته و کاراکتر موجود بر روی اندیس ها مقایسه شوند.
بهتره به جای تابع Round از تابع Ceil یا Floor استفاده کنید برای املا صحیح آنها از Help پاسکال کمک بگیرید.

akb_behnam
سه شنبه 12 دی 1385, 11:58 صبح
ممنون از کمکتون

در رابطه با ceil چیزی پیدا نکردم فقط round ، int ، trunc

می دونم به همچین تابعی احتیاج دارم اما میشه بیشتر راهنماییم کنید چه طور این کارو کنم ؟ آیا باید کارارکتر های آرایه رو یکی یک بخونم و هرجا علامتی دیدم شیفت بدم ؟؟؟ (از دست این پاسکال)

Developer Programmer
سه شنبه 12 دی 1385, 12:37 عصر
ابتدا تابعی بنویسید که علامات و نقطه گذاری را از رشته حذف کند، سپس در مورد پالیندروم بودن تصمیم بگیریدبه جاش میتونی یه کار کنی یه SET تعریف کن که علائم نقطه گذاری توش باشه؛ حالا درحین پردازش ، با دستورif not in MySet علائم را در نظر نگیر.

در رابطه با ceil چیزی پیدا نکردمترجمه فارسیش می شه "سقف" یعنی به "جزء صحیح" عدد اعشاری یک واحد اضافه کن.
مثلا سقف 4 می شه 4 ؛ اما سقف 4.4 میشه 5

از دست این پاسکال نبینم به دلفی و پاسکال توهین کنی!! :بامزه: