Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проверка на високосный год


Автор: mr.Anderson 28.8.2005, 17:18
Задача: есть TEdit, в который вводится год в четырехзначном формате (2004, например). Надо узнать, високосный или нет введенный год.
Как это сделать? Я знаю, что у високосного года последняя цифра делится без остатка на 4. Но как разделить введенное значение на цифры, обработать последнюю и сделать в соответствии с вычислениями вывод? Прошу помочь.

Автор: maxim1000 28.8.2005, 17:26
переводим строку в число с помощью StrToInt(Edit1->Text), смотрим на x%4
только я слышал, что есть еще одно уточнение для високосного года (не уверен на 100%): если число делится на 100, но не делится на 400 - год не високосный...

Автор: mr.Anderson 28.8.2005, 17:29
Как перевести текст в Эдите в переменную, я знаю - примерно так:
Код

int var=Edit1->Text.ToInt();

Я спрашиваю, как теперь оперировать с последней цифрой? Ведь в переменную передано все число!

Автор: Mayk 28.8.2005, 17:30
maxim1000 Угу. Цитата:
Цитата(http)

1. Год делится на 400 -> високосный -> конец
2. Год делится на 100 -> не високосный -> конец
3. Год делится на 4 -> високосный -> конец
4. Год не високосный -> конец
5. Всё

Добавлено @ 17:33
Цитата(sim7 @ 28.8.2005, 21:29)
Ведь в переменную передано все число!

Ну дыкть, тебе и нужно целое. 2000 год был високосным, 2100 уже не будет. Здесь не отделаться последней цифрой.

Автор: mr.Anderson 28.8.2005, 17:33
А... Вон как. Следовательно, проверку делаем так?
Код

#define FLAG1 0
#define FLAG2 0
//-------------------------------------------------

int var=Edit1->Text.ToInt();
if((var%400)==0) FLAG1=1;
if((var%100)==0) FLAG2=1;
if((var%4)==0) FLAG1=1;

if(!FLAG2) //значит, високосный

Верно?

Автор: mr.Anderson 28.8.2005, 17:55
Что за фигня?! Пишу:
Код

