Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.11.2019
Сообщений: 10

Задача на нахождение кол-ва дней до нового года по месяцу и дню

06.01.2020, 20:37. Показов 5926. Ответов 7
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
Вводится месяц и день месяца, а выводится кол-во дней до НГ. При некорректном вводе выводится -1.Решать без массивов.
Я вроде-бы понимаю,как это решить, но не понимаю, как записать чтобы не выдавало 2 значения тогда, когда кол-во введённых дней больше, чем есть в данном месяце. Подскажите как исправить решение и упростить код, пожалуйста!

Ввод:
2
30
Должно выводить:
-1
Выводит:
-1
304



Java
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
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int g = in.nextInt();
        int l = in.nextInt();
        int f = 0; int result=365;
        
            if( g !=1 && g!=2 && g!=3 && g!=4 && g!=5 && g!=6 && g!=7 && g!=8 && g!=9 && g!=10 && g!=11 && g!=12){
                System.out.println("-1");}
                
            
                    if (( g==1 || g==3 || g==5 || g==7 || g==8 || g==10 || g==12) && l>31){
                        System.out.println("-1");
                        f= f+ 31; } 
                    if ((  g==4 || g==6 || g==9 || g==11) && l>30){
                        System.out.println("-1");
                        f=f+ 30;}
                    if ( (g==2) && l >28){
                        System.out.println("-1");}
                
          
            for(int x=1;x<g;x++){
               if ( x==1 || x==3 || x==5 || x==7 || x==8 || x==10 || x==12){
                    //System.out.println("31");
                    f= f+ 31; }
              if (  x==4 || x==6 || x==9 || x==11){
                        //System.out.println("30");
                        f=f+ 30;}
              if ( x==2){
                   //System.out.println("28");
                   f= f+ 28;}
                
            }
           
        result = result - (f+l);
            System.out.println(result);
        }
    
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2020, 20:37
Ответы с готовыми решениями:

По заданным номеру месяца и дню определить, сколько дней до Нового Года
Напишите программу, которая вводит с клавиатуры номер месяца и день, и определяет, сколько дней осталось до Нового года. При вводе неверных...

Программа вычисления високосного года, сезона года по месяцу, количеству дней от начала года
добрый вечер, уважаемые программисты! помогите,пожалуйста,разобраться в программе. в программе нужно: 1)вычислять является ли год...

По заданным дню и месяцу определить дату предыдущего и следующего дней
Дата некоторого дня определяется двумя натуральными числами m (порядковый номер месяца) и n (число). По заданным n и m определить: (а)...

7
115 / 79 / 40
Регистрация: 18.12.2015
Сообщений: 192
06.01.2020, 21:06
А если год високосный?)
Ну в целом так.
UPD: Забыл брейки впилить в нижний цикл
Java
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
54
55
56
57
import java.util.Scanner;
public class Main
{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        int d = scan.nextInt();
        System.out.println(solve(m,d));
    }
    
    public static int solve(int m,int d){
        int count = 0;
        if(m < 1 || m > 12 || d < 1 || d > 31) return -1;
        switch(m){
            case 1:
                case 3:
                    case 5:
                        case 7:
                            case 8:
                                case 10:
                                    case 12:
                                        if(d > 31) return -1;
                                        break;
       case 4:
           case 6:
               case 9:
                   case 11:
                       if(d > 30) return -1;
                       break;
       case 2:
           if(d > 28) return -1;
           break;
        } 
       for(int i = m;i<=12;i++){
           switch(i){
            case 1:
                case 3:
                    case 5:
                        case 7:
                            case 8:
                                case 10:
                                    case 12:
                                       count+=31;
                                       break;
        case 4:
           case 6:
               case 9:
                   case 11:
                       count+=30;
                       break;
       case 2: count+=28;
       break;
       }
    }
     return 365-(count+d);
}
}
1
0 / 0 / 0
Регистрация: 26.11.2019
Сообщений: 10
06.01.2020, 21:13  [ТС]
Считать что все года не високосные.
А куда там ,брейки добавлять?
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
06.01.2020, 21:14
Java
1
2
3
4
5
6
7
8
9
10
static final int YEAR = 2020;
 
public static void main(String[] args) {
    final int month = 1;
    final int day = 6;
    
    System.out.println(
        LocalDate.of(YEAR, month, day).until(LocalDate.of(YEAR, 12, 31), ChronoUnit.DAYS)
    );
}
3
115 / 79 / 40
Регистрация: 18.12.2015
Сообщений: 192
06.01.2020, 21:49
Лучший ответ Сообщение было отмечено IZT как решение

Решение

Цитата Сообщение от IZT Посмотреть сообщение
Считать что все года не високосные.
А куда там ,брейки добавлять?
В таком случае корректно работает, вроде как. Если вводить 12 месяц и 1 число - до нг останется 30 дней, если 11 месяц и 30 число - 31 день, если 1 месяц и 1 день - 364 дня.

Java
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
54
55
56
57
import java.util.Scanner;
public class Main
{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        int d = scan.nextInt();
        System.out.println(solve(m,d));
    }
    
    public static int solve(int m,int d){
        int count = 0;
        if(m < 1 || m > 12 || d < 1 || d > 31) return -1;
        switch(m){
            case 1:
                case 3:
                    case 5:
                        case 7:
                            case 8:
                                case 10:
                                    case 12:
                                        if(d > 31) return -1;
                                        break;
       case 4:
           case 6:
               case 9:
                   case 11:
                       if(d > 30) return -1;
                       break;
       case 2:
           if(d > 28) return -1;
           break;
        } 
       for(int i = m;i<=12;i++){
           switch(i){
            case 1:
                case 3:
                    case 5:
                        case 7:
                            case 8:
                                case 10:
                                    case 12:
                                       count+=31;
                                       break;
        case 4:
           case 6:
               case 9:
                   case 11:
                       count+=30;
                       break;
       case 2: count+=28;
       break;
       }
    }
     return count-d;
}
}
1
0 / 0 / 0
Регистрация: 26.11.2019
Сообщений: 10
07.01.2020, 21:35  [ТС]
Спасибо огромное!
Auror, если вам не трудно, то можете объяснить ваш код, пожалуйста.
0
115 / 79 / 40
Регистрация: 18.12.2015
Сообщений: 192
07.01.2020, 21:49
Цитата Сообщение от IZT Посмотреть сообщение
Спасибо огромное!
Auror, если вам не трудно, то можете объяснить ваш код, пожалуйста.
IZT в функции проверяем сначала дни и месяцы на ну точно невалидные значения - если они отрицательные или если дней больше 31 или месяцев больше 12 сразу возвращается -1 и следует выход из функции, дальнейший код банально дальше не отработает

после проверятся для месяцев конкретно - switch(m) выполняет в case определенные действия в зависимости от значения переменной m,переданной в свитч. поскольку проверка для всех месяцев едина,то можно объединить проверку и не прописывать ее в каждом кейсе(хотя можно и так), то проверку пишем лишь в последний кейс. если в месяцах 1,3,5,7,8,10,12(что соответствует case 1, case 3,case 5 итд) дней больше чем 31 то также возвращаем -1 и дальнейший код не срабатывает. проверка остальных месяцев аналогична.

После того как все проверки выполнены можно начать считать сколько же дней до нового года осталось. необязательно для этого еще и знать, что в году 365 дней, достаточно знать, что всего месяцев 12 и количество дней в каждом месяце.
запускаем цикл
Java
1
 for(int i = m;i<=12;i++){
, который проходит от заданного месяца до последнего, добавляя в переменную count количество дней в каждом месяце. способ с конструкцией свитч здесь аналогичен - поскольку дней в нескольких месяцах одинаково, можно назначить одно действие сразу для всех этих нескольких месяцев.
Из конечного результата отнимается переменная хранящая в себе дни, поскольку если допустим задана дата 25 января, то не вычитая дни будет получено(исходя из логики подсчета, охватывающей месяц целиком) число которое будет больше реального как раз на эти 25 дней
2
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
08.01.2020, 16:26
С массивом но "ручками".
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.stream.IntStream;
 
public class CalendarCount{
    private static int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public static void main(String[] args){
        System.out.println("day,month\t : days");
        System.out.println("  0  0 :\t "+solve(0,0));
        System.out.println(" 30  2 :\t "+solve(30,2));
        System.out.println(" 30  3 :\t "+solve(30,3));
        System.out.println(" 31  4 :\t "+solve(31,4));
        System.out.println(" 31  12 :\t"+solve(31,12));
        System.out.println(" 30  12 :\t"+solve(30,12));
        System.out.println("  1  1 :\t "+solve(1,1));
        System.out.println(" 30  11 :\t "+solve(30,11));
    }
    public static int solve(int d, int m) {
        if(d<1 || m<1 || m>12 || d>months[m-1]) return -1;
        return IntStream.range(0,months.length).skip(m-1).map(i -> months[i]).sum()-d;
    }
}
Code
1
2
3
4
5
6
7
8
9
day,month    : days
  0  0 :     -1
 30  2 :     -1
 30  3 :     276
 31  4 :     -1
 31  12 :   0
 30  12 :   1
  1  1 :     364
 30  11 :    31
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2020, 16:26
Помогаю со студенческими работами здесь

Задача. Сколько дней осталось до Нового Года?
Здравствуйте, форумчане! Помогите с задачей =) Задача: Напишите программу, которая вводит с клавиатуры номер месяца и день, и...

По введенному с клавиатуры дню и месяцу выдать название соответствующего сезона года
Нужно предусмотреть защиту от неправильного ввода данных (По введенному с клавиатуры дню и месяцу выдать название соответствующего сезона...

По введенному с клавиатуры дню и месяцу выдать название соответствующего сезона года
1)По введенному с клавиатуры дню и месяцу выдать название соответствующего сезона года (лето, осень, зима, весна), считая наступление...

Как в SQL запросе сделать выбор даты по конкретному месяцу и дню и для любого года?
Как в эскюэльном запросе сделать выбор даты по конкретному месяцу и дню и для любого года??? т.е. кпримеру чтоб получить список дней...

Нахождение дней между диапазоном дат(не кол-во дней, а сами дни)
Всем привет, возникла такая задачка: есть начальная и конечная даты, нужно найти дни между ними, не само кол-во дней, а именно сами дни,...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru