Loading...
YankoVanov avatar YankoVanov 72 Точки

[Homework] C# Basics - Introduction to programming - March 2014

Здравейте !!!

Нека направим форумът по-лесен за търсене, като "компресираме" всяка тема от една задача до по-обща тема от даден раздел(където, ако не всички, то поне повечето задачи са решени).

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

1.  Коректно зададено име на solution-ът ("Introduction to programming"),

2. Коректно именуване на отделните проекти в solution-ът ("PrintMyName", "HelloCSharp") not like wrong -> ("FirstTask", "ToDoSomthingMagical") <- wrong

3. Номериране на проектите (01, 02, 03, 04 т.н.) избягвам 1,2,3,4..., защото при solution по-голям от 9 проекта, проект номер 10 ще бъде първи в  solution-ът, което не е много правилно.

4. Използването на коментари в кодът помага както на Вас, така и на тези, които четат кодът Ви.

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

04. Create, compile and run a “Hello C#” console application. Ensure you have named the application well (e.g. “”HelloCSharp”). Click /стандартна задача, няма какво много да се каже тук/

05. Modify the previous application to print your name. Ensure you have named the application well (e.g. “PrintMyName”). Click /като предната/

06. Write a program to print the numbers 1, 101 and 1001, each at a separate line. Name the program correctly. Click /нищо ново/

07. Create console application that prints your first and last name, each at a separate line. Click /като 06./

08. Create a console application that calculates and prints the square root of the number 12345. Find in Internet “how to calculate square root in C#”.  Click /тук използвам методът Math.Sqrt и му подавам числото, на което искам да изчисля корен квдратен/

09. Write a program that prints the first 10 members of the sequence: 2, -3, 4, -5, 6, -7, ... Click /използвам for цикъл, проверявайки дали целочисленото деление е 0 или различно от нея, принтирам съответно положително или отрицателно число/

10. Reformat the following C# code to make it readable according to the C# best practices for code formatting. Change the casing of the identifiers in the code (e.g. use PascalCase for the class name): Click /нищо интересно тук/

14. Create a console application that prints the current date and time. Find in Internet how. Click /използвам DateTime.Now може и DateTime.Today/

15.Write a program to read your birthday from the console and print how old you are now and how old you will be after 10 years. Click /продължение на по-горната задача. Тук използвам метода DateTime.Parse() и му подавам входа от потребителят, след което изваждам от днешният ден входът (DateTime.Subtract()) и получавам годините. За да получа възрастта след 10 години използвам метода AddYears() na DateTime /

16. Write a program that prints the first 1000 members of the sequence: 2, -3, 4, -5, 6, -7, … Click

/същата логика като при зад 09., за по-добра производителност може да се ползва StringBuilder/

Чакам вашите коментари и въпроси.

 

Edited: Променено е името на темата според правилата на форума.

Тагове:
66
Programming Basics 14/09/2014 10:44:11
Anichka avatar Anichka 93 Точки

Можете да видите моите имплементации тук

Включила съм и 17 задача.

6
maria.stoycheva avatar maria.stoycheva 7 Точки

Здравей,

търся си тук малко помощ за 15 задача (AgeAfter10Years) и ми направи впечатление, че при теб от потребителя се очаква да напише не рождената си дата (както е в условието), а направо възрастта си в момента. Това опростява задачата много. Може би ще искаш да я преправиш, така че да отговаря точно на условието ;)

Поздрави!

2
Anichka avatar Anichka 93 Точки

Много, много, много мерси! Страшно съм разсеяна. Поправих го и изглежда така:

        Console.WriteLine("Enter your birthday(try yyyy.m.d)");
        DateTime birthDay = DateTime.Parse(Console.ReadLine());
        DateTime today = DateTime.Now;
        int age = today.Year - birthDay.Year;
        Console.WriteLine("You are {0} years old.", age);
        Console.WriteLine("After 10 years you will be {0} years old", age + 10);

Не е особено прецизно, но засега толкова :)


3
Anichka avatar Anichka 93 Точки

Ето едно малко по-прецизно решение на Проблем 15 тук

И май не съм била разсеяна този път - действително условието на Проблем 15 е променено.

Старото пейстнато условие е в коментарите в сорс кода ми(кръстила съм го Old).

1
mzografski avatar mzografski 189 Точки
Само вметка относно кометарите в кода. Когато имената на класовете, методите и променливите изпозвани в кодът са т.нар. self-explained, кометарите са необходими само на по-завъртяните места. За това непрекъснато ни повтарят да мислим преди да именуваме променливите и класовете, а по-натам и методите. Това се нарича self-explanatory code.
3
Yulia avatar Yulia 1346 Точки

Да, отличен guide за първото домашно, колега! Аз самата не се бях сетила да си поиграя със StringBuilder на 16-та задача, макар и на други да се заиграх да ги реша малко по-advanced като за първо домашно. Иначе според мен ще е хубаво именно в тази тема да се постват и решенията на задачите, защото много се разпръскват из целият форум и има отделни теми за всяка задача, повечето без тагове, с тотално различни заглавия иии ще са трудно откриваеми, със или без търсачка (каквато в момента не виждам да има).

И щом такова е предложението ми, ще пусна и своето домашно - GitHub (не са абсолютно всички задачи все още). Наблегнала съм на коментарите и, надявам се, те ще бъдат полезни за съвсем начинаещите. Разбира се, очаквам критика и предложения по решенията ми, благодаря. :)

 

ЕДИТ: Цялото домашно е готово. Като по-интересни мога да посоча задачките 3, 15 и16. За трета наистина "си поиграх" ии даже по-прекалих, ноо ако на някой му е любопитно, може да погледне какви шарении съм сътворила. xD

Problem 15.* Age after 10 years е изчислена изцяло с класа DateTime, но не е и кой знае какво - мисля, че има вече няколко подобни решения.
Problem 16.* Print Long Sequence - готиното в това решение е PadLeft-а и подредеността на output-а, с което съм много доволна, хаха.

5
hristo.dimitrov avatar hristo.dimitrov 8 Точки

очарователно! :D

0
maria.stoycheva avatar maria.stoycheva 7 Точки

Здравей Янко!

Благодаря ти за тази тема. Имам едно въпросче относно AgeAfter10Years (абсолютно начинаеща съм):

Console.WriteLine("You are {0} years old.", new DateTime(resulut).Year - 1);  <-- това откъде идва точно? *confused*

Предварително ти благодаря!


1
aslv1 avatar aslv1 304 Точки
Здравей!
Бих се намесил, понеже доста време си поиграх с тази задачка.
Значи, разликата между две дати (например рождената ти дата и настоящата дата) не е дата, а период от време.
За времеви периоди има специален „тип“ - TimeSpan, а не DateTime.
Обаче, от TimeSpan можеш да получиш само дни, но не и месеци или години. Дълго рових из нета, за да видя защо е така и намерих причината. Така е, защото годината има променлив брой дни - и например 3 години може да се равняват на 1095 дена и на 1096 дена. Доста хитро ;)
Така че може или да се извежда възрастта в само в дни - например 10000 дена, което не е много интуитивно, или да се правят някакви хакове с превръщането от период в DateTime.
Аз съм избрал първото, а колегата - второто.
Та защо е това -1?
Причината пак е простичка, но доста хитра - понеже можем да имаме период от 0 дена, но най-първата дата не е 0.0.0000 г., а 1.1.0001 г.
И като превръщаш 5 дена, ще се получи 6.1.0001 г., та от това 6 трябва да извадим едно.
Това също ми отне доста време да го разбера, но си струваше :)

П. П. Тук има доста интелигентно решение на проблема, но си е вече по-сложничко!


7
Sandalski avatar Sandalski 4 Точки
Препоръчвам , ти да я решиш както  aslv1  каза , с TimeSpan :)
1
Stoyan.Stoyanov avatar Stoyan.Stoyanov 96 Точки

На мен най-интересна ми се стори задача 15. Ето как реших да я направя аз:

/*Problem 15.  Age after 10 Years
Write a program to read your birthday from the console and print how old you are now and how old you will be after 10 years.*/

using System;
    class AgeAfter10Years
    {
        static void Main()
        {
                Console.WriteLine("Enter your birthday date in format day/month/year: "); // Prompt
                string birthday = Console.ReadLine(); // Get string from user
                try
                {
                    DateTime dt = DateTime.Parse(birthday); // Converting to DateTime
                    DateTime now = DateTime.Today;
                    int age = now.Year - dt.Year;
                    Console.WriteLine("Your current age is: " + age + ". After 10 years you will be on: " + (age + 10) + ".");
                }
                catch (System.ArgumentNullException) // Handle possible exception 1
                {
                    Console.WriteLine("You triggered \"System.ArgumentNullException\". Please enter a date!");
                    Console.Beep();
                }
                catch (System.FormatException) // Handle possible exception 2
                {
                    Console.WriteLine("You triggered \"System.FormatException\". Please enter a correct date!");
                    Console.Beep();
                }
        }
    }

1
vesiangelova avatar vesiangelova 2 Точки

Ето и моето решение на задача 15:

Console.Write("Enter your birthday in format(dd.mm.yyyy):");
DateTime birthDay = DateTime.Parse(Console.ReadLine());
DateTime today = DateTime.Now;
int age = today.Year - birthDay.Year;   //calculate the age

birthDay = new DateTime(today.Year, birthDay.Month, birthDay.Day);    //assign my birthday on current year          

if (today < birthDay)   //if my birthday didn't pass this year                                

           age = age - 1;      //then decrease the age                        

Console.WriteLine("You are {0} years old.", age);                            

Console.WriteLine("After 10 years you will be {0} years old.", age + 10);



0
scinetic avatar scinetic 40 Точки

Имам въпрос относно 15-та задача. В този ред си използвал var, а реално с какво може да се замести var в случая, понеже доколкото прочетох, var оставя компилатора сам да отгатне какъв тип да зададе. 

var resulut = DateTime.Today.Subtract(userBirthday).Ticks;

И 2-ро, да те поправя, не се пише DateTime.Substract, а DateTime.Subtract 

2
YankoVanov avatar YankoVanov 72 Точки

Ключовата дума var може да се замести, в случаят, с тип long. Ползвам var, защото наистина оставам компилатора сам да се сети от какъв тип е върнатият резултат.

Що се отнася до DateTime.Substract -> поправено :)

0
Sandalski avatar Sandalski 4 Точки

Ето 2-ро  решение на задача 15  , за по-голям избор : 

   static void Main()
    {
        Console.Write("Which Date you have been born(dd.mm.yyyy): ");
        DateTime dateOfBirth = Convert.ToDateTime(Console.ReadLine());
        DateTime PresentYear = DateTime.Now;
        TimeSpan ts = PresentYear - dateOfBirth;
        //към минималната дата 01.01.0001 добавяме дните от ts.Days
        DateTime Age = DateTime.MinValue.AddDays(ts.Days);
        //Получава се нещо от сорта 11.12.0025 като се извади 1 от годината месеца и деня се получава възрастта на която е съм.
        Console.WriteLine("Now i'm at:  {0} Years {1} Month {2} Days", Age.Year - 1, Age.Month - 1, Age.Day - 1);
        //Тук добавям само 9 защото MinValue = 0001г.
        int ageAFterTen = Age.Year+9;
        Console.WriteLine("After 10 Years I'll be at: {0} Years {1} Month {2} Days", ageAFterTen, Age.Month - 1, Age.Day - 1);

    }

3
vesiangelova avatar vesiangelova 2 Точки

Още едно решение на задача 15 :)

Console.Write("Enter your birthday in format(dd.mm.yyyy):");
DateTime birthDay = DateTime.Parse(Console.ReadLine());
DateTime today = DateTime.Now;
int age = today.Year - birthDay.Year;   //calculate the age


birthDay = new DateTime(today.Year, birthDay.Month, birthDay.Day);    //assign my birthday on current year          

if (today < birthDay)   //if my birthday didn't pass this year                                

           age = age - 1;      //then decrease the age                        

Console.WriteLine("You are {0} years old.", age);                            

Console.WriteLine("After 10 years you will be {0} years old.", age + 10);

1
Vasilsk avatar Vasilsk 109 Точки

Здравей YankoVanov,

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

Иначе ето и от мен едно алтернативно решение на същата задача:
...
class SquareRoot
    {
        static void Main()
        {
            double x = Math.Sqrt(12345);
            Console.WriteLine(x);
        }
    }







1
YankoVanov avatar YankoVanov 72 Точки
Благодаря за забележката -> линкът е поправен !
0
zhivko1985 avatar zhivko1985 34 Точки

Още един вариант

using System;


namespace SquareRoot
{
    class SquareRoot
    {
        static void Main()
        {
            Console.WriteLine(Math.Sqrt(12345));
        }
    }
}

1
mariu6 avatar mariu6 1 Точки

В зад. 08 всъщност стои решението на зад. 07... Същото и при задачи 10 и 09.  

Иначе съм впечатлен от решенията, Good job!

1
YankoVanov avatar YankoVanov 72 Точки
10 -> 09 -> линкът е поправен!
1
coaster avatar coaster 412 Точки

Браво за идеята, YankoVanov! Изглежда подредено :)

Ето и още един вариант на 15-та задача.

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