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

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

06.01.2020, 20:37. Показов 5961. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru