Домашно: Object-Oriented Programming - коментари и впечатления
Най-после стигнах до това домашно и меко-казано, съм във възторг :)
Не помня да съм се забавлявал толкова с писане на код, от студентските години с асемблер (не че съм писал много, но там всеки момент се помни ).
Много добре подбрани задачи, с нарастваща сложност и постепенно въвеждане на новите неща!
Тъкмо приключих с трета задача, по която загубих най-много време за удовлетворяване на входно-изходните ѝ условия.
Получи се нещо такова:
------------------------------
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:
Ето няколко от рандом генерираните ентрита:
..............................
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
Като си се заиграл, направи нещо, което намира всички persons, на които имената им започват с определена буква. Можеш ли да го направиш да ги намира, без да търсиш из всичките имена, а директно да извеждаш имената, които почват със съответната буква (ще се налага при всяко създаване на запис да правиш нещо) :)
Интересно предложение! :)
Предполагам, трябва да се направи без използването на двоично дърво или хеш таблица?
ЕДИТ:
Най-простият вариант, за който се сещам е масив от 26 вектора (по един за всяка буква) с пойнтъри към Person обектите, чиито имена започват с тази буква... Или направо вектори от стрингове с имената, ако това е единствента информация, която ще ни трябва при извеждането.
Ами, хеш таблица или дърво може да ползваш, но в конкретния случай има по-ефикасен подход. Забележи, че имаш краен, при това сравнително малък брой символи, които може да са първата (или която и да е) буква в едно име (в порядъци по-малко от броя имена, които генерираш) - пробвай да ползваш това. В някакъв смисъл, това, за което намеквам е много специален случай на хеш-таблица, но не е самата структура данни от стандартните библиотеки :)
Едитнах си горния пост, докато си писал твоя...
Би ли коменетирал дали съм на прав път с идеята си там? :)
Да, точно това е идеята
Добре, приемам предизвикателството! :)
Готово! :)
Имплементацията на тази част от задачата: https://pastebin.com/VmCyKvvj
Кодът в действие:
------------------------------
Enter number of random persons to generate: 100
Created 100 new persons.
------------------------------
0 - Exit
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...
10- System Information
11- Export all persons to file...
12- Export all registrations to file...
13- Reset all data
14- Save all data to file...
15- Restore all data from file...
16- Automated test
17- List persons by start name letter...
18- Persons statistics by start name letter
Enter your selection: 18
------------------------------
A : 7
B : 5
C : 4
D : 1
E : 8
F : 2
G : 6
H : 2
I : 4
J : 2
K : 5
L : 5
M : 3
N : 1
O : 5
P : 4
Q : 10
R : 1
S : 3
T : 5
U : 9
V : 1
W : 2
X : 4
Y : 6
Z : 5
------------------------------
0 - Exit
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...
10- System Information
11- Export all persons to file...
12- Export all registrations to file...
13- Reset all data
14- Save all data to file...
15- Restore all data from file...
16- Automated test
17- List persons by start name letter...
18- Persons statistics by start name letter
Enter your selection: 17
------------------------------
Enter first name letter: l
..............................
Name: Larry Purple
Age: 41
ID: 10000015
..............................
Name: Larry Gray
Age: 29
ID: 10000017
..............................
Name: Larry Blue
Age: 20
ID: 10000070
..............................
Name: Larry Purple
Age: 55
ID: 10000099
..............................
Name: Larry Black
Age: 21
ID: 10000108
------------------------------
Ето и статистика по първа буква за 1малко над 10 000 000 Person обекта:
18- Persons statistics by start name letter
Enter your selection: 18
------------------------------
A : 384149
B : 384447
C : 384949
D : 385041
E : 384219
F : 385905
G : 385543
H : 384392
I : 385482
J : 385288
K : 384265
L : 385580
M : 385025
N : 384444
O : 384290
P : 383229
Q : 384065
R : 384339
S : 384312
T : 384959
U : 384600
V : 384730
W : 384150
X : 384276
Y : 384867
Z : 383564
------------------------------