این نکات را در تمامی سوالهای این مسابقه رعایت کنید؛ رعایت نکردن این نکات ممکن است باعث شود کد ارسالی شما حتی اگر درست هم باشد نمرهی کمی دریافت کند.
+ پروژهای که آپلود میکنید بصورت اتوماتیک توسط سیستم داوری میشود، پس تلاش کنید تمام نکات گفتهشده داخل صورت سوال را رعایت کنید و دقیقاُ آنچه گفته شده را پیادهسازی کنید.
+ پروژه مربوط به هر سوال را از لینک داخل صورت آن سوال دریافت کنید و با توجه به صورت سوال، *task*های معرفی شده را پیاده سازی کنید تمامی فایلهای موردنیاز برای اجرای پروژه را باتوجه به توضیحات صورت سوال ارسال کنید.
+ برای ارسال، پوشهی *App* از پروژه را زیپ کرده و در محل مشخص شده آپلود نمایید.
+ پس از آن که کد را ارسال کردید و نمرهدهی انجام شد، شما میتوانید روی نمره ارسال خود در بخش *همه ارسالها* کلیک کنید و از راهنماییها و جزئیات نمرهای که دریافت کردید باخبر شوید.
+ لطفا پروژه را یک بار در رایانه شخصی خود اجرا کرده و پس از اطمینان از اجرا شدن برنامه آن را برای داوری ارسال نمایید.
+ تنها فایلهای مشخص شده در صورت سوال را تغییر داده و در بقیه قسمتهای پروژه تغییری ایجاد نفرمایید.
+ اضافه کردن فایل جدید درصورتی که در پوشه ```main``` یا زیرپوشههای آن قرارگیرد، مشکلی ایجاد نمیکند و بلامانع است.
+ در صورتی که در حین مسابقه راجع به صورت سوالها به ابهامی برخوردید، میتوانید در بخش *سوال بپرسید* از پشتیبانی مسابقه مورد را جویا شوید.
+ رتبهبندی مسابقه به ترتیب مجموع نمرهای است که از سوالها دریافت میکنید؛ شرکتکنندهی با نمرهی بیشتر رتبهی بهتری کسب میکند. شرکتکنندگان با رتبهی برابر بر اساس مجموع زمان ارسالهای نهایی رتبهبندی میشوند.
[لینک دانلود پروژه اولیه](https://www.dropbox.com/s/g9musw14zoc4c5b/Form-contestant.zip?dl=0)
گروه کوه دانشگاه شریف تصمیم به گرفتن اعضای جدید کرده است. آنها میخواهند فرمی را درست کنند تا متقاضیان بتوانند اطلاعات خود را در آن وارد نمایند. برای اینکار از شما کمک میخواهند.
فرم شامل فیلد های نام، شماره دانشجویی و سال ورود به دانشگاه میباشد.
هر کدام از فیلد ها دارای شرایطی هستند:
+ در فیلد نام باید **حرف اول اسم** را **بزرگ** نوشت. در غیر اینصورت عبارت ```name is invalid``` در فیلد ```TextView``` که بالای صفحه قراردارد، نمایش داده میشود.
+ در فیلد شماره دانشجویی باید تعداد ارقام برابر با 8 باشند در غیر اینصورت عبارت ```student number is invalid``` در فیلد ```TextView``` که بالای صفحه قراردارد، نمایش داده میشود.
+ در فیلد سال ورود باید دو رقم ابتدای شماره دانشجویی با سال ورود برابر باشد (به طور مثال اگر شماره دانشجویی برابر با ```94000000``` باشد، در فیلد سال ورود نیز باید عدد ```94``` وارد شود) در غیر اینصورت عبارت ```entrance year is invalid``` در فیلد ```TextView``` که بالای صفحه قراردارد، نمایش داده میشود.
+ اگر همه فیلد ها درست پر شده بود باید عبارت ```you submit successfully``` در فیلد ```TextView``` که بالای صفحه قراردارد، نمایش داده میشود.
### نکات مهم:
+ پیغامها **پس از فشردن کلید** نمایش داده شوند.
+ اگر بیشتر از یک فیلد اشتباه پر شده بود، ارورهای آن به ترتیب در ```TextView``` نمایش داده میشوند.
+ هنگام نمایش پیغامها دقت کنید که کاراکترهای نامرئی مانند ```\n``` که بکار بردهاید، به تعداد کافی باشند. (عدم استفاده از ```\n``` برای جداکردن خطوط، درج ```\n``` قبل از خط اول یا بعد از خط آخر از خطاهای متداول هستند.)
+ درصورت خالی ماندن هریک از فیلدها، پیغامی چاپ نمیشود، اما برنامه شما در اینصورت نباید با فشردن دکمه موجود از کار بیفتد.
+ ورودی ها بصورت ارقام و حروف انگلیسی وارد میشوند.
+ **به هیچ وجه** در بخشهای دیگر پروژه تغییری اعمال نکنید.
+ برای ارسال پاسخ، دقت کنید **پوشه ```app```** موجود در ریشه فایلهای پروژه، باید **در ریشه فایل زیپ ارسالی** قراربگیرد.
ساختار فایل ارسالی(فایلهایی که باید تغییر دهید با ----> نمایش داده شده اند):
```
<Your-zip-name>.zip
app
│ .gitignore
│ app.iml
│ build.gradle
│ proguard-rules.pro
│
└───src
└───main
│ AndroidManifest.xml
│
├───java
│ └───com
│ └───example
│ └───mahsa_pc
│ └───form
│ MainActivity.java <----
│
└───res
├───drawable
├───layout
│ activity_main.xml <----
│
├───mipmap-hdpi
│
├───mipmap-mdpi
│
├───mipmap-xhdpi
│
├───mipmap-xxhdpi
│
├───mipmap-xxxhdpi
│
└───values
colors.xml
strings.xml
styles.xml
```
[دانلود فایل پروژه](http://bayanbox.ir/download/2352802595611492106/CompanyManager.zip)
مهدیار به عنوان مدیر داخلی شرکت «گوبرا» انتخاب شده است. او پس از چند روز که از شروع کارش گذشت و مشخصات کارمندان شرکت را در کاغذ وارد کرد، احساس خستگی کرد. مهدیار از عطا خواست که برایش برنامهی اندرویدی بنویسد که بتواند با کمک آن لیست کارمندان شرکت را مدیریت کند. عطا هم از فرط خستگی، پروژه را ناتمام گذاشته و زحمت اتمام کار بر دوش شماست.برنامه دو قسمت اصلی دارد؛ ثبت کارمند جدید و گرفتن گزارش کارمندان.
در بخش ثبت کارمند جدید(```Register```)، باید مشخصات کارمند جدید دریافت شود. هر کارمند مشخصات زیر را دارد:
1. کد کارمندی
2. نام
3. نام خانوادگی
4. حقوق(به ازای هر ساعت)
5. ساعت کار ماهانه
6. منصب(مدیر، توسعهدهنده، کارمند)
در بخش گزارش(```Report```)، چند نوع گزارش میتوان تهیه کرد.
1. محاسبهی کل پرداختی ماهانهی شرکت برای هر گروه شغلی(مدیر، توسعهدهنده، کارمند، همه)
2. گرفتن مشخصات کارمند با واردکردن کد کارمندی
3. مشاهدهی ```n```امین کارمند شرکت از نظر بیشترین درآمد ماهانه. (رتبه هر کارمند به اینصورت محاسبه میشود: درصورتی که کارمندان را بصورت نزولی براساس حقوق دریافتی ماهانه مرتب کنیم، کارمند با بیشترین دریافتی رتبه یک را دریافت میکند و با کاهش حقوق، به ترتیب رتبه افزایش مییابد.)
شما باید تغییرات زیر را در پروژه ایجاد کنید:
+ با اجرای برنامه، ```MainActivity``` اجرا شود و ```activity_main``` را نمایش دهد. همچنین در اولین اجرای برنامه بر روی دستگاه، پایگاه دادهای با نام company **(دقیقا به همین نام و بدون هیچ پسوند، پیشوند یا فرمت فایل)** ساخته شود و جدولی به اسم Staff با ستونهای زیر در آن قرار گیرد:
شمارهی کارمندی (ستون ```ID```)
نام (ستون ```FirstName```)
نام خانوادگی (ستون ```LastName```)
درآمد هر ساعت (ستون ```Salary```)
ساعات کار ماهانه (ستون ```Hour```)
منصب (ستون ```Position```)
+ با زدن دکمهی ```Register```، کلاس ```RegisterActivity``` و با زدن دکمهی ```Report```، کلاس ```ReportActivity``` اجرا شود و به ترتیب ```activity_register``` و ```activity_report``` نمایش داده شوند.
+ در ```activity_register```، داخل ```edit_code```، ```edit_hour``` و ```edit_salary``` فقط باید بتوان عدد وارد کرد.
+ در ```activity_register```، پس از فشردهشدن ```btn_submit``` اگر هر کدام از ```EditText``` ها خالی بود، رنگ پیغام راهنمای آن باید با استفاده از ثابت ```Color.RED``` یا کد رنگ معادل آن، به قرمز تغییر کند. در غیر اینصورت، اطلاعات واردشده باید به جدول Staff اضافه شوند. در صورتی که کد کارمندی واردشده تکراری بود، نباید اطلاعات اضافه شوند و پیغام ```Duplicate Personal Code``` داخل ```txt_result``` نمایش داده شود. در صورت موفقیتآمیز بودن هم پیغام ```Registration successful``` داخل ```txt_result``` نمایش داده شود و همه ```EditText``` ها به حالت اولیه (بدون متنی که کاربر وارد کرده و با کد رنگ پیشفرض برای متن راهنما) برگردند.
+ در ```activity_report```، با فشردهشدن ```btn_payment``` باید کل حقوق ماهانهی همه کارمندان گروهی که در ```drop_report_position``` انتخاب شدهاند، در ```txt_report``` نمایش داده شود.(کل حقوق ماهانهی یک کارمند برابر با حاصلضرب تعداد ساعات کار در حقوق ساعتی است.)
+ در ```activity_report```، با فشردهشدن ```btn_person```، باید نام و نام خانوادگی کارمندی که شمارهی کارمندی او در ```edit_get_code``` وارد شده است، در ```txt_report``` نمایش داده شود. توجه کنید که بین نام و نام خانوادگی ***باید دقیقا یک فاصله*** (```space```)باشد. همچنین اگر کارمندی با شماره واردشده وجود نداشت، پیغام ```Not found``` در ```txt_report``` نمایش داده شود. همچنین اگر ```edit_get_code``` خالی بود، پیغام راهنمای آن باید با استفاده از ثابت ```Color.RED``` یا کد رنگ معادل آن، به رنگ قرمز تغییر کند. توجه شود که ورودی ```edit_get_code``` فقط باید عدد باشد و غیر عدد را نباید بتوان وارد کرد.
+ در ```activity_report```، با فشردهشدن ```btn_top```، باید کارمندی که در رتبهی متناظر با عدد واردشده در ```edit_top``` قرار دارد، در ```txt_report``` نمایش دادهشود؛ (کارمندان براساس حقوق دریافتی بصورت نزولی مرتب میشوند و بالاترین حقوق، بالاترین رده یعنی رذه یک را دریافت میکند) باید نام، نام خانوادگی و درآمد ماهیانه در ```txt_report``` نوشته شود (موارد باید با **دقیقا یک کاراکتر** ```space``` از هم جدا میشوند.) اگر عدد واردشده از تعداد کارمندان شرکت بیشتر بود، عبارت ```Not found``` در ```txt_report``` نوشته شود. همچنین اگر ```edit_top``` خالی بود، پیغام راهنمای آن با استفاده از ثابت ```Color.RED``` یا کد رنگ معادل آن، به قرمز تغییر کند. توجه شود که ورودی ```edit_top``` فقط باید عدد باشد و غیر عدد را نباید بتوان وارد کرد.
### نکات مهم:
+ برای پیادهسازی خواستههای مسئله (بخصوص ساخت و پیادهسازی دیتابیس)، هیچگونه دسترسی یا ```permision``` جدیدی نباید به فایل پروژه اضافه شود. درصورت استفاده از روشهایی که نیاز به افزودن دسترسی به پروژه دارند، بخشی از نمره راهحل ارسالی کسر میگردد و یا نمرهای به راهحل ارسالی شما تعلق نمیگیرد.
ساختار فایل ارسالی(فایلهایی که باید تغییر دهید با ----> نمایش داده شده اند):
```
F:.
└───app
│ .gitignore
│ app.iml
│ build.gradle
│ proguard-rules.pro
│
├───libs
└───src
├───androidTest
│ │ androidTest.iml
│ │
│ └───java
│ └───ir
│ └───quera
│ └───companymanager
│ ExampleInstrumentedTest.java
│
├───main
│ │ AndroidManifest.xml
│ │ main.iml
│ │
│ ├───gen
│ ├───java
│ │ └───ir
│ │ └───quera
│ │ └───companymanager
│ │ MainActivity.java <----
│ │ RegisterActivity.java <----
│ │ ReportActivity.java <----
│ │
│ └───res
│ ├───drawable
│ ├───layout
│ │ activity_main.xml
│ │ activity_register.xml
│ │ activity_report.xml
│ │
│ ├───mipmap-hdpi
│ │ ic_launcher.png
│ │ ic_launcher_round.png
│ │
│ ├───mipmap-mdpi
│ │ ic_launcher.png
│ │ ic_launcher_round.png
│ │
│ ├───mipmap-xhdpi
│ │ ic_launcher.png
│ │ ic_launcher_round.png
│ │
│ ├───mipmap-xxhdpi
│ │ ic_launcher.png
│ │ ic_launcher_round.png
│ │
│ ├───mipmap-xxxhdpi
│ │ ic_launcher.png
│ │ ic_launcher_round.png
│ │
│ └───values
│ colors.xml
│ strings.xml
│ styles.xml
```
[لینک دانلود پروژه اولیه](https://www.dropbox.com/s/5pupbir5665srh7/NumberRecognitionTest-contest.zip?dl=0)
### مرور وظایف:
+ پیادهسازی الگوی ارقام ```[0,1,2,3,4,5,6,7,8,9]``` ۲۵٪ امتیاز سوال (پیادهسازی هر عدد ٪۲.۵)
+ پیادهسازی انیمیشن برای الگوی نادرست ۱۵٪ امتیاز سوال
+ پیادهسازی روش صحیح وارد کردن اعداد (مشابه با وارد کردن الگو برای بازکردن قفل صفحه) ۵۰٪ امتیاز سوال
+ غیرفعال کردن صفحه ورود اعداد هنگام نمایش انیمیشن ۱۰٪ امتیاز سوال
محمد از اینکه هر دفعه برای زنگ زدن به کسی باید روی آن شماره لمس کند خسته شده و دلش تنوع میخواهد. حسین که به تازگی با برنامهنویسی اندروید آشنا شده است، قصد دارد به محمد کمک کند اما به دلیل تازه کار بودن برنامه را نصفه رها کرده است. حال، شما باید به وی کمک کنید تا بتواند محمد را خوشحال کند.
برنامه بدین صورت است که:
+ صفحه ای که نمایش داده میشود دارای دکمه های سفید با کد رنگ ```#FFFFFF``` است که با لمس شدن، به رنگ مشکی با کد رنگ ```000000#``` تغییر رنگ میدهند.
+ برای نوشتن هر عدد باید باید دکمه هایی که در کنار هم آن عدد را شکل میدهند، با لمس کردن به رنگ مشکی درآیند. وارد کردن عدد به این صورت است که کاربر، دست خود را برروی صفحه نمایش قرار میدهد و با کشیدن الگوی عدد موردنظر روی صفحه نمایش (بدون جدا شدن دست از صفحه نمایش)، مسیر متناظر با حرکت دست روی صفحه، به رنگ مشکی با کد رنگ ```000000#``` تغییر رنگ میدهند (مشابه با وارد کردن الگو برای باز کردن قفل صفحه گوشی) و در صورت برداشتن دست از روی صفحه نمایش:
+ درصورتیکه الگوی رسم شده معتبر باشد، عدد متناظر به ```TextView``` سبز رنگ، در پایین صفحه اضافه میشود و همه دکمه ها به رنگ سفید اولیه باز میگردند.
+ درصورتیکه الگوی رسم شده، متناظر با هیچیک از ارقام ```[0,1,2,3,4,5,6,7,8,9]``` نباشد، رنگ زمینه تمام پانزده دکمه، همراه با انیمیشنی به مرور تغییر رنگ داده و مجددا به رنگ سفید بازمیگردند.
### شمای کلی پروژه پس از تکمیل:
![پروژه کامل](http://bayanbox.ir/download/3299649379009666104/recog.gif)
[لینک دانلود درصورت بروز مشکل در نمایش گیف](http://bayanbox.ir/download/3299649379009666104/recog.gif)
### نکات مهم:
+ الگو را برای **اعداد انگلیسی** طراحی کنید و نه اعداد فارسی
+ برای ارسال پاسخ، دقت کنید **پوشه `app`** موجود در ریشه فایلهای پروژه، باید **در ریشه فایل زیپ ارسالی** قراربگیرد.
+ انیمیشن را به اندازه کافی، طولانی درنظر بگیرید. برای اطمینان میتوانید از مقدار ۴ ثانیه برای تکمیل انیمیشن استفاده کنید.
ساختار فایل ارسالی(فایلهایی که باید تغییر دهید با ----> نمایش داده شده اند):
<your-zip-name>.zip
├── app
│ ├── java
│ │ └── MainActivity <----
│ ├── res
│ │ ├── drawable
│ │ ├── layout
│ │ ├── mipmap
│ │ └── values
[لینک دانلود پروژه اولیه](https://www.dropbox.com/s/h29c6vve5v0yt6i/OnlineQuessWord-contestant.zip?dl=0)
### خلاصه وظایف
+ ارتباط با سرور و فرستادن رکوئست به آن ۸٪ امتیاز سوال
+ ```encode``` کردن صحیح دادههای ارسالی به سرور ۸٪ امتیاز سوال
+ گرفتن پاسخ صحیح از سرور و نمایش آن در جای مناسب ۸٪ امتیاز سوال
+ امکان پردازش چند درخواست بطور همزمان ۱۶٪ امتیاز سوال
+ پایداری ارتباط با سرور درصورت تغییر وضعیت دستگاه (مانند چرخش) ۴۴٪ امتیاز سوال
+ پایداری محتوای مورد نمایش در رابط کاربری درصورت تغییر وضعیت دستگاه (مانند چرخش) ۱۶٪ امتیاز سوال
در این سوال شما باید یک بازی شبیه به بازی بیست سوالی (بدون محدودیت سوال) را پیادهسازی کنید. به این صورت که شما سوالات خود را تایپ و ثبت میکنید، سپس سوال خود را به آدرس سرور ارسال میکنید و پس از پردازش سوال، پاسخی متناسب از طرف سرور به شما برمیگردد (پاسخ سرور صرفا شامل یک رشته بعنوان پاسخ سوال ارسالی است و هیچ ساختار خاصی ندارد). شما باید سوالات و پاسخ ها را در قسمت بالایی صفحه، بصورت گزارشی از تاریخچه عملکرد نمایش دهید؛ به این صورت که هر سوال بلافاصله پس از لمس دکمه ```submit``` به لیست افزوده میشود، آخرین پاسخ ارسالی در ```last_answer_tv``` نمایش داده میشود و با رسیدن پاسخ جدید از سمت سرور، متن موجود در ```last_answer_tv```، به ```history_tv``` منتقل میشود و پاسخ جدید در ```last_answer_tv``` نمایش داده میشود.
# موارد مورد انتظار جهت پیادهسازی
۱- سوال کاربر باید در **EditText** با آیدی **question_et** تایپ شود و با لمس دکمه **Submit** برای پردازش، به سرور ارسال شود تا پاسخ سرور را در قالب یک رشته دریافت کند. دقت کنید **متن سوال نمیتواند خالی باشد**.
نمونه درخواست ارسالی به سرور برای پرسیدن سوال **?what is length of the word**
```
<YOUR_URL>?q=what+is+length+of+the+word%3F
```
نمونه پاسخ ارسالی سرور:
```
it contains 10 characters
```
۲- آخرین پاسخ دریافت شده از سرور باید در **TextView** با آیدی **last_answer_tv** نمایش داده شود.
۳- لیست تاریخچه سوالات کاربر و پاسخ های سرور (بجز آخرین پاسخ سرور) باید در **TextView** با آیدی **history_tv** نمایش داده شود.
۴- برنامه شما باید با تغییر جهت دستگاه، وضعیت فعلی خود (شامل اطلاعات نمایش داده شده به کاربر و اطلاعات موردنیاز جهت ادامه فعالیت بصورت صحیح) را حفظ کند.
۵- درصورتی که در هنگام ارتباط با سرور و انتظار برای پاسخ سرور، جهت دستگاه تغییر کرد (دستگاه **rotate** شد)، نباید خللی در ارتباط با سرور و دریافت پاسخ بوجود آید.
۶- درصورتی که کاربر سوالی را با استفاده از کلید *Submit* ثبت کند و پیش از پاسخگویی سرور، سوال (یا سوالات) دیگری را ثبت کند، ارسال سوالات به سرور باید در لحظه ثبت انجام شود (نباید ارسال سوال جدید و انتظار برای گرفتن پاسخ، تا زمان پاسخگویی سرور به سوال قبلی، به تعویق بیافتد).
# موارد مورد توجه هنگام پیادهسازی:
+ درخواست ها به سرور توسط متد **GET** ارسال میشوند.
+ آدرس پایهای سرور را حتما در متغیر **url** که عضو ثابت کلاس **BaseURL** میباشد،قرار دهید و زمانی که به آن نیاز داشتید، از **BaseURL.url** استفاده کنید. (از بکار گیری آدرس پایه بطور مستقیم در کد، جدا خودداری کنید).
+ به هیچ وجه آیدی (**id**) های موجود در فایل *activity_main.xml* را تغییر ندهید.
## [ فرمت فایل ارسالی ]
# توجه کنید که
+برای بررسی کدهای خود میتوانید از سرور محلی یا کتابخانههای موجود برای اندروید جهت شبیهسازی سرور استفاده کنید.
+ برای ارسال پاسخ، دقت کنید **پوشه `app`** موجود در ریشه فایلهای پروژه، باید **در ریشه فایل زیپ ارسالی** قراربگیرد.
+ نوع، نام و محتویات اولیه کلاسهای موجود در فایل پایه را به هیچ وجه تغییر ندهید/حذف نکنید. (اضافه کردن بلامانع است.)
+ پروژه ارسالی شما میتواند فایل های اضافه بر فایلهای موجود در پروژه پایه داشته باشد؛ این فایل ها باید بطور مستقیم یا غیرمستقیم در پوشه ```main``` قرارگرفته باشند.
+ امکان تغییر در فایل ```manifest``` وجود دارد.
+ درصورت استفاده از کتابخانههای ثالث جهت ارتباط با سرور، کد شما توسط سیستم داوری مردود اعلام میشود.
ساختار فایل ارسالی(فایلهایی که باید تغییر دهید با ----> نمایش داده شده اند، همچنین امکان افزودن فایل به ساختار ارسالی زیر وجود دارد اما از اعمال تغییر در محتویات پوشه ```layout``` جداً خودداری کنید):
```
<your-zip-name>.zip
└───app
├───libs
└───src
└───main
│ AndroidManifest.xml
│
├───java
│ └───quera
│ └───androidchallenge
│ └───com
│ └───onlineguessword
│ │ MainActivity.java <------
│ │
│ └───models
│ BaseURL.java
│
└───res
├───drawable
│
├───drawable-v24
│
├───layout
│ activity_main.xml
│
├───mipmap-anydpi-v26
│
├───mipmap-hdpi
│
├───mipmap-mdpi
│
├───mipmap-xhdpi
│
├───mipmap-xxhdpi
│
├───mipmap-xxxhdpi
│
└───values
colors.xml
strings.xml
styles.xml
```