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

Judge Assignment 2 (JA2) - Условия, Срокове, Въпроси, Коментари

Здравейте колеги,

EDIT: ето линк към състезанието - https://judge.softuni.bg/Contests/538/Judge-Assignment-2-JA2-OOP

Както обещах на упражненията, днес пускаме Judge Assignment 2, само че понеже не сме готови с подготовката на Judge системата още, днес ви пускам само условията, а в Judge constest-а ще можете да ги предавате от събота, 10:00 сутринта (както направихме и за първия judge assignment) - крайният срок остава непроменен. Ще ви дадем линк когато състезанието в Judge е готово.

Засега качвам условията в .shared папката в Dropbox (https://tinyurl.com/cpp-softuni-shared), и по-конкретно тук: https://www.dropbox.com/home/Projects/Cpp-Programming/.shared/Judge-Assignment-2-JA2. Възможно е да има леки изменения по ограниченията за време и памет, както и изменения ако открием бъг в някое решение или условие преди да пуснем състезанието в Judge.

Този Judge Assignment е различен от предишния с това, че освен условия, за някои задачи имате допълнителни файлове с код, които са достъпни за решенията ви. Тези "скелети" на решението са предназначени да ползвате от кода си, за да решите задачите. В някои случаи (като например задача 1) тези файлове имат main() функция, което означава, че вашият код ще трябва да допълни някакъв съществуващ код, за да може съществуващия код да работи. Не трябва да редактирате никой от тези предоставени файлове, тъй като при submit системата ще ги overwrite-не с нейната версия. В Judge системата ще предавате .zip файлове съдържащи вашите файлове нужни за решение на задачата - системата ще компилира всички .cpp файлове в .zip-а който пратите, заедно с всички файлове от "скелета" на решението, в една директория.

Ето кратки описания на задачите:

JA2-Task-1-List - от вас се иска да напишете имплементацията на един клас List, който представлява свързан списък. Дадени са ви List.h файл, както и main.cpp файл който ползва List-а от List.h за да реши някаква задача. Вие трябва да напишете имплементация (например в List.cpp), която позволява на задачата да работи вярно. (Тази задача щеше да е Matrix, не List, но реших Matrix-а да го преместя за подготовка за изпита, вместо за това домашно, най-вече защото изглежда като повече код).

JA2-Task-2-Divisible-by-45 - трябва да намерите всички числа, които се делят на 45 и се намират между две числа зададени на входа (от включително, до не-включително). Даден ви е файл BigInt.h, който можете да ползвате ако искате.

JA2-Task-3-Populations - Дадени са ви населения на градове и числата L, H и M. Трябва да намерите бройката градове, за които има поне M други градове, чиито населения са между L и H пъти по-големи. L, H и М се въвеждат от конзолата, а населенията на градовете са предварително зададени във файла populations.txt. Тук ще трябва да сте малко по-изобретателни с решението.

JA2-Task-4-Closest-Towns - Дадени са ви имена и координати на градове в двумерното пространство. Трябва да изведете 2-та най-близки града по име.

Ако имате въпроси или коментари, задавайте ги в тази тема (така най-бързо ще ги видя и ще мога да ви отговарям)

Поздрави,

Жоро

Тагове:
5
C++ Programming 22/04/2017 13:52:11
fantom4e avatar fantom4e 24 Точки

Здравейте. Имам проблем  и незнам от къде идва, при мен първа задача 01.Лист ми дава правилен оутпут,  но като я кача  в judge system към отупут-а ми добавя осем нули.Не разбирам какво става прегледах кода уш всичко е наред.

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

Здравей,

Като цяло това, че при теб върви по един начин, а на система върви по друг начин, означава, че най-вероятно достъпваш неинициализирана памет, или освободена памет.

В твоето решение има едно място, на което може един от методите да не return-не нищо, въпреки, че трябва (виж си warnings от компилацията) - но не е това проблемът в случая.

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

Hint: като delete-неш нещо, вече нямаш достъп до него - ако си направил два указателя към едно и също нещо и изтриеш единия, другия пак не е валиден вече (представи си двама души да ти имат телефонния номер, обаче ти да си прекратиш договора с мобилния оператор - и двамата няма да могат да ти звънят - тоест те имат само номера ти, и ако договорът, който отговаря на този номер вече не е валиден, тогава на колкото и различни места да е записан този номер, няма как да му се обадиш).

Поздрави,

Жоро

0
fantom4e avatar fantom4e 24 Точки

Благодаря за помоща.Не съм сигорен но мисля че, проблема беше в копи-конструктора, опитвах се да направя проверка на неинициализирана променлива. Сега като се замисля е логично, че като this->head  го направя на нуллптр трябва и  this->size да стане 0.Оправих си също така и first метода. Имах доста проблеми с тази задача радвам се че одарих 100  точки :)
Благодарности отново.

