Presentation is loading. Please wait.

Presentation is loading. Please wait.

تهیه کنندگان مهری بابائی،گیتا جوادی رضا امید ملایری ،ناصر بهمدی

Similar presentations


Presentation on theme: "تهیه کنندگان مهری بابائی،گیتا جوادی رضا امید ملایری ،ناصر بهمدی"— Presentation transcript:

1 تهیه کنندگان مهری بابائی،گیتا جوادی رضا امید ملایری ،ناصر بهمدی
Queues صف ها تهیه کنندگان مهری بابائی،گیتا جوادی رضا امید ملایری ،ناصر بهمدی

2 صف ها Queues صف ساختمان داده یست که مانند صفی از مردم که منتظر دریافت خدماتند، مدل شده.همچون پشته ها، صف ها یکی از ساده ترین انواع ساختمان داده ها می باشند. این فصل ویژگی های صف ها، تحلیل چگونگی بکار بستن آنها، و امتحان کردن پیاده سازی های متفاوت را بسط وتوسعه میدهد.

3 صف ها Queues تعاریف کاربردها
صف لیستی است که تمام عناصر اضافه شونده از یک طرف به لیست اضافه شوند و تمام عناصر حذف شونده از طرف دیگر حذف شوند. اولین عنصر یک صف که آماده ی سرویس گیری است جلوی صف نامیده می شود. آخرین عنصر صف، یعنی، آخرین عنصر اضافه شده، عقب(یا دم) صف نامیده می شود. کاربردها کاربردهای صف، تقریبا تمام کاربردهای پشته، یا حتی معمول تر ازکاربردهای پشته، است.

4 صف ها Queues عملیات صف باید صف هایی را پیاده سازی کنیم که ورودی های آنها نوع عمومی دارند، که به آنها ورودی صف می گوییم. اولین عملی که هنگام کاربا هر صفی باید انجام دهیم این است که از یک سازنده برای مقداردهی اولیه استفاده کنیم تا در کاربردهای بعدی از آن استفاده کنیم:

