Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 23:09   #1
программирование
Форумчанин
 
Регистрация: 22.04.2013
Сообщений: 162
Восклицание нахождение высокосного года, сезона года и к-ва дне с начала года Делфи 7 (есть код программы полностью)

добрый вечер, уважаемые программисты и просто форумчани. помогите, пожалуйста, в моей программе найти ошибку.

задание программы:
1)создать форму про.png.
2)вводим в программу число, месяц и год (начиная с 2001) - результат программы является ли год высокосным или нет.
3)по номеру месяца определить сезон года (зима,весна,лето или осень).

вот код
PHP код:
unit Unit1;

interface

uses
  Winapi
.WindowsWinapi.MessagesSystem.SysUtilsSystem.VariantsSystem.ClassesVcl.Graphics,
  
Vcl.ControlsVcl.FormsVcl.DialogsVcl.StdCtrls;

type
  TForm1 
= class(TForm)
    
monthTLabel;
    
Label1TLabel;
    
Label2TLabel;
    
rikTButton;
     
procedure Button1Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;
  
tdate=class
    
month,day,year:integer;
    
procedure setvalue(m,d,y:integer);
    function 
leapyear:boolean;
  
end;
var
  
Form1TForm1;
    
aday:tdate;
  
mn,dn,yn:integer;


implementation

{$R *.dfm}
 
procedure tdate.setvalue(m,d,y:integer);
begin
 month
:=m;
 
day:=d;
 
year:=y;
end;
function 
tdate.leapyear:boolean;
begin
 
