الگوریتم و فلوچارت
Download
Report
Transcript الگوریتم و فلوچارت
مبانی کامپیوترو
برنامه نویس ی
فصل اول
ارائه دهنده :مهندس عبداللهی
اجزاء تشکيل دهنده کامپيوتر عبارتند از :
سخت افزار
نرم افزار
سخت افزار
Out put
process
خروجي
پردازش
Input
ورودي
ً
كامپيوترهاي امروزي معموال از قطعات زير تشكيل ميشوند:
دستگاههاي ورودي
حافظههاي جانبي
حافظههاي اصلي
ي
واحد پردازشگر مركز
دستگاههاي خروجي
نرم افزار
نرمافزار يكي از بخشهاي اساس ي كامپيوتر به شمار ميآيد ،كه در
واقع سختافزار را بكار ميگيرد.
بعبارت ديگر رابط بين كاربر و سختافزار را نرمافزار مينامند .نرمافزار در
حقيقت روح و جان يك كامپيوتر است ،كه به سختافزار هويت ميبخشد.
نرم افزار سيستم عامل
سيستم عامل ) (OS: Operating Systemمشهورترين نوع
نرمافزارهاي سيستمي ميباشد .كه مديريت منابع سيستمي را بر
عهده دارد .سيستمعامل ،همچنين ارتباط بين كاربر و اجزاء
سختافزاري و نرمافزاري ديگر را برقرار ميكند.
زبانهاي برنامهنويس ي
نرمافزارها توسط زبانهاي برنامهنويس ي نوشته ميشوند .زبانهاي
برنامهنويس ي ،يك سيستم ارتباطي هستند كه توسط آنها ميتوان
دستورات الزم را به ماشين انتقال داد.
هرزبان برنامهنويس ي به مجموعهأي از عاليم ،قواعد و دستورالعملها
گفته ميشود كه امكان ارتباط با كامپيوتر را جهت بيان كاري يا حل
مسئلهاي فراهم ميكند.
در حالت كلي زبانهاي برنامهنويس ي را به سه دسته زير تقسيمبندي ميكنند:
زبانهاي سطح پايين
زبانهاي سطح باال
زبانهاي سطح خیلی باال
LOW LEVEL LANGUAGE
HIGH LEVEL LANGUAGE
VERY HIGH LEVEL LANGUAGE
كامپايلر برنامه نوشته در يك زبان سطح باال را به برنامه مقصد تبديل ميكند.
Object
program
Compiler
Source
program
الگوریتم و فلوچارت
تعریف الگوریتم
هر دستورالعملی که مراحل انجام کاری را با
زبانی دقیق و با جزئیات کافی بیان نماید
بطوریکه ترتیب مراحل و شرط خاتمه
عملیات در آن کامال“ مشخص شده باشد را
الگوریتم گویند.
ادامه تعریف الگوریتم
منظور از زبان دقیق :آن است که الگوریتم دقیقا“ به
همان صورتیکه مورد نظر نویسنده است اجرا گردد.
منظور از جزئیات کافی ،آن است که در طول اجرای
الگوریتم عملیات ناشناخته پیش نیامده و باعث انحراف از
مسیر و هدف اصلی نگردد.
منظور از ترتیب مراحل ،آن است که مراحل اجرای
الگوریتم قدم به قدم و با رعایت تقدم و تأ خر مشخص شده
باشد.
منظور از شرط خاتمه ،پایان پذیر بودن الگوریتم می
باشد و بهر حال الگوریتم باید در زمانی دلخواه و تحت شرایط یا
شرایط داده شده خاتمه پذیرد.
الگوريتم مجموعهاي از دستورالعمل ها ،براي حل مسئله ميباشد كه
شرايط زير را بايد دارا باشد:
• دقيق باشد
• جزئيات كامل حل مسئله را داشته باشد.
•پايانپذير باشد.
مراحل تهیه الگوریتم
برای تهیه یک الگوریتم خوب و کارآمد باید مراحل خاص ی اجرا شوند:
-1تعریف دقیق مسئله:
باید مسئله را تجزیه و تحلیل کرده تا کوچکترین
ابهامی در فهم آن وجود نداشته باشد.
-2تعیین عوامل اصلی(متغیرهای) مورد نیاز
-3تعیین ورودی و خروجی مسئله ( :داده ها و
اطالعات)
-4بررسی راه حل های مختلف مسئله
-5انتخاب یک راه حل مناسب
-6اشکال زدایی
week1
طراحی الگوریتم -مهندس محمد اکبرپور
تعريف الگوريتم
الگوریتم :به زبان ساده ميتوان گفت الگوريتم مجموعهاي از دستورالعملهاست كه اگر به ترتيب دنبال شوند،
موجب حل مسأله ميگردند.
طراحی الگوریتم :منظور از طراحي الگوريتم كشف الگوريتم ،ايجاد ،تعيين اعتبار ،آناليز و ارزيابي الگوريتم
براي يك مسأله ميباشد.
آناليز الگوریتم :منظور از آناليز الگوريتم اين است كه پارامترهاي زمان محاسبه و حافظه مورد نياز براي محاسبه
الگوريتم بدست آيد تا بتوان ،الگوريتمهاي مختلف را براي يك مسأله خاص با يكديگر مقايسه كرد .
week1
طراحی الگوریتم -مهندس محمد
اکبرپور الگوريتم
تشريح
چگونگي
الگوريتمها را به روشهاي مختلف ميتوان تشريح نمود ،كه بر اساس كوچك و يا بزرگ و پيچيده
بودن الگوريتم ،روشهاي تشريح زير را ميتوان نام برد:
-1تشريح الگوريتم توسط يك زبان طبيعي (فارس ي يا انگليس ي) براي الگوريتمهاي آسان و كوچك.
به عنوان مثال عبارتي مانند " nرا بگير و در cضرب كن”.
-2نمايش گرافيكي الگوريتم توسط فلوچارت (براي الگوريتمهاي آسان و كوچك)
-3نمايش با استفاده از شبه كد ( )Pseudo Codeكه شباهت زيادي به زبانهاي Cو پاسكال دارد.
week1
طراحی الگوریتم -مهندس محمد اکبرپور
مراحل اوليه حل يك مسأله
-1تعريف و بيان مسأله و فهم كامل آن
-2تشخيص و تدوين يك مدل براي حل مسأله فوق (بررس ي كليه روشهاي حل مسأله)
-3طراحي الگوريتم بر اساس مدل انتخاب شده
-4بررس ي و ارزيابي صحت الگوريتم
-5تحليل الگوريتم و ارزيابي پيچيدگي آن
-6پيادهسازي الگوريتم با استفاده از زبانهاي برنامهسازي
-7تست برنامه
-8مستندسازي
مثال :الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع
دو عدد را محاسبه و چاپ نمايد.
خروجيها
مجموع دو عدد
انجام محاسبات
جمع دو عدد
وروديها
a , b
0ـ شروع
1ـ b ,aرا بخوان.
2ـ مجموع b , aرا محاسبه و در sumقرار بده.
3ـ sumرا در خروجي چاپ كن
4ـ پايان
مثال :الگوريتمي بنويسيد كه سه عدد از ورودي دريافت كرده مجموع و ميانگين
سه عدد را محاسبه و چاپ كند.
خروجيها
چاپ مجموع
چاپ ميانگين
انجام محاسبات
محاسبه مجموع
محاسبه ميانگين
وروديها
a
b
c
0ـ شروع
1ـ سه عدد از ورودي بخوان
2ـ مجموع سه عدد را محاسبه و در sumقرار بده.
3ـ sumرا بر سه تقسيم كرده،در aveقرار بده.
4ـ ave , sumرا در خروجي چاپ كن.
5ـ پايان.
فلوچارت
بیان تصویری الگوریتم
مراحل انجام کار با اشکال هندسی
نشان داده می شوند.
مراحل انجام کار توسط خطوط به
هم وصل می گردند.
شکل
مثال
شرح
start
برای نشان دادن شروع و خاتمه
عملیات
stop
محاسبات و مقداردهی
c←a+b
d← i
ورود اطالعات
خروج بر روی صفحه نمایش
A,B
خروج اطالعات بر روی کاغذ
”A,B,”100
سئوال ،تصمیم گیری و شرط
های دلخواه
ورودی
خروجی
?
خروجی
خروجی
معموال درك يك الگوريتم با شكل راحتر از نوشتن آن بصورت متن
ميباشد .لذا الگوريتم را با فلوچارت( )flowchartنمايش ميدهند.
فلوچارت از شكلهاي زير تشكيل ميشود.
عالمتهاي شروع و پايان :كه معموال از يك بيض ي استفاده ميكنند:
End
Begi
n
عالمتهاي ورودي و خروجي :كه معموال از متوازياالضالع استفاده ميشود:
چاپ کردن
write
خواندن یا
Read
عالمتهاي محاسباتي و جايگزيني :براي نمايش دستورات جايگزيني
و محاسباتي از مستطيل استفاده ميكنند:
جایگزین یا محاسبات
•عالمت شرط :براي نمايش شرط از لوزي استفاده ميشود.
•عالمت اتصال :براي اتصال شكلهاي مختلف بهم از فلشهاي
جهتدار استفاده ميكنند.
مثال: 1
فلوچارتی رسم کنید که دو عدد را خوانده و حاصلضرب آنها را نمایش دهد.
شروع
A,B
z←A*B
z
پایان
مثال:2
فلوچارتی رسم کنید که شعاع یک دایره را خوانده ،مساحت و محیط آنرا نمایش
دهد.
شروع
R
A←3.14*R²
P←2*R*3.14
A,P
پایان
• فلوچارت مجموع سه عدد
Begin
Read(a,b,c)
Sum
a+b+c
Ave
sum/3
Write(sum,ave)
End
مثال :فلوچارتی رسم نمائيد كه دو عدد از ورودي دريافت كرده سپس
محتويات دو عدد را با هم جابجا نمايد.
براي حل اين مسئله b , aرا دو متغير كه در آنها دو عدد خوانده شده،
قرار ميگيرند در نظر ميگيريم .سپس با استفاده از يك متغير كمكي
محتويات اين دو عدد را جابجا ميكنيم :
temp
a
12
b
a
b
15
12
15
temp
12
temp
a
b
a
b
15
15
15
12
12
12
temp
temp
:فلوچارت مسئله باال بصورت زير خواهد بود
Begin
Read(a,b)
temp
a
a
b
b
temp
Write(a,b)
End
دستورالعملهاي شرطي
ً
در حل بسياري از مسائل يا تقريبا تمام مسائل نياز به استفاده از شروط
جزء ،نيازهاي اساس ي محسوب ميشود .همانطور كه ما خودمان در
زندگي روزمره با اين شرطها سركار داريم .بطور مثال اگر هوا ابري
باشد ممكن است چنين سخن بگوييم:
•
اگر هوا باراني باشد سپس چتري برميدارم.
در غير اينصورت چتر برنميدارم.
در حالت كلي شرط را بصورت زير نمايش ميدهند:
yesعمل
then
شرط If
NO
عمل بعدي
الگوریتم های حلقوی
تعریف اول :مراحلی از الگوریتم که چندین بار اجرای آنها
تکرار می گردد تشکیل یک حلقه ) (LOOPرا می دهند.
برای ساختن یک حلقه از یک متغیر کمکی استفاده می گردد،
این متغیر را قبل از شروع حلقه با یک مقدار اولیه آماده می
سازیم و سپس معموال“ در انتهای حلقه و قبل از بازگشت به
ابتدای حلقه مقداری را به آن اضافه کرده و تحت یک شرائط خاص
به مراحل قبل پرش می نماییم.
تعریف دوم :مقداری که قبل از شروع حلقه به متغیر
حلقه داده می شود را مقدار اولیه یا شرط اولیه گویند.
تعریف سوم :مقداری که پس از یکبار اجرای مراحل
حلقه به متغیر حلقه اضافه می شود را مقدار اضافه
شونده می نامند.
مثال :فلوچارتی رسم کنید که یک عدد بزرگتر از صفر را خوانده سپس
به تعداد آن عدد ,اعداد دیگری را خوانده مجموع و میانگین آنها را نمایش
دهد.
Nعدد خوانده شده
Cشمارنده
Sمجموع
Aاعداد
شروع
N
C←0
S←0
Y
S, S / N
C=N
N
پایان
SSA
C C 1
A
مثال :الگوریتم برنامه ای را بنویسید که 10عدد را گرفته و تعیین کند
کدام زوج و کدام فرد است.
شروع
C←0
p
k ← p-INT(p/2)*2
K=0
n
”P, “odd
C ← C+1
y
C< 10
n
پایان
y
”P, “even
مثال :
الگوریتم برنامه ای را بنویسید که یک عدد مثبت را خوانده فاکتوریل
آن را نمایش دهد.
فاکتوریل یک عدد یعنی حاصل ضرب اعداد 1تا آن
عدد
فاکتوریل عدد صفر برابر یک می باشد.
ادامه مثال
شمارندهA
شروع
N
FACT ← 1
A ←1
Y
A>N
N
FACT ← FACT * A
A ← A+ 1
FACT
پایان
مثــال :فلوچااارتي رساام نماكيااد كااه عااددي را از ورودي دريافاات كاارده ،فاارد يااا زوج
بودن آن را تشخيص دهد.
Begin
)Read(a
R
a mod 2
yes
)’Write(‘even
if R=0 then
No
)’Write(‘odd
End
مثال :فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد
را پيدا كرده در خروجي چاپ نمايد.
Begi
n
)Read(a,b
a
b
max
yes
max
if b>max
No
)Write(max
End
حلقهها
در حل بسياري از مسائل با عملياتي روبرو ميشويم ،كه نياز به تكرار
دارند و عمل تكرار آنها به تعداد مشخص ي انجام ميگيرد .فرض كنيد،
بخواهيم ميانگين 100عدد را محاسبه كنيم ،در اينصورت منطقي بنظر
نميرسد كه 100متغير مختلف را از ورودي دريافت كنيم سپس آنها را
جمع كنيم.
حلقهها ی تکرار (:شکل کلی)
No
شرط يا شروط If
yes
محموعه دستورالعملها و
جاگزينها
• انواع حلقه ها
• حلقه های با تکرار مشخص
• حلقه های با تکرار نا مشخص
• حلقه های با تکرار مشخص
در اين نوع حلقهها تعداد تكرار مشخص ميباشد اين حلقه از اجزاء زير
تشكيل ميشود:
1ـ انديس حلقه
2ـ مقدار اوليه براي انديس حلقه
-3مقدار افزاينده براي انديس حلقه (معموال يك واحد در هر مرحله)
4ـ مقدار نهايي (تعداد تكرا حلقه)
5ـ شرطي براي كنترل تعداد تكرار حلقه
ً
اين حلقهها را غالبا با فلوچارت بصورت زير نمايش ميدهند:
1
اتمام كار حلقه
No
i
if i<=n
yes
مجموعه دستورات حلقه
i+1
i
مثال :فلوچارتي رسم نمائيد كه عدد nرا از ورودي دريافت كرده،
مجموع اعداد از يك تا nرا محاسبه كند.
n
مقدار نهايي
i
انديس حلقه
Begi
n
Read(n)
I
sum
1
0
if I<=n
حلقه
No
Write(sum)
yes
End
sum
I
sum+I
I+1
نمونه اجراي فلوچارت باال بصورت زير است:
خروجي
15
sum
I
0
1
1
3
6
10
15
N
5
2
3
4
5
6
1
2
3
4
5
6
7
مثال :فلوچارتي رسم كنيد كه nعدد از ورودي دريافت كرده،
بزرگترين مقدار از بين nعدد را پيدا كرده در خروجي چاپ نمايد.
انديس حلقه
i
مقدار نهايي
بزرگترين مقدار
n
Max
Begin
Read(n)
I
max
2
a
No
if i<=n then
write(max)
yes
End
حلقه
Read(a)
yes
if a > max
No
i
i+1
max
a
حلقههاي تودرتو
الگوريتمهايي كه تا حال بكار برديم ،فقط شامل يك حلقه بودند.
در صورتي كه در بسياري از مسائل ممكن است نياز به استفاده از
چندحلقه در داخل هم باشيم.
در اين نوع حلقهها بايد دقت بيشتري به خرج دهيم ،تا مشكلي پيش
در
نيايد .اگر از حلقههاي نوع اول بصورت تودرتو استفاده كنيم
اينصورت براي هر حلقه شرط نهايي و انديس اوليه
جداگانه بايد تعريف كنيم .
در حلقههاي تودرتو به ازاي يكبار تكرار حلقه اوليه ،حلقه داخلي به اندازه
مقدار نهايي خود تكرار ميشود .در كل اگر حلقه اوليه nبار تكرار شود و
حلقه داخلي mبار ،در اينصورت كل حلقه :
n m
بار تكرار خواهد شد.
فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد:
1
اتمام كار حلقه هاي تو در تو
i
.
.
.
No
A
if i<=n then
yes
1
مجموعه دستورات و جايگزيني
ها
i
i+1
A
No
j
if j<=m then
yes
مجموعه دستورات و جايگزيني
ها
j+1
j
حلقه
week1
طراحی الگوریتم -رو
اکبرپورحل مسأله
مهندسشمحمدهاي
هدف اين درس مطالعه تكنيكهاي مختلفي است كه بهينه بودن آنها تا كنون به اثبات
رسيده است و ميتوان از آنها براي حل مساكل مختلف استفاده نمود.
با مسلط شدن بر اين استراتژيهاي طراحي ميتوان به راحتي يكي از
الگوريتمها و روشهاي معروف و جديد را براي مسأله خود كشف نمود.
از جمله تكنيكهاي حل مساكل ميتوان به موارد زير اشاره كرد كه در هفتههاي بعدي به طور كامل
تشريح خواهند شد:
.1روش تقسيم و حل ()Divide & Conquer
.2روش حريصانه ()Greedy
.3روش برنامهنويس ي پويا ()Dynamic Programming
.4روش بازگشت به عقب ()Back Tracking
.5روش شاخه و حد ()Branch & Bound
☺
week1
طراحی الگوریتم -مهندس محمد اکبرپور
چگونه ميتوان در الگوريتم ،حلقهي بينهايت را نمايش داد؟
روش اول
repeat
{
......
......
......
}
)until (false
روش دوم
)while (1
{
......
......
......
}
روش سوم
) ; ; ( for
{
......
......
......
}
طراحی الگوریتم -مهندس محمد اکبرپور
week1
selectionبرای مسئله مرتب سازی
الگوریتم sort
این بخش برای پیدا کردن عنصر
مینیمم لیست نامرتب می باشد.
)Alg selection-sort (a , n
{
for i = 1 to n do
{
; min = i
for k = i + 1 to n do
; if (a[k] < a[min]) then min = k
;) ] swap ( a [ i ] , a [ min
}
}
در هر مرحله که الگوریتم اجرا می شود عنصر مینیمم لیست مرتب نشده مشخص شده
و به ابتدای لیست منتقل می شود .
بنابراین پس از nجابجایی عنصر مینیمم لیست مرتب خواهد شد.
ليست زير را به روشweek1
انتخابي مرتب كنيد.
67 – 33 – 21 – 84 – 49 – 50 – 75
طراحی الگوریتم -مهندس محمد اکبرپور
حل:
ابتدا ليست مورد نظر را داخل يك آرايه قرار ميدهيم.
سپس عنصر اول آرايه را با بقيه عناصر بعد از آن مقايسه كرده و
كوچكترين عنصر را يافته و جاي آن را با عنصر اولي عوض ميكنيم.
پس ليست مورد نظر به صورت زير تغيير ميكند:
7
6
5
4
3
2
1
7
6
5
4
3
2
1
75
50
49
84
67
33
21
75
50
49
84
21
33
67
)(b
)(a
اکبرپور
با محمد
مهندس
الگوریتم -
جاي طراحی
week1
كمترين عنصر در آرايه عوض ميكنيم
جاي
دوم را
عنصر
در مرحله دوم
كه در اينجا هر دو مورد 33است (يعني جاي 33با خودش عوض ميشود:).
7
6
5
4
3
2
1
75
50
49
84
67
33
21
)(c
در اين مرحله دو عنصر 21و 33در جاي خود fixشدهاند و از ليست نامرتب خارج شدهاند.
و همين طور پيش ميرويم تا آرايه مرتب شود:
7
6
5
4
3
2
1
75
50
67
84
49
33
21
7
6
5
4
3
2
1
75
84
67
50
49
33
21
)(d
)(e
week1
طراحی الگوریتم -مهندس محمد اکبرپور
7
6
5
4
3
2
1
75
84
67
50
49
33
21
)(f
در اين مرجله فقط دو عنصر 75و 84در ليست نامرتب باقي ماندهاند .آنها را نيز مرتب مي كنيم:
7
6
5
4
3
2
1
84
75
67
50
49
33
21
)(g
week1
طراحی الگوریتم -مهندس محمد اکبرپور
در پايان پس از تعداد nجابجايي ،ليست مرتب شده به روش انتخابي به صورت زير خواهد بود:
7
6
5
4
3
2
1
84
75
67
50
49
33
21
)(h
تعداد دقيق مقايسهها و همچنين تعداد دقيق تعويضها را براي مثال فوق بدست آوريد.
آيا ميتوان در اين الگوريتم ،تعداد مقايسهها و تعداد تعويضها را كاهش داد؟
week1
طراحی الگوریتم -مهندس محمد اکبرپور
پيچيدگيهاي زمان و فضا
-1پيچيدگي فضا (:)Space Complexity
ميزان حافظه مورد نياز از اجرا تا تكميل الگوريتم ميباشد.
-2پيچيدگي زمان (:)Time Complexity
ميزان زمان مورد نياز از اجرا تا تكميل الگوريتم ميباشد.
پيچيدگي فضاي مورد نياز الگوريتم (): )S(n
به حاصل جمع فضاي مورد نياز متغيرها ،آرايه ها ،پشته ها و كليه ساختمان دادههاي مورد نياز و
همچنين فضاي ذخيره كد برنامه در حافظه ،پيچيدگي فضاي الگوريتم گفته ميشود ،و
بايد بر حسب ( nتعداد وروديها) سنجيده شود.
اگر پيچيدگي فضاي يك الگوريتم به nوابسته نباشد ،پيچيدگي آن را ثابت فرض كرده و از مرتبه
) O(1ميدانيم.
به عنوان مثال پيچيدگي فضاي تكه كد زير ) O(1ميباشد:
; for ( i = 1 ; i < = 20 ; i + + ) a + +
week1
طراحی الگوریتم -مهندس محمد اکبرپور
پیچیدگي زمان اجراي الگوریتم ())T(n
اين زمان براي برنامهاي مانند Pعبارت است از حاصل جمع زمان كامپايل و زمان اجراي برنامه ،كه
ما زمان كامپايل را ثابت فرض كرده و بيشتر روي زمان اجراي برنامه تأكيد داريم و آن را )T(n
نمايش ميدهيم:
= TPزمان كامپايل +زمان بار شدن حافظ +زمان انتظار زمانبندي سيستمعامل +زمان اجرا
= )T(nزمان اجراي الگوريتم= تعداد دستورات × CPUزمان اجراي يك دستور توسط
week1
طراحی الگوریتم -مهندس محمد اکبرپور
پيچيدگي الگوريتمهاي غيربازگشتي
غير بازگشتي به توابعي ميگويند كه در آن ،تابع خودش را فراخواني نكرده باشد
و فقط شامل حلقهها ( )while ، for, repeat-untilو دستورات غير بازگشتي باشد.
براي محاسبه پيچيدگي الگوريتمهاي غيربازگشتي كافي است ،تعداد تكرار دستورات
داخليترين حلقه مشخص شود.
نکته :اگر در الگوريتمهاي غيربازگشتي تعداد تكرار دستورات حلقه تكرار به nبستگي نداشته باشد،
)( T(nپيچيدگي زمان) مقداري ثابت خواهد بود و به صورت زير نمايش ميدهيم:
)O(1
)T(n
week1
طراحی الگوریتم -مهندس محمد اکبرپور
پيچيدگي تكه كد زير را بدست آوريد:
)for (i = 1 ; i <= n ; i ++
)for (j = i; j <= min ( i , k ) ; j ++
;a++
)1
)3
)4