0
IvanMitkov avatar IvanMitkov 20 Точки

Имам пробем с първата задача, но в частта от мейн, която е дадена.

while (listLine != "end")

istringstream lineStream(listLine);
        List currentList;
        int value;
        while (lineStream >> value)

Работя с visual studio ако това е важно, но в момента в който стъпи на реда  while (lineStream >> value) и прави сег фаулт.

ако създам листа над първия while Всичко си е ок.

Exception thrown at 0x0FAB3191 (msvcp140d.dll) in J1.exe: 0xC0000005: Access violation reading location 0x00000004.

Unhandled exception at 0x00A55A39 in J1.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

0
23/04/2017 18:41:51
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Това изглежда като да имаш проблем с конструктор или деструктор на твоя List - щом като го извадиш от цикъла работи, значи явно има проблем когато се инициализира и destruct-ва много пъти подред. Грешката надали се случва на метод от стандартната библиотека, по-скоро debugger-а най-вероятно не може да генерира добре дебъг символи и затова ти дава грешката там (или някаква оптимизация обърква дебъгера). Този конкретен access violation изглежда все едно се мъчиш да достъпиш някакъв адрес който е NULL + sizeof(int) (виж как грешката ти дават опит за достъп до 4-ти байт в паметта - Access violation reading location 0x00000004).

Авторското решение се компилира и работи под Visual Studio, така че не е проблемът с main файла. Виждам, че си опитвал да предадеш нещо, в което не следваш интерфейса от List.h, а наследяваш std::list - това не се компилира, защото в List.h е различна дефиницията, но освен това като цяло не е добре да наследяваш контейнери от стандартната библиотека, не са писани така, че да работят добре наследени и нямат виртуални деструктори. Ако правиш нещо такова в кода може това да ти създава seg fault проблема.

Без компилиращ се код пратен в judge системата ще е трудно да те насоча към реалния проблем

0
IvanMitkov avatar IvanMitkov 20 Точки

Да наследявам от лист някои неща, ще видя дали ще стане ако променя нещо. Просто листа който съм направил си работи прекрасно в други случай и реших че може да е някакъв проблем с istringstream ако се съчетае предполагам с нулевите пойнтери на листа , защото грешката излиза още преди да подам стойността на value към листа. Забива когато istringstream се опитва да чете value, а там единственото налично е чар арейя, който държи стринга

0
Jordan_Dobrev12 avatar Jordan_Dobrev12 336 Точки

За първа задача:

Във List.cpp файла , който трябва да имплементираме ние ...трява да напишем алгоритъма за сортиране ли ?

Може ли да се използва Buble sort алгоритъм ?

Като цяло не съм свикнал с това да ми се дава код и аз да го дописвам , странно ми е.

0
fantom4e avatar fantom4e 24 Точки

Здравейте. Знам че ставам досаден, но просто немога да разбера какво се случва.Трета задача отново при мене работи и ми връща правилен изход даже се вписвам и във времето, но пък като я пробвам в Judge System ми дава като изход 0.

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

Здравей,

Някой колега беше имал подобен проблем - за тази задача файла populations.txt НЕ Е на системата и не можете и да го качите. Тоест не можеш в решението си да ползваш четене от този файл. Трябва по някакъв друг начин да ползваш информацията, без да ползваш ifstream към някой файл. Просто казано, информацията, която ти трябва от populations.txt трябва по някакъв начин да ти е част от кода.

Поздрави,

Жоро

0
IvanMitkov avatar IvanMitkov 20 Точки

Имам един въпрос за STL дали има някаква книга където да е описано принципа по който работят алгоритмите, които могат да се намерят там. Това във връзка с третата задача, където успях да намеря нещо което върши работа, но бе малко въз основа на проба грешка, дали ще даде достатъчно скорост. В C++ Standard Library е дадено за някой, но има доста други, за които само се споменава какво правят, но не и как го правят, или поне дали работят в N , логN или нещо друго.

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

C++ стандартите не дефинират очаквано време за работа за всички алгоритми, което означава, че имплементациите (компилаторите) са свободни да ги направят за каквото време преценят. За повечето би следвало да дават, но пак - компилаторите могат да решат как да постигнат съответната сложност.

Повечето функции и повечето им имплементации (компилатори) съответстват на сложностите на стандартни алгоритми от компютърните науки. Ето един непълен списък:

- find, min, max, search и техните вариации - O(N)

- lower_bound, upper_bound, binary_search - базирани на двоично търсене - O(log(N)) ако ги пуснеш върху сортирана последователност И ако итераторите на последователността са Random Access Iterator (тоест ако контейнерът е прост масив или array или vector или deque)

