IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Работа с записями, Вывод даты
shyrik
сообщение 7.02.2005 22:32
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


хм,у меня проблемка есть.странно, но я написал код для проги которая считает количество дней после введённой даты а чтоб было до, не могу только месяцы правельно считает а дни и год нет.помогите исправить чтоб считала до а не после.
вот код проги кот считает после введённой даты:


Код
Program L;
Uses crt;
Type god=record
     mes:1..12;
     den:1..31;
     god1:integer;
end;
Var vek:array[1..255] of god;
i,m,j,c,g:integer;
Begin repeat
ClrScr; c:=0;
with vek[1] do begin
 repeat write('месяц '); c:=c+1; readln(mes); until mes<13;
 repeat write('день '); c:=c+1; readln(den); until den<32;
 write('год'); readln(god1); c:=c+1;
end;
repeat write ('‚введите число'); c:=c+1; readln(m); until m<256;
m:=m+1;
for i:=2 to m do
 with vek[i] do begin
  god1:=vek[i-1].god1;
  mes:=vek[i-1].mes;
  den:=vek[i-1].den+1;
  g:=god1 mod 4;
  case mes of
   1,3,5,7,8,10,12:if den>31 then begin
                    den:=den-31; mes:=mes+1; end;
   2:if g=0 then begin
      if den>29 then begin
       den:=den-29; mes:=mes+1; end;
      end
      else
       if den>28 then begin
        den:=den-28; mes:=mes+1; end;
   4,6,9,11:if den>30 then begin
             den:=den-30; mes:=mes+1; end;
  end;
  if mes>12 then begin
   mes:=mes-12; god1:=god1+1;
  end;
 end;
writeln('************************************');
c:=c+1;
write('*  ');
write(vek[m].den,'.');
case vek[m].mes of
 1:write('января.');   2:write('февраля.');
 3:write('марта.');    4:write('апреля.');
 5:write('мая.');      6:write('июня.');
 7:write('июля.');     8:write('августа.');
 9:write('сентебря.'); 10:write('октебря.');
 11:write('ноября.');  12:write('декабря.');
end;
writeln(vek[m].god1);
gotoxy(36,c+1); writeln('*');
writeln('************************************');
write('Exit(1..9) '); readln(i);
until i<>0;
End.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
volvo
сообщение 7.02.2005 23:25
Сообщение #2


Гость






Цитата(shyrik @ 7.02.05 21:32)
помогите исправить чтоб считала до а не после.

blink.gif Это что значит?

А вообще-то вот тут есть прекрасный модуль для работы с датами. Посмотри, что непонятно - спрашивай...
Модуль для работы с датами
 К началу страницы 
+ Ответить 
shyrik
сообщение 7.02.2005 23:31
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 21
Пол: Мужской

Репутация: -  0  +


Цитата
Это что значит?

это значит чтоб программа выдаёт дату которая будет через н количество дней,а надо наоборот чтоб выводила до. особенно это касается дней, а то у меня при изменений ниже приведённого кода она выдаёт неправильную дату да ещё с минусом,месяцы же считает нормально,а год ваще не считает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.02.2005 23:33
Сообщение #4


Гость






По ссылке ходил?
 К началу страницы 
+ Ответить 
volvo
сообщение 8.02.2005 2:31
Сообщение #5


Гость






shyrik
Я поменял логику работы программы...
{ Функция проверки, високосный ли год}
function bsYear(n: Word): Boolean;
begin
bsYear := ((n mod 4) = 0) and
not (((n mod 100) = 0) and ((n mod 400) <> 0))
end;

const
monthes: array[1 .. 12] of integer =
(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
month_name: array[1 .. 12] of string[3] =
('jan', 'feb', 'mar', 'apr', 'may', 'jun',
'jul', 'aug', 'sep', 'oct', 'nov', 'dec');

type
TData =
record
day: 1 .. 31;
month: 1 .. 12;
year: word;
end;

var
current: TData;
from_start_year: longint;
to_sub: integer;

m_ix: integer;
begin
{ Ввод даты }
with current do
begin
repeat write('месяц: '); readln(month) until month <= 12;
repeat write('день: '); readln(day); until day <= monthes[month];
write('год: '); readln(year)
end;

write('сколько дней отнять (до 256): '); readln(to_sub);

from_start_year := 0;
for m_ix := 1 to pred(current.month) do
begin
inc(from_start_year, monthes[m_ix]);
if (m_ix = 2) and bsYear(current.year) then
inc(from_start_year);
end;
inc(from_start_year, current.day);
{ Сейчас в переменной from_start_year хранится
число дней от начала года до введенной даты... }

dec(from_start_year, to_sub);
if from_start_year < 0 then
begin
dec(current.year);
inc( from_start_year, 365 + byte(bsYear(current.year)) )
end;

m_ix := 1;
while from_start_year > monthes[m_ix] do
begin
dec(from_start_year, monthes[m_ix]);
if (m_ix = 2) and bsYear(current.year) then
dec(from_start_year);
inc(m_ix)
end;
current.month := m_ix;
current.day := from_start_year;

with current do
writeln( day, ':', month_name[month], ':', year);

end.

Должно работать... Я ее протестировал на 3-4 значениях (и в одном году, и с переходом в предыдущий). Но мало ли что... Найдешь баги - говори, исправим :yes:
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 9:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"