Loading...
MartinBG avatar MartinBG 4803 Точки

Домашно: Object-Oriented Programming - коментари и впечатления

Най-после стигнах до това домашно и меко-казано, съм във възторг :)

Не помня да съм се забавлявал толкова с писане на код, от студентските години с асемблер (не че съм писал много, но там всеки момент се помни laugh).

Много добре подбрани задачи, с нарастваща сложност и постепенно въвеждане на новите неща!

Тъкмо приключих с трета задача, по която загубих най-много време за удовлетворяване на входно-изходните ѝ условия.

Получи се нещо такова:

------------------------------
1 - List all persons
2 - List all registrations
3 - Change person name...
4 - Change person age...
5 - Change car registration...
6 - Generate random persons...
7 - Generate random registrations...
8 - Create a new person...
9 - Create a new registration...
0 - Exit

Сега като гледам листа, май ѝ липсва само експорт към файл. :)

Накрая - за разкош, реших да я напъна здраво с функциите за рандом генериране на Person и Registrations. Открих си един краш проблем (вектори с референции към локална памет не са добра идея), и след фиксването му издържа без крашове до 200000 потребителя и 100000 регистрации (повече не ми се занимава). Unit/load тестовете са хубаво нещо! :)

Приеснява ме, обаче, следното нещо - времето, което ми отнема решаването на задача като третата е горе-долу толкова, колкото ще имаме и на изпита. Надявам се там задачите да са по-фокусирани върху конкретни проблеми, а не толкова "творчески", че ще го закъсам! :)

 

Интересно ми е да чуя и мнения от колеги относно това домашно.

 

Поздрави!

 

EDIT:

Ето няколко от рандом генерираните ентрита: cheeky

 

..............................
Registration Number: AU-24901
Manufacturer: BMW
Model: 3 Series
Horsepower: 49
.....
Owner details:
Name: Ivan Pink
Age: 21
ID: 24502

..............................
Registration Number: AU-28292
Manufacturer: Lexus
Model: RX 350
Horsepower: 27
.....
Owner details:
Name: Alex Black
Age: 32
ID: 21375

..............................
Registration Number: AU-316
Manufacturer: Ford
Model: Mustang
Horsepower: 39
.....
Owner details:
Name: Peter Gray
Age: 38
ID: 142

1
C++ Programming 26/03/2017 16:15:41
MartinBG avatar MartinBG 4803 Точки

3-та задача с 100 000 000 presons и 50 000 000 регистрации изяде над12GB памет laugh, но се държи:

 

1
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Като си се заиграл, направи нещо, което намира всички persons, на които имената им започват с определена буква. Можеш ли да го направиш да ги намира, без да търсиш из всичките имена, а директно да извеждаш имената, които почват със съответната буква (ще се налага при всяко създаване на запис да правиш нещо) :)

1
MartinBG avatar MartinBG 4803 Точки

Интересно предложение! :)

Предполагам, трябва да се направи без използването на двоично дърво или хеш таблица?

 

ЕДИТ:

Най-простият вариант, за който се сещам е масив от 26 вектора (по един за всяка буква) с пойнтъри към Person обектите, чиито имена започват с тази буква... Или направо вектори от стрингове с имената, ако това е единствента информация, която ще ни трябва при извеждането.

0
28/03/2017 01:02:57
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Ами, хеш таблица или дърво може да ползваш, но в конкретния случай има по-ефикасен подход. Забележи, че имаш краен, при това сравнително малък брой символи, които може да са първата (или която и да е) буква в едно име (в порядъци по-малко от броя имена, които генерираш) - пробвай да ползваш това. В някакъв смисъл, това, за което намеквам е много специален случай на хеш-таблица, но не е самата структура данни от стандартните библиотеки :)

0
MartinBG avatar MartinBG 4803 Точки

Имам няколко неясноти относно условието на 4-та здача:

 

1. Очаква ли се броят на обектите в една звездна система да бъде променян? Това ми се струва логично от... астрономическа гледна точка. laugh С развитието на технологиите (или промяна на правилата за категоризиране на обектите), ще бъдат откривани нови обекти, които евентуално ще искаме да добавим.

 - Трябва ли да можем да вмъкваме обекти между два други, вече дефинирани за звездната система или пък

 - да трием обекти, като в двата случая актуализираме индексите на оставащите обекти? 

 

2. В условието изрично се казва, че в една звездна система ще има само едно слънце (с индекс 1), което не е точно така (Alpha Centauri). Какво се очаква да прави програмата, ако:

- Добавим нов обект от тип star, към система, която вече има дефинирана звезда?

- Променим статуса на обект от unknown към star в същата ситуация?

