همانطور که از اسم سؤال پیداست، از شما میخواهیم برنامهای با پایتون ۳ بنویسید که اتفاق عجیبی بیفتد!
نحوه عملکرد برنامه به این صورت است:
باید کلاسی به نام Foo
بنویسید که
یک خصوصیت به نام x
داشته باشد که طبق این قواعد مقداردهی میشود:
x
هنگام ساخته شدن کلاس Foo
صفر است.x
با یک عدد:x
ذخیره شود.-1
شود.x
باید از نوع int
باشد.یک مثال دیگر:
یک فایل Zip شامل یک فایل به نام source.py
که کلاس Foo
در آن قرار دارد آپلود کنید.
میخواهیم برنامهای بنویسیم تا بتوانیم با فایل نمرات دانشجویان کار کرده
و کارهایی که پیش از این توسط مسئولین آموزش به صورت دستی بر روی این فایلها
انجام میشد را خودکار کنیم. هر سطر از این فایل دارای سه بخش است که با
کاراکتر فاصله (" "
) از هم جدا شدهاند. این سه بخش به ترتیب عبارتند از:
یعنی هر سطر از این فایل مشخص میکند که یک دانشجو در یک درس چه نمرهای را گرفته است.
چند نیاز اساسی در رابطه با این فایلها وجود دارد:
Grade
بخوانیم.Grade
را به صورت یک سطر از فایل نمرات و در انتهای فایل ذخیره کنیم.یک کلاس به نام Grade
شامل سه خصوصیت با اسامی زیر بنویسید.
student_id
course_code
score
کلاس شما باید دارای متد سازندهای باشد که این سه خصوصیت را به همین ترتیب دریافت و مقداردهی کند.
با توجه به نیازمندیهایی که در بالا گفته شد، یک کلاس با نام CourseUtil
تعریف کنید که همه متدهای جدول زیر را طبق رفتار توضیح داده شده پیادهسازی کند.
رفتار | خروجی | متد |
---|---|---|
آدرس فایل نمرات به ورودی این متد داده میشود. | - |
set_file(address) |
یک شماره خط از فایل را در ورودی میگیرد و اطلاعات موجود در آن خط از فایل را در قالب یک شئ Grade برمیگرداند. |
Grade |
load(line_number) |
یک شئ Grade در ورودی میگیرد و طبق فرمت مورد نظر، آن را در انتهای فایل اضافه میکند. |
- |
save(grade) |
میانگین نمرات دانشجویان در درس با کد course_code را برمیگرداند. |
float |
calc_course_average(course_code) |
میانگین نمرات دانشجو با شماره دانشجویی student_id در درسهای مختلف را برمیگرداند. |
float |
calc_student_average(student_id) |
تعداد کل نمرات موجود در فایل نمرات را برمیگرداند. | int |
count() |
set_file
در اختیار کلاس قرار داده میشود. شما باید خودتان فایل را به نحوه دلخواه باز کنید.load
اگر مقدار line_number
بزرگتر از تعداد خطهای فایل بود، باید None
برگردانید. شمارهی خطوط از ۱ شروع میشود.set_file
ممکن است چند بار فراخوانی شود که پس از هر فراخوانی، اطلاعات فایل جدید باید خوانده شود.save
ثبت کنیم، نباید در فایل تغییری ایجاد شود.\n
وجود ندارد. شما نیز باید طوری فایل را تغییر دهید که هیچ گاه در انتهای فایل \n
وجود نداشته باشد.در کد زیر یک فایل شامل دو سطر به عنوان ورودی داده شده است.
خروجی زیر مورد انتظار است:
یک فایل Zip شامل یک فایل به نام source.py
که کلاسهای Grade
و CourseUtil
در آن قرار دارد آپلود کنید.
منبع سؤال: مسابقات جاواکاپ
محمد، مهدی و پارسا به مسابقات ACM جهانی راهیافتهاند روز مسابقه هر تیم باید نام تیم خود را در فایل دیتابیس sqlite اضافه کند ما باید کتابخانهای بنویسیم که کار را برای ارتباط با دیتابیس برای مهدی و دوستان ساده کند. این کد قرار است شبیه به یک ORM کار کند. در این سوال تنها کتابخانه sqlalchemy نصب شده است که میتوانید از آن استفاده کنید.
فایل اولیه را از این لینک دریافت کنید. تست نمونه در فایل قرار داده شده است. کد شما باید به صورت زیر باشد.
۱. تابع create_database_if_not_exist
در صورتی که فایل پایگاه داده تاکنون ساخته نشده آن را در آدرس db_path
میسازد. نمونه db_path
که به پوشه databases و پایگاه first.sqlite3 اشاره میکند (پوشه databases از قبل باید وجود داشته باشد) :
db_path = r'databases/first.sqlite3''
۲. تابع create_table
قرار است مسیر تعریف table
و نام آنرا دریافت کند و جدول را در پایگاه داده بسازد.
نحوه تعریف جدول در پایگاه داده به صورت زیر است.
در این صورت تابع را به صورت create_table('tables.user', 'User')
صدا میزنیم. در صورت موجود بودن جدول در پایگاه داده، استثنا TableExistsException
را باید raise
کنید.
۳. تابع add_value
مقدار جدید را میگیرد و در جدول مربوطه ذخیره میکند نحوه صدا زدن این تابع به صورت
add_value('tables.user', 'User', name='mahdi', family='shokri', likes=3)
است. در صورت موجود بودن مقدار از قبل در جدول باید استثنا ValueExistException
و در صورت هرگونه مشکل دیگر باید استثنا AddValueException
را raise
کنیم.
۴. تابع add_values
مقادیر جدید را میگیرد و در جدول مربوطه ذخیره میکند. نحوه صدا زدن این تابع به صورت
add_values('tables.user', 'User', [{'name': 'mahdi', 'likes': 3, 'family': 'shokri' }])
است. به ازای هر مورد در آرایه آنرا به جدول اضافه میکند. توجه کنید که یا همه موارد اضافه شوند یا در صورت هرگونه مشکل برای هرکدام از موارد آرایه باید استثنا AddValuesException
را raise
کنیم و پایگاه داده را به حالت قبل از این دستور، rollback
کنیم.
۵. تابع remove_value
مقداری را میگیرد و بر اساس آرگومانها موارد را فیلتر میکند و حذف مینماید. مثلا
add_value('tables.user', 'User', name='mahdi')
تمام افرادی که نامشان mahdi
است را حذف میکند. در صورت نبودن سطری برای حذف شدن در جدول یا هرگونه مشکل دیگر باید استثنا RemoveValueException
را raise
کند.
۶. تابع remove_values
آرایه ای از فیلترها میگیرد و به ازای هر کدام از فیلترها موارد مربوط به آن فیلتر را که در جدول مطابقت دارند حذف میکند.
add_value('tables.user', 'User', [{'name': 'mahdi'}, {family': 'mohammadi'}])
به ازای هرکدام از موارد در آرایه حداقل باید یک سطر برای حذف شدن وجود داشته باشد در غیر این صورت استثنا RemoveValuesException
بازگردانده شود.
۷. تابع get_values
مقادیر فیلتر را دریافت میکند و نتیجهای را به صورت json
باز میگرداند. مثلا اگر تابع
get_values('tables.user', 'User', name='mahdi')
را صدا بزنیم تمام سطرهای جدول که name
در آنها mahdi
باشد را برمیگرداند. توجه کنید که ترتیب موارد در خروجی json
باید بر اساس order_fields
در تعریف جدول (در اینجا User
) باشد.
to_json()
است و نیازی نیست شما آن را تبدیل به json کنید.کد ارسالی شما باید به صورت زیر در ریشه فایل zip
باشد. حتما قبل از ارسال تستهای نمونه را اجرا کنید.
در شکل زیر یک صفحه ساده را میبینیم که به زبان انگلیسی است.
از شما میخواهیم این صفحه را مطابق شکل زیر با استفاده از امکانات ترجمهی Django به فارسی ترجمه کنید.
فایلهای اولیه را از اینجا دانلود کنید. ساختار این فایلها به شرح زیر است:
شما باید فایل ترجمه را به همراه کامپایلشدهی آن،
در پوشهی صحیح در مسیر app/locale
ایجاد کنید.
پروژه باید بدون نیاز به هیچ تغییر دیگری متون را فارسی نمایش دهد.
متنهای فارسی را از جدول زیر کپی کنید:
متن انگلیسی | ترجمه فارسی |
---|---|
Website Statistics | آمار سایت |
Number of visits | تعداد بازدیدها |
Your website had ### visits yesterday. | سایت شما دیروز ### بازدید داشت. |
میخواهیم یک سایت برای خودکار کردن فرایند فروش بلیتهای سینما بنویسیم. در این سایت امکان مشاهده فیلمهای در حال اکران وجود دارد. کاربران میتوانند عضو سایت شوند و پس از ورود به سایت برای هر فیلم صندلی موردنظر را رزرو کند.
بخشی از این پروژه نوشته شده است. از شما میخواهیم این پروژه را تکمیل کنید.
پروژه اولیه را از اینجا دانلود کنید. ساختار این پروژه به شرح زیر است:
در این سؤال تنها لازم است تغییراتی در app/views.py
و app/fixtures
ایجاد کنید.
در فایل models.py
سه مدل به شرح زیر وجود دارد:
۱. مدل Movie
شامل فیلدهای زیر:
title
: نام فیلمrelease_year
: سال انتشار فیلمplay_time
: زمان اکران فیلم در سالن۲. مدل Seat
شامل فیلد زیر:
number
: شماره صندلی۳. مدل Ticket
شامل فیلدهای زیر:
movie
: فیلمی که این بلیت برای آن فروخته شده استuser
: کاربری که این بلیت را خریده استseat
: صندلی مربوط به این بلیتdate_bought
: تاریخی که بلیت خریده شده استقرار است همه صندلیهای سالن و لیست فیلمها در ابتدا با استفاده از fixture
به پایگاه داده اضافه شود. سپس به ازای هر بلیتی که فروخته میشود
یک شیٔ از مدل Ticket
ساخته میشود.
مواردی که باید انجام دهید:
از شما میخواهیم دو فایل fixture با نامهای
movies
و seats
در مسیر app/fixtures
بنویسید. این fixture ها را میتوانید به فرمت
JSON
یا YAML
بنویسید.
movies
باید شامل دادههای زیر باشد.
زمان اکران را به صورت naive (بدون TimeZone) تعریف کنید.id | نام فیلم | سال انتشار | تاریخ اکران | ساعت اکران |
---|---|---|---|---|
1 | Children of heaven | 1997 | 2018/4/20 | 22:00 |
2 | About Elly | 2009 | 2018/4/20 | 20:00 |
3 | A separation | 2011 | 2018/4/22 | 18:00 |
4 | The salesman | 2016 | 2018/4/21 | 18:00 |
5 | The Elephant king | 2017 | 2018/4/21 | 20:00 |
seats
نیز باید شامل ۱۰ صندلی با id
های ۱ تا ۱۰
و با شماره صندلیهای ۳۱ تا ۴۰ (به ترتیب id
ها) باشد.در این قسمت باید view نمایش صندلیها (list_seats
) را به گونهای تغییر دهید
که فقط صندلیهایی که برای فیلم موردنظر رزرو نشدهاند نمایش داده شوند.
با توجه به توضیحات زیر، view ها را تکمیل کنید.
برای رزرو صندلی، کاربر مراحل زیر را انجام میدهد:
ابتدا از آدرس /movie
بازدید میکند که لیست فیلمهایی که در حال اکران هستند
را نمایش میدهد. سپس روی فیلم مورد نظر خود کلیک کرده و صفحهی بعدی صندلیهای رزرو
نشده برای آن فیلم را نمایش میدهد. تا این مرحله کاربر نیازی به login بودن ندارد.
وقتی کاربر روی یکی از صندلیها کلیک کرد:
در این قسمت شما باید view مربوط به آدرس stats
را به نحوی کامل کنید
که در پاسخ برای همه صندلیهای که حداقل
برای یک فیلم رزرو شدهاند (به ترتیب id
صندلی)،
یک خروجی JSON به شکل زیر بازگردد:
app/views.py
و app/fixtures
هستید.
اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد.همه چی از uber شروع شد. ایده ی خوبی که رانندگان را به مسافران وصل میکرد و هر کسی هر جایی بود به سرعت میتوانست برای خودش تاکسی درخواست دهد. مدتی نگذشت که برنامهنویس های داخل کشور عزیزمان هم از این سرویس ایده گرفتند و شروع به پیاده سازی مشابه آن در ایران کردند. در حال حاضر چندین سرویس درخواست آنلاین تاکسی وجود دارد که در تهران و چند شهر دیگر مشغول سرویس دهی به مسافرین هستند و روز به روز هم گسترش بیشتری میابند و اشتغالزایی زیادی را نیز به وجود آوردهاند. حالا با توجه به بازار داغ این سرویس ما نیز میخواهیم یک سرویس مشابه ایجاد کنیم. اسمش هم cabin
گذاشتهایم. شما میتوانید پروژه کابین رو از اینجا دانلود کنید.
همانطور که در فایل ها میبینید یک app به نام cabin وجو دارد. در فایل models.py هشت مدل به شرح زیر وجود دارد:
Account: اکانت که به یک مدل دیگر اعم از راننده یا مسافر یا مدیر سیستم وصل است و شامل فیلد های زیر است
Admin: مدیر سیستم که دسترسی هایی خاصی به سیستم دارد
Rider: مسافر
Driver: راننده
Car: خودرو
RideRequest: درخواست سفر
Ride: سفر
Payment: پرداخت
حال از شما میخواهیم پرس و جو (query) های زیر را روی مدل های بالا بنویسید.
حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!
در اینجا status تاثیری ندارد و نتیجه را میتوانید به صورت dict برگردانید.
.count()
از QuerySet مربوطه را بازگرانید که نتیجه یک عدد خواهد بود.n
که تعداد سفر هایی که هر مسافر با ماشین کلاس A داشته است را نشان میدهد.🔗خروجی نمونه:
n
که نشان دهنده تعداد سفر های هر راننده است.🔗n
) که راننده با آن آسم انجام داده است.🔗خروجی نمونه:
queries.py
وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کد های خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید.query_0
در پاسخ به پرس و جویِ «لیست همه ی رانندگانی که رتبهی آنها بیشتر از x است.» کامل شده است که شما نیز باید مشابه همین تابع بقیه توابع را کامل کنید.first_name
است.یک فایل zip. که درون آن یک پوشه cabin
وجود دارد که شامل یک فایل queries.py
است. توجه کنید در صورتی که فایلهای اضافی ارسال کنید، حذف خواهند شد.