Консультация № 129212
26.03.2008, 20:06
0.00 руб.
0 4 3
Здравствуйте.
В общем нужна помощь, есть массив записи с датами (три типа записи, день (1..31), месяц(1..12) и год (integer)), вводится сегодняшняя дата, нужно определить какие даты из массива уже прошли, а какие ещё нет. Вывести те которые уже прошли...

Буду благодарен за алгоритм или текст программы...

Обсуждение

Неизвестный
26.03.2008, 20:55
общий
это ответ
Здравствуйте, Зыков Николай Павлович!
Программа в приложении
Удачи !!!

Приложение:
constn=5;TypeTdate=record Day:byte; Monce:byte; Year:Word;End;VarDate:Tdate;M:array[1..n] of Tdate;I:integer;Procedure Read_Date;BeginWriteln(‘Zapolnite masiv‘);For i:=1 to n do Begin Write(‘Day: ‘); Readln(Date.day); Write(‘Monce: ‘); Readln(Date.monce); Write(‘Year: ‘); Readln(Date.Year); m[i]:=Date; Writeln; end;Writeln(‘Vvedite Datu‘);Write(‘Day: ‘);Readln(Date.day);Write(‘Monce: ‘);Readln(Date.monce);Write(‘Year: ‘);Readln(Date.Year);end;BeginRead_Date;For i:=1 to n doIf (m[i].Year<Date.Year) And((m[i].year<date.year) or (m[i].monce<Date.monce)) And((M[i].Year<Date.Year) or(m[i].Monce<Date.monce) or (m[i].day<Date.day)) thenBegin Writeln(‘Year: ‘,M[i].Year); Writeln(‘Monce: ‘,m[i].Monce); Writeln(‘Day: ‘,m[i].day);end;Readln;end.
Неизвестный
26.03.2008, 21:03
общий
это ответ
Здравствуйте, Зыков Николай Павлович!
Полностью писать программу не буду - она, вроде, несложная.
Расскажу как решать:
Для хранения будем использовать такую структуру:
<font color=darkblue face="courier"><b>type</b> TDate = <b>record</b> <font color=gray><i>{ тип Дата }</i></font>
        day : byte; <font color=gray><i>{ день }</i></font>
        month : byte; <font color=gray><i>{ месяц }</i></font>
        year : integer; <font color=gray><i>{ год }</i></font>
     <b><b>end</b></b>;</font>
В полях day, month я использую тип byte, т.к. их значения не превышают 255.

Массив будет объявляться так:
<font color=darkblue face="courier"><b>const</b> N = 100; <font color=gray><i>{ максимальное кол-во элементов массива }</i></font>
<b>var</b> mas : <b>array</b>[1..N] <b>of</b> TDate;</font>

Вначале программы необходимо считать количество вводимых дат и сохранить его в какую-нибудь переменную. Именно столько дат в массиве надо будет проверять. Далее считываете это количество дат (цикл <b>for</b>).
И считываете еще одну дату (сегодняшний день).

Теперь циклом <b>for</b> проверяете все элементы массива с текущей датой.
Пусть текущая дата у Вас сохранена в переменной currdate, тогда условие проверки будет такое

<font color=darkblue face="courier"><b>if</b> currdate.year < mas[i].year <b>then</b>
  { этот день еще не прошел }
<b>else</b>
<b>begin</b>
  <b>if</b> surrdate.year = mas[i].year <b>then</b>
  <b>begin</b>
    <b>if</b> currdate.month < mas[i].month <b>then</b>
      { этот день еще не прошел }
    <b>else</b>
    <b>begin</b>
      <b>if</b> currday.month = mas[i].month <b>then</b>
      <b>begin</b>
        <b>if</b> currdate.day < mas[i].day <b>then</b>
          {этот день еще не прошел}
        <b>else</b>
          <b>if</b> currdate.day = mas[i].day <b>then</b>
            {этот день - сегодня}
          <b>else</b>
            { этот день прошел (год, месяц одинаковые, но день больше)}
      <b>end</b>
      <b>else</b>
       { этот день прошел (текущий год равен, но месяц больше) }
    <b>end</b>;
  <b>end</b>
  <b>else</b>
  { этот день прошел (текущий год больше) }
<b>end</b>;</font>

Удобно будет это записать в функцию и таким образом проверять.

Если будут проблемы с реализацией, пишите.

Удачи!
давно
Старший Модератор
31795
6196
26.03.2008, 21:26
общий
to: <b>Зыков Николай Павлович</b>:об ответе т.<b>Шемет Станислав Васильевич</b>, в его программе последняя введенная дата есть текущей.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессор
401888
1232
26.03.2008, 23:42
общий
это ответ
Здравствуйте, Зыков Николай Павлович!
Полный код программы в прложении. Комментарии минимальные, т.к. вроде все ясно.

Приложение:
uses crt;type data=record {тип запись с полями по условию} day:1..31; month:1..12; year:integer; end;var sp:array[1..50] of data; {список дат-массив} n,i,g,m,d:integer;beginclrscr;write(‘Razmer spiska:‘);readln(n);for i:=1 to n do begin {заполняем список} write(‘Zapis ‘,i,‘:‘); write(‘year:‘);readln(sp[i].year); write(‘month:‘);readln(sp[i].month); write(‘day:‘);readln(sp[i].day); end;writeln;writeln(‘Vvedite tekushyu datu:‘);write(‘god: ‘);readln(g);write(‘mesiac: ‘);readln(m);write(‘chislo: ‘);readln(d);writeln;writeln(‘Daty, kotorye proshli:‘);for i:=1 to n do {определяем условия, при которых дата } begin {уже прошла} if (sp[i].year<g) or((sp[i].year=g)and(sp[i].month<m)) or((sp[i].year=g)and(sp[i].month=m)and(sp[i].day<d)) then writeln(sp[i].day,‘.‘,sp[i].month,‘.‘,sp[i].year); end;readlnend.
Форма ответа