5 صف ها Queues تعریف کلاس C++ class Queue { public: Queue( );
bool empty( ) const; Error_code append(const Queue_entry &x); Error_code serve( ); Error_code retrieve(Queue_entry &x) const; // Additional members will represent queue data }; سه عملیات برای صف ها بسیار مفید است. اولی clear است، که یک صف را که قبلا ساخته شده را می گیرد و آن را خالی می کند. دومی تابع size است، که تعداد عناصر موجود در صف را بر می گرداند. سومی تابع serve_and_retrieve است، که نتایج serve و retrieve را ترکیب می کند. کلاس های مشتق شده اکنون رابطه بین کلاس Queue و کلاس مشتق شده Extended_queue را با یک دیاگرام سلسله مراتبی نشان می دهیم یک پیکان از کلاس مشتق شده به کلاس اصلی اشاره می کند

6 صف ها Queues class Extended_queue: public Queue { public:
bool full( ) const; int size( ) const; void clear( ); Error_code serve_and_retrieve(Queue_entry &item); }; کلمه کلیدی public در اولین خط تعریف کلاس نشان می دهد که هر عضو ارثی از یک Extended_queue در حقیقت همان قابلیت دید(visibility) (برای کاربر) را دارد که به عنوان عضوی از Queue دارد.

7 روش پیاده سازی صف ها Queues
مدل فیزیکی : دراین روش یک آرایه ی خطی با ابتدایی همیشه در خانه ی اول داریم یک ورودی میتواند همانگونه که به پشته ها ورودی را می افزاییم و براحتی با افزایش شمارنده ی انتهای صف افزوده شود. و هرگاه ابتدا حذف شود همه عناصر در آرایه بالا میروند.بطور کلی این یک روش نامناسب در کامپیوتر است. یک آرایه ی خطی با دو اندیسهای ابتدا و انتهایی که همواره افزایش میابند. میدهیم.برای حذف یک عنصر آن را از محل در ابتدای صف برمیداریم و ابتدا را یکی افزایش میدهیم و برای افزودن عنصر به صف به سادگی مقدار انتها را یکی افزایش میدهیم این این روش مناسبیست اگر بشود تمام صف را در یک آن خالی نمود. یک آرایه حلقوی شبیه ماربرای نمایش صف ها داریم .برای پیاده سازی باید محلهای آرایه را شماره گذاری شده از 0 تا max-1 تصورکنیم،که max مقدار نهایی عناصر در آرایه ی حلقوی است . جابجایی اندیس ها مانند محاسبات مدوله است:وقتی ما یک ایندکس را بعدmax-1 افزایش میدهیم دوباره از 0 شروع میکنیم. پیاده سازی و اجرای خطی: پیاده سازی آرایه های حلقوی:

8 صف ها Queues حالات مرزی حالات مرزی نشاندهنده ی اینست که یک صف خالی یا پر است. است.اگر دقیقا یک عنصر در صف باشد ابتدا و انتها برابرند.وقتی این یک عنصر حذف شود، ابتدای صف یکی افزایش می یابد،پس یک صف نشان داده میشود وقتی که انتهای صف یکی قبل از ابتداست. وقتی که صف پر است انتها یکی قبل از ابتدا قرار میگیرد.پس ما یک مشکل دیگر داریم: اندیسهای ابتدا و انتها در صف خالی و پر در یک وضعیت مکانی قرار دارند. راهی برای تشخیص اینکه صف پر یا خالیست تنها با نگاه کردن به آرایه ها وجود ندارد.

9 صف ها Queues آرایه های خطی در C++ راه حل های ممکن برای حل این مشکل:
یک آرایه حلقوی با اندیسهای ابتدا و انتهایی و یک flag برای نشان دادن خالی یا پر بودن در نظر بگیرید. یک آرایه حلقوی با اندیسهای ابتدا و انتها و یک متغیر صحیح که عناصر رامیشمارد درنظر بگیرید. یک آرایه حلقوی با اندیسهای ابتدا و انتهایی که برای نشان دادن خالی بودن مقادیر خاصی میگیرنددرنظر بگیرید. آرایه های خطی در C++ در C++ ما میتوانیم اندیس I یک آرایه حلقوی را با استفاده از اپراتور سه تایی ?: افزایش دهیم و بنویسیم: i = ((i + 1) == max) ? 0 : (i + 1); این استفاده ی اپراتور سه تایی ?: هم ارز با کد زیر است: if ((i + 1) == max) i = 0; else i = i + 1; همچنین ما میتوانیم از اپراتور باقیمانده ای استفاده کنیم وبنویسیم: i = (i + 1)%max (شما باید چک کنید که نتیجه ی عبارت اخیر همواره بین 0 و max-1 باشد.

10 پیاده سازی حلقوی صف ها Queues در c++
پیاده سازی در یک آرایه ی حلقوی که از یک شمارنده برای شمارش عناصر ورودی در صف استفاده می کند صف را ذخیره شده در یک آرایه با اندیس از 0 تا maxqueue-1 که ورودی هایی از نوع عنصر- صف دارند می گیریم. تعریف کلاس برای یک صف به صورت زیر است که به اعضای داده ای صف رویت Protected را به جای Private را میدهیم const int maxqueue = 10; class Queue { public: Queue( ); bool empty( ) const; Error_code serve( ); Error_code append(const Queue_entry &item); Error_code retrieve(Queue_entry &item) const; protected: int count; int front, rear; Queue_entry entry[maxqueue]; };

11 صف ها Queues توابع عضو از کلاس های مشتق شده اجازه دارند به عضوهای Protected کلاس اصلی دسترسی داشته باشند. بنابراین وقتی ما متدها را برای کلاسهای مشتق صف گسترده مینویسیم کد ما قادر به استفاده اعضای داده ای کلاس صف خواهد بو د. متدها برای اضافه برای اضافه و حذف کردن از یک صف گسترده بحث قبلی مارادنبال میکنند.فقط موارد زیر را در نظر می گیریم: ابتداصف خالی تعریف میشودQueue :: Queue( ) اگر صف خالی باشد مقدار صحیح و در غیر این صورت غلط را باز میگرداند count = 0; bool Queue :: empty( ) const }return count == 0; { در صورتی که صف پر باشد پیغام خطای سرریز میدهد و صف بدون تغییر میماند Error_code Queue :: append(const Queue_entry &item) if (count >= maxqueue) return overflow; ابتدای صف حذف شده است اگر صف خالی باشد پیغام خطا میدهد Error_code Queue :: serve( ) if (count <= 0) return underflow; ابتدای صف مقدار آیتم خروجی را میگیرد اگر صف خالی باشد پیغام خطای سرریز میدهد. Error_code Queue :: retrieve(Queue_entry &item) const

12 صف ها Queues متد size اثبات و آزمایش کردن:
int Extended_queue :: size( ) const در نوشتن متد size،ما ازشمارش اعضای صف protected استفاده می کنیم .اگر اعضاهای داده در صف کلاس رویت private داشته باشند آنگاه آنها درتابع غیر قابل دسترس خواهند شد و کدمابرای متد اندازه به یک مجموعه از پیچیده ای از فراخوانی به روش های حذف ،بازیابی واضافه کردن صف های public، احتیاج خواهد داشت. اثبات و آزمایش کردن: بهترین آزمایش نوشتن یک برنامه ی اثبات فهرست واراست.در هر بار تکرار حلقه ی اصلی برنامه از کاربر درخواست می کند که یک عملیات را انتخاب کند، سپس (اگر ممکن باشد) عملیات را بر روی ساختمان داده انجام و نتیجه را نمایش می دهد. بنابراین برنامه ی اصلی به صورت زیر می باشد: int main( ) {Extended_queue test_queue; introduction( ); while (do_command(get_command( ), test_queue)); کاربر برای انتخاب یک دستور یک کاراکتر را وارد خواهد کرد.شرح دستورات بهمراه کاراکترهای متناظر بوسیله تابع help توضیح داده شده اند،که می تواند خودش را بوسیله اختصاص دادن یک دستور فعال کند:

13 صف ها Queues void help( ) {
<< "This program allows the user to enter one command" << endl << "(but only one) on each input line." << endl << "For example, if the command S is entered, then" << endl << "the program will serve the front of the queue." << endl << " The valid commands are:" << endl << "A − Append the next input character to the extended queue" << endl << "S − Serve the front of the extended queue" << endl << "R − Retrieve and print the front entry." << endl << "# − The current size of the extended queue" << endl << "C − Clear the extended queue (same as delete)" << endl << "P − Print the extended queue" << endl << "H − This help screen" << endl << "Q − Quit" << endl << "Press < Enter > to continue." << flush; char c; do { cin.get(c); } while (c != 0\n0); }

14 صف ها Queues کار انتخاب و انجام دادن دستورات در نهایت وظیفه ی تابع do_command است. ما بخشی از این تابع را در زیر ارائه میکنیم: bool do_command(char c, Extended_queue &test_queue) { bool continue_input = true; Queue_entry x; switch (c) { case 0r0: if (test_queue.retrieve(x) == underflow) cout << "Queue is empty." << endl; else cout << endl << "The first entry is: " << x << endl; break; case 0q0: cout << "Extended queue demonstration finished." << endl; continue_input = false; Break } return continue_input;}

15 صف ها Queues کاربرد صف ها : کلاس های موردنیاز:
شبیه سازی عبارتست از استفاده از یک سیستم برای مدل نمودن عملکرد یک سیستم دیگر.از شبیه سازی اغلب در مواردی استفاده می شود که انجام آزمایش بوسیله سیستم های حقیقی بسیار پر هزینه و یا خطرناک باشد. در شبیه سازی کامپیوتری از مراحل یک برنامه برای شبیه سازی رفتار سیستمی که تحت بررسی است استفاده می شود. شبیه سازی یک فرودگاه بعنوان یک تمرین ویژه اجازه دهید که یک فرودگاه کوچک که دارای فقط یک خط پرواز است مورد بررسی قرار دهیم.در هر واحد زمانی یک هواپیما می تواند روی باند بنشیند یا از روی باند بلند شود و اجرای این دو کار باهم ممکن نیست. کلاس های موردنیاز: ساختن یک کلاس از هواپیما که اشیاء آن بیانگر هر یک از هواپیما نیاز به وجود یک method برای هواپیما های دیگر یک کلاس Runway برای نگهداری اطلاعاتی درباره ی وضعیت و عملکرد باند فرودگاه یک کلاس Random برای encapsulate هواپیماهایی که به صورت اتفاقی مجبور به نشستن بر روی باند یا برخاستن از روی باند می شوند نکته: مقدار زمانی را که هر هواپیما برای انتظار در صف ها قبل از نشستن یا برخاستن از روی باند صرف می کند اهمیت زیادی دارد

16 صف ها Queues int main( ) // Airport simulation program
{ int end_time, queue_limit, flight_number = 0; double arrival_rate, departure_rate; initialize(end_time, queue_limit, arrival_rate, departure_rate); Random variable; Runway small_airport(queue_limit); for (int current_time = 0; current_time < end_time; current_time..) { int number_arrivals = variable.poisson(arrival_rate); for (int i = 0; i < number_arrivals; i..) { Plane current_plane(flight_number.., current_time, arriving); if (small_airport.can_land(current_plane) != success) current_plane.refuse( ); } int number_departures = variable.poisson(departure_rate); for (int j = 0; j < number_departures; j..) { Plane current_plane(flight_number.., current_time, departing); if (small_airport.can_depart(current_plane) != success) Plane moving_plane; switch (small_airport.activity(current_time, moving_plane)) { case land: moving_plane.land(current_time); break; case takeoff: moving_plane.fly(current_time); case idle: run_idle(current_time); } } small_airport.shut_down(end_time); }

17 صف ها Queues توجه داشته باشید که اگر کلاس Runway ما نتواند یک پروازجدیدالورود را به landing Queue اضافه کند،از یک روش که Refuse نامیده می شود برای راهنمایی هواپیما به یک فرودگاه دیگر استفاده می کنیم.احتمالا، بعضی مواقع مجبور می شویم که درخواست یک هواپیما برای پرواز را نپذیریم. اعداد تصادفی مرحله ی اصلی تصمیم گیری برای این موضوع است که در هر بازه ی زمانی چه تعداد هواپیمای جدید برای نشستن بر روی باند یا برخاستن از روی آن آماده می شوند . سودمند ترین راه برای این امر آن است که به صورت راندوم و تصادفی تصمیم گیری کنیم

18 صف ها Queues کلاس فرودگاه دو صف پروازو فرود بین اعضایش دارد.که پیاده سازی آن روابط has-a را منعکس می کند. تعریف باند فرودگاه enum Runway_activity {idle, land, takeoff}; class Runway { public: Runway(int limit); Error_code can_land(const Plane &current); Error_code can_depart(const Plane &current); Runway_activity activity(int time, Plane &moving); void shut_down(int time) const; private: Extended_queue landing; Extended_queue takeoff; int queue_limit; int num_land_requests; // number of planes asking to land int num_takeoff_requests; // number of planes asking to take off int num_landings; // number of planes that have landed int num_takeoffs; // number of planes that have taken off int num_land_accepted; // number of planes queued to land int num_takeoff_accepted; // number of planes queued to take off int num_land_refused; // number of landing planes refused int num_takeoff_refused; // number of departing planes refused int land_wait; // total time of planes waiting to land int takeoff_wait; // total time of planes waiting to take off int idle_time; // total time runway is idle }

19 صف ها Queues وقتی که ما از یک اسم واحد برای توابع متفاوت متعدد استفاده می کنیم،ما می گوییم نامoverload شده است ، درون حوزه ی کلاس هواپیما ما قادر به overload کردن دو سازنده هواپیما هستیم ،بخاطر اینکه اول از یک لیست پارامتر خالی استفاده می کند و دوم از پارامتر لیست سه متغیر های صحیح استفاده می کند. حالا می توانیم ویژگیهایی برای کلاس هواپیما بدهیم. enum Plane_status {null, arriving, departing}; class Plane { public: Plane( ); Plane(int flt, int time, Plane_status status); void refuse( ) const; void land(int time) const; void fly(int time) const; int started( ) const; private: int flt_num; int clock_start; Plane_status state; }; تعیین ویژگیهای کلاس هواپیما کلاس هواپیما باید داده هایی شامل یک شماره پرواز،یک زمان ورود در سیستم فرودگاه ویک وضعیت هواپیما که در حال رسیدن یا حرکت کردن است باشددرنظر بگیرد. باشد.ماباید آنها را در اطلاعات شخصی اعضا نگه داریم تا یک مشتری قادر به تغییراین اطلاعات نباشد. به این دلیل مانیازداریم به یک سازنده کلاس هواپیما که آن سه پارامتر رادارد.در زمان ها های دیگر گرچه ما خواهان آن خواهیم بود که یک شئ هواپیما بدون مقدار اولیه دادن این اطلاعات طراحی شود به خاطر اینکه یا مقدار آن نامربوط هست یا در غیر این صورت تعیین خواهد شد.از اینروما واقعا نیازبه دو سازنده برای کلاس هواپیما یکی با سه پارامتر و یکی با هیچ پارامترداریم. . بالاخره باید کلاس هواپیما شامل نپذیرفتن،پرواز کردن وبه زمین نشستن باشد که به طور صریح بوسیله برنامه اصلی استفاده می شود. همچنین هر هواپیما بایدقادر به ارتباط زمان ورودش به فرودگاه به کلاس باندفرودگاه باشد

20 توابع و روش های شبیه سازی
صف ها Queues توابع و روش های شبیه سازی 2.مقداردهی باندفرودگاه اعضای داده باند فرودگاه مقداردهی اولیه می شوندبرای اینکه محدودیت سایز های صف وباندی که آماده فرود بوده ولی هواپیما فرود نیامده است را ثبت کنند . queue_limit = limit; num_land_requests = num_takeoff_requests = 0; num_landings = num_takeoffs = 0; num_land_refused = num_takeoff_refused = 0; num_land_accepted = num_takeoff_accepted = 0; land_wait = takeoff_wait = idle_time = 0; 1.مقداردهی اولیه شبیه سازی کاربر تعداد واحد زمانی در شبیه سازی را،حداکثر سایز صف ومنوال ورود و خروج های مورد انتظار را تعیین می کند void initialize(int &end_time, int &queue_limit, double &arrival_rate, double &departure_rate) } cout << "Up to what number of planes can be waiting to land " << "or take off at any time? " << flush; cin >> queue_limit; cout << "How many units of time will the simulation run?" << flush; cin >> end_time; bool acceptable; do { cout << "Expected number of arrivals per unit time?" << flush; cin >> arrival_rate; cout << "Expected number of departures per unit time?" << flush; cin >> departure_rate; .... {

21 توابع و روش های شبیه سازی
صف ها Queues توابع و روش های شبیه سازی 4.بررسی دسترسی باند فرودگاه اگر صف فرود اعضایی داشت،هواپیما جلویی به پارامترمتحرک کپی میشودویک نتیجه فرود برگردانده میشودویااگر صف پرواز اعضایی داشت،هواپیما جلویی به پارامتری که حرکت می کند کپی می شود ویک نتیجه پرواز برگردانده می شودوآمارهای باند فرودگاه آپدیت می شود. if (!landing.empty( )) { landing.retrieve(moving); land_wait += time − moving.started( ); num_landings..; in_progress = land; landing.serve( );} else if (!takeoff.empty( )) { takeoff.retrieve(moving); takeoff_wait += time − moving.started( ); num_takeoffs..; in_progress = takeoff; takeoff.serve( );} else {idle_time..; in_progress = idle;} return in_progress;} 3.پذیرفتن یک هواپیما جدید در یک صف باند اگر برای فرودپذیرفتن امکان پذیر باشد هواپیما به صف فرود اضافه می شود در غیر این صورت خطای سرریزظاهر می شودوآمارهای باند فرودگاه آپدیت میشود. Error_code result; if (landing.size( ) < queue_limit) result = landing.append(current); else result = fail; num_land_requests..; if (result != success) num_land_refused..; num_land_accepted..; return result; Error_code Runway :: can_depart(const Plane &current) برای پرواز هم اگرپذیرفتن امکان پذیر باشد هواپیما به صف پروازاضافه می شود در غیر این صورت خطای سرریز ظاهر می شود.آمارهای باند فرودگاه آپدیت شده است.

22 توابع و روش های شبیه سازی
صف ها Queues توابع و روش های شبیه سازی 6.نپذیرفتن هواپیما فرآیندی که در آن یک هواپیما منتظر استفاده از باند است وقتی که صف پر است را بررسی می کند. cout << "Plane number " << flt_num; if (state == arriving) cout << " directed to another airport" << endl; Else cout << " told to try to takeoff again later" << endl; 7.پردازش هواپیما در حال ورود فرآیندی که در آن یک هواپیما یی را که در یک زمان مشخص فرود می آید بررسی می کند. int wait = time − clock_start; cout << time << ": Plane number " << flt_num << " landed after ” << wait << " time unit" << ((wait == 1) ? "" : "s") << " in the takeoff queue." << endl; در این تابع ازعملگر سه تایی ? : استفاده کردیم برای افزودن “s” در جایی که می خواهیم خروجی را به دست آوریم مثل“1 time unit” or “2 time units” 5.مقداردهی اولیه هواپیما اعضای داده هواپیما flt_num, clock_start, state به ترتیب در مقادیر پارامتر هایflt, time,status گذاشته می شوند. flt_num = flt; clock_start = time; state = status; Plane :: Plane( ) درآخر اعضای داده هواپیما flt_num, clock_start, state مقادیر غیر مجاز می گیرند. flt_num = −1; clock_start = −1; state = null; دومین نوع این سازنده ها یک مقداردهی صفر را انجام می دهد. هر شئ باندفرودگاه صف هایی از هواپیما ها می باشدو هر کدام از این صف ها به وسیله استفاده آرایه ای از هواپیماها پیاده سازی می شود.بنابر این در شبیه سازی مان ما واقعا نیاز به عمل مقدار دهی پوچ نداریم.

23 توابع و روش های شبیه سازی
صف ها Queues توابع و روش های شبیه سازی در حال حرکت 8.پردازش هواپیما فرآیندی که در آن یک هواپیمایی که در یک زمان مشخص پرواز می کند بررسی می کند. int wait = time − clock_start; cout << time << ": Plane number " << flt_num << " took off after " << wait << " time unit" << ((wait == 1) ? "" : "s") << " in the takeoff queue." << endl; 9.ارتباط برقرار کردن با اطلاعات ورود هواپیما زمانی که هواپیما وارد سیستم فرودگاه می شود بر می گرداند int Plane :: started( ) const {return clock_start;} 10.علامت گذاری واحد های زمانی بلااستفاده زمان های مشخص شده با یک پیغام که باند فرودگاه بلااستفاده است نمایش داده می شود. void run_idle(int time) {cout << time << ": Runway is idle." << endl;} 11.پایان شبیه سازی اجرا برنامه و به دست آوردن خروجی

24 صف ها Queues نتایج به دست آمده با اجرای برنامه(TRACE) برای آزمایش صحت برنامه یک فرودگاه با یک باند ،یک مکان برای فرود یا برای پرواز در هر واحد زمانی درنظر می گیریم و به سئوالات پاسخ می دهیم که برای نمونه چند تا از آنها ذکر شده است .پس درنهایت داریم. حدودا چند هواپیما می توانند در هرلحظه برای فرود یا پرواز صبرکنند؟ چند واحد زمانی شبیه سازی اجرا می شود؟1000 تعداد ورودهای مورد انتظار در هر لحظه؟48 تعداد حرکت های مورد انتظار در هر لحظه؟48 هواپیما شماره 0آماده حرکت 0:هواپیما 1 فرود آمده،هیچ دستگاهی در صف 0 نیست.هواپیما شماره 0 بعد از 0واحد زمانی در صف پرواز بلند می شود.هواپیما شماره 1آماده حرکت 1:هواپیما شماره1 بعد از 0واحد زمانی در صف پرواز بلند می شود.هواپیما شماره 2آماده حرکت هواپیما شماره 3آماده حرکت 2: هواپیما شماره2 بعد از 0واحد زمانی در صف پرواز بلند می شودهواپیما شماره 4آماده فرود هواپیما شماره 5آماده حرکت ...... 19: هواپیما شماره20 بعد از 3واحد زمانی در صف پرواز،پرواز می کند. 20:هر دو صف خالی هستند،باند فرودگاه بلا استفاده است. بالاخره بعد از گام های بیشتر شبیه سازی ما یک خلاصه آماری به دست می آوریم. خلاصه شبیه سازی بعد ار 1000 واحد زمان به پایان رسیده است. مجموع هواپیماهای پردازش شده 970 مجموع هواپیماهای خواستارفرود 484 ... مجموع هواپیماهای باقیمانده در صف پروا ز درصد زمان بلا استفاده بودن باند 9.5% میانگین انتظار در صف فرود واحد زمانی میانگین انتظار در صف پرواز واحد زمانی میانگین سرعت مشاهده شده هواپیماهایی که می خواستند فرود آیند0.484 واحد زمانی میانگین سرعت مشاهده شده هواپیماهایی که می خواستند بلند شوند واحد زمانی


Download ppt "تهیه کنندگان مهری بابائی،گیتا جوادی رضا امید ملایری ،ناصر بهمدی"

Similar presentations


Ads by Google