Софтуерно Инженерство
Loading...
+ Нов въпрос
Yulia avatar Yulia 1343 Точки

[Homework] C# Basics - C# за напреднали

Виждам, че още няма тема за домашното "C# за напреднали",  затова нека започна аз.

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

 

Problem 1. Fibonacci Numbers
Problem 2. Prime Checker
Problem 3. Primes in Given Range
Problem 4. Difference between Dates
Problem 5. Sorting Numbers
Problem 6. Longest Area in Array
Problem 7. Matrix of Palindromes

 

//TODO
Problem 8. * Longest Non-Decreasing Subsequence
Problem 9. Remove Names
Problem 10. Join Lists
Problem 11. Count of Letters
Problem 12. Count of Names
Problem 13. Average Load Time Calculator
Problem 14. Longest Word in a Text
Problem 15. Extract URLs from Text
Problem 16. * Counting a Word in a Text
Problem 17. * Perimeter and Area of Polygon

 

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

iordan_93 avatar iordan_93 SoftUni Team Trainer 407 Точки
Best Answer

Понеже малко хора са решили 13-та задача, ето го моето решение: source.

В началото чета report-a от файл и вземам всеки отделен елемент (като приемам, че всеки елемент е на нов ред). Имам речник с ключ URL-a и стойност списък от времената за зареждане на съответния URL.

В основния цикъл попълвам речника по стандартния начин: проверявам дали ключът за дадения URL съществува; ако това е така, добавям времето за зареждане в неговия списък, а ако не е - правя нов списък за него.

Накрая изкарвам всеки ключ със средната стойност на списъка му с времена за зареждане (Average() е метод от System.Linq, който прави това).

Мисля, че кодът може да се оптимизира доста (да не държи списъци с времената, а само по два елемента - count и average, да не чете целия файл наведнъж (защото може да е много голям) и т. н.), но засега това ме устройва :).

3
nikolaykk avatar nikolaykk 94 Точки

Ето и моето решение на задачата, но малко времето надвишава.

http://pastebin.com/D9v4WMaJ

0
ZvetanIG avatar ZvetanIG 925 Точки

Колеги здравейте,

нещо немога да разбера, какво точно се иска в задача 8 /Longest Non-Decreasing Subsequence/. Някой може ли да обясни?

2
Samuil.Petrow avatar Samuil.Petrow 1551 Точки

Трябва да се намери най-дългата подредица отляво надясно като подредица в случая не се възприема последователност от поредни числа, а като последователност от по-малък към по-голям индекс : (примерно a[0], a[2], a[4] се счита за подредица)

Разгледай примерите внимателно, става ясно от тях :)

1
ZvetanIG avatar ZvetanIG 925 Точки

Благодаря! Разбрах го.

Но следвайки логиката на задачата 

 

 

при вход  1 1 1 2 2 2 програмата трябва да върне  1 1 1 2 2 2, защото това е най-дългата ненамаляваща поредица.

При вход 1 1 1 3 3 3 2 2 2 2   изходът трябва да е 1 1 1 2 2 2 2 .

2
milen.stefanov avatar milen.stefanov 40 Точки

Съгласен съм с ZvetanIG. Малко е подвеждащо условието.

0
StanDimitroff avatar StanDimitroff 90 Точки

Колеги на първа задача в редицата на Фибоначи първото число не е ли 0, а второто 1? И реално нулев член май няма.Защото аз ги смятам 0-та да ми първи е член, 1-втори, съответно nextNum=1 и т.н.Клик. Ако бъркам моля да ме поправите smile

0
Yulia avatar Yulia 1343 Точки

Амии изкарва грешни резултати при дадените тестове ако вадиш 0-та и 1-цата от поредицата, защото тогава пишеш цикъла да е до <= n-2, а то се оказва недостатъчно. Поне не и според даденият input и output. По-скоро може да приемем, че поредицата започва от 1 и така не се брои предварителното събиране от нулата. Иначе решението е абсолютно вярно, само махни изваждането от n.

1
StanDimitroff avatar StanDimitroff 90 Точки

Мда явно такъв е бил замисълът-да се брои от първото новообразувано число. 

0
topalovr avatar topalovr 16 Точки

 

Виж най-добре тук Цък

Надявам се да ти се изясни :)

0
GoShow avatar GoShow 595 Точки

В задачата Difference between Dates формата е изрично зададен : dd.MM.yyyy. В твоя вариант този вход хвърля exception.Иначе решението работи.

0
Yulia avatar Yulia 1343 Точки

Хмм, какво точно въвеждаш, та хвърля exception? Защото ги въвеждам данните точно както в примерите, пък не ми е гърмяло...

Прегледах пак тази страничка, която ми беше много полезна за всички задачи, свързани с DateTime и не открих къде във форматирането може да е евентуалната грешка. По-надолу си писал, че програмата трябва да работи с формат dd.MM.yyyy, а работи с mm.dd.yyyy. Е, да, ама 'MM' e за месец, а 'mm' е за минути, нали? Или греша?

MMM     display three-letter month
ddd     display three-letter day of the WEEK
d       display day of the MONTH
HH      display two-digit hours on 24-hour scale 
mm      display two-digit minutes
yyyy    display four-digit year

M, MM:These display the months in numeric form.
One M does not have a leading zero on it.
Two Ms have a leading zero.

MMM:This displays the abbreviated three-letter form of the month represented in the DateTime.

MMMM:This displays the full month string, properly capitalized.
An example is "January".

 

5
GoShow avatar GoShow 595 Точки

Ами когато въведа 17.03.2014  по този начин и ми хвърля ексепшън, ако се въведе обаче 03/17/2014 т.е. mm.dd.yyyy и задачата ти работи.Това имах предвид.Иначе благодаря за линка, ще го погледна и аз щото и на мен не ми се получава с тия дати :)

