03.Methods-Homework


6
Пускам тема за третото домашно с цел всичко около него да се дискутира тук.
Тук са моите решения на задачите, надявам се да са полезни за някого.



Отговори



6
Споделям и моите РЕШЕНИЯ. : )

от tabula (2134 точки)


0

Бързи сте с домашното :)

Пък аз имам един тъп въпрос за начинаещи:

If a method is declared without an access modifier (either  public or
private ), it is accessible from all classes in the current assembly, but not
accessible for any other assemblies (let say from other projects in Visual
Studio).

От този текст разбирам, че метод без modifier може да бъде достъпен от всеки клас в един namespace. Ако имам два класа и в единия съм декларирала метода, в другия мога да извикам същия този метод. Правилно ли съм разбрала, защото кодът по-долу си има собствено мнение и MyClass.PrintText(); не работи (дори и изрично да кажа, че MyClass e public)?

using System;

namespace MethodsInsideClass
{

    public class MyClass
    {
        static void PrintText()  
        {
            Console.WriteLine("text");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
           
            MyClass.PrintText(); 
        }
    }
}


от pdimova (256 точки)


0

Ами за да работи така както си го написала трябва класът Program да наследява MyClass, за да има достъп до публичните му методи, но това е тема на OOP-то и няма да навлизам в подробности за да не те обърквам допълнително.

Иначе за да правим методи, не е нужно всеки метод да е в отделен клас. Може в класът Program да сложиш колкото искаш методи - в твоя случай, сложи методът

using System; namespace MethodsInsideClass { public class Program { static void Main(string[] args) { PrintText(); } public static void PrintText() { Console.WriteLine("text"); } } }


от tabula (2134 точки)

0

Идеята на въпроса ми е да науча как да викам методи от друг клас :)

ако добавя public към static void PrintText()  и нещата се получават. Обаче според учебника на Наков (или поне това, което аз разбирам от него и изречението, което цитирах) без modifier public трябва да мога да извикам метода в клас Program.

Обаче следва и това от MSDN:

Classes that you declare directly within a namespace, not nested within other classes, can be either public or internal. Classes are internal by default.

The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly, as in this example:

Class members, including nested classes, can be public, protected internal, protected, internal, or private. Members are private by default.

OK, класовете са internal и си признавам, че не ми е ясно какво означава the same assembly , и също явно методите са private by default.

Тогава защо в учебника пише друго.

Съвсем се обърках. :/


от pdimova (256 точки)



1

Ето ги и моите решения

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


от todorovh (2055 точки)


0
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _09.SortingArray { class Program { static void Main(string[] args) { Console.ReadLine(); double[] numbers = Console.ReadLine() .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(double.Parse) .ToArray(); Sort(numbers); Console.WriteLine(string.Join(" ", numbers.Reverse())); } private static void Sort(IList<double> numbers) { for (int i = 0; i < numbers.Count; i++) { Swap(numbers,i,numbers.IndexOf(GetMaxElementFromCollection(numbers, i, numbers.Count - 1))); } } private static double GetMaxElementFromCollection(IList<double> numbers, int startIndex, int endIndex) { double max = double.MinValue; for (int i = startIndex; i <= endIndex; i++) { if (numbers[i] > max) { max = numbers[i]; } } return max; } private static void Swap(IList<double> numbers, int indexA, int indexB) { double temp = numbers[indexA]; numbers[indexA] = numbers[indexB]; numbers[indexB] = temp; } } }

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

Имам въпрос относно 9та задача(сортирането). Направих си моя имплементация която се доближава до описания в условието алгоритъм, но изкарва 70/100. Някакви идеи защо?


от ViktorBarzin (210 точки)


0

