Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
VANYOK
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 43
1

Определение возраста по датам. Исправить код

09.12.2013, 00:26. Просмотров 691. Ответов 12
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace HelloCs
{
    class Program
    {
        static void Main(string[] args)
        {
            string name;       // имя 
            int year;          // год
            int age;           // возраст
            int frameyear;     // год отсчета
            string yearend;    // окончание "лет"
            
            Console.WriteLine("Введите ваше имя:\n");
            name = Console.ReadLine();  
            Console.WriteLine("\nПривет, " + name + "!\n");
            Console.WriteLine(name + ", введите ваш год рождения:\n");
            year = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("\nИ введите ваш год, в котором хотите узнать сколько вам лет:\n");
            frameyear = Convert.ToInt32(Console.ReadLine());
 
            age = (frameyear - year);
            
            if(age < 0)
            {
                Console.WriteLine("/nВы еще не родились");
                Console.ReadKey();
            }
            
            yearend = " лет\n";
            
            if ((age % 100) >= 11 && (age % 100) <= 19)
            {
                yearend = " лет\n";
            }
           
            switch (age % 10)
            {
                case 1: yearend = " год\n"; break;
                case 2:
                case 3:
                case 4: yearend = " года\n"; break;
            }
             
            Console.WriteLine("\n" + name + ", вам в " + frameyear + " году: " + age + yearend);
            Console.ReadKey();
        }     
    }
}
Почему если получается лет меньше нуля, она выполняет
C#
1
Console.WriteLine("/nВы еще не родились");
Но потом продолжает выполнять
C#
1
Console.WriteLine("\n" + name + ", вам в " + frameyear + " году: " + age + yearend);
а уже потом только завершает работу???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2013, 00:26
Ответы с готовыми решениями:

Определить возрастную группу в зависимости от введенного возраста. Исправить код
Доброго времени суток, обитатели форума. Не так давно начала изучать C#. Сижу...

Определение 6 лучших команд в каждой группе, исправить код
Даны 2 группы по 12 команд,в методе идёт определение 6 лучших команд в каждой...

Выполнить код по датам из файла Excel
в файле excel в столбце С записаны даты в формате 02.06.2017 10:07:14....

Код не отображает картинку с камеры. Исправить код
using System; using System.Collections.Generic; using System.ComponentModel;...

Исправить код
Отредактируйте пожалуйста. Задание: Определить иерархию классов (в...

12
freeba
Неадекват
1261 / 1060 / 202
Регистрация: 02.04.2010
Сообщений: 2,433
Записей в блоге: 2
Завершенные тесты: 2
09.12.2013, 00:32 2
Цитата Сообщение от VANYOK Посмотреть сообщение
Но потом продолжает выполнять
Добавте в 32 строчку return;
1
VANYOK
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 43
09.12.2013, 00:43  [ТС] 3
Цитата Сообщение от freeba Посмотреть сообщение
Добавте в 32 строчку return;
Спасибо
0
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
09.12.2013, 02:31 4
VANYOK, строки 37-40 не несут никакой смысловой нагрузки
1
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
09.12.2013, 08:48 5
VANYOK, 1) лучше наверное так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            if (age < 0)
            {
                Console.WriteLine("/nВы еще не родились");
                Console.ReadKey();
            }
 
            int mod = age % 10;
            yearend = " лет\n";
 
            if (mod == 1)
            {
                yearend = " год";
            } 
            else if (mod <= 4)
            {
                yearend = " года";
            }
И второе: избавляйтесь от привычки писать новую строку как \n. В линуксе это действительно \n. В винде это - \r\n, где-то еще - свое. Пользуйтесь Environment.NewLine, там всегда лежит то, что является переводом для текущей платформы.

А вообще для новичка очень чистый код, с понятно названными переменными... Одним словом: молодец.
2
VANYOK
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 43
09.12.2013, 13:57  [ТС] 6
Psilon, это как С++ :
C++
1
cout << "..."<< endl;
В C#:
C#
1
Console.WriteLine("...", Environment.NewLine);
Я вас правильно понял?
Хотя,
C#
1
WriteLine
и так осуществляет переход на новую строку, наверное это тоже самое что я писал, только без \n, ну ладно, сейчас исправлюсь.
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
09.12.2013, 13:59 7
VANYOK, почти, только в шарпе форматирующая строка. То есть писать нужно
C#
1
Console.WriteLine("...{0}", Environment.NewLine);
а сишным аналогом этого будет
C
1
printf("...%s", "\n");
0
VANYOK
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 43
09.12.2013, 14:19  [ТС] 8
Хотя лучше не разделять, и так хорошо смотрится(читается).
Во вам рабочий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace HelloCs
{
    class Program
    {
        static void Main(string[] args)
        {
            string name;       // имя 
            int year;          // год
            int age;           // возраст
            int frameyear;     // год отсчета
            string yearend;    // окончание "лет"
 
            Console.WriteLine("Введите ваше имя:");
            name = Console.ReadLine();
            Console.WriteLine("Привет, " + name + "!!!");
            Console.WriteLine(name + ", введите ваш год рождения:");
            year = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("И введите год, в котором хотите узнать сколько вам лет:");
            frameyear = Convert.ToInt32(Console.ReadLine());
 
            age = (frameyear - year);
            
            if(age < 0)
            {
                Console.WriteLine(Environment.NewLine,"В " + year + " году вы еще не родились!");
                Console.ReadKey();
                return;
            }
 
            int mod = age % 10;
            yearend = " лет";
 
            if (mod == 1)
            {
                yearend = " год";
            }
            else if (mod <= 4)
            {
                yearend = " года";
            }
 
            Console.WriteLine(name + ", вам в " + frameyear + " году: " + age + yearend);
            Console.ReadKey();
        }     
    }
}
Есть идеи как сделать точность до дня включая месяц?
Раз уж тему форума изменили...
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
09.12.2013, 14:31 9
в идеале должно выглядеть как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
 
