Loading...
ivopesheff avatar ivopesheff 50 Точки

[Homework] C# Basics - Introduction to programming - Problem{15} - Age after 10 Years

Колеги,

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

Подозирам, че има нещо по-детайлно от date.Year, но не успявам да открия.

DateTime today = DateTime.Now;
Console.Write("Birthday YYYY-MM-DD: ");
DateTime date = DateTime.Parse(Console.ReadLine());
Console.WriteLine("Your age: " + (today.Year - date.Year) + " years");
Console.WriteLine("Age in 10 years: " + (today.Year - date.Year + 10) + " years");

4
Programming Basics
Petya:
Многократно дублирана тема: https://softuni.bg/Forum/179/Homework-CSharp-Basics-Introduction-To-Programming-Problem-15-Age-after-10-Years
GogoK avatar GogoK 80 Точки

Здравей,

Не съм сигурен дали работи на всички версии на VS, но аз съм с VS 2013 и при мен работи... селектирай Date.Time в редактора и натисни F12. Би трябвало да ти се отвори нов прозорец, и ще се ориентираш, ако не от сайта MS :)

Ако искаш погледни тук, не че е най добрия код, има повече украси от колкото код.. но обърни внимание на TimeSpan и как са добавени годините.. дните..

Успех!

0
ivopesheff avatar ivopesheff 50 Точки

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

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

DateTime today = DateTime.Now;
Console.Write("Your birthday is (please follow the format yyyy,mm,dd): ");
DateTime date = DateTime.Parse(Console.ReadLine());
int age = today.Year - date.Year;
if (today < date.AddYears(age)) age--;
Console.WriteLine("You are now {0} years old.", age);
Console.WriteLine("In 10 years you will be {0} years old.", age + 10);

Мерси и успех!

3
Sveti avatar Sveti 4 Точки

Здравей ,

Да те попитам ,защото на мен нещо не ми се получавас тоя код ,какви данни сменяш освен yyyy,mm,dd ?

Благодаря предварително !

0
Sveti avatar Sveti 4 Точки

Получи ми се вече !

1
ivopesheff avatar ivopesheff 50 Точки

Супер! Радвам се

1
katqcherdoneva avatar katqcherdoneva 3 Точки

Здравейте,

Аз също стигнах до тази задача, но имам проблем с кода или програмата. Не знам, защо, но накрая ми излиза, че съм на 15, а не 18.

Console.Write("Please enter your birthday (1997-02-01) : ");
int AfterTenYears = (DateTime.Now.Year - 1997-02-01) + 10;
Console.WriteLine("After 10 years you will be {0}.", AfterTenYears);
int NowIAm = (DateTime.Now.Year - 01 - 02 - 1997);
Console.WriteLine("Now I am {0} years old", NowIAm);

0
taylorswift avatar taylorswift 54 Точки

int NowIAm = (DateTime.Now.Year - 01 - 02 - 1997);

 

Тук имаш 2015 минус 1 минус 2 минус 1997, което е 15.

1
28/03/2015 23:55:21
a_tifonoff avatar a_tifonoff 26 Точки

Формата на рожденната дата не е зададен корктно.Така ще работи

Console.Write("Please enter your birthday (1997-02-01) : ");
int AfterTenYears =((DateTime.Now).Year-(DateTime.Parse("1997-02-01")).Year)+10;
Console.WriteLine("After 10 years you will be {0}.", AfterTenYears);
int NowIAm = (DateTime.Now.Year - (DateTime.Parse("1997-02-01")).Year);
Console.WriteLine("Now I am {0} years old", NowIAm);

1
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравейте,

по повод тази задача имам едно предложение:

Тъй като става въпрос за домашно което ще се проверява в един момент от колеги, на личните им компютри, които ще имат най-различни локални настройки за date format - в един момент това води до хвърляне на exception при опит да се стартира програмата на чужд компютър.

Пример: моят компютър си стои с US date format настройки - така съм свикнала. Когато опитам да стартирам програма която кани да въведа дата във формат Day Month Year, и аз въведа например 13/02/1985 - програмата хвърля exception:

код:         DateTime test = DateTime.Parse(Console.ReadLine());

инпут: 13/02/1985

аутпут:
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.DateTime.Parse(String s)
   at AgeAfterTenYears.Main() in c:\Users\Katya\Documents\Visual Studio 2013\Projects\Intro-Programming-Homework\AgeAfterTenYearsNew\AgeAfterTenYearsNew.cs:line 40