Така както намираш индекса на най-големия елемент в останалата част от несортирания масив numbers.IndexOf(GetMaxElementFromCollection(...) , всъщност може да намериш индекс по-малък от i.

Използвай:

Swap(numbers, i, numbers.ToList().IndexOf((GetMaxElementFromCollection(numbers, i, numbers.Count - 1)), i));

и замени навсякъде double с int.


от marks (354 точки)


0

http://pastebin.com/AqNkxyZE

на задача 8 минавам само нулевите тестове, някаква идея защо така се получава?


от pdimova (256 точки)


0

Здравейте,

задача 8 съм я решил по малко друг начин. Някой да може да хвърли един поглед и да каже, защо минавам само нулевите тестове. Кодера ми дава грешка. Решението ми се изпълнява в конзолата, и е 2 пъти по-късо.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _08NumberAsArray { class Program { static void Main(string[] args) { int[] arrays = new int[2]; arrays = Console.ReadLine() .Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(item => int.Parse(item)) .ToArray(); int[] numbers1 = new int[arrays[0]]; numbers1 = Console.ReadLine() .Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(item => int.Parse(item)) .ToArray(); int[] numbers2 = new int[arrays[1]]; numbers2 = Console.ReadLine() .Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(item => int.Parse(item)) .ToArray(); //-------------------------------------- int finalScore = GetFinalScore(numbers1, numbers2); Result(finalScore); } private static void Result(int finalScore) { int[] result = finalScore.ToString().ToCharArray(). Select(x => (int)Char.GetNumericValue(x)).ToArray(); Array.Reverse(result); for (int i = 0; i < result.Length; i++) { Console.Write(result[i] + " "); } Console.WriteLine(); } private static int GetFinalScore(int[] numbers1, int[] numbers2) { Array.Reverse(numbers1); Array.Reverse(numbers2); int finalScore = 0; for (int i = 0; i < numbers1.Length; i++) { finalScore += numbers1[i] * Convert.ToInt32(Math.Pow(10, numbers1.Length - i - 1)); } for (int i = 0; i < numbers2.Length; i++) { finalScore += numbers2[i] * Convert.ToInt32(Math.Pow(10, numbers2.Length - i - 1)); } return finalScore; } } }


от Dido_Aint (577 точки)

0
И при мен беше така. Пренаписах я няколко пъти, като накрая пробвах със Stringbuilder и после резултата го записах като string и заспа.

от martinboykov (1112 точки)



1
И аз добавям един Homework

от Dido_Aint (577 точки)


0

Здравейте, 

понеже на 5  Larger than neighbors, бг кодер ми дава RunTime Error на 4 от тестовете. Може ли да ми кажете къде бъркам: ето решението http://pastebin.com/tsTt85u0

И също ако може да попитам каква е разликата между четенето от конзолата на ред като стринг в този пример:

1.

var line = Console.ReadLine().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int [] array = new int [size]; for (int i = 0; i < size; i++) { array[i] = int.Parse(line[i]); }

 

и този

int[] numbers = new int[N]; numbers = Console.ReadLine() .Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(item => int.Parse(item)) .ToArray();

Тъй като предполагам , че тук ми е грешката.


от djingibi (99 точки)


0

Двата начина, които си качил отгоре правят абсолютно едно и също. Проблемът ти е тук

for (int i = 1; i < array.Length - 1; i++) { if (array[i] > array[i + 1]&&array[i]>array[i-1]) { elements++; { }

Цикълът трябва да ти върви от 1, а не от 0, защото понякога ти сравнява нулевия елемент с -1, а такъв няма и от там идва грешката. Тествах ти кода, като промених само това и дава 100/100


от tabula (2134 точки)

0
Благодаря!

от djingibi (99 точки)


0

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

Някои може ли да ми помогне с условието на 10-та задача. Изобщо си нямам на идея какво се иска да направим, а не искам да го разбирам гледайки кода на готово :)

Благодаря :)


от TanyoSotirov (95 точки)


0
Трябва да намериш факториела на въведеното число, тоест ако n ти е числото n!=n*(n-1)*(n-2)....*2*1 

от magadisho (823 точки)

1

Програмата трябва да изчислява N! т.е. N! = 1*2*3*...*N

При подадено число N (5 например), правиш масив с числата (от 1 до 5)

и пишеш метод, който изчислява произведението на членовете на масива. В случая 5! = 1*2*3*4*5 = 120

Не знам дали успях да обясня условието разбираемо.

Нарочно не ти пиша код, ако ти трябва, питай :)


от Pepi.Ka (922 точки)



0

Здравейте!

Реших всички задачи от домашното без 8-ма. Нещо не мога да я разбера.

Реших я веднъж със стрингове, но надхвърлях паметта. След малко оптимизации свалих близо половин мегабайт, но не беше достатъчно, а и някои тестове гърмяха с Runtime error. Реших я с масиви от интове, вместо стрингове и сега съм далеч от лимита на паметта, но пак гърми с Runtime error, а и в двата случая минавам нулевите тестове. Не мога да разбера какъв е проблема.

Това ми е кода:
http://pastebin.com/Hq0RZMRp

Някой има ли идея какво не е наред?




0

Решението ти е принципно вярно, но това те прецаква

  • Each of the numbers that will be added could have up to 10 000 digits.

Ако замениш int с BigInteger ще работи, но минават само 2та нулеви и 1ви тест, останалите гърмят за памет или време.

Просто едно число от 10 хиляди цифри заема много памет. За сравнение ulong има максимум 20 цифри.

Направи нещо такова:

string result = string.Empty;

int curretnResult = array1[0] + array2[0] // проверяваш дали не надхвърля 9 

result += currentResult.ToString() + " ";

Може да използваш за result не string, а StringBuilder,


от georgivelikov (1844 точки)

0

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

EDIT:

Добре де, вече тотално се обърках...

Щом може да имаме 10 000 елемента в масива реших да подходя по съвсем различен начин.

Създавам си нов масив в който да ми отиде резултата, след това пускам цикъл от 0 до дължината на по-големия от двата масива и в цикъла събирам елементите в индексите на масивите от i и записвам резултата в същия индекс на масива за резултат. Естествено, ако резултатът е по-голям от 10 първо го деля на %10 и си записвам в друга променлива, че имам остатък 1, който добавям към следващия резултат. Т.е. не би трябвало да ме интересува повече колко стойности имам в масива, ако ще да са 1 000 000.

И въпреки това, отново минавам само нулевите тестове и Runtime error на всички останали....




0
И аз не мога да реша 8ма задача, минавам нулевте тестове само. Какво да правя?
http://pastebin.com/dTnHMavv

от Tony_Nikolov (633 точки)


0
След пресмятанията до края на по-късия масив, където проверяваш кой е по-дълъг, може първият да е по-дълъг. Също така там трябва да си действаш както в горния цикъл - с remainder, защото може rem от последната сума да е 1. Аз се опитах да преправя твоя код с тези промени, но честно казано не разбирам защо пак минава само нулевите. Ето как аз я реших.


0

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

Моето минава само нулевите и дава Runtime error на всички останали....

http://pastebin.com/4whKFx5b