Помощь - Поиск - Пользователи - Календарь
Полная версия: Определение даты (записи)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Amro
smile.gif Люди подкиньте идейку!!!!
Вот условие программы:

Цитата
Определить дату, которая наступит через m дней.


Таким образом из условия видно, что программа должна запрашивать месяц и дату, а также само число m... Но я не могу найти сам алгоритм решения этой задачи... а именно каким образом программа будет искать это число и месяц...

Саму прогу необходимо написать при помощи записи...
trminator
вот без записей... куда их вставить, непонятно.
Дату берет сегодняшнюю

Код

uses DOS;
const days: array[1..12] of byte=(31,29,31,30,31,30,31,31,30,31,30,31);
var plus, Year, Month, Day,week_nr : word;

begin
   GetDate(Year, Month, Day, week_nr);
   ReadLn(plus);
   while plus>days[month] do begin
       dec(plus, days[month]);
       inc(year,month+1 div 12);
       month:=(month+1) mod 12;
   end;

   inc(day, plus);
   if day > days[month] then begin
       day:=day mod days[month];
       inc(month)
   end;

   writeLn('Будет ',day,'.',month)
end.

Разве что вместо переменных year, month, day использовать запись date с теми же полями
Amro
Неплохо!!! Спасибо!!! Но дело в том что дату должен вводить сам я, необязательно чтоб она была сегодняшняя(год не надо вводить, только число и месяц)!!! В принципе до такой программки я и сам бы додумался, но как действовать с записями, куда их совать я  не догадываюсь...В результате действия программы она должна выводить на экран месяц и число, чтож в записи можно засунуть только месяца и ничего болеее.........Блин... не понимаю я... Но всё равно за идейку спасибо, попробую её усовершенствовать, авось что-нить и получится......
KRUTOY
Код
record =
january:array [1..31] of integer;
...
december:array [1..31] of integer;
end;


можно конечно и попроще...вообще без записей.
а вместо GETDATA попробуй SETDATA--хотя я не пробывал;
в паскале есть специальный тип-запись--DATATIME--может это тебе поможет! ;)
Amro
Всё!!! Вот окончательный вариант решения: (может кому пригодится!!)
Код

program lab7;
uses crt,dos;
type aa=array[1..12]of integer;
var q:char;
   a:aa;
   data:record
   month:string[7];
   day,year,months:word;
   end;
j:integer;
week:word;
m:integer;
begin
repeat
clrscr;
a[1]:=31;
a[2]:=29;
a[3]:=31;
a[4]:=30;
a[5]:=31;
a[6]:=30;
a[7]:=31;
a[8]:=31;
a[9]:=30;
a[10]:=31;
a[11]:=30;
a[12]:=31;
getdate(data.year,data.months,data.day,week);
writeln('Введите число М через, которое вы хотите узнать дату:');
read(m);
j:=m;
while j<>0 do begin
           if j>a[data.months]-data.day then begin
                                   inc(data.months);
                                   data.day:=1;
                                   j:=j-a[data.months]+data.day
                                   end

else begin data.day:=data.day+j; break;end;
           end;
writeln('Дата дня: ',data.day,' месяц  ',data.months);
end.

Спасибо всем помогающим!!!
AlaRic
Сайту пригодится!
___ALex___
високосный год ещё никто не отменял вроде
trminator
А тут год вообще не рассматривается, год считается текущим (високосным). Хотя если надо, это недолго...
Amro
Млин........Ошибку в собственной программе нашёл!!!
(начиная с февраля все даты путаются!!!)

Код
while j<>0 do begin
 if j>a[data.months]-data.day then begin
   inc(data.months);
   data.day:=1;
   j:=j-a[data.months]+data.day { <--- }
 end

 else begin
   data.day:=data.day+j; break;
 end;
end;


Эту самую главную часть я написал неправильно!!!! (а вернее алгоритм не правильный мне посоветовали)
Правильно надо вот так:
Код
while j<>0 do begin
 if j>a[data.months]-data.day then begin
   j:=j-(a[data.months]-data.day)
   inc(data.months);
   data.day:=0;
 end

 else begin
   data.day:=data.day+j; break;
 end;
end;


В общем вот программа полностью, со всеми доработками, думаю кому-нибудь пригодится, ведь ВУЗах одни и те же лабы пишем!!! Сайту тоже пригодится!!
Код
program Lab8_02_2;
uses crt,dos;
var
 q:char;
 data:record
   day,year,months:word;
 end;
 j:integer;
 week:word;
 m:integer;
 g:word;

const
 month:array[1..12] of string[7] =
   ('января','февраля','марта','апреля','мая','июня','июля',
     'августа','сентябя','октября','ноября','декабря');
 a:array[1..12] of integer =
   (31,29,31,30,31,30,31,31,30,31,30,31);

begin
 repeat
   clrscr;
   getdate(data.year,data.months,data.day,week);
   g:=data.months;
   writeln('Сегодняшняя дата: ',data.day,' ',month[g]);
   writeln('введите число m через которое вы хотите узнать дату:');
   read(m);
   j:=m;
   while j<>0 do begin
     if j>a[data.months]-data.day then begin
       j:=j-(a[data.months]-data.day);
       inc(data.months);
       data.day:=0;
     end

     else begin
       data.day:=data.day+j; break;
     end;
   end;

   g:=data.months;
   writeln('Дата дня и месяц: ',data.day,' ',month[g] );
   write('Вычислить еще ?(Y/N)');
   q:=ReadKey;
 until not (q in ['Y','y']);
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.