#define VISOKOS 0
int var=Edit1->Text.ToInt();
if((var%400)==0) VISOKOS=true;
if((var%100)==0) {if(!VISOKOS) VISOKOS=true;
if((var%4)==0) VISOKOS=false;
//Дальше проверка
if(VISOKOS) //Делаем то-то
if(!VISOKOS) //Делаем другое

Компилер ругается на строчки 3, 4, 5 в моем коде. Говорит:
Цитата
Lvalue required

Помогите!

Автор: Mayk 28.8.2005, 17:59
Нда. А ты чего от него хочешь?
Цитата(sim7 @ 28.8.2005, 21:55)
#define VISOKOS 0

Замени на bool VISOKOS=false; и почитай что-нить про препроцессор, директивы #define etc.

Автор: mr.Anderson 28.8.2005, 18:01
Я пробовал писать и так:
Код

#define VISOKOS 0
int var=Edit1->Text.ToInt();
if((var%400)==0) VISOKOS=1;
if((var%100)==0) {if(!VISOKOS) VISOKOS=1;
if((var%4)==0) VISOKOS=0;
//Дальше проверка
if(VISOKOS) //Делаем то-то
if(!VISOKOS) //Делаем другое

И даже так:
Код

#define VISOKOS false
int var=Edit1->Text.ToInt();
if((var%400)==0) VISOKOS=true;
if((var%100)==0) {if(!VISOKOS) VISOKOS=true;
if((var%4)==0) VISOKOS=false;
//Дальше проверка
if(VISOKOS) //Делаем то-то
if(!VISOKOS) //Делаем другое

Но ошибка все равно выдается!
Добавлено @ 18:03
Или нельзя константам... Ой, ё! smile Забыл, что константы - неизменяемые значения! Блин! Во опозорился...
Добавлено @ 18:08
Так. Вот общий код:
Код

bool VISOKOS=0;
int var=Edit1->Text.ToInt();
if((var%400)==0) VISOKOS=1;
if((var%4)==0) VISOKOS=1;
if((var%100)==0) VISOKOS=0;
if(VISOKOS)
 if(Edit2->Text.ToInt()==2 && Edit1->Text.ToInt()>=30)
  Edit1->Text=29;
if(!VISOKOS)
 if(Edit2->Text.ToInt()==2 && Edit1->Text.ToInt()>=29)
  Edit1->Text=28;

Почему при наборе даты 30.02.2012 число 30 меняется на 28, а не на 29, как должно быть?

Автор: Mayk 28.8.2005, 18:14
Цитата(sim7 @ 28.8.2005, 22:01)
Почему при наборе даты 30.02.2012 число 30 меняется на 28,

Вот почему
Цитата(sim7 @ 28.8.2005, 22:01)
if((var%4)==0) VISOKOS=1;


Автор: mr.Anderson 28.8.2005, 18:28
Цитата
Год делится на 4 -> високосный -> конец

Или я чего-то недопонимаю?

Автор: Mayk 28.8.2005, 18:30
Побегай с отладчиком, поймешь.

ЗЫ. Хинт. Что неверно в этом коде по обмену значения с 1 на 2 и наоборот
Код

if (x==1) x = 2;
if (x==2) x = 1;


Автор: mr.Anderson 28.8.2005, 18:36
Цитата(Mayk @ 28.8.2005, 19:30)
Побегай с отладчиком, поймешь.

Если б я умел им пользоваться...
Цитата(Mayk @ 28.8.2005, 19:30)
ЗЫ. Хинт. Что неверно в этом коде по обмену значения с 1 на 2 и наоборот

Это вопрос? Тогда не знаю... Вроде, все нормально. Если x равен 1, то он становится равен 2. Если он равен 2, то приравнивается к 1. Что тут может быть неверно?

Послушайте, подскажите, что не так в моем коде, и закроем вопрос! Неужели ж это так трудно? smile smile

Автор: Mayk 28.8.2005, 18:44
Покажу, что не так в коде с обменом. В твоём та же фишка.
Итак, имеем
Код

if (x == 1) x=2;
if (x == 2) x=1;

Пусть X=2. Смотрим.
if (x==1) <-- неверно, ничего не делаем
if (x==2) <-- верно, x=1;
Получили x=1.

А теперь x=1.
if (x==1)<--верно, x = 2
if (x==2)<--верно, x = 1
Получем х=1.


зы. оффтопик отсюда, вообще так менять неинтересно. Лучше вот так делать
x = abs(x-2)+1;.
Так
|1-2|+1=1+1=2
|2-2|+1=0+1=1

Автор: mr.Anderson 28.8.2005, 18:59
Я, наверно, слишком тупой, но ошибки у себя я не нашел. Завтра я зайду снова, надеюсь, вы мне укажете ошибку.

Автор: Mayk 28.8.2005, 19:09
Упс, сорри, не туда посмотрел. Вот та ошибка:
Цитата(sim7 @ 28.8.2005, 22:01)
int var=Edit1->Text.ToInt();

Предыдушии посты показывают другую ошибку. 2000 год например является вискосным, хотя программа посчитает по другому.

Автор: Vyacheslav 29.8.2005, 09:54
Надо быть проще smile
Код

extern PACKAGE bool __fastcall IsLeapYear(Word Year);

Автор: codelord 30.8.2005, 17:29
Цитата(Vyacheslav @ 29.8.2005, 09:54)
Надо быть проще

полностью согласен smile
примерно так на форме Edit1 в котором год и Button1 который жмем
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i=Edit1->Text.ToInt();
if(IsLeapYear(i))Edit1->Text="Високосный";
else Edit1->Text="Не високосный";
}

Добавлено @ 17:35
Ну или
так:
Код

int year=Edit1->Text.ToInt();
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)  Edit1->Text="Високосный";
else Edit1->Text="Не Високосный";

Автор: mr.Anderson 30.8.2005, 20:37
Спасибо, Codelord. Vyacheslav, а вы не могли раньше сказать? Мы тут такую кашу заварили. А могли бы и не варить... smile

Автор: Гость_fisic 27.10.2005, 22:00
По-моему задача достаточно проста.
1. Вроде как есть функция bool IsLeapYear(int);
2. Береч год, целиком, например 2000, находиш остаток от деления на 4,
если он равен нулю, значит год високосный, если нет, то нет.
Тема стара, но я так понял, не решена, так что может, пригодится
С уважением, fisic.

Автор: Гость_fisic 27.10.2005, 22:04
Извините, что-то у меня протормозило, я не увидел продолжение
темы. Ответ уже готов... Жаль... Хотел помочь....,
Кстати, не могли бы вы привести пример года, который делился на 4 без остатка, но не был високосным?

с уважением, fisic.

Автор: Mayk 28.10.2005, 08:24
Цитата
Кстати, не могли бы вы привести пример года, который делился на 4 без остатка, но не был високосным?


Цитата(codelord @ 30.8.2005, 21:29)
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)  Edit1->Text="Високосный";
else Edit1->Text="Не Високосный";


Выше же писали.
1900,2100 к примеру не високосны.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)