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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 21:54   #1
Morraks91
 
Регистрация: 17.05.2010
Сообщений: 5
По умолчанию Прога некорректно работает Delphi

Прога по созданию классу.Некорректно работает складывание двух экземпляров класов не правильно считает.Если ввести значение 4 часа 45 минут 4 секунды и к этому прибавить 4 часа 15 минут 4 секунды прога выдаст неправильный результат.При некоторых значения считает правильно при некоторых нет.Плз исправьте что нетак.
Код:
constructor TTime.Create(a1,b1,c1:word);
begin
Fchas:=a1;
Fmin:=b1;
Fsec:=c1;
end;
function Ttime.Pechat:string;
begin
result:=inttostr(fchas)+':'+inttostr(fmin)+':'+inttostr(fsec);
end;
procedure Ttime.slogvremandsec(k1:word);
begin
Fsec:=Fsec+k1;
if (Fsec>=60) and (Fsec<3600) then
begin
Fmin:=Fmin+Fsec div 60;
Fsec:=Fsec mod 60;
if Fmin>=60 then
begin
Fchas:=Fchas+(Fmin div 60);
Fmin:=Fmin mod 60;
end;
end;
if Fsec>=3600 then
begin
Fchas:=Fchas+Fsec div 3600;
if Fsec mod 3600>=60 then
begin
 Fmin:=Fmin+((Fsec mod 3600) div 60);
 Fsec:=(Fsec mod 3600) mod 60;
 end
 else Fsec:=Fsec mod 3600;
 if fsec>=60  then
 begin
  Fmin:=Fmin + (Fsec div 60);
  Fsec:=Fsec mod 60;
  end;
if Fmin>=60 then
begin
Fchas:=Fchas+ (Fmin div 60);
Fmin:=Fmin mod 60;
end;
if  Fchas>=24 then Fchas:=Fchas mod 24;
  end;
 end;


procedure Ttime.vichvrandsec(d1:word);
var f:word;
begin
if d1<=fsec then Fsec:=Fsec-d1
else
begin
f:=Fmin*60+Fsec+Fchas*3600-d1;
if f<3600  then
begin
Fsec:=(Fmin*60+Fsec+Fchas*3600-d1) mod 60;
Fmin:=(Fmin*60+Fsec+Fchas*3600-d1) div 60;
Fchas:=0;
end;
if f>=3600 then
        begin
Fchas:=(Fmin*60+Fsec+Fchas*3600-d1) div 3600;
Fmin:=(Fmin*60+Fsec+Fchas*3600-d1) mod 3600;
if Fmin>=60 then
begin
Fsec:=Fmin mod 60;
Fmin:=Fmin div 60;
end;
         end;
end;
end;
procedure Ttime.slog2(h1:Ttime);
begin
Fchas:=Fchas+h1.Fchas;
Fmin:=Fmin+h1.Fmin;
Fsec:=Fsec+h1.Fsec;
end;
procedure Ttime.vichit2(l1:Ttime);
begin
end;
Вложения
Тип файла: rar Копия лабс5.rar (177.8 Кб, 11 просмотров)

Последний раз редактировалось Morraks91; 17.05.2010 в 22:09.
Morraks91 вне форума Ответить с цитированием
Старый 18.05.2010, 10:07   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Внутри класса храните время в секундах. Все будет гораздо проще.
alexBlack вне форума Ответить с цитированием
Старый 18.05.2010, 18:04   #3
Morraks91
 
Регистрация: 17.05.2010
Сообщений: 5
По умолчанию

Пожалуйста напишите подробнее что Вы имеете ввиду, я слаб в программировании, и не уловил Вашу мысль
Morraks91 вне форума Ответить с цитированием
Старый 18.05.2010, 18:55   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Оставьте в приватной части только одно поле - время в секундах:

Код:
type 
    Ttime=class
    private 
       Fsec:word;
    public      
       constructor Create(a1,b1,c1:word);
Все методы сложения/вычитания сразу станут проще и сведутся к простому сложению/вычитанию секунд. Останется только два метода - приведение времени в секунды в констракторе и секунд в формат hh:mm:ss при выводе.
alexBlack вне форума Ответить с цитированием
Старый 18.05.2010, 19:11   #5
Morraks91
 
Регистрация: 17.05.2010
Сообщений: 5
По умолчанию

Сорри за моё нубство но я не понимаю как складывать 2 класса если у меня будет только поле для секунды.Мне то нужно сложить и часы и минуты и секунды
Код:
 procedure Ttime.slog2(h1:Ttime);
begin
Fchas:=Fchas+h1.Fchas;
Fmin:=Fmin+h1.Fmin;
Fsec:=Fsec+h1.Fsec;
end;
Morraks91 вне форума Ответить с цитированием
Старый 18.05.2010, 19:13   #6
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Morraks91, мне кажется, что код в первом посте не ваш.
O(n)
sabbathist вне форума Ответить с цитированием
Старый 18.05.2010, 19:17   #7
Morraks91
 
Регистрация: 17.05.2010
Сообщений: 5
По умолчанию

sabbathist,Вобще то мой у меня не работает складывание двух классов
а почему не мой ?
Morraks91 вне форума Ответить с цитированием
Старый 19.05.2010, 16:11   #8
Morraks91
 
Регистрация: 17.05.2010
Сообщений: 5
По умолчанию

спасибо но помощь уже не требуется я разобрался Прога неправильно считала потому что я не правильно создал второй класс и потому что неправильно вызвал процедуру сложения классов
Morraks91 вне форума Ответить с цитированием
Старый 19.05.2010, 18:16   #9
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Извините, ошибся.
O(n)
sabbathist вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
некорректно работает WaitForMultipleObjects bazilior Общие вопросы C/C++ 2 17.04.2010 20:15
float в ие-6 работает некорректно cratte HTML и CSS 3 17.02.2010 08:50
Некорректно работает запрос Arkuz БД в Delphi 9 20.08.2009 07:04
Некорректно работает запрос zulu80 БД в Delphi 10 16.02.2009 13:35
IdHTTP1 некорректно работает nike-p Работа с сетью в Delphi 9 23.07.2008 23:13