- Няма звезда и ре-дефинираме unknown, с индекс различен от 1, към star?

 

3. "The program should store the info in a text file (each time an object is created)". Това условие предполага запис към файл в "реално време", но какво трябва да е поведението в случай на промяна на данни за вече записан обект?

1
30/03/2017 22:39:28
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

5-та задача искаш да кажеш :)

1. Като цяло задачата не е толкова ориентирана към това да поддържате правилни един спрямо друг записите (като се преименува системата на една планета да се преименуват всички, да се променят позициите на планети ако се вмъкне планета) - идеята основно е да създадете клас с правилните полета и достъп до тях, на базата на тази информация. Но ако искаш да се занимаваш, да, добро упражнение би било да може да се вмъкват/изтриват планети и това да обновява информацията за тези, които са в същата система

2. Това с едната звезда отново е улеснение, за да не трябва да се занимавате с този случай. Ако искаш да си поиграеш - направи слънцата да се различават едно от друго по буква, докато позицията им си остава 1. Тоест ще имаш Alpha Centauri-1a, Alpha Centauri-1b и т.н. - като буквата се определя автоматично от програмата, тоест потребителя не може да каже кое е a, кое е b и т.н., а тези букви се слагат спрямо реда добавяне на съответното слънце. Редефинирането на unknown обект към звезда по-скоро трябва да е невалидна операция (с идеята, че ако видиш нещо първо ще видиш звезда, после планети, евентуално може да се сетиш, че звездата е двойна, ама няма как да имаш звездна система без първо да имаш... звезда :D)

3. Добавяне и редактиране на обекти трябва да обновява файла, да. Лесният начин (и водещ до bad performance, който обаче е приемлив за тази задача, защото целта ѝ е просто упражнение на ООП) е просто да overwrite-ваш целия файл всеки път. Ако искаш да си поиграеш, потърси за seekp методите на stream-овете. Даже най-добре направи клас, който се занимава с писане/четене от файла ти (това е хубаво да го имаш по принцип, не само като допълнителна задача) и накарай този клас да може като му дадеш обект за запазване, той да го намира във файла и да го обновява - ако има такъв, ако не просто да създава нов.

Поздрави,

Жоро

4
MartinBG avatar MartinBG 4803 Точки

Да, 5-та задача имах предвид. :)

Благодаря за уточненията и насоките!

С подобрените условия тази задача стана доста по-интересна за имплементиране: класове, наследяване, енумератори, безименни структури... Дотук 400 реда код, а половината ми методи още са само на декларации laugh

0
01/04/2017 00:10:25
MartinBG avatar MartinBG 4803 Точки

Сега забелязах, че липсват указания в условието дали и как да се показва object type информацията.

Реших да импровизирам и я добавих към пъллната информация за обектите.

 

Ето как изглежда към момента една random генерирана звездна система с две слънца:

System-0-1a {type: Star, mass: 18633.7, radius: 6334}
System-0-1b {type: Star, mass: 12429.6, radius: 17421}
System-0-2 {type: Gas giant, mass: 15835.1, radius: 11478}
System-0-3 {type: Unknown, mass: 4694.3, radius: 15141}
System-0-4 {type: Unknown, mass: 5488.67, radius: 21726}
System-0-5 {type: Gas giant, mass: 32446.6, radius: 14604}
System-0-6 {type: Unknown, mass: 19949, radius: 25667}
System-0-7 {type: Gas giant, mass: 28736.3, radius: 23811}
System-0-8 {type: Gas giant, mass: 557.667, radius: 2995}
System-0-9 {type: Rocky planet, mass: 5788.33, radius: 28145}

1
01/04/2017 04:09:17
krasio12356 avatar krasio12356 19 Точки

На мен ми отне няколко дена. Хем ползвам СТЛ. Не мога да пиша бързо. 

Ако за 4 часа трябва да реша 4 задачи, те трябва да са елементарни. 

0
MartinBG avatar MartinBG 4803 Точки

Да... И аз не съм от бързите.

Ако задачата е по-засукана, се бавя, защото чета в и-нет за нещата, които не знам, а ако е по-елементарна си намирам начини да я разнообразя и направя "по-интерсна". blush 

 

Например 5-та задача я писах сигурно 2 дена - то не бяха (ненужни, но интересни) усложнения на условието, рандом генератори, basic unit/load tests, вложени менюта за вход-изход, един куп класове и структури и т.н... над 1300 реда код, като за малко да не успея да изпълня едно от основните изисквания в задачата - запис и възстановяване на данните от файл (написах ги за 30-ина минути, тъкно навреме, за да предам домашното). Лудница! laugh

0
03/04/2017 00:11:53
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.