Loading...
g.antonov avatar g.antonov 20 Точки

[Homework] Advanced C# - Arrays, Lists, Stacks, Queues - Problem 4 - Bad Code vs Good Code

Днес реших задача 4, но решението ми се стори прекалено сложно като код и реших да го преработя. Изненадващо, отне ми 5 минути и се получи толкова по-добре, че реших да постна двата варианта като демонстрация колко голяма разлика може да има от код до код, макар и крайният резултат да е същият - поне примерите дадени във файла с домашното работят еднакво и с двата варианта.

Грозно решение:
http://pastebin.com/2kf8tBqu

Хубаво решение:
http://pastebin.com/GpXwuPqK

 

Поздрави :)

3
C# Advanced 17/09/2015 13:26:42
Bojo96 avatar Bojo96 Trainer 147 Точки

Колега, можеш да оптимизираш малко, като махнеш проверката за < броя на елементите в масива - 1, като я добавиш директно в инициялизацията на for цикъла. Ако обаче го направиш така, след края на цикъла, трябва да принтираш един console.WriteLine от масива[дължината на масива минус -1], за да принтира и последния елемент, независимо дали е еднакъв с предишните няколко или не.

1
g.antonov avatar g.antonov 20 Точки

Да, вариант е, но дали наистина ще е оптимизация? Изразът в скобите винаги ще се evaluate-ва при всяка итерация на цикъла - и в единия и в другия случай процесорът пак ще пресмята колко е inputElements.Length и ще изважда 1 от този length. Дали evaluation-ът ще става в if-условието или във for, пак ще са същите сметки и пак ще стават при всяка итерация.

В този смисъл оптимизация би било да присвоим inputElements.Length на някаква променлива

int arrLength = inputElements.Length;

и после да пишем

for (int i = 0; i < arrLength; i++)

вместо както е сега

for (int i = 0; i < inputElements.Lenght; i++)

Така процесорът ще изчислява колко е length-ът на inputElements само един път, някъде извън цикъла и в цикъла тази стойност вече ще се ползва "наготово" изчислена.

Разбира се, всичко това е "for the sake of argument", защото говорим за C# а не за C примерно и не пишем за устройство със силно ограничена памет и бавен процесор.

1
Bojo96 avatar Bojo96 Trainer 147 Точки

До колкото съм запознат C# кешира било то arr.Lenght или arr.Lenght-1, когато е в цикъл и не го изчислява всеки път, както е например в JavaScript. Мисълта ми беше, че ако имаш тази проверка i<arr.Lenght-1 в if-а, тя ще се проверява n-1 пъти, което например при arr от 10 000 елемента, са 9999 допълнителни проверки, дали i < arr.Lenght-1, докато в другия случай проверката дали i < arr.Lenght-1 така или иначе минава във for-а и в този случай само трябва експлицитно да принтираш последния елемент, защото цикъла няма да го обхване. 
От друга страна е и малко по-качествен програмен код да не проверяваш едно и също нещо, когато знаеш, че n-1 на брой пъти ще се evaluate-не до true и само последния път ще даде false. 

2
Gabriela_banova avatar Gabriela_banova 12 Точки

На "хубавото решение " на мен ми дава IndexOutsideTheBoundsOfTheArray?:)

0
18/09/2015 20:31:03
Gabbs avatar Gabbs 80 Точки

Какъв input му подаваш?

Не би трябвало да дава такава грешка.

0
18/09/2015 22:48:25
Gabriela_banova avatar Gabriela_banova 12 Точки

ami tezi ot domashnoto- hi yes yes yes bye

 string[] input = Console.ReadLine().Split(' ').ToArray();

           for (int i =0;i< input.Length; i++)
            {
                Console.Write(input[i] + " ");
                if(input[i] == input[i + 1])
                {
                    Console.Write(" ");
                }
                else
                {
                    Console.WriteLine();
                }
                
                

             }

Moje da imam greshka nqkude,no ne q vijdam:)

0
19/09/2015 11:56:00
Gabbs avatar Gabbs 80 Точки

g.antonov има един допълнителен if( i < inputElements.Length-1), който проверява дали цикълът е стигнал до последния елемент. При теб я няма тази проверка и когато цикълът стигне до последния елемент, се опитва да изчисли input[i+1], което вече е IndexOutsideTheBoundsOfTheArray.

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