PDA

نسخه کامل مشاهده نسخه کامل : درخواست الگوریتم



nafe-bandar
06-10-2013, 22:56
با سلام
متاسفانه بدلیل شلوغی های اول ترم 2تا تمرین اساسی رو دستم باد کرده...
ممنون میشم اگه بتونین واسم توضیح بدین...
همون ترتیب هم بنویسین کافیه احتیاجی به فلوچارت نیست....

1. الگوریتمی بنویسید که n عدد دریافت کند و نشان دهد چه تعداد زوج و چه تعداد فرد است.
2. *** الگوریتمی بنویسید که دو عدد به عنوان ساعت و دقیقه دریافت کند و زاویه ی بین آن دو را در ساعت حساب کند. "ساعت بین 0-11، دقیقه بین 0-59"

راستی اگه کسی مرجعی برای حل تمرین های مختلف می شناسه ارائه کنه ممنونش میشیم...
پیشاپیش ممنون بابت الگوریتم...

rahnema1
07-10-2013, 05:57
دوست عزیز جوابهایی که خودت فکر می کنی را برای هر مساله بنویس وبفرست هر چند به نظر خودت ناقص و نادرست باشد
لازم نیست حتما به صورت الگوریتم بنویسی به صورت توضیحی نظر خودت را بگو
یا مثلا بگو اگر مساله اینجوری بود می توانستم حلش کنم
نکته دیگه اینکه شما این فروم را به چشم کتاب حل تمرین ببین اما کتابی که با همکاری خودت تمرین ها را حل می کند که قطعا این روش بالاتر از کتاب حل تمرینه

nafe-bandar
09-10-2013, 22:51
ممنون
اولی که حلش کردم
دومی هم یه چیزی نوشتم فکر کنم هم درست باشه ها... :
دو تا عدد H و M بعنوان ساعت و دقیقه می گیره، M*6 اسمش میذاریم min
h * 30 + m * 1/2 اسمش میذاریم hour
پس زاویه میشه hour - min
بعدشم یه قدرمطلق از نتیجهش می گیریم که منفی نشون نده.

*** هر 60 دقیقه 360درجه ست پس 1دقیقه میشه 6درجه
پس 5دقیقه میشه 30 درجه
واسه ساعت شمار هم هر 60دقیقه 30درجه میشه پس 1دقیقه میشه 0.5 درجه

چندتا سوال جدید:

1. عدد n را دریافت کرده و بررسی کند آیا متقارن است یا خیر.
در این مورد فقط می تونم حدس بزنم به تقسیم و باقیمانده ربط داره، همین!!!

2. عددی دریافت کند و بررسی کند آیا عدد کامل است یا خیر.
در این مورد هم گسسته نیازه که سر در نمیارم فقط استاد راهنمایی کرد گفت عدد کامل یعنی عدد برابر با جمع مقسوم علیه هاش بشه

پیشاپیش تشکر

rahnema1
10-10-2013, 00:39
در مورد ساعت
شما می خواستید در ابتدا ساعت و دقیقه را به مقیاس درجه ببرید در نتیجه لازم نبود ساعت با m*1/2 جمع بشه یعنی hour=h*30 باید باشه و دقیقه هم که درسته باید ضرب در 6 بشه
زاویه هم می شه hour-min قدر مطلق هم درست اما موقعی که مثلا ساعت 11 باشه و دقیقه هم 2 باشه
در این حالت داریم 2*6 -11*30 که میشه 318 که اشتباهه چون ما زاویه باز نمی خواهیم زاویه بسته می خواهیم برای این کار بعد از اینکه قدر مطلق گرفتیم باید یک شرط بگذاریم اگر زاویه از 180 درجه بیشتر شد آن را از 360 کم کنیم که در این مثال 318-360 برابر با 42 درجه میشه

این سوالات جدید رو هم که گذاشتید احتیاج به دانستن حلقه داره

عدد متقارن عددی هست که اگه معکوسش کنیم بازم خودش می شه مثل 121 یا 25452
شما باید برنامه ای بنویسی که عدد ورودی را به صورت یک رشته متنی وارد کنه و بعد کاراکتر های اول وآخر را به تریب مقایسه کنه که مثل هم هستند یانه
برای عدد کامل