if  (year mod 4 <>0then
      leapyear
:=false
 
else if (year mod 100<>0then
      leapyear
:=true
 
else if (year mod 400<>0then
      leapyear
:=false
 
else
      
leapyear:=true;
end;

procedure TForm1.Button1Click(SenderTObject);
begin
// ctvorenna obektu
   
aday:=tdate.Create ;
   
// vikorictanna ego
   
mn:=strtoint(form1.edit1.text);dn:=strtoint(form1.edit2.text);yn:=strtoint(form1.edit3.text);
   
aday.setvalue(mn,dn,yn);
   case 
month of
12
,1,2:showmessage('Winter');
3..5:showmessage('Spring');
6..8:showmessage('Summer');
9..11:showmessage('Autumn');
end;
if 
aday.leapyear  then
    showmessage
('Visokicniy rik:' inttostr(aday.year)+' '+inttostr(yn))
      else
    
showmessage('NEvisokicniy rik:' inttostr(aday.year));
    
//znichenna obekta
    
form1.edit4.Text:='Vi vveli datu '+inttostr(dn)+'/'+inttostr(mn)+'/'+inttostr(yn);
    
aday.Free;
end;

   
begin
   
// ctvorenna obektu
   
aday:=tdate.Create ;
   
// vikorictanna ego
   
mn:=1;dn:=1;yn:=2001;
   
aday.setvalue(mn,dn,yn);
   if 
aday.leapyear  then
    showmessage
('Visokicniy rik:' inttostr(aday.year))
    else
    
showmessage('NEvisokicniy rik:' inttostr(aday.year));
    
//znichenna obekta
    
aday.Free;
end
выдаёт ошибку
в строчке
mn:=strtoint(form1.edit1.text);dn:= strtoint(form1.edit2.text);yn:=strt oint(form1.edit3.text);
программирование вне форума Ответить с цитированием
Старый 19.09.2013, 23:18   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Какую именно ошибку выдает?
Вообще, записывайте каждый оператор на отдельной строке, так будет проще отлаживать программу.

Кстати, зачем високосность года проверять так:
Код:
function tdate.leapyear:boolean;
begin
 if  (year mod 4 <>0) then
      leapyear:=false
 else if (year mod 100<>0) then
      leapyear:=true
 else if (year mod 400<>0) then
      leapyear:=false
 else
      leapyear:=true;
end;
Достаточно лишь проверить, делится ли порядковый номер года на 4 нацело и всё. В вашем случае, это может выглядеть вообще так
Код:
unction tdate.leapyear: boolean;
begin
result:=(year mod 4) = 0

Последний раз редактировалось Вадим Мошев; 19.09.2013 в 23:23.
Вадим Мошев вне форума Ответить с цитированием
Старый 19.09.2013, 23:32   #3
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Я не пойму, почему вот этот код вынесен за пределы процедуры?

Код:
if aday.leapyear  then
    showmessage('Visokicniy rik:' + inttostr(aday.year)+' '+inttostr(yn))
      else
    showmessage('NEvisokicniy rik:' + inttostr(aday.year));
    //znichenna obekta
    form1.edit4.Text:='Vi vveli datu '+inttostr(dn)+'/'+inttostr(mn)+'/'+inttostr(yn);
    aday.Free;
end;

   begin
   // ctvorenna obektu
   aday:=tdate.Create ;
   // vikorictanna ego
   mn:=1;dn:=1;yn:=2001;
   aday.setvalue(mn,dn,yn);
   if aday.leapyear  then
    showmessage('Visokicniy rik:' + inttostr(aday.year))
    else
    showmessage('NEvisokicniy rik:' + inttostr(aday.year));
    //znichenna obekta
    aday.Free;
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 19.09.2013, 23:54   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Достаточно лишь проверить, делится ли порядковый номер года на 4 нацело и всё. В вашем случае, это может выглядеть вообще так
Нет! Нет! И еще раз нет!!!
Возьмем 1900 год. По-твоему, он будет високосным, хотя это не так..

Можно делать так
Код:
function IsLeapYear (y : Integer) : Boolean;
begin
     result := (y mod 400 = 0) or ((y mod 4 = 0) and (y mod 100 <> 0));
end;
Poma][a вне форума Ответить с цитированием
Старый 20.09.2013, 00:03   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Нет! Нет! И еще раз нет!!!
Возьмем 1900 год. По-твоему, он будет високосным, хотя это не так..
Это из-за того, что в условии сказано, что "начиная с 2001 года"? Если да, то я просто не так понял
Вадим Мошев вне форума Ответить с цитированием
Старый 20.09.2013, 00:05   #6
программирование
Форумчанин
 
Регистрация: 22.04.2013
Сообщений: 162
Восклицание помогите разобраться с программой

в этой программе нужно:
1)опеределить является ли год высокосным.
2)сезон года по номеру месяца.
3)сколько дней прошло с начала года.

вот код программы
PHP код:
interface

uses
  Winapi
.WindowsWinapi.MessagesSystem.SysUtilsSystem.VariantsSystem.ClassesVcl.Graphics,
  
Vcl.ControlsVcl.FormsVcl.DialogsVcl.StdCtrls;

type
  TForm1 
= class(TForm)
    
monthTLabel;
    
Label1TLabel;
    
Label2TLabel;
    
rikTButton;
    
Edit1TEdit;
    
Edit2TEdit;
    
Edit3TEdit;
    
Label1TLabel;
    
Label2TLabel;
    
Edit4TEdit;

     
procedure Button1Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;
  
tdate=class
    
month,day,year:integer;
    
procedure setvalue(m,d,y:integer);
    function 
leapyear:boolean;

  
end;
tdate=class
    
month,day,year:integer;
    
procedure setvalue(m,d,y:integer);
    function 
leapyear:boolean;

  
end;

var
  
Form1TForm1;
    
aday:tdate;
  
mn,dn,yn:integer;


implementation

{$R *.dfm}
 
procedure tdate.setvalue(m,d,y:integer);
begin
 month
:=m;
 
day:=d;
 
year:=y;
end;
function 
tdate.leapyear:boolean;
begin
 
