PDA

View Full Version : الگوریتم ایجاد کلمه با دادن حروف



feridoon
دوشنبه 28 خرداد 1386, 22:20 عصر
سلام
می خواهم الگوریتمی بنویسم که هر چند تا خواست حروف از کاربر بگیره و با اون حروف هر چند تا کلمه که می شه درست کرد رو بنویسه . چه کلمات با معنی و چه کلمات بی معنی!!!
ممنون میشم از دوستان که در این مورد راهنماییم کنن.
اگه نمونه برا این مورد دارین برام بنویسین. اگه هم نه ... راهنماییم کنین که چه چوری شروع کنم نوشتن این الگوریتم رو.
ممنون:لبخندساده:

azmoodeh
دوشنبه 28 خرداد 1386, 23:23 عصر
سلام
یه روش اینه که حروفی که می خواید توی کلمه استفاده بشه رو توی یک آرایه قرار بدید ، بعد یه حلقه به اندازه تعداد حروفی که می خواید یک کلمه داشته باشه ایجاد کنید و توی حلقه یک عدد بین صفر و ماکزیموم اندازه آرایه به صورت رندوم ایجاد کنید و کاراکتر متناظر اون رو از آرایه بخونید و به کلمه اضافه کنید .
فکر می کنم توضیحاتم کافی باشه
موفق باشید

noorsoft
سه شنبه 29 خرداد 1386, 07:02 صبح
شما باید با استفاده از حلقه های تو در تو عمل کنید به این صورت که ابتدا اولین حروف را به ترتیب وارد شدن کنار هم قرار دهی سپس جای اولی و دومی را عوض کنی سپس جای اول با سومی و... (اولین حرف به تعداد حروف وارد شده باید جا به جا شود) سپس برای دومی این کار را انجام می دی فقط حلقه دوم یکی از تعدادش کم میشه
اگه فکر میکنی باز هم مشکل داری بگو تا برات بنویسم

CodeMasterX
سه شنبه 29 خرداد 1386, 07:25 صبح
با عرض پوزش باید بگم همچین الگوریتمی اصلا معنی نداره!
اگه قراره کلمات بی معنی هم تولید بشن بی معنی میشه، اینجوری همون حروفی که کاربر وارد می کنه خودشون میشن یه کلمه که میتونه بی معنی باشه.
درصورتی که بخواین کلمات با معنی تولید کنید، میشه نوشتن چیزی شبیه به تکنولوژی Intellisense مایکروسافت که در نرم افزار ویژوال استودیو استفاده میشه.شما باید برای این کار یه دیکشنری از کلمات قابل قبول و معتبر بسازین، مثلا یه بانک اکسس، و بعد با گرفتن حروف چک کنید که میشه باهاشون کلمه ای ساخت که شبیه یکی از کلمه های موجود در بانک هست یا نه.

Hossein Bazyan
سه شنبه 29 خرداد 1386, 09:07 صبح
با عرض پوزش باید بگم همچین الگوریتمی اصلا معنی نداره!
اگه قراره کلمات بی معنی هم تولید بشن بی معنی میشه، اینجوری همون حروفی که کاربر وارد می کنه خودشون میشن یه کلمه که میتونه بی معنی باشه.
درصورتی که بخواین کلمات با معنی تولید کنید، میشه نوشتن چیزی شبیه به تکنولوژی Intellisense مایکروسافت که در نرم افزار ویژوال استودیو استفاده میشه.شما باید برای این کار یه دیکشنری از کلمات قابل قبول و معتبر بسازین، مثلا یه بانک اکسس، و بعد با گرفتن حروف چک کنید که میشه باهاشون کلمه ای ساخت که شبیه یکی از کلمه های موجود در بانک هست یا نه.
سلام
CodeMasterX جان کار را پیچیده نکن . این دوستمون فکر کنم برای یه پروژه دانشجویی میخوان و هدف هم نمره گرفتنه پس روش اولی که دوستمون اشاره کرد خوبه اما کافی نیست باید یه خورده دیگه توسعه داده بشه .
برنامه ش هم خیلی راحته و کار مشکلی نیست

azmoodeh
سه شنبه 29 خرداد 1386, 09:30 صبح
سلام
روشی که بنده هم گفتم برای کلمات نامفهوم بود و فکر می کنم خیلی از روش حلقه های تو در تو سریعتر و بهتر کار کاربر رو راه بندازه !!!!

ولی در مورد کلمات با معنی کاملا حق با CodeMasterx هست.
موفق باشید

