Професионална програма
Loading...
icko134 avatar icko134 0 Точки

Обработка на масив

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

Обработка на масив

Вие ще получите масив от низове и трябва да изпълните командите под тях. Вие можете да получите три команди:

  • Reverseобръща реда в масива
  • Distinctизтрива всички неуникални (повтарящи се) елементи на масива
  • Replace {index} {string}замества елемента на дадената позиция index  с низ string, който ви е даден

Вход

  • На първи ред,  получавате масив от символни низове string array
  • На втори ред ще получите броя на редове, които следват
  • На следващите n реда ще получите команди

Изход

Изведете масива в следния формат:

{1st element}, {2nd element}, {3rd element} … {nth element}

Ще се радвам, ако някой ми помогне.

Тагове:
0
Fundamentals Module
svetoslav_0 avatar svetoslav_0 1005 Точки

Здравей, 

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

Бих могъл да ти я обясня доста подробно и да те убедя, че се решава доста лесно :)

0
icko134 avatar icko134 0 Точки

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

https://pastebin.com/Y2JGykxx

И доста бих се радвал на подробно обяснение. :)

 

0
svetoslav_0 avatar svetoslav_0 1005 Точки

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

Дай ми няколко минути да опиша всичко по задачата :)

0
svetoslav_0 avatar svetoslav_0 1005 Точки

Понеже не знам от къде е взета задачата, имай предвид, че не се водя 1:1 с условието и Judge може и да не ти даде 100/100.
Така, първото нещо, което трябва да направим, е да си прочетем входните данни:

string[] arr = Console.ReadLine().Split();

Тази променлива ще съхранява нашия масив от думички -> прочитаме си един ред от конзолата, след което му прилагаме метода Split(), който взема този ред, който сме си прочели от конзолата и го разбива на отделни думички (ако не му кажем по какво да разделя, то по подразбиране ги разделя по space).

След това си прочитаме едно число, което ще определя колко операции ще бъдат извършени и въртим един цикъл толкова на брой пъти. Нищо сложно до тук, нали? :)
Вътре в този цикъл си прочитаме по един ред всеки път, който представлява нашата команда:

string[] command = Console.ReadLine().Split();

Отново е необходимо да го Split-нем, тъй като последната команда - Replace, има и други данни със себе си. По този начин, ако ни се въведе Reverse или Distinct, ще имаме масив от една единствена дума (съответно Reverse или Distinct). Но ако ни е въведено Replace, то тогава в масива command ще имаме три елемента: думичката Replace, индекса и думата, която трябва да сложим на този индекс. 
От там ти си продължил с if проверки, което няма лошо. Лично аз предпочитам switch:

switch (command[0].ToLower())

В него си взимаме първия елемент от масива command, в който сме на 100% сигурни, че се съдържа нашата думичка, която показва каква всъщност е командата - Reverse, Distinct или Replace. Добре е в такива ситуации да се използва ToLower() метода, който ще направи всички букви малки. Така Reverse и reverse стават едно и също нещо. Предимството е, че когато пишем case-овете, не се налага всеки път да ги пишем с главна буква (виж следващия ред). От тук логиката ни се разделя на три:

case "reverse":
    Array.Reverse(arr);
    break;

Навлизаме в същинската част на задачата, но се оказва, че за да завъртим един масив наобратно, си има вградем метод. Яко, а? :)

case "distinct":
    arr = arr.Distinct().ToArray();
    break;

Както предния път - имаме вграден метод. Разликата тук е, че ако просто кажеш arr.Distinct() няма да стане нищо. Необходимо е да се присвои на нещо, в случая на същото...Защо е така => можеш да прочетеш за разликата между Value type и Reference type.

case "replace":
    int index = int.Parse(command[1]);
    string newWord = command[2];
    arr[index] = newWord;
    break;

Последното е най-просто. Създаваме си променлива index, която е вторият елемент от масива command. Необходимо е да я Prase-нем, тъй като command е масив от стрингове, а индексът е число. И една променлива newWord, която е новата дума, която ще замени старата. След това просто казваме arr[index] = newWord; В масива arr, на позиция index сложи стойност newWord. И с това се изчерпваме :)
Последното, което остава е да принираме резултата:

Console.WriteLine(string.Join(", ", arr));

string.Join() ще вземе целия масив, и ще го принтира като стринг, като за разделител между отделните стойности ще сложи запетайка и един space (", ").
Предполагам успях да те убедя, че е съвсем простичко. Ако нещо не ти е ясно, питай, насреща съм :)

Цялостен код: https://pastebin.com/HAjWKHXY

2
21/03/2019 00:37:34
icko134 avatar icko134 0 Точки

Много съм благодарен, че има хора, който отделят от личното си време за такива неща (особено за толкова проста задача). Аз съм десети клас и за мое щастие има обучение за ИТ кариера. Ходя във Правец на лекции, но миналата седмица не съм, а тази неделя имам изпит и ми се искаше да ги прегледам отново и да реша задачите. Ще опитвам и няма да се отказвам и се ще стане :Д.

0
icko134 avatar icko134 0 Точки

А само едно последно разяснение за while цикъла ??

0
svetoslav_0 avatar svetoslav_0 1005 Точки

Веднъж бях видял някой да го използва така и много ми хареса и от тогава го използвам и аз. Работи по следния начин: 

while(n-- > 0)

Всъщност се случват две неща едновременно: n-- , което намаля стойността на n при всяко завъртане с единица. Прави се и проверка дали е по-голямо от нула, съответно както знаем, как работи while цикъла - докато това условие връща true, цикъла ще продължава да се върти. Или накратко: този цикъл винаги ще се завърти n на брой пъти. Абсолютно същото би било и с for цикъл:

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

Но някак си с while изглежда една идея по-елегантно. 

В допълнение: има ситуации, в които не особено удобно да се използва while. По този начин не може да се използва променливата - брояч i, което означава, че не е особено удобно да се използва да се отпечатат числата от 1 до n например.

 

0
19/03/2019 22:22:31
icko134 avatar icko134 0 Точки

Благодаря още веднъж. Ако може и един съвет :Д: как да подхождам на задачите с масиви. Гледам лекции и всичко е точно, ама като дойде време за задачите направо се пиша бегал. Имам впредвид, ако има някакви тънкости или нещо такова.

0
svetoslav_0 avatar svetoslav_0 1005 Точки

Ами да ти кажа често, тайната е да решаваш много. Тази задача например не беше нещо кой знае какво. Много ясно си спомням момента, в който аз се сблъсках с нея. Нямах представа, че има вградени методи за reverse и distinct. И си ги написах сам, започнах да въртя едни цикли, да обхождам масива и така. Смятам, че това е начинът да се изгради характер. Започни от нещо просто, опитай се да създадеш един масив, който да е обърнат на този, който е даден, но без да използваш вградените методи, както аз бях направил. После пробвай същото нещо с distinct. Ако трябва измисляй си такива простички примери и се опитвай да ги реализираш, докато в един момент започнеш да правиш по-сложни операции. Това е, което мога да ти препоръчам. Е, разбира се, ако имаш някакво сериозно затруднение, винаги имаш форума. Ако не аз, то винаги ще се намери кой да помогне :)

0
svetoslav_0 avatar svetoslav_0 1005 Точки

Между другото масивите са един трап, който ако предкочиш, сигурно няма да видиш такава трудност месеци след това.

0