Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на високосный год 
:(
    Опции темы
mr.Anderson
Дата 28.8.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 28.8.2005, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
mr.Anderson
Дата 28.8.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Как перевести текст в Эдите в переменную, я знаю - примерно так:
Код

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

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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 28.8.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



maxim1000 Угу. Цитата:
Цитата(http)

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

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

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

Это сообщение отредактировал(а) Mayk - 28.8.2005, 17:31


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 28.8.2005, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



А... Вон как. Следовательно, проверку делаем так?
Код

#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) //значит, високосный

Верно?

Это сообщение отредактировал(а) sim7 - 28.8.2005, 17:34


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 28.8.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Что за фигня?! Пишу:
Код

#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

Помогите!

Это сообщение отредактировал(а) sim7 - 28.8.2005, 17:56


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 28.8.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



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

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 28.8.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Я пробовал писать и так:
Код

#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, как должно быть?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 28.8.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



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

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




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 28.8.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Цитата
Год делится на 4 -> високосный -> конец

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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 28.8.2005, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



Побегай с отладчиком, поймешь.

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

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




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 28.8.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



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

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

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

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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 28.8.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



Покажу, что не так в коде с обменом. В твоём та же фишка.
Итак, имеем
Код

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



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 28.8.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 28.8.2005, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



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

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 29.8.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Надо быть проще smile
Код

extern PACKAGE bool __fastcall IsLeapYear(Word Year);



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
codelord
Дата 30.8.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(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="Не Високосный";



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
mr.Anderson
Дата 30.8.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Гость_fisic
Дата 27.10.2005, 22:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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


Unregistered











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

с уважением, fisic.
  Вверх
Mayk
Дата 28.10.2005, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



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


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


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



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.