توی زبانهای برنامه نویسی یک عملگر هست بنام mod که باقیمانده یک تقسیم رو نشون میده اگر باقیمانده تقسیم یک عدد به عدد دیگه برابر صفر باشه پس قابل تقسیمه و دومی مقسوم علیه اولیه
پس شما باید اولا مقسوم علیه های یک عدد رو پیدا کنی و با هم جمع کنی ببینی میشه همون اولی یا نه
یادت باشه کامپیوتر از کار تکراری نمی ترسه هرچه دلت بخواهد میتونی با استفاده از حلقه کار تکراری بهش بدی

nafe-bandar
10-10-2013, 21:01
خوب وقتی ساعت مثلا 8:40 باشه عقربه ساعت شمار دقیقا روی 8 نمیاد که، چند درجه جلوتره، به همین دلیل ضرب 1/2 شد.

واسه عدد کامل: یه مشکلی که دارم نمی دونم چطوری هم مقسوم علیه هارو شناسایی کنم و هم حاصل جمعشون رو داشته باشم
خوب بعد از تولید حلقه و شمارنده با شرط اینکه باقیمانده عدد بر شمارنده ( که از 1 شروع میشه و هر دفعه یکی بهش اضافه میشه) 0 بشه، چطوری هم باید به شمارنده اضافه هم حاصل جمع مقسوم علیه هارو داشته باشیم. ( واسه True & False)؟

عد متقارن هم نمی دونم چطوری باید همزمان هم عدد اول هم آخر بکشم بیرون؟ چطوری همزمان هم تشخیص بده چند رقمه؟ بعد تقسیم کنه و ... . ایده ی خاصی ندارم!!

سوال جدید

--- الگوریتمی که عدد را به عوامل اول تجزیه کند.

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


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

پیشاپیش ممنون

rahnema1
11-10-2013, 03:43
عدد کامل:
یک روش ساده اما نسبتا رو می گم گرچه روشهای بهینه تر از این هم هستش اما یک کم پیچیده تره
متغیری بنام n ایجاد کن با مقدار معلوم
متغیری بنام «شمارنده» درست کن و مقدار آن را 1 قرار بده
متغیری بنام «جمع مقسوم علیه ها» درست کن و مقدار آن را برابر صفر قرار بده
حلقه را شروع کن
شزط:اگر باقیمانده تقسیم n بر شمارنده صفر شد «جمع مقسوم علیه ها» را با «شمارنده» جمع کن و جوابش را داخل همان «جمع مقسوم علیه ها» بگذار
«شمارنده» را با یک جمع کن
اگر شمارنده بیشتر از 2/n شد از حلقه خارج شو
پایان حلقه
اگر n برابر با «جمع مقسوم علیه ها» بود چاپ کن عدد کامل است در غیر این صورت کامل نیست

عدد متقارن
می دانیم هر عدد ده دهی به صورت مجموع توانهای ده نوشته می شه
مثلا 7453 را می توانیم به صورت« 7 ضربدر 10 به توان 3 »بعلاوه «4 ضربدر 10 به توان 2» بعلاوه «5 ضربدر 10 به توان 1» بعلاوه «3 ضربدر 10 به توان صفر» بنویسیم
معکوسش رو به صورت « 3 ضربدر 10 به توان 3 »بعلاوه «5 ضربدر 10 به توان 2» بعلاوه «4 ضربدر 10 به توان 1» بعلاوه «7 ضربدر 10 به توان صفر» می نویسیم
بنابراین مشخص شد اگر عدد چهار رقمی باشه بیشترین توانی که در اون به کار رفته توان 3 است یعنی تعداد ارقام هر عدد مساوی است با بیشترین توان به کار رفته در آن بعلاوه 1
حالا اولا با توجه به نکته بالا باید یک حلقه بنویسیم که با اون تعداد ارقام اون عدد رو مشخص کنیم
ثانیا با توجه به اینکه معکوس عدد متقارن هم مثل خودشه معکوسس را بدست بیاوریم و نهایتا باخودش مقایسه کنیم
1. بدست آوردن تعداد ارقام

عدد n را بعنوان ورودی در نظر می گیریم که معکوسش را بدست بیاوریم
متغیری به نام r تعریف می کنیم که قرار است تعداد ارقام در آن ذخیره شود
متغیری به نام m تعریف می کنیم که قرار است معکوس عدد مورد نظر که بدست آمد در آن قرار داده شود
متغیری به نام k تعریف می کنیم که قرار است خارج قسمت تقسیم در آن ذخیره شود
متغیری به نام b تعریف می کنیم که قرار است باقیمانده تقسیم در آن ذخیره شود
متغیر i را بعنوان شمارنده تعریف کن
r را مساوی 1 قرار بده
شروع حلقه
شرط: اگر n بزرگتر از 10 به توان r است در نتیجه r=r+1 و حلقه را ادامه بده
و در غیر اینصورت از حلقه خارج شو
پایان حلقه
2. بدست آوردن معکوس
حالا که می دونیم عدد ما چند رقمیه برای بدست آوردن معکوس توانهاش رو برعکس می کنیم که باید عدد رو پی در پی به توانهای 10 تقسیم کنیم و خارج قسمت همون رقم مورد نظر ماست و باقیمانده عدد جدیده که باید 10 به توان یک عدد کمتر از حالت قبلی بشه
m=0
r=r-1
s=r
شروع حلقه
k برابر است با خارج قسمت تقسیم n بر «10 به توان s » و b برابر با باقیمانده آن (( k=res(n/(10^s و (( b=mod(n/(10^s
m را با k ضربدر «10 به توان r-s » جمع کن و جوابش را در خود m بگذار ((m=m+k*(10^(r-s
به دلیل اینکه دوباره می خواهیم باقیمانده تقسیم را تقسیم بر توان ده بکنیم n را برابر b قرار می دهیم n=b
از s یکی کم می کنیم تا دفعه بعدی توان کمتری بدهد s=s-1
اگر s از صفر کمتر شد از حلقه خارج شو if s<0 then exit loop
پایان حلقه
اگر m=n در نتیجه عدد ما متقارن است

تجزیه به عوامل اول
در برنامه زیر هر جا یکی از عوامل اول پیدا شد چاپ می شود
برای تک تک اعدادی که از دو شروع می شود بررسی می کنیم آیا n بر آن بخش پذیر است؟
به اولین عددی که مواجه شدیم که بخش پذیر بود ابتدا آن را چاپ می کنیم
سپس خارج قسمت تقسیم n را به آن عدد محاسبه می کنیم
و از این به بعد برای آن خارج قسمت بررسی می کنیم که مقسوم علیه دارد یا نه
یعنی برای اون خارج قسمت دوباره از عدد 2 شروع به چک کردن می کنیم
و این کار ادامه پیدا می کند تا برسیم به n/2 زیرا معلوم است که هیچ عددی بر عددی بیشتر از نصف خودش قابل تقسیم نیست
البته روش بهینه تر وجود دارد ولی پیچیده می شود
متغیر n به عنون ورودی دریافت می شود وبعدا هم یک سری عملیات روی آن انجام می شود
متغیر i به عنوان شمارنده تعیین شود
متغیری به نام b تعریف می کنیم که قرار است باقیمانده تقسیم در آن ذخیره شود
i=2
شروع حلقه
(b=mod(n/i یعنی باقیمانده بدست بیاید
شروع شرط: اگر b برابر صفر بود این کار را بکن: if b=0 then
الف. i را بعنوان یکی از عوامل چاپ کن print i
ب. n را برابر با خارج قسمت تقسیم قرار بده (n=res(n/i
ج. i را دوباره مساوی 2 قرار بده i=2
در غیر این صورت (یعنی b برابر با صفر نبود) else
یکی به i اضافه کن i=i+1
پایان شرط
شروع شرط اگر i از n/2 بیشتر شد: if i>n/2 then
الف. ابتدا n را به عنوان یکی از عوامل چاپ کن print n
ب. سپس از حلقه خارج شو exit loop
پایان شرط
پایان حلقه

rahnema1
11-10-2013, 06:16
بزرگترین مقسوم علیه مشترک بین دو عدد یعنی بزرگترین عددی که اون دو عدد بر اون بخشپذیر باشند
یک روش راحت اینه که بین دو عدد مورد نظر کوچکترینشو انتخاب کنیم و تقسیم بر 2 کنیم و از اونجا تا عدد 2 به صورت کاهشی شروع کنیم بررسی کنیم آیا دوعدد بر اون بخشپذیرند به اولین موردی که برخوردیم همون رو به عنوان ب م م انتخاب می کنیم
ک م م یعنی عددی که بر دو عدد بخشپذیر باشه اما در عین حال بین تمام اعدادی که بر اون دو تا بخشپذیرند کوچکترینشون باشه
تو اینجا بین دو عدد کوچکترینشون رو پیدا می کنیم و ضرب در دو می کنیم و از اونجا شروع می کنیم بصورت افزایشی بررسی می کنیم که آیا اون عدد بر هر دو عدد بخشپذیره یانه به اولین مورد که برخوردیم همون رو بعنوان ک م م در نظر می گیریم

nafe-bandar
11-10-2013, 12:00
rahnema1 عزیز ، خیلی خیلی ممنون بابت راهنمایی و در پایان پاسخ...

این عدد متقارن خیلی رو اعصابه!
2تا سوال پیش اومد بخاطر همین نتونستم فلوچارت رو تست کنم... یعنی نمی شد
m=b دقیقا یعنی چی؟؟ چرا ؟؟ دقیق تر بپرسم، b رو می ریزیم توی m یا، m رو می ریزیم توی b ???


بازم تشکر

rahnema1
11-10-2013, 17:32
n=b یعنی b را بریز توی n . باید فرمولها رو از چپ به راست بخونی
ضمنا توی خط آخر که نوشتم اگر m برابر n شد منظورم همون n اولیه که ابتدای برنامه وارد شده نه اون n که بعدا تغییر کرده
برای اجتناب از سردرگمی پیشنهاد می کنم بعد از اینکه متغیر n وارد شد یک متغیر دیگه درست کنی به نام n1 که همون مقدار n رو داشته باشه
بعدا در آخر برنامه بررسی کنی که آیا m برابر با n1 شده یا نه

rahnema1
11-10-2013, 18:02
پیشنهاد می کنم برای تهیه فلوچارت از نرم افزار scratch استفاده کنید توی اون می تونید قطعات برنامه رو بصورت پازل کنار هم بچینید و بعد هم
اون رو تست و اجرا کنید
این هم لینک دانلود ورژن 1.4:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
تصویر زیر هم برنامه بررسی متقارن بودن یک عدده که توی نرم افزار تهیه کردم
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

nafe-bandar
02-11-2013, 00:35
سلام
دیگه وارد کدزنی شدیم چند روزه. گفتم تاپیک اضافی واسه سوالام ایجاد نکنم بهتره...

واسه اینکه راه بیفتم اگه میشه کمک کنید این 3تا برنامه رو بنویسم ( به زبان C):



برنامه ای بنویسید که عددی صحیح مانند n را دریافت کرده و مشخص کند که آیا اول است یا خیر؟
برنامه ای بنویسید که n عدد اول دنباله فیبوناچی را محاسبه و چاپ کند.

برنامه ای بنویسید که دو عدد صحیح m و n را دریافت کرده ب.م.م و ک.م.م آن ها را محاسبه و چاپ کند.




راستی یه مشکل هست، من برنامه ویژوال رو نصب کردم اما نمی دونم چرا ساده ترین کد رو هم که می زنم ارور میده؟؟!!

ممنون

Life24
02-11-2013, 00:41
سلام
دیگه وارد کدزنی شدیم چند روزه. گفتم تاپیک اضافی واسه سوالام ایجاد نکنم بهتره...

واسه اینکه راه بیفتم اگه میشه کمک کنید این 3تا برنامه رو بنویسم ( به زبان C):



برنامه ای بنویسید که عددی صحیح مانند n را دریافت کرده و مشخص کند که آیا اول است یا خیر؟
برنامه ای بنویسید که n عدد اول دنباله فیبوناچی را محاسبه و چاپ کند.

برنامه ای بنویسید که دو عدد صحیح m و n را دریافت کرده ب.م.م و ک.م.م آن ها را محاسبه و چاپ کند.




راستی یه مشکل هست، من برنامه ویژوال رو نصب کردم اما نمی دونم چرا ساده ترین کد رو هم که می زنم ارور میده؟؟!!

ممنون

درود
دوست عزیز: لطفا عکس یا ارور با متن برنامه را برای عیب یابی بهتر و کمک سریعتر به شما بگذارید.