Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Помоги разобраться


Автор: Logree 23.3.2008, 15:43
требуется следущее

В файле содержатся различные даты. Каждая дата - это число, месяц и год. В новый файл переписать все даты, которые предшествуют заданной. Выдать на печать те даты, которые приходятся на високосные года.

я написал вот что

Код

program n13;
Const manth:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31); {Создаем потояный массив из 12 эл и 
                                                                                 присваеваем каждому эл значения}
var f:text; {Объявляем переменную -связку с файлом}
    d,m,y:integer;

function is_v(year:integer):boolean; {Функция проверяет является ли год високосным или нет если да то возвращаем true иначе false}
var t:boolean;
Begin
    if (year mod 4=0) and
       ((year mod 100<>0) or
       (year mod 400 =0)) then
        t:=true
    else
        t:=false;
End;

procedure make_file(var f:text);  {Процидура создает файл(source.txt) и заполняет его значениями}
var yyyy,c,
    m,year,
    d:integer;
Begin
  year:=2006;     {начинаем с этого года}

    ReWrite(f);   {Разрешение на запись в файд f}

    for yyyy:=year to year+5 do            {В 3-х вложенных циклах формеруем дату}
    for m:=1 to 12 do begin
        c:=0;                              {обнуляем С}
        if is_v(yyyy) and (m=2) then c:=1; {Если год високосный и месяц февраль то количество дней будет 29
                                                                       (manth[m]+c = 28+1) иначе 28 (28+0)}
        for d:=1 to manth[m]+c do begin
            write(f,d,m,yyyy);             {записываем сформир дату}
            writeln(f);                    {переход на новую строку}
        end;
    end;
End;

procedure poisk(var f:text;dd,mm,yy:integer); {функция читает файл(source.txt) и если дата в файле меньше даты 
                                               указанной пользователем то записывыет ей  в файл (res.txt) если 
                                               при том год является високосным то  выводит дату на экран}
var nf:text;
    d,m,yyyy:integer;
Begin
    ReSet(f);             {Разрешение на чтение файла source.txt }
    Assign(nf,'res.txt'); {связываем  файл с указателем на него}
    ReWrite(nf);          {разрешение записывать в файл res.txt }

    while not Eof(f) do begin      {Пока файл не кончится считывам из файла source.txt данные и сверяем их с условием}
        read(f,d,m,yyyy);
        if (d<dd) and
           (m<=mm) and
           (yyyy<=yy) then begin

            if is_v(yyyy) then writeln(d,'/',m,'/',yyyy); {если год високосный то выводим на экран дату}
            write(nf,d,m,yyyy);                           {записываем  данные в новый файл если они уд условию}
            writeln(nf);
        end;
    end;
    Close(nf); {закрываем файл}
End;

BEGIN
    ASSIGN(f,'source.txt'); {связываем  файл с указателем на него}

    make_file(f);           {Передаем указатель  в функцию создающюю файл}
    writeln('d m yyyy');
    read(d,m,y);
    poisk(f,d,m,y);         {Передаем указвнную дату в функцию ищющюю дыты меньшие данной}

    CLOSE(f);               {закрываем файл}
    readln;
END.




вообще на паскале я не пишу, но тут попросили, и поэтому я плохо понимаю как он работает с файлами
на мой взгляд проблема именно в этом... то ли  я не так  считываю толи записываю неправилтно...

И еще вопросик  где можно посмотреть какие нибудь малоиспользуемые но полезные конструкции,функции и т д  в паскале..

Модератор: Название темы должно отражать ее суть!

Автор: ILyAHA 23.3.2008, 22:19
А что за проблема то? Просто непонятно, что объяснить...

Автор: Logree 23.3.2008, 22:24
почему у меня в файл res.txt вываливается вот это
Код

-1578-326501814
-1577-326491815
-1576-326481816
-1575-326471817
-1574-326461818
-1573-326451819
000


а в файле source.txt
в каждом году в феврале по 29 дней?

Автор: Logree 23.3.2008, 23:06
еще раз вниматьльно почитал нашёл много логических ошибок, исправил
Код

program n13;
Const month:array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);

var f:text;
    d,m,y:integer;

function is_v(year:integer):boolean;
var r:boolean;
Begin
    if (year mod 4=0) and
       ((year mod 100<>0) or
       (year mod 400 =0)) then
        r:=TRUE
    else
        r:=FALSE;
End;

function compere(d,m,dd,mm:integer):boolean;
var r:boolean;
    val1,val2:integer;
Begin

    val1:=d+d*(month[m]);
    val2:=dd+dd*(month[mm]);
    if val1<val2 then
        r:=TRUE
    else
        r:=FALSE;
End;

procedure make_file(var f:text);
var yyyy,c,
    m,year,
    d:integer;
Begin
  year:=2006;

    ReWrite(f);

    for yyyy:=year to year+5 do
    for m:=1 to 12 do begin

        if is_v(yyyy) and (m=2) then c:=1 else c:=0;

        for d:=1 to month[m]+c do begin
            write(f,d,m,yyyy);
            writeln(f);
        end;
    end;
End;

procedure poisk(var f:text;dd,mm,yy:integer);
var nf:text;
    d,m,yyyy:integer;
Begin
    ReSet(f);
    Assign(nf,'res.txt');
    ReWrite(nf);

    while not Eof(f) do begin
        read(f,d,m,yyyy);
        if compere(d,m,dd,mm) and (yyyy<=yy) then begin

            if is_v(yyyy) then writeln(d,'/',m,'/',yyyy);
            write(nf,d,m,yyyy);
            writeln(nf);
        end;
        readln(f);
    end;
    Close(nf);
End;

BEGIN
    ASSIGN(f,'source.txt');

    make_file(f);
    writeln('d m yyyy');
    read(d,m,y);
    poisk(f,d,m,y);

    CLOSE(f);
    readln;
END.


возможно стало лучше... но в результирующем файе опять чушь...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)