1
Yulia avatar Yulia 1343 Точки

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

Случаен пример:

3
sety.stoyanova avatar sety.stoyanova 4 Точки

Здравейте,

това домашно задължително ли е?

След като няма да са на него задачите от изпита и е за напреднали?

 

2
GoShow avatar GoShow 595 Точки

В лекцията беше зададен същия въпрос и Наков обясни,че в края на краищата ще се отрази в точките, защото последния изпит е на 14- ти, а срока за предаване на домашното е 13- ти, ако не се лъжа. Така или иначе всички тези неща ще се учат много по-задълбочено след това, а и матриците и масивите са много полезни за изпита.Аз те съветвам да го предадеш, дори и да не са всички задачи.Успех!

 

3
topalovr avatar topalovr 16 Точки

Малко решения и от мен...

1. Fibonacci

2. Prime Number

3. Prime Number In Range

4. Difference Dates

5. Sorting Numbers

6. Longest Area

7. Matrix Of Palindromes

9. Remove Names

10. Join List

11. Count Of Letters

Засега съм до тук, останалите - "TODO"

6- задача леко я пооомазах, не е на 100% работеща, но ако някой има препоръка, критики - приемам всякакви :)

11- задача не съм сигурен дали това е начина на решение на задачата според условието

0
GoShow avatar GoShow 595 Точки

4 задача не приема входа, който е поставен в условието dd.MM.yyyy, а работи mm.dd.yyyy.Относно 6-та аз самия още не съм я довършил но имам съвет след входа Array.Sort() и след това обхождане по този начин всички еднакви стрингове ще са един до друг 1 променлива за брояч и 1 за най-дългата поредица, също и една да се пази текущия стринг.При всяка смяна на стринга брояча се нулира и проверка, дали е по-голям от ностоящата най-дълга поредица, ако е така най- дългата = брояча, а той се занулява и се запазва текущия стринг. :) не знам дали ме разбра но нещо от сорта:

string[] input = new string[n];

string currString = ""

int currCount;

int maxCount;

if currCount > maxCount

maxCount = currCount

currString = input[i];

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

 

 

2
GoShow avatar GoShow 595 Точки

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

1
topalovr avatar topalovr 16 Точки

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

За 6 задача ще я огледам отново по натам като ми остане време, интересен вариант си предложил

0
StanDimitroff avatar StanDimitroff 90 Точки

В четвърта задача май трябва да се промени формата на "d.MM.yyyy"(ако се прави проверка за формата), защото хвърля изключение на последните два примера Problem 4

1
HPetrov avatar HPetrov 822 Точки

Значи почти довърших 8-ма задача с "*" и тестовете ми ги вади правилни с едно изключение. На последния тест "11 12 13 3 14 4 15 5 6 7 8 7 16 9 8" трябва да ми извади -> "3 4 5 6 7 8 9", но на мен ми вади "16" вместо "9" накрая. Прочетох 8 пъти условието дума по дума и резултата ми отговяря на абсолютно цялото условия, включително условието "In case of several longest non-decreasing sequences, print the leftmost of them." Окей. Допускам, че може да има грешка просто за изхода в домашното, но пробвах на друга, много подобна задача от учебника и там ми дава същия резултат. Условието на нея е също да се изведе максималната поредица от нарастващи елементи като тестовата поредица е "9 6 2 7 4 7 6 5 8 4" и output-а трябва да е "2 4 6 8". На мен ми вади "2 4 7 8", както би трябвало да е. Тествах си програмата с всякакви поредици, който можех да измисля и всичко изглежда работи точно. Та искам да чуя и вашето мнение по въпроса :)

 

Edit 1: Ето линк към решението на задачата ми. Сложил съм коментари на доста места където съм решил, че има малко нужда от пояснение. Като цяло идеята ми се върти около това, че има "X" на брой комбинации от поредици от числа в една голяма поредица. Използвам репрезентацията на дадена комбинация в бинарен вид, и където има "1"-ци, вземам числата от масива на този индекс и вече си играя малко с тях. За сега работи коректно, но вече като input-а стане малко по дълъг (20+ числа) малко повече отколкото ми се иска се бави програмата.

5
ZvetanIG avatar ZvetanIG 925 Точки

На мен ми се получи същото като при теб. Според мен това е така, защото "3 4 5 6 7 8 16 е със същата дължина като "3 4 5 6 7 8 9, но се намира по наляво.

0
petio.bs avatar petio.bs 51 Точки

Програмата ви вади такъв output, защото фактически това е the leftmost sequence.

0
aslv1 avatar aslv1 304 Точки

В книгата на Преслав Наков и Панайот Добриков „Програмиране = ++Алгоритми“ е обяснен алгоритъмът, необходим за 8ма задача.

П. П. Колегата напомни да отбележа, че става дума за тема 8. 2. 7. Най-дълга ненамаляваща подредица, страница 517.

10
ScreeM avatar ScreeM 19 Точки

Здравей,

Пробвай в първата си задача да напишеш 2 и ще ти излезе 2, а не би трябвало, защото 2рото число е 1. Пробвах да го оправя, но не можах. Успех :)

0
Yulia avatar Yulia 1343 Точки

Благодаря за забележката! Днес като решавах Tribonacci, ми гръмна на един от тестовете и грешката беше точно такава: търсеше че число, по-малко от началното в цикъла и за целта трябваше да въведа условие преди него, което проверява дали въведеното число е 1, 2 или 3 и съответно да върна променливите за firstNum, secondNum и т.н от поредицата. По същата логика, и тук фикснах решението си.  Не предполагах преди, че може да има такъв тест. (Решение - Fibonacci)

3