در ابتدا بگم كه براي درست خوندن اين متن، انكودينگ صفحهات رو راست به چپ كن. قابل توجه احسان كه آقا چرا اين Alignment و اينا انگليسيه. يا نكنه فقط من مشكل دارم؟
در مورد سؤال پيدا كردن كلمة تكراري، با توجه به سؤالت، فرض ميكنيم كه همة حروف رو به بزرگ تبديل كردي.
پيدا كردن كلمات تكراري، بستگي به اين داره كه ورودي رو چه جوري گرفته باشي. دو احتمال وجود داره، يا همهاش رو ريختي توي يه متغير از نوع String و يا اينكه از آرايه استفاده كردي، كه خود اين هم به دو نوع آرايهاي از حروف و يا آرايهاي از كلمات تقسيم ميشه.
در حالتي كه از آرايهاي از حروف استفاده كرده باشي، كار كمي سختتر خواهد بود. ولي دو تاي ديگه آسونه.
اون جوري كه من ديدم، تمامي برنامههايي كه بايد مينوشتي براي تمرين كردن حلقههاي تو در تو بودن به اضافة چيزاي ديگهاي مث آرايهها.
اين هم عملاً دو تا حلقهاس كه داخل هم قرار گرفتن و مكانيسم كار هم خيلي آسونه.
معمولاً در حلقههاي تو در تو، روال اينه كه حلقة بيروني، كل بازة عملياتي رو از اول تا آخر طي ميكنه و حلقة دروني، بر اساس نوع مسأله، يك بازة عملياتي ديگه و يا همون بازة عملياتي رو طي ميكنه. كه در حالت دوم، معمولاً حلقة دروني، بجاي اينكه از اول بازة عملياتي شروع بشه، از جايي شروع ميشه كه حلقة بيروني تا الان طي كرده.
به عنوان مثال، توي همين مثال خودت، بايد از اول تا آخر متن، يكي يكي كلمهها رو مشخص كني، بعد از جايي كه هستي، تا انتهاي متن، بگردي و اگه كلمهاي مث اين پيدا كردي، حذفش كني.
خب، براي اينكه مسأله رو حل كنيم، برميگرديم به نوع نگهداري رشتة اصلي. آرايهاي از حروف سخته و آرايهاي از كلمات خيلي آسون. واسه همين فرض ميكنم يه متغير رشتهاي گرفتي و كل رشته رو توي اون ريختي. اين ميتونه برات الگو باشه تا اگه با يكي از دو روش ديگه هم مسأله رو حل كردي، توي همون قالب، خودت ادامه بدي.
اول بايد ببيني چه كارهايي بايد انجام داد. كارهايي كه من ميبينم، اينهاست: پيدا كردن يك كلمه، حذف يك كلمه.
منظورم از كار، يك يا چند تا دستوره كه يه كار مشخص رو انجام ميدن و تو چندين بار اون كار رو لازمه كه انجام بدي.
خب، اگه ميدوني كه function چيه، براي هر كدوم از دو تا كار فوق، يه function بنويس. چون كارت رو خيلي راحت خواهد كرد. اما باز من فرض رو بر اين ميذارم كه function نميدوني چيه.
خب، براي پيدا كردن كلمة بعدي، چيزايي كه بايد بدونيم، نام رشتة اصلي، و موقعيتيه كه اونجا هستيم و ميخوايم كلمة بعدي رو پيدا كنيم. اي كار رو با سه تا دستور ميشه انجام داد:
(توضيح ضروري: يه تابع داريم توي پاسكال كه يه رشته، يك رشتة ديگه و يه موقعيت شروع رو ميگيره و عددي رو كه برميگردونه، اولين وقوع رشتة دوم، توي رشتة اول، بعد از موقعيت داده شدهاست. اگه درست يادم باشه، توي پاسكال، اسمش substr بود. يا يه همچين چيزي)
1. موقعيت اولين blank رو توي رشتة اصلي، بعد از موقعيت داده شده پيدا كن.
2. موقعيت اولين blank رو توي رشتةاصلي، بعد از موقعيتي كه توي 1 پيدا كردي، پيدا كن.
3. رشتهاي كه توي رشتة اصلي و بين دو موقعيت فوق واقع شده، كلمة بعدي است. (باز يه تابع داريم كه يه رشته، يه موقعيت و يه طول رو ميگيره و از اون موقعيت به اون طول از رشتة اصلي، يه رشته در مياره و تحويلت ميده)
پس اينجوري كلمة بعدي رو پيدا كرديم. حالا بريم سر حذف كردن:
چيزايي كه بايد داشته باشيم، نام رشتة اصلي، موقعيت شروع كلمهاي كه بايد حذف شه و موقعيت انتها يا طول اونه.
توي قسمت قبل ديدي كه موقعيت ابتدا و انتهاي كلمه رو داريم. پس با يه دستور به راحتي ميتونيم كلمه رو حذف كنيم:
بايد بگي رشتة اصلي رو برابر قرار بده با رشتة اصلي، از ابتدا، تا موقعيت شروع كلمه به اضافة رشتة اصلي، از موقعيت انتهاي كلمه، تا انتهاي رشتة اصلي.
اينجوري خودبخود اون كلمه از اون وسط حذف ميشه.
خب، حالا ديگه كاري نمونده، بايد دو تا حلقة for يا while توي هم بنويسي. يكي يكي كلمهها رو پيدا ميكني. بعد از موقعيت انتهاي كلمه تا انتهاي رشته رو باز هي كلمه پيدا ميكني و مقايسه ميكني با كلمه اوليه و اگه برابر بودن، كلمه دوميه رو حذف ميكني.
حلقة while راحتتره، چون اگه از for استفاده كني،قاعدتاً بايد از طول رشته براي شرط انتها استفاده كني و چون در طي كار هي طول رشته كم ميشه، احتمال بروز خطا هست.
يه psudo code برات مينويسم:
کد:
i := 1;
j := 1;
while (i < len(MyString))
begin
aWord := find_a_word(MyString, i);
while ((j + len(aWord)) < len(MyString))
begin
next_word := find_a_word(MyString, j);
if aWord = next_word then
delete_next_word
else
j := j + len(next_word);
end;
i := i + len(aWord);
end;
اين چيزي بود كه همين الان نوشتم. خيلي سريع و ساعت 5 صبح! الگوريتم كلي رو برات شرح دادم. يك سري ريزهكاري توي دقت به انتهاي برنامه و اينكه يه وقت توي لوپ نيفته، يا اينكه بعضي جاها بايد طولها رو به اضافة يك كني تا blank اضافه رو هم حذف كني، يا اينكه آخرين كلمة متنت ديگه بعدش blank نيست و بايد حواست به اين باشه، وجود داره. نوشتن برنامه با خودت. اگه مشكلي داشتي، بنويس. البته ترجيحاً email هم بده تا بيام چك كنم. به اين آدرس:
[email protected]
مخلصيم!