Intro to Programming Homework


21

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

Тъй като домашното към първата тема (Въведение в програмирането) е различно от миналогодишното, реших да пусна нова тема, в която който иска да сподели решенията си или да се посъветва.

Това са моите решения.

Успех на всички!




Отговори



4

'\b' - Един недооценен надценен символ

Чудих се тука ли да постна или в темата за домашните - реших тук, че е по-конкретно.

Проверявам второто домашно "Въведение в програмирането". Направи ми впечатление, че колегата (също и доста други хора от форума) са решили задачата с редицата "положително-отрицателно" по умен начин, но не оптимизиран. Знаете - печата се в цикъл толкова пъти, колкото члена на редицата ни трябват. За да излезе на един ред тая цялата хава е добре да се делят членовете, които се печатат, с ", " (запетая интервал). Лошото е, че този метод налага използването на допълнителна условна логика за проверка на последната итерация, която да печата по различен начин последния член - без ", " след него (за да е по-прегледно).

Ето кода на колегата, който ме заинтригува (малко съм го свил да не спамя):

            int count = 12;
            for (int i = 2; i <= count; i++)
            {
                if((i % 2) == 0) {
                    if (i == 12)
                    { Console.WriteLine(i + ";"); break; }
                    Console.Write("{0}, ", i);
                }
                else
                    Console.Write("-{0}, ",  i);
            }

Изхода в конзолата е следният:

2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12;

Без условната логика за печатане на последния член, изхода би бил:

2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, 

'\b' е литерала, съответстващ на символа "backspace"! "backspace" (изтрива символа отляво и връща курсора една позиция назад) всъщност се представя чрез символ, както всички други. С тази разлика, че се води "непринтируем"/"контролен". Той управлява случващото се с текстовия поток, както '\n' и '\r' и другите като тях го правят (те за това за измислени).

Едно решение, работещо с логиката на колегата, но модифицирано/оптимизирано чрез '\b' не изисква допълнителен условен блок - той просто изтрива 2-та ненужни символа след края на цикъла (извън него):

            int count = 12;
            for (int i = 2; i <= count; i++)
                Console.Write("{0}, ", i % 2 == 0 ? i : -i);
            Console.WriteLine("\b\b;");

Изхода от модификацията е желаният:

2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12;

За разлика от първоначалният вариант, този е по-оптимизиран (може би и по-бърз). Само ако успеете в реално време (не в дебъгера) да забавите изпълнението на програмата до n-та степен, ще можете да видите, че всъщност ", " се печата, изтрива се връща се курсора и се добавя ";" върху запетаята :(.

--Edit--

В конзлоата '\b' работи само в рамките на текущия ред. В конзолата, зачистването наляво с '\b' не връща текста след курсора назад, както е във всички други (нормални) среди, долепяйки го до предходния, защото просто не зачиства нищо. Само връща позицията на курсора наляво. Това важи само при изход - да не се бърка с поведението при вход - тогава е различно >:(.

В случая е много полезно. Явно съм го надценил... По-добре не го правете като мен (каруцарската) - решението на колегата е по-логично...

Поста се обезмисли - по-добре не го четете.


от Zenix (628 точки)


1
Поста е много интелигентен и много ценен - точно това се нарича обсъждане на код и обмяна на информация!


0
Ето го и моето домашно от C# първа част,надявам се да съм бил полезен :) http://dox.bg/files/dw?a=2ceb73cf58




0

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

Да попитам и аз нещо, ако някой може да даде съвет. В четвъртък на лекциите бях забравил да се log out-на от системата и някой много добронамерен колега (да е жив и здрав), който след мен е седнал на компютъра, който аз ползвах, ме е отписал от курса. Писах на Телерик в петък, когато разбрах, но те ме добавиха в курса отново днес и не можах да си изпратя първото домашно, а следователно - и не мога да оценявам домашни. Та дали някой се е сблъсквал с подобен проблем и има ли вариант да си пратя домашното по-късно?

Винаги проверявайте, дали сте излезли от акаунта си в Телерик, ако ползвате някой от настолните компютри там, за да си спестите проблеми като моя. :)


от yanski (0 точки)


1

Друг вариант е да си носиш USB с програми от PortableApps. Вкарваш USB-то в компютъра и си работиш с portable програмите от флашката, без да се притесняваш дали си прекратил сесията.

Готиното на portable програмите е, че си имат собствен профил с настройки, който се пази на USB-то и е независим от тези на операционната система.


от PaperNick (494 точки)


0

Ето и моето домашно 

:)  https://github.com/Peter-Alexandrov/HomeworksCSharp1/tree/master/Intro-To-Programming


от P.Alexandrov (14 точки)


0
Ето и моето. Тук.

от petyodelta (15 точки)


1
Цък След страшно много време и аз се включвам.

от Nayata (3190 точки)


1

Ето го моя първи опит с домашните.Ще се радвам на някакво мнение :). Приятна вечер

https://github.com/KostadinPetrov/CSharp-Part-1/tree/master/01.IntroductionToProgramming




1

Здравей.

Като цяло не са лоши задачите, но AgeAfter10Years има друг замисъл. В темата е изписано много за задачата - трябва да се прочете рожденна дата (ден,месец, година) и спрямо нея да се определи възрастта.

Разгледай първите 5 страници, примерно, както и как са я решили колеги - има много инфо. :)


от dentia (12519 точки)

0
Благодаря ти за коментара.Поправих своята грешка. Понеже още нямам достатъчно точки немога да ти дам положителна оценка за коментара :)