- sort, stable_sort и подобни - O(N*log(N))

- за структури данни като map, set и т.н. бях оставил една таблица със сложностите на основните операции. По-пълно overview на сложността за структурите има тук: http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-summary.html

Почти всичко като алгоритъм в STL-а работи линейно, тоест O(N), с изключение на разните двоични търсения и сортирания. Моят съвет е като ползвате алгоритми, поне на първо време да ползвате от STL само сортиранията и двоичните търсения, а за останалите неща сами да си ги пишете - примерно find и неговите подобия, ако ги ползвате за vector, ще работят малко по-бавно от итерация по индекси.

Но ако искаш да имаш пълно разбиране, хвани някой курс или учебник по Структури данни и Алгоритми (Data Structures & Algorithms) - оттам ще разбереш основните алгоритми и структури данни и общо взето сам ще можеш да прецениш от документацията колко бързо работи нещо от STL, защото нещата в STL като цяло следват тези базови алгоритми и структури. Също така ще можеш да сметнеш твой алгоритъм колко бързо работи и т.н., а повечето алгоритми които ще пишеш ще се основават на комбинации между тези основни алгоритъми, така че в повечето случаи алгоритъмът ще е предимно твои и тук-там ще ползваш helpers от стандартната библиотека.

Поздрави,

Жоро

1
25/04/2017 23:10:14
IvanMitkov avatar IvanMitkov 20 Точки

Мерси много.

И линка е доста полезен

0
vlad.dinev avatar vlad.dinev 13 Точки

Привет,

Жоро, благодаря за задачите! Бяха много готини. Даже ако имах достатъчно дълга коса, за да мога да я хвана, сега щеше да липсва тук-там. Я признай, задачата с населението колко време я крои, за да стане толкова увъртяна? Ще се радвам да се срещнем на изпита.

Поздрави,

Владо

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

Здравей,

Няма грижи, скоро ще има още една партида задачи (за Judge Assignment 3), така че главоблъсканиците (главоскубанията?) не са приключили още.

Populations я кроих един ден, защото първо беше exoplanets и имаше десетина полета на всеки обект (https://en.wikipedia.org/wiki/List_of_exoplanets) и изискваше заявки за намиране по няколко от тези критерии. И в един момент се усетих, че мога само нея да я пусна за цял Judge Assignment, та затова я пренаписах с populations в опростен вид. Де да можеше така и в истинската работа :D ...

Поздрави,

Жоро

0
Wanker avatar Wanker 15 Точки

Чак тия дни стигнах до задачите, та сега да споделя мнение.

Първа задача - трудоемка, но със знанията до момента се решава сравнително бързо(без дебъгването и чуденето къде ми leak-ва memory). Втора и четвърта използват почти елементарна математика и ми се сториха лесни.

Истинското предизвикателство беше 3-та, доста се порових в нета как да оптимизирам решението, за да влезе в time limit-а.
Като се абстрахираш от цялостното условие, можеш да я сведеш до нещо сравнително тривиално.

Като цяло доста интересни задачи. :)

 

0
gydigydi avatar gydigydi 12 Точки

4 задача, 10 тест, някой има ли на идея какви стойности подава ?

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

Ето ти подсказка, не към стойностите, а към една грешка в решението ти, която предполагам ти причинява проблем:

Колко е разстоянието между точките (2, 1) и (3, 2)? Каква стойност ще сметне твоето решение?

Виждам, че и други колеги са допуснали същата грешка и на тях им излиза грешен 10-ти тест, така че е много вероятно това да е причината.

0
gydigydi avatar gydigydi 12 Точки

Благодаря!

Объркал съм името на метода. Понеже няма нужда да правя корен квадратен и променливите ми са целочислени по погрешка съм написъл метода който коренува getLength() и трябват float променливи. По начало го бях замислил да използвам getLengthSq() но съм написъл getLength() в програмата.. 

 

0
30/04/2017 14:06:38
gydigydi avatar gydigydi 12 Точки

Това нещо

List::List(const List& other)

и това

List& List::operator<<(const List& other)

според мен не се използват в програмата.

Така ли е?

 

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

Второто, тоест 

List& List::operator<<(const List& other)

наистина не се използва, тоест ако го махнеш пак ще работи.

Copy-constructor-а обаче определено се ползва - все пак предаваме копие на List обект на функцията mergeSortedLists - виж ако искаш лекцията Full C++ OOP, там говорихме за тези специални методи кога се викат. Него ако го изтриеш - програмата ще се компилира, обаче ще има memory проблеми и най-вероятно няма да работи вярно.

0
gydigydi avatar gydigydi 12 Точки

Благодаря!

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