Press any key to continue . . .

Реално, по комютрите на колегите могат да съществуват най-разнообразни локални настройки за date format.

Избягването на този проблем е просто - в самата си програма да зададем date format настройки, и в поканата за инпут на дата да поискаме формат съответстващ на тези настройки - в MSDN има информация по въпроса.

Аз например зададох настройки за български формат за дата - приема всичко което е във формат Day Month Year

- независимо дали е само с цифри, или месеца с думи (на английски или български - други езици не разпознава), независимо от разделителите (13/02/1985, или 13-02-1985, 13,02,1985, 13 02 1985, и т.н.):

using System;
using System.Globalization;
using System.Threading;

class AgeAfterTenYears
{
    static void Main()
    {
        CultureInfo bg = new CultureInfo("bg-BG");
        Thread.CurrentThread.CurrentCulture = bg;

Ето и целият код http://pastebin.com/PRaDxb5E (с comments overkill).

1
02/04/2015 10:20:08
kyamaliev avatar kyamaliev 209 Точки

Можеш и да ползваш

Snippet

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

 

 

Това ще го направи на английски без културни специфики.
Допълнително това ще ти реши проблемите с десетичната запетая при четене от конзолата и няма нужда да човъркаш из уиндоуса :)
Просто го пишеш това и готово :)
Поздрави,
Косьо

 

 

2
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей Косьо,

за съжаление не става - една колежка ми обърна внимание на това преди месеци - опитала да рънне моята програма на нейния компютър, и тя изгърмяла, ето така:

Code:

using System;
using System.Globalization;
using System.Threading;

class AgeAfterTenYears
{
    static void Main()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

        Console.Write("Please, type the date of your birthday: ");
        DateTime birthday = DateTime.Parse(Console.ReadLine());
    }
}

Please, type the date of your birthday: 13/02/1985 (това въведох за инпут)

Output:
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.DateTime.Parse(String s)
   at AgeAfterTenYears.Main() in c:\Users\Katya\Desktop\02. Introduction-To-Programming-Homework\ConsoleApplication4\Program.cs:line 12
Press any key to continue . . .

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

Но за датата си е необходима конкретна настройка.

0
02/04/2015 10:19:00
kyamaliev avatar kyamaliev 209 Точки

Здравей, Катя,

Е да, няма 13-ти месец в годината. Инвариантната култура предполага фомат месец/ден/година

Това може да се отиграе и по друг начин:

Snippet

DateTime date = DateTime.ParseExact(
Console.ReadLine(),
"dd-MM-yyyy", 
CultureInfo.InvariantCulture); Console.WriteLine(date.ToString("dd-MMM-yy"));

Тук обаче няма да приеме друго освен тире за разделител.

Относно десетичната запетая е важно да се въвежда с numpad-a, иначе може да възприеме символа за разделител на хилядните и да го пропусне (3,4->34).

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

 

 

1
02/04/2015 11:43:07
anastassija87 avatar anastassija87 5 Точки

Здравейте,

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

        Console.WriteLine("When were you born? Use format(mm.dd.yyyy)!");
        string date = Console.ReadLine();
        DateTime dt = Convert.ToDateTime(date); // Конвертираме символния низ до показател за дата
        DateTime today = DateTime.Today; // Показва годините на потребителя в момента
        int age = today.Year - dt.Year;
        Console.WriteLine("Your current age is {0}.", age);
        Console.WriteLine("Your age in 10 years will be {0}. ", age+10);

 

Output

When were you born? Use format (dd.mm.yyyy)!

> 5.11.1990

Your current age is 25.

Your age in 10 years will be 35.

 

 

0
04/04/2015 14:47:10
supersane avatar supersane 234 Точки

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


namespace AgeAfterTenYears
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter your birthday in this format (YYYY,MM,DD) Example: 1995,12,21 ");
            DateTime birthday = DateTime.Parse(Console.ReadLine());
            DateTime today = DateTime.Now;
            int age = today.Year - birthday.Year;
            if (birthday.Month > today.Month)
            Console.WriteLine(age - 1);
            else if(birthday.Month == today.Month)
            {
                if(birthday.Day > today.Day)
                {
                    Console.WriteLine(age - 1);
                }
                else
                {
                    Console.WriteLine(age);
                }
            }
            else
            {
                Console.WriteLine(age);
            }
        }
    }
}

2
anastassija87 avatar anastassija87 5 Точки

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

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