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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 01:47   #1
Mitzzz
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 17
По умолчанию Описание логической функции earlier(t1,t2)

Доброй ночи! Помогите, пожалуйста, исправить ошибку, связанную с несоответствием типов Time и TDateTime...

Дано время, описанное следующим образом:
type time = record
h:0..23;
m,s: 0..59
end;
Описать логическую функцию erlier(t1,t2) для проверки, предшествует ли время t1 времени t2 (в рамках суток) и проиллюстрировать её работу в программе.

Код программы:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

type
   Time =
   record
      h : 0 .. 23;
      m, s : 0 .. 59
   end;

var
  t_1 : Time;
  t_2 : Time;

  function Earlier(T1, T2 : Time) : Boolean;
begin
 result := ((T1.s * 60 + T1.m) * 60 + T1.h) < ((T2.s * 60 + T2.m) * 60 + T2.h);
end;

  begin
 t_1:=strtotime(Edit1.Text);
 t_2:=strtotime(Edit2.Text);
   ShowMessage( 't_1 earlier than t_2 : ' + BoolToStr(Earlier(t_1, t_2), True) );
end;

end.
Mitzzz вне форума Ответить с цитированием
Старый 30.04.2012, 01:56   #2
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

А на какой именно строке ошибка? Не знаю, толк ли я говорю, но мне кажеться, что нужно рекорд Тайм изменить на что-нибудь другое, т.к. может быть конфликт с глобальной переменной Time, которая возвращает текущую дату.
Delphi_ProGer вне форума Ответить с цитированием
Старый 30.04.2012, 02:38   #3
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Интересно, а что вычисляется тут - ((T1.s * 60 + T1.m) * 60 + T1.h) ?
=master= вне форума Ответить с цитированием
Старый 30.04.2012, 03:07   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Delphi_ProGer, верно говорит.
Ваша запись конфликтует с той, что обьявлена в system модуле.
Замените свой Time на TmyTime.
Человек_Борща вне форума Ответить с цитированием
Старый 30.04.2012, 09:58   #5
Mitzzz
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Delphi_ProGer Посмотреть сообщение
А на какой именно строке ошибка? Не знаю, толк ли я говорю, но мне кажеться, что нужно рекорд Тайм изменить на что-нибудь другое, т.к. может быть конфликт с глобальной переменной Time, которая возвращает текущую дату.
Ошибка возникает в строке:
Код:
t_1:=strtotime(Edit1.Text);
t_2:=strtotime(Edit2.Text);
Никак не могу ничего придумать, чем можно заменить...

Цитата:
Сообщение от =master= Посмотреть сообщение
Интересно, а что вычисляется тут - ((T1.s * 60 + T1.m) * 60 + T1.h) ?
Вычисляется определение часа, минут и секунд и выполняется действие, что T1 должно быть < T2.

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Delphi_ProGer, верно говорит.
Ваша запись конфликтует с той, что обьявлена в system модуле.
Замените свой Time на TmyTime.
Понятно.
Спасибо, заменил... Но опять выскакивает:
[Error] Unit1.pas(47): Incompatible types: 'TmyTime' and 'TDateTime'
[Error] Unit1.pas(48): Incompatible types: 'TmyTime' and 'TDateTime'

Видимо, я что-то не так догоняю?
Mitzzz вне форума Ответить с цитированием
Старый 30.04.2012, 10:36   #6
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Спасибо, заменил
Эта замена не спасет. Надо просто правильно инициализировать T1 и T2.

Цитата:
Вычисляется определение часа, минут и секунд и выполняется действие, что T1 должно быть < T2.
Давайте подставим реальные данные, например T1 = 06:20:20, T2 = 07:15:05
явно видно что T1 < T2
вычислим
t1 = ((20*60 + 20)*60 + 6 = 73206
t2 = ((05*60 + 15)*60 + 7 = 18907
получилось T1 > T2
Так чтож вы вычисляете то?
=master= вне форума Ответить с цитированием
Старый 30.04.2012, 18:52   #7
Mitzzz
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Эта замена не спасет. Надо просто правильно инициализировать T1 и T2.
Т.е. T1 и T2 нужно присвоить отдельный тип переменных?

Цитата:
Сообщение от =master= Посмотреть сообщение
Давайте подставим реальные данные, например T1 = 06:20:20, T2 = 07:15:05
явно видно что T1 < T2
вычислим
t1 = ((20*60 + 20)*60 + 6 = 73206
t2 = ((05*60 + 15)*60 + 7 = 18907
получилось T1 > T2
Так чтож вы вычисляете то?
Точнее, должно быть так: если Т1 будет раньше, чем Т2, то будет выводиться сообщение, что "Т1 раньше, чем Т2: True", в противном случае будет выводиться, что "Т1 раньше, чем Т2: False".

Можно, в принципе, этот расчёт заменить на:
Код:
if T1.h<>T2.h then Result := T1.h<T2.h 
else
if T1.m<>T2.m then Result := T1.m<T2.m 
else
if T1.s<>T2.s then Result := T1.s<T2.s
Mitzzz вне форума Ответить с цитированием
Старый 30.04.2012, 19:35   #8
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Т.е. T1 и T2 нужно присвоить отдельный тип переменных?
Надо определить локальную переменную
var
myTime : TDateTime;

далее распарсить вводимые данные
myTime:=StrToTime(Edit1.Text);
и инициализировать ваши
t_1.h:=...
t_1.m:=...
t_1.s:=...
тоже и для t_2
myTime:=StrToTime(Edit2.Text);
t_2.h:=...
t_2.m:=...
t_2.s:=...
а вот сейчас уже можно и проверки делать.
=master= вне форума Ответить с цитированием
Старый 04.05.2012, 23:06   #9
Mitzzz
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
а вот сейчас уже можно и проверки делать.
Всё, я разобрался! Большое спасибо за оказанную помощь!
Вот итоговый код программы:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

type
   Time =
   record
      h : 0 .. 23;
      m, s : 0 .. 59
   end;

var
  t_1 : Time;
  t_2 : Time;

  function Earlier(T1, T2 : Time) : Boolean;
begin
if T1.h<>T2.h then Result := T1.h<T2.h 
else
if T1.m<>T2.m then Result := T1.m<T2.m 
else
if T1.s<>T2.s then Result := T1.s<T2.s
end;

  begin
 t_1.h:=StrToInt(Edit1.Text);
 t_1.m:=StrToInt(Edit2.Text);
 t_1.s:=StrToInt(Edit3.Text);
 t_2.h:=StrToInt(Edit4.Text);
 t_2.m:=StrToInt(Edit5.Text);
 t_2.s:=StrToInt(Edit6.Text);
   ShowMessage( 't_1 раньше, чем t_2 : ' + BoolToStr(Earlier(t_1, t_2), True) );
end;

end.
В качестве дополнения выложил исходник программы.
Вложения
Тип файла: zip t_1, t_2.zip (209.7 Кб, 15 просмотров)

Последний раз редактировалось Mitzzz; 04.05.2012 в 23:11.
Mitzzz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу для построения таблицы истиности логической функции. Elimay25 Паскаль, Turbo Pascal, PascalABC.NET 1 02.03.2012 08:34
Описание логической функции ПОТОМОК(А,Б) Boomhauer Помощь студентам 2 03.04.2011 20:28
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
Помогите, пожалуйста, дописать программу на C++ (построение эквивалентной логической функции) Anastasiya209 Помощь студентам 0 07.06.2009 23:58
Построение эквивалентной логической функции (C++) Anastasiya209 Помощь студентам 5 03.06.2009 20:28