sm_hossein
سه شنبه 29 خرداد 1386, 10:58 صبح
سلام
به روشی که این کار رو انجام می ده Back Tracking می گن. مثال معروف این روش برنامه ایه که تمام اعداد N رقمی در مبنای B رو می نویسه. این برنامه رو می شه خیلی راحت به برنامه ی نوشتن همه ی کلمات N حرفی از B تا حرف تبدیل کرد، به این ترتیب که حروف را در یک آرایه ذخیره می کنیم و در برنامه ی اول به جای هر رقم، حرف متناظر آن رقم را از آرایه می نویسیم.
برنامه ی نوشتن اعداد N رقمی در مبنای B رو به دو روش "بازگشتی" (Recursive) و "با استفاده از حلقه های تکرار" (Iterative) می شه نوشت. در روش اول باید یک تابع بنویسیم که تمام اعداد n رقمی در مبنای B رو تولید کنه، به این ترتیب که اگر تابع با مقدار n=0 صدا شد، یعنی اینکه یک عدد کامل ساخته شده و می توان آن را نوشت، و برای n>0 تابع با یک حلقه ی تکرار رقم n_ام را در یک آرایه با مقادیر صفر تا B-1 مقداردهی می کنیم و برای هر یک از مقادیر، تمام اعداد n-1 رقمی در مبنای B را با صدا کردن خود تابع ایجاد می کند.
من VB بلد نیستم ولی چون ++C نزدیک به pseudocode هست، مثال هام رو به ++C می نویسم. امیدوارم قابل فهم باشه. مثال زیر این تابع را نشان می دهد :



#define N 5
int a[N];
void backTrack (int n, int B)
{
if (n == 0)
{
for (int i = 0; i < N; i++)
cout << a[i];
cout << endl;
}
else
{
for (int i = 0; i < B; i++)
{
a[n - 1] = i;
backTrack (n - 1, B);
}
}
}
int main ()
{
backTrack (N, 4);
}


برای تبدیل برنامه ی بالا به برنامه ی کلمات، باید یک آرایه ی حروف مانند b تعریف کنیم که B عضو داشته باشد و به جای :
cout << a[i]; بنویسی :

cout << b[a[i]];
اگر حروف غیر تکراری (ارقام غیر تکراری) مورد نظر باشد، می توان با یک آرایه ی mark این عمل را انجام داد، به این ترتیب که قبل از گذاشتن یک عدد در آرایه و تولید اعداد n-1 رقمی باید چک کرد که آیا رقمی که می خواهیم در آرایه بگذاریم، مارک شده است یا نه، اگر مارک نشده بود آن را در آرایه گذاشته و آن را مارک می کنیم و تابع بازگشتی را صدا می کنیم و بعد از صدا کردن تابع، برای اینکه سراغ رقم بعدی برویم، رقم فعلی را از حالت مارک در می آوریم :




for (int i = 0; i < B; i++)
if (!mark[i])
{
a[n - 1] = i;
mark[i] = true;
backTrack (n - 1, B);
mark[i] = false;
}


واضح است که آرایه ی mark به اندازه ی B خواهد بود و در ابتدا همه ی خانه های آن مقدار false خواهند داشت.
روش دوم که با حلقه های تکرار است به این صورت است که ابتدا آرایه ی a را با صفر پر می کنیم و سپس در هر مرحله از یک طرف آرایه شروع می کنیم و تا جایی که رقم های موجود در آرایه برابر با B-1 هستند جلو می رویم (ممکن است صفر خانه جلو برویم) و خانه های موردنظر را صفر می کنیم و خانه ی بعدی آرایه (که حتماً از B-1 کمتر است) را یکی اضافه می کنیم.



while (a[N] == 0)
{
/* Writing number or word */
...
/* Generating next number */
int i = 0;
while (a[i] == B-1)
{
a[i] = 0;
i++;
}
a[i]++;
}


برای چک کردی تکراری بودن ارقام نیز در انتها (موقع نوشتن هر عدد) کل آرایه را باید چک کرد. در ضمن در این روش، آرایه ی a باید یک خانه ی اضافی هم برای شرط پایان تمام حالات داشته باشد یعنی N+1 خانه.
روش اول، راحت تر است و قابلیت های بیشتری نسبت به دومی دارد (یعنی می توان شروط دیگری غیر از تکراری بودن برای آن گذاشت (Bond) و یا ترتیب قرار دادن ارقام در هر مرحله را با توجه به بعضی از شرایط عوض کرد (Branch))

Maziar zare
سه شنبه 09 شهریور 1395, 14:36 عصر
ن ى ى س ل ا ا ك ك و ت م