if  (year mod 4 <>0then
      leapyear
:=false
 
else if (year mod 100<>0then
      leapyear
:=true
 
else if (year mod 400<>0then
      leapyear
:=false
 
else
      
leapyear:=true;
end;
procedure TForm1.Button1Click(SenderTObject);
begin
   
// ctvorenna obektu
   
aday:=tdate.Create ;
   
// vikorictanna ego
   
mn:=strtoint(form1.edit1.text);dn:=strtoint(form1.edit2.text);yn:=strtoint(form1.edit3.text);
   
aday.setvalue(mn,dn,yn);


   if 
aday.leapyear  then
    showmessage
('Visokicniy rik:' inttostr(aday.year)+' '+inttostr(yn))
      else
    
showmessage('NEvisokicniy rik:' inttostr(aday.year));
    
//znichenna obekta
    
form1.edit4.Text:='Vi vveli datu '+inttostr(dn)+'/'+inttostr(mn)+'/'+inttostr(yn);
    
aday.Free;
end;
 
Procedure tdate.TellQuarter;
begin

case mn of
12
,1,2:showmessage('Winter');
3..5:showmessage('Spring');
6..8:showmessage('Summer');
9..11:showmessage('Autumn');
end;
  function 
tmydate.getdaysinteger;
const
  
days: array [.. 11of integer = (3128313031303131303130);
var
  
icinteger;
begin
  c 
:= day;
  for 
:= 1 to month do
    
inc(cdays[i]);
  
inc(cord((month 2) and leapyear));
  
result := c;
end;
 
begin
   
// ctvorenna obektu
   
aday:=tdate.Create ;
   
// vikorictanna ego
   
mn:=1;dn:=1;yn:=2001;
   
aday.setvalue(mn,dn,yn);
   if 
aday.leapyear  then
    showmessage
('Visokicniy rik:' inttostr(aday.year))
    else
    
showmessage('NEvisokicniy rik:' inttostr(aday.year));
    
//znichenna obekta
    
aday.Free;

end
программирование вне форума Ответить с цитированием
Старый 20.09.2013, 00:09   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Неа..
Цитата:
Иными словами, год является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. Год не является високосным, если он не кратен 4, либо он кратен 100, но при этом не кратен 400.
Из Вики (Тыц)
Poma][a вне форума Ответить с цитированием
Старый 20.09.2013, 00:10   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Неа..
Из Вики (Тыц)
Минутку... а мы по какому календарю живём?
Вадим Мошев вне форума Ответить с цитированием
Старый 20.09.2013, 00:10   #9
программирование
Форумчанин
 
Регистрация: 22.04.2013
Сообщений: 162
Вопрос

Цитата:
Достаточно лишь проверить, делится ли порядковый номер года на 4 нацело и всё. В вашем случае, это может выглядеть вообще так
Нет! Нет! И еще раз нет!!!
Возьмем 1900 год. По-твоему, он будет високосным, хотя это не так..

Можно делать так
Код:

function IsLeapYear (y : Integer) : Boolean;
begin
result := (y mod 400 = 0) or ((y mod 4 = 0) and (y mod 100 <> 0));
end;

Нет! Нет! И еще раз нет!!!
Возьмем 1900 год. По-твоему, он будет високосным, хотя это не так..

Можно делать так
Код:

function IsLeapYear (y : Integer) : Boolean;
begin
result := (y mod 400 = 0) or ((y mod 4 = 0) and (y mod 100 <> 0));
end;
а если у меня в программе начинаются года с 2001 года?
программирование вне форума Ответить с цитированием
Старый 20.09.2013, 00:13   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
а если у меня в программе начинаются года с 2001 года?
Всё равно..
Цитата:
Минутку... а мы по какому календарю живём?
По тому, который на стеночке висит По Григорианскому..
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой по счёту день от начала года(не работает скрипт) maxim456 JavaScript, Ajax 3 22.03.2012 09:44
Даны числа A,B,C обозначающие дату.Найти номер этого дня от начала года. naty7773 Помощь студентам 5 13.01.2012 13:35
Вычесление высокосного года Invader_13 Помощь студентам 0 20.10.2010 20:21