namespace HelloCs
{
    internal class Program
    {
        private static void Main()
        {
            Console.WriteLine("Введите ваше имя:");
            string name = Console.ReadLine();
            Console.WriteLine("Привет, {0}!!!", name);
            Console.WriteLine("{0}, введите ваш год рождения:", name);
            int year = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("И введите год, в котором хотите узнать сколько вам лет:");
            int frameyear = Convert.ToInt32(Console.ReadLine());
 
            int age = (frameyear - year);
 
            if (age < 0)
            {
                Console.WriteLine("В {0} году вы еще не родились!", year);
                Console.ReadKey();
                return;
            }
 
            int mod = age%10;
            string yearend;
 
            if (mod == 1)
                yearend = "год";
            else if (mod <= 4)
                yearend = "года";
            else
                yearend = "лет";
 
            Console.WriteLine("{0}, вам в {1} году будет {2} {3} ", name, frameyear, age, yearend);
            Console.ReadKey();
        }
    }
}
пользуйтесь форматированием, без него трудно читать, конкатенации строк очень отвлекают.

Добавлено через 1 минуту
Стандартный метод заключается в переводе в дни, но по-моему класс DateTime просто огромный (с его помощью все это сделать легко, но инфраструктура внутри - непростая).

Добавлено через 2 минуты
Откопал раритет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Threading;
 
namespace ConsoleApplication25
{
    class Program
    {
        static void Main()
        {
            var r = new Random();
            DateTime dateTime = new DateTime(1993, 5, 18);
            while (true)
            {
                Console.WriteLine(DateDiff(dateTime,DateTime.Now));
                Thread.Sleep(r.Next(500, 1500));
            }
        }
 
        private static string DateDiff(DateTime dt1, DateTime dt2)
        {
            var diff = new DateTime((dt2 - dt1).Ticks);
            return string.Format("Разница между {0} и {1} составляет {2} лет, {3} месяцев, {4} дней, {5} часов, {6} минут, {7} секунд",
                              dt1, dt2, diff.Year, diff.Month, diff.Day, diff.Hour, diff.Minute, diff.Second);
        }
    }
}
1
VANYOK
1 / 1 / 0
Регистрация: 05.12.2013
Сообщений: 43
09.12.2013, 15:13  [ТС] 10
Цитата Сообщение от Psilon Посмотреть сообщение
Console.WriteLine("{0}, вам в {1} году будет {2} {3} ", name, frameyear, age, yearend);
Эта фишка мне понравилась, спасибо!
Но мне еще учиться, да учиться...
0
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
09.12.2013, 17:59 11
Цитата Сообщение от Psilon Посмотреть сообщение
В винде это - \r\n
Psilon, не могли бы Вы объяснить, если гугл не подвел, то:
\r это символ возврата каретки, переводит курсор в начало строки
\n это символ перевода строки, переводит курсор в начало следующей строки
если судить логически, то /r перед /n вообще ничего не меняет
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
09.12.2013, 19:45 12
rattrapper, ну например если парсить csv, то там при неправильном переводе строке ничего не получится получить...
0
tezaurismosis
Администратор
Эксперт .NET
8547 / 3840 / 725
Регистрация: 17.04.2012
Сообщений: 8,547
Записей в блоге: 14
09.12.2013, 22:35 13
rattrapper, к примеру, вы парсите INI-файла с помощью Split, допустим, он у вас в виде полного текста
Делите на строки
C#
1
string[] lines = ini.Split('\n');
и хотите узнать, является ли строка заголовком (пример см. спойлер, Section2 я имею в виду)
Кликните здесь для просмотра всего текста
Код
[Section2]
var1 = значение_1
var2 = значение_2

и предположите определять это по тому, заканчивается ли строка символом ']'. Пишите
C#
1
if (line.EndsWith(']'))  // ...
Если перенос строки - \r\n, то для Section2 line.EndsWith(']')) вернёт false, т.к. строка заканчивается \r
Конечно, это всё можно обойти дополнительными костылями, но ведь хорошо, когда всё уже учтено.
1
09.12.2013, 22:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2013, 22:35

Исправить код
После ввода слов, если в конце ставлю пробел, вылетает ошибка. И при вводе...

Исправить код
Не могу сделать для вещественных чисел(в коде для целочисленных). И бывает...

Исправить код
class Tel { protected string marka; protected int funk; string _marka...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru