6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
1

Оператор switch. Логическое "Или"

01.11.2018, 21:45. Показов 1082. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему такой код, выдаёт для 4 - "невисокосный"?

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
#include<stdio.h>
#include<conio.h>
int main()
{
 
int year;
 
printf("Введите год, N*: ");
scanf("%d",&year);
 
if ( year <= 0 )
 
    switch (year) {
    case 0: printf("0 ã. í. ý.");   break;
    default: printf ("Год не может быть отрицательным!"); break;
    }
 
else 
 
    switch ( year % 4 || year % 400 ) {
    case 0: printf ("Високосный"); break;
    default: printf("Невисокосный"); break;
    }
 
getch();
return 0;
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2018, 21:45
Ответы с готовыми решениями:

Оператор switch: рассчитать разницу, сумму или произведение двух чисел
Здравствуйте! Не могу применить switch к заданию, потому что ни опыта, ни знаний как таковых......

Как оператор switch превратить в оператор if
Здравствуйте! Есть вот такая задачка: Для целого числа K (от 1 до 99 включительно) напечатать...

Оператор switch
Только учусь прогать на си, из некоторых ресурсов узнал, как работает switch. написал программку,...

Оператор Switch
С клавиатуры вводится целое трёхзначное число. Во введённом числе отбросить две последние цифры. По...

16
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
01.11.2018, 21:52 2
Выведи на экран отдельно результат выполнения year % 400, чтобы ситуация прояснилась для тебя.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
01.11.2018, 21:56 3
Лучший ответ Сообщение было отмечено number_118 как решение

Решение

Цитата Сообщение от number_118 Посмотреть сообщение
year % 4 || year % 400
и какой результат ожидается?
4%4 =0 приводится к false
4%400 =4 приводится к true
false || true =true , приводится к 1

что за извращенное использование switch?
0
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
01.11.2018, 22:15  [ТС] 4
Исправил на удобоваримое, всё работает:
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
#include<stdio.h>
#include<conio.h>
int main()
{
 
int year;
 
printf("Введите N, т.е. год*: ");
scanf("%d",&year);
 
if ( year <= 0 )
 
    switch (year) {
    case 0: printf("0 г. н. э.");   break;
    default: printf ("Год не может быть отрицательным!"); break;
    }
 
else {
 
    if ( year % 4 == 0 || year % 400 == 0 ) printf ("Високосный");
    else printf ("Невисокосный");
 
    }
 
getch();
return 0;
 
}
P.S. Конечно, можно тут было с do-while, но сказали без него сделать.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
01.11.2018, 22:26 5
а теперь введи 1900 год

Добавлено через 2 минуты
Цитата Сообщение от number_118 Посмотреть сообщение
Конечно, можно тут было с do-while,
это еще как?

Добавлено через 2 минуты
Цитата Сообщение от number_118 Посмотреть сообщение
printf ("Год не может быть отрицательным!");
Это почему?
до рождения Исуса Христа люди не жили?
а как же древние греки
0
2302 / 1128 / 702
Регистрация: 25.04.2016
Сообщений: 3,219
01.11.2018, 22:27 6
switch тут совершенно избыточен, да и на мой взгляд им стоит пользоваться ювелирно, только в самых-самых случаях, когда это действительно сделает код проще.
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
#include <stdio.h>
 
void check (int year)
{
    if (year%4 == 0 && year%100 != 0 || year%400 == 0)
        printf("%d - високосный\n", year);
    else
        printf("%d - невисокосный\n", year);
}
void circle (int start, int end)
{
    int year;
    for (year=start; year<=end; year++)
        check(year);
    printf("\n");
}
 
int main (void)
{
    int year;
    //printf("Введите год, N*: ");    scanf("%d", &year);
    //if (year <= 0) return 1;
    //check(year);
 
    circle(1, 9);
    circle(97, 102);
    circle(397, 405);
    circle(1697, 1705);
    circle(1991, 2003);
    return 0;
}
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
01.11.2018, 22:39 7
Цитата Сообщение от stake-k26 Посмотреть сообщение
circle(1, 9);
т.е ты проверяешь года с 1 по 9
4 и 8 должны быть високосными
но 4 не является високосным
високосными были 8 и 12
из за того что жрецы все напутали и до нашей эры считали високосным каждый третий год
да и кратные 100 года не високосными стали только после 1582 года
подробности здесь https://ru.wikipedia.org/wiki/Високосный_год
не все так просто с високосным годом
я бы с математическими расчетами в глубь веков не лез окараться можно
кстати
Цитата Сообщение от number_118 Посмотреть сообщение
выдаёт для 4 - "невисокосный"?
правильно показывала
1
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
01.11.2018, 22:48  [ТС] 8
ValeryS, stake-k26, мой код такой:

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
#include<stdio.h>
#include<conio.h>
int main()
{
 
int year;
 
printf("Введите N, т.е. год*: ");
scanf("%d",&year);
 
if ( year <= 0 )
 
    switch (year) {
    case 0: printf("0 г.н.э.");   break;
    default: printf ("Год не может быть отрицательный!"); break;
    }
 
else {
 
    if ( year <= 100 && year > 0 && year % 4 == 0 ) printf ("Високосный");
    else 
    if ( year <= 100 && year > 0 ) printf ("Невисокосный");
    else 
    if ( year % 400 == 0) printf ("Високосный");
    else printf ("Невисокосный");
 
}
 
getch();
return 0;
 
}
Это почему?
до рождения Исуса Христа люди не жили?
а как же древние греки
Было не -399г. , а 399 до н.э.

это еще как?
Вот так:

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
#include<stdio.h>
#include<conio.h>
int main()
{
 
int year;
 
do {
printf("Введите N, т.е. год*: ");
scanf("%d",&year);
}
while ( year < 0 );
 
if ( year == 0 ) printf ("0 г.н.э.");
 
 
else {
 
    if ( year <= 100 && year > 0 && year % 4 == 0 ) printf ("Високосный");
    else 
    if ( year <= 100 && year > 0 ) printf ("Невисокосный");
    else 
    if ( year % 400 == 0) printf ("Високосный");
    else printf ("Невисокосный");
 
}
 
getch();
return 0;
 
}
Если Вы настаиваете на отрицательных числах, тот же код, без do-while...

P.S. Ладно, буду иметь в виду Ваше замечание насчёт високосности, но ТЗ пока то, что было...
0
2302 / 1128 / 702
Регистрация: 25.04.2016
Сообщений: 3,219
01.11.2018, 23:30 9
Цитата Сообщение от ValeryS Посмотреть сообщение
4 не является високосным
цитата из одной педии:
год, номер которого кратен 400, — високосный;
остальные годы, номер которых кратен 100, — невисокосные;
остальные годы, номер которых кратен 4, — високосные.

согласно этому определению 4 - високосный

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
из за того что жрецы все напутали и до нашей эры считали високосным каждый третий год
... а вот сюда лучше не лезть, это слишком обширная тема, в результате которой всплывает эпохальный календарь и летосчисление от сотворения мира в звездном храме.. тема на столько мутная, что ну ее в баню. А потом еще выплывают многочисленные реформы календаря, начиная с .. рождества христова.. те е жрецы до сих пор не уверены когда стоит пасху отмечать. Так что лучше остановиться на общепринятых вариантах.

Чуть сократил код:
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
#include <stdio.h>
 
int check (int year){ return year%4 == 0 && year%100 != 0 || year%400 == 0; }
 
void circle (int start, int end)
{
    int year;
    for (year=start; year<=end; year++)
        printf("%d - %s\n", year, check(year)?"високосный":"невисокосный");
    printf("\n");
}
 
int main (void)
{
    //int year;
    //printf("Введите год, N*: ");    scanf("%d", &year);
    //if (year <= 0) return 1;
    //printf("%d - %s\n", year, check(year)?"високосный":"невисокосный");
 
    circle(1, 9);
    circle(97, 102);
    circle(397, 405);
    circle(1697, 1705);
    circle(1991, 2003);
    return 0;
}
Добавлено через 2 минуты
или, если соответствовать условию изначальной задачи без лишних проверок:
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int check (int year){ return year%4 == 0 && year%100 != 0 || year%400 == 0; }
int main (void)
{
    int year;
    printf("Введите год, N*: ");  scanf("%d", &year);
    if (year <= 0) return 1;
    printf("%d - %s\n", year, check(year)?"високосный":"невисокосный");
    return 0;
}
Добавлено через 31 минуту
ValeryS, если уж на то пошло, то високосность появилась в следствии того, что григорианский календарь (черт знает сколько раз исправленный) учитывает эклипсию земной оси, за счет чего каждые 4 года накапливается ошибка вычислений в 1 день. Однако изначальный календарь.. тот самый от сотворения мира в звездном храме, учитывал эклипсию земной орбиты - событие куда более масштабное и продолжительное. Т.е. наш современный календарь учитывает погрешность в рамках солнечной системы, в то время как изначальный учитывает погрешность в рамках (всего-то) млечного пути.

Тут кстати стоит не забывать о том факте, что сотворение мира в звездном храме, приключившееся где-то 600 000 лет тому назад - это не сотворение мира в библейском его понимании, что вроде бы напрашивается интуитивно, а подписание мира между двумя сверхдержавами, до которого было еще примерно 3 миллиона лет истории, и сколько там было поправок?..

Это примерно как нырять в Марианскую впадину в трусах и майке. Затея крайне бесперспективная.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
01.11.2018, 23:37 10
Цитата Сообщение от stake-k26 Посмотреть сообщение
цитата из одной педии:
год, номер которого кратен 400, — високосный;
остальные годы, номер которых кратен 100, — невисокосные;
остальные годы, номер которых кратен 4, — високосные.
но только после 1582 года
Цитата Сообщение от stake-k26 Посмотреть сообщение
а вот сюда лучше не лезть,
полностью согласен
вообще у нас свой календарь, компьютерный отсчет начинается с 13 декабря 1901 года, https://ru.wikipedia.org/wiki/Unix-время
но вот накидал функцию с учетом статьи в википедии
C
1
2
3
4
5
6
7
8
9
10
if(year>1582 &&(year%4==0 && year%100!=0 || year%400=0))
  printf ("Високосный");
 else
   if(year<1582 && year>4 && year%4==0)
       printf ("Високосный");
   else
      if(year<-9 && year>=-45 & year%3==0)
        printf ("Високосный");
   else
     printf ("Невисокосный");
0
2302 / 1128 / 702
Регистрация: 25.04.2016
Сообщений: 3,219
02.11.2018, 00:38 11
ValeryS, все же я не согласен с таким подходом, поскольку нигде не сказано, что високосный год учитывается вот в таком-то промежутке времени, а вот в в этаком он не учитывается. Просо есть 3 правила, по которым определяется високосный год, при этом не сказано, что до 1582 года или скажем до 1701 надо считать как-то по-другому.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
02.11.2018, 08:32 12
Цитата Сообщение от stake-k26 Посмотреть сообщение
все же я не согласен с таким подходом,
имеешь полное право
Цитата Сообщение от stake-k26 Посмотреть сообщение
поскольку нигде не сказано, что високосный год учитывается вот в таком-то промежутке времени,
как это, современные правила високосный кратны 4 но не кратный 100 или кратный 400 введены в 1582 году,
а до этого были просто кратны 4, а еще до этого кратны 3, а до 45 года до нашей эры их вообще не было
правда интересно это, скорее всего, только историкам

Добавлено через 2 минуты
пускай ТС решает, нужно ему такое глубокое погружение или нет
я тут недавно в другой теме сказал что 2000 год високосный а вот 1900 и 2100 нет, на что мне ответили, его железка столько не проживет, так что устроят простые правила, кратные 4

Добавлено через 7 часов 22 минуты
решил задачу со switch, правда без этих временных штучек
проверяйте
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
if(year<0)
 year*=-1;
 
switch(year%400)
{
 case 100:
 case 200:
 case 300:
   printf ("Невисокосный");
   break;
default:
   switch(year%4)
  {
    case 0:
       printf ("Високосный");
   break;
default:
    printf ("Невисокосный");
   break;
  }
 
  break;  
 
 
}
0
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
02.11.2018, 18:08  [ТС] 13
ValeryS, использование switch было необязательно.
0
2302 / 1128 / 702
Регистрация: 25.04.2016
Сообщений: 3,219
02.11.2018, 21:38 14
Цитата Сообщение от ValeryS Посмотреть сообщение
а до этого были
в том-то и дело, что мы не живем "до этого", мы живем сейчас.. или хотите сказать вам уже чуть более 436 лет?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
02.11.2018, 21:42 15
Цитата Сообщение от number_118 Посмотреть сообщение
использование switch было необязательно.
так мне просто интересно стало
нехай лежит, можа кто и соблазнится

Добавлено через 2 минуты
Цитата Сообщение от stake-k26 Посмотреть сообщение
что мы не живем "до этого", мы живем сейчас..
и что ?
если мы по простой программе рассчитаем что 4 год был високосным, а потом это скажем историкам, боюсь они нас не поймут.
0
stake-k26
02.11.2018, 22:01
  #16

Не по теме:

ValeryS, я историк и могу смело заявить, что ваши опасения напрасны. :)

