[C#] Домашно Arrays - 4 Задача


0

Здравейте допускам някъде много глупава грешка и променливата Bestlen не се променя ? Подскажете ако някоя я вижда 

Ето и условието

Напишете програма, която намира максимална редица от последова-
телни еднакви елементи в масив. Пример: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} 
 {2, 2, 2}.

http://pastebin.com/3aLiqW1Z  при положение , че искам да чета числата от конзолата.

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

Благодаря!




Отговори



0

Като цяло грешката ти е, че си вкарал проверката в цикъла в който си въвеждаш числата и докато въвеждаш първото число, няма как да провериш дали то не е равно на второто, все пак VS няма как да хвърли боб, за да ти познае кое е следващото число. Ето ти кода оправен http://pastebin.com/LrhHfeB4

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


от Hristo.B (3885 точки)


0
Стана , но ако въведа например 10 числа : 5455611111 Не работи правилно...

от koko_9898 (208 точки)

0
http://pastebin.com/LrhHfeB4 сега вече мисля, че работи коректно.

от Hristo.B (3885 точки)


1

Проблемът е в това, че алгоритъмът и четеното на масивът са в един и същи цикъл. По този начин в началото ти си прочел елемента на масивът " i " но проверяваш този елемент със следващият , който все още не е прочетен и следователно е равен на 0.

Ето мойто решение : http://pastebin.com/kVTXiD1n


от tddhome (3086 точки)


1

Извади началното въвеждането на елементите в отделен цикъл, за да не става така, че четеш от конзолата елемента с индекс i и веднага искаш да го сравниш със следващия елемент, който още не си прочел. Освен това бих те посъветвала да сложиш допълнително условие (i != table.Lenght-1) към if (table[i] == table[i + 1]), за да не стане така, че да ти даде IndexOutOfRangeException. Също така още при първия for-цикъл, където четеш елементите, щом даваш на i начална стойност 0, значи трябва да ходи до < table.Lenght или до <= table.Lengh - 1. В против случай записваш с един елемент по-малко от желания брой.


от kalbo_17 (2709 точки)


1
Колеги, аз до колкото разбирам в условието се иска да се покажат точно кои числа се повтарят най-много, а не само техният брой.
Както е написано "Пример: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} -> {2, 2, 2}." Това ми говори, че трябва да изведа като резултат {2, 2, 2}, а не броя им "3".
Не знам дали нещо аз не разбирам, поправете ме ако греша.



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

от desislavst (455 точки)

0
Според мен си прав, плюс това в слючая е по-добре програмата да изкарва по-пълен отговор.

от stanev.plamen (1143 точки)



2

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

Дано ви бъде полезно.

 

http://pastebin.com/UinXW6Ck




0
Точно такова нещо мислех и аз. Променливата Start ти пази точната цифра, която се е повторила най-много пъти нали? Само не знам защо си я кръстил Start, но явно ти е било удобно така :) Мисля, че това е правилното решение. Аз в моето решение бях пропуснал да правя тая проверка с CurrentLenght > MaxLenght, но ще си го оправя после. Мерси много колега!


0
Да, точно така. Променливата се казва start,защото я присвоявам на старт елемента на редицата, която търсим, може би не е подходящото име всъщност... Радвам се, че съм билА полезнА.. :):):)




1

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

Ако има два различни елемента, които се повтарят еднакво най-много пъти, ги изписва всичките.

https://gist.github.com/ttitto/5972527
 


от ttitto (1950 точки)


0
Препоръчвам ти да не ползваш dynamic т.к. не се счита за добра практика. Ако искаш да може да приемеш различни по тип данни въж Genneric Types и Methods. Също така не пиши коментарите на кирилица, а на английски.
И една препоръка за форума - ползвай някой tool за пастване на код ( PasteBin, Gist и т.н. ) т.к. така кода е трудно четим и прави ненужно дълги постове.

от Teodor92 (13062 точки)

0
Кода ще го вкарам в pastebin, веднага щом получа активационния email. Благодаря за останалите препоръки!

от ttitto (1950 точки)



1

Заповядайте и от мен едно решение, което показва освен точно кои цифри се повтарят, а също и техният брой.

http://pastebin.com/fxghnR86

Надявам се да съм бил полезен.




0
Здравей, разглеждайки кода ти видях, че в един от граничните случаи (ако всички елементи се повтарят само по веднъж) изкарва следният резултат: "The max repeating sequence is: <0> ---1 time" ; Аз също не бях отчела вероятността, че всички елементи биха могли да се повтарят по веднъж и си оправих програмата. Можеш да я видиш тук: http://pastebin.com/4PBFhGSd Когато обаче всички елементи се повтарят повече от веднъж еднакво, тогава моята програма изкарва само първата намерена последователност. Например ако числата са: 111,222,333,444 - и моята програма изкарва само: 111; Не знам дали това не е бъг и дали не трябва да се направи да изкарва всички последователности?


0
Ами аз не мисля, че трябва да изкарва всички, защото в условието се иска да изкара числата, които най-много се повтарят, а тук няма такива които най-много се повтарят. Следователно би било редно да изкара съобщение "Няма максимален брой повторения!" Видях, че кодът ти е сходен с моя, харесва ми проверката на края и съобщението дали има повторения или не :) Но аз не мога да си обясня защо при повторения на всички изкарва този глупав резултат... не намирам причината. Струва ми се невъзможно, защото това "<0>" всъщност изкарва числото от масива, което е повторено и го печата N на брой пъти. След това пише колко повторения има "MaxRepeats" и то няма как да е =1, невъзможно е да се рестартира, защото има условия за това. Рестартира се само ако следващото число от масива е различно от предходното, тоест ако няма повторение... Много странно... ще го прегледам и преработя пак, явно съм пропуснал нещо :)




3

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

Ето едно решение и от мен  -->CLICK<-- 

Първоначално потребителят въвежда големината на масива /броят елементи които ще съдържа/ необходима, за да му се задели памет. След това с for цикъл инициализираме всеки един от елементите със стойности въведени от потребителя. Принтираме полученият масив на екрана, за да може потребителят по-лесно да направи проверка когато се изведе крайният отговор. Следва дефиниране на 3 променливи: - една която ще пази стойността на елемент от масива с най-много повторения до момента; променлива, пазеща моментната дължина на повторения на въпросният елемент, както и трета променлива, която пък ще пази най-добрата дължина. Последните 2 променливи ще имат начална стойност 1, защото когато се открият последователни равни елементи, вече ще имаме дължина с големина 2. Въртим фор цикъл от 0 до предпоследният елемент на масива, защото винаги ще проверяваме с един елемент напред и има опасност да излезем от границите на масива. При откриването на 2 равни последователни елемента, увеличаваме стойността на променливата пазеща временната дължина с 1. Сравняваме после тази променлива с променливата пазеща най-добрада дължина досега и ако евентуално е по-голяма й присвояваме стойност равна на тази пазеща временната дължина. Присвояваме на променливата пазеща стойността на елемента с най-много повторения тази на текущият елемент на масива /тук малко объркано звучат нещата, но като се погледне кода всичко се изяснява :))/. Ако обаче след серия последователни равни елементи нямаме повече такива, то е необходимо да върнем началната стойност на променливата пазеща текущата дължина на 1. Така след като се извъртят всички итерации на цикъла ние вече трябва да имаме елементът който се повтаря най-много, както и броят пъти които го прави. Тук посредством още един for цикъл печатаме този елемент толкова на брой пъти колкото се повтаря, като гледаме изходът да е във форматът, който е показан в условието на задачата :]


от Vlado_XXX (944 точки)


1

http://pastebin.com/v0Cgjtke Първо съм намерил сикуанса повтарящ се най- много пъти после намирам кое точно е числото и съм принтирал с един фор цикъл като ползвам сикуанса за граница.




2

Това е мойто решение http://pastebin.com/R13CwEXR.

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


от tddhome (3086 точки)