من معتقدم هیچ وقت برا یادگیری دیر نیست. برا همین هم با این سن و سال شروع کردم به یادگیری زبان C و برنامه نویسی.
حالا بناست یه برنامه بنویسم که تعداد حروف تکراری در یک کلمه رو بشمره. خب اولین حرف رو انتخاب کرده و بقیه حروف رو طی یک حلقه با اولین حرف مقایسه کرده و در صورت مساوی بودن به شمارنده یه واحد اضافه می کنم.
با این فرایند تعداد حروف تکراری با حرف اول مشخص میشه. حالا میرم سر حرف دوم. چه جوری میشه فهمید که این حرف دوم جزو همون تکراری های حرف اول نباشه؟
کسی می تونه راهنمایی کنه؟
اینکار خیلی غیر موثره. راه ساده که با یکبار خوندن کلمه این کار رو انجام بدید اینه:
-
به هر حرف یک عدد نسبت بدید. میتونید از طریق یه تابع این کار رو بکنید که حرف رو میگیره و عدد مربوط رو میده. اسمش رو میزاریم: NUM(word). فرض این از 1 تا تعداد حروف عددها رو به حرفها (مثلا n) نسبت دادید.
-
آرایه ای به تعداد حروف تعریف کنید و مقدار اولیه رو صفر بزارید: COUNT(1:n)=0
-
در خوندن کلمه به هر حرف میرسید با دستور: COUNT(NUM(word))=COUNT(NUM(word))+1 به طور خودکار تعداد حرف موردنظر یکی اضافه میشه.
حتی میتونید با تعریف آرایه مناسب و همین تکنیک جایگاههای حرف در کلمه رو هم تعیین کنید.
1- آرایه ای از حروف کلمه مورد نظر تعریف کنید.[ ]WORD (فقط یک بار هر حرف را خواهیم خواند.)
2- بعد از خواندن اولین حرف از WORD، آن حرف و عدد یک را در یک آرایه دو بعدی ([ ][ ]COUNT) ثبت کنید.
3- قبل از ثبت حرف بعدی در COUNT, آن را با حروف قبلی ثبت شده در COUNT مقایسه کنید اگر در COUNT وجود نداشت مثل مرحله ی 2 عمل کنید اگر وجود داشت یک عدد به عدد متناظر با آن اضافه کنید.
4- در پایان تعداد اعداد بزرگتر از یک در COUNT جواب مسئله خواهد بود.
سلام و از راهنمایی تون متشکرم.
من هم تقریبا چنین کردم.به این ترتیب که حروف کلمه رئ در یک آرایه ریختم. بعد اولین حرف رو با بقیه حروف مقایسه کده و اگه برابر بود به شمارنده یه واحد اضافه کردم و اگه مساوی نبود اون حرف رو در ارایه جا به جا کرده و به اولین مکان می اوردم و بعد در یک حلقه قرار داده و دوباره از نو شروع می کردم.
اما راه حل شما هم جالبه و امتحانش می کنم.
خوشحال می شم اگه دیگران هم راه حلی دارند به اشتراک بگذارند تا با دیدگاه های متفاوت آشنا بشم.
با سپاس
سلام و متشکر از راهنمایی تون.
منظور ازین قسمت چیه؟ اگه می خوایم طول کلمه مورد نظر رو اندازه بگیریم که میشه از تابع lenght استفاده کرد. آیا درست می گم یا نه؟
ممنون میشم بیشتر توضیح بدید.
با تشکر
تابعی هست که یه حرف رو میگیره و عددی رو بهش نسبت میده. مثلا NUM(a)=1, NUM(b)=2,… . این بهتون کمک میکنه حرف رو تبدیل کنید به اندیس آرایه و حتی میتونید برعکسش رو هم برای کاربرد نهائی نمایش.
یه نکته: در زبانهای پیشرفته مثلا متلب، این تابع هست و قابلیت کاربرد مستقیم داره. ولی اساسش همینه که اینجا گفتم. در حالت پیشرفته برای شمردن تعداد اعضای تکراری هر آرایه ای از اعداد و اشیا به کار ببرید. البته برای این کاربرد یکم تکنیک میخواد تا شمارنده اعضا خودکار عمل کنه.
دوستان تقریبا روش رو گفتن. صرفا برا ارائه ی یه روش متفاوت نظرم رو میگم:
-
به هر حرف الفبا یه عدد (یا اندازه) نسبت بدیم؛ الف = ۱، ب = ۲، …، ی = ۳۲
-
کلمه ی مورد نظر رو به آرایهی عدد تبدیل کنیم؛ بابا = ۲۱۲۱
-
اندازهی هر حرف رو از حرفهای بعدش کم کنیم؛ بابا: ۱،۰،۱؛ -۱،۰؛ ۱
حجم محاسباتی این کار برای کلمهی n حرفی، میشه معادل n×(n-1)/2 محاسبه از جنس تفاضل. -
تعداد صفرهای ماتریس نهایی رو بشمریم؛ بابا: ۲
سئوال جانبی برای این روش:
تابع به صورت ثابت اعضا رو تعریف میکنه. یعنی اول همه حرفها مقداردهی میشن و بعد کار شروع میشه. میشه کاری کرد که به هر حرف میرسه، ببینه مقداردهی شده یا نه، و اگه نشده، به لیست اضافه کنه؟