0
Невнимательный
2568 / 953 / 313
Регистрация: 08.02.2013
Сообщений: 5,674
Записей в блоге: 2
02.11.2018, 22:37 17
Раньше -45-го года никто кроме астрономов похоже вообще не парился насчёт сколько дней в году
Юлиа́нский календа́рь — календарь, разработанный группой александрийских астрономов во главе с Созигеном. Календарь назван в честь Юлия Цезаря, по указу которого был введен в Римской империи с 1 января 45 года до н. э.
Зодиакальный календарь по Дионисию — календарь, использовавшийся александрийскими астрономами для датировки наблюдений планет в 272—241 гг. до н. э. Единственная сохранившаяся информация об этом календаре дошла до нас благодаря «Альмагесту» Птолемея. Реконструкцию зодиакального календаря выполнили Бёх в 1863 г. и ван дер Варден в 1984 г.
В календаре от Дионисия продолжительность года составляла в среднем 365,25 дней: три года по 365 дней и четвёртый 366 дней (аналогично юлианскому календарю, появившемуся позднее).
по версии вики-офф-научного сообщества .)

В XVI веке весеннее равноденствие происходило примерно на десять дней раньше, 11 марта. Разница была замечена ещё в начале второго тысячелетия, возникла необходимость коррекции календаря, однако только в 1582 году папа Григорий XIII издал постановление о реформе календаря. В новом календаре, получившем название григорианского, уменьшили количество високосных лет и применили новую формулу для определения дня Пасхи. Для возврата весеннего равноденствия на 21 марта было пропущено 10 дней, и в 1582 году следующий после 4 октября день был объявлен 15 октября.

Протестантские страны отказывались от юлианского календаря постепенно, на протяжении XVII—XVIII веков; последними были Великобритания (1752 год) и Швеция.

В России григорианский календарь был введён декретом Совнаркома, подписанным В. И. Лениным 26 января 1918 года
Одними из последних на григорианский календарь перешли Греция в 1924 году, Турция в 1926 году и Египет в 1928 году[4].
[3].

Вобщем до 1918-го можно забыть о точности,

Продолжительность года в юлианском календаре 365 1/4 дней, что на 11 с небольшим минут больше, чем длина солнечного («тропического») года, каждые 128 лет накапливается лишний день.
1918+128 = 2046, после этого или раньше високосных годов должно стать больше

Добавлено через 10 минут
Цитата Сообщение от ft4l Посмотреть сообщение
високосных годов должно стать больше
или меньше
0
02.11.2018, 22:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2018, 22:37
Помогаю со студенческими работами здесь

Оператор Switch
Разработать диалоговую программу, которая спрашивает возраст пользователя и определяет, к какой...

Оператор switch
Как в опреаторе switch можно сделать бесконечное кол-во кейсов?

switch на оператор if
Замените switch на оператор if в следующей программе. #include &lt;stdio.h&gt; main(){ ...

Оператор switch
Как сделать, чтобы case несколько раз работал? #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() {...

Не работает оператор switch.
Привет всем. Реализую в программе кое-что при помощи оператора switch. Пересмотрел материал,...

Через оператор switch в си
Фирма «Товары – почтой!» осуществляет доставку заказанных товаров по стране. Расстояние, на...

Оператор switch-case
Привет всем программистам! Помогите пожалуйста, у меня не получается освоить операторы switch-case...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru