На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Дата следующего дня
    Пишу программу, опрeдeляющую дaту слeдующeго дня. Ceгoдняшняя дата вводится с клавиатуры.
    d, m, y - сeгoдня.
    d1, m1, y1 - завтра.

    ExpandedWrap disabled
      var
      d, m, y, d1, m1, y1, r: integer;
      last: boolean;
       
      BEGIN
      {Ввод данных добавлю позже}
         last:=false;
         case m of
         4, 6, 9, 11: if d=30
              then last:=true;
         2: if d=28
              then begin
                r:=y mod 4;
                if r <> 0 then
                      last:=true;
                      end;
                      else if d=31 then last=true;
                      end;
                if last then begin
                   d:=1;
                   if m=12 then
                              begin
                               m:=1;
                               y1:=y+1;
                               end
                               else m1:=m+1;
                               end
                               else d1:=d+1;
                               END.


    Free Pascal v2.4.0 при компиляции выдает ошибку: "Error Illegal expression". Помогите исправить. В алгоритме нет ошибок?
      ExpandedWrap disabled
        Var
        d, m, y, d1, m1, y1, r: integer;
        last: boolean;
              
        BEGIN
        {Ввод данных добавлю позже}
        last:=false;
        case m of
         4, 6, 9, 11: if d=30
                         then last:=true;
         2: if d=28
               then begin
                     r:=y mod 4;
                     if r <> 0
                        then last:=true;
                    end;
         else if d=31
                 then last=true; // тут ошибка
        end;
         
        if last
           then begin
                 d:=1;
                 if m=12
                 then begin
                       m:=1;
                       y1:=y+1;
                      end
                 else m1:=m+1;
                end
           else d1:=d+1;
        END.
        Polinom2686
        Спасибо! Невнимательность :wall:
        Можно решить задачу используя перечислимые и интервальные типы?
          Цитата Yagami @
          Можно решить задачу используя перечислимые и интервальные типы?
          Разумеется. Для дней достаточно интервала 1..31, для месяцев - 1..12 (или вообще сделать перечислимый тип Jan, Feb, ..., Dec), совсем не обязательно использовать Integer.

          P.S.
          Цитата Polinom2686 @
          ExpandedWrap disabled
                         r:=y mod 4;
                         if r <> 0
                            then last:=true;

          Этого недостаточно, чтобы определить високосность года: Является-ли год високосный ? (сообщение #580679)
            Yagami, ты смотри на сообщения компилятора, он показывает место ошибки.
              volvo877

              ExpandedWrap disabled
                var
                y, y1, r: integer;
                d, d1: 1..31;
                m, m1: 1..12;
                last: boolean;
                 
                BEGIN
                 Writeln('Ввод даты: ');
                   read(d);
                 
                   last:=false;
                      case m of
                       4, 6, 9, 11: if d=30
                                       then last:=true;
                       2: if d=28
                             then begin
                                   r := (y mod 4) = 0) and
                                not (((n mod 100) = 0) and ((n mod 400) <> 0)
                                            then last:=true;
                                  end;
                       else if d=31
                               then last:=true;
                      end;
                 
                      if last
                         then begin
                               d:=1;
                               if m=12
                               then begin
                                     m:=1;
                                     y1:=y+1;
                                    end
                               else m1:=m+1;
                              end
                         else d1:=d+1;
                END.


              Компилятор сообщает об ошибке: "(26,35) Error: Incompatible types: got "Boolean" expected "SmallInt"."
              Как исправить?
                ExpandedWrap disabled
                  if ((y mod 4) = 0) and
                         not (((y mod 100) = 0) and ((y mod 400) <> 0)) then last := true;

                Красным выделены места ошибок. По ссылке же было правильное написание, ЗАЧЕМ понадобилось убирать скобки?
                  volvo877
                  Незачем. Отвлекся на телефонный звонок.
                  Сообщение отредактировано: Yagami -
                    Дописал проверку введенных данных, опять появились ошибки.


                    ExpandedWrap disabled
                      BEGIN
                       Write('Введите день, месяц, год, разделяя пробелами: ');
                       {$I-}
                         read(d, m, y);
                       {$I+}
                        if IOResult <> 0 then
                           begin
                          writeln('Вы не ввели три числа. Повторите ввод.');
                          reset(input);
                          readln;
                           exit;
                         end;
                         if (d<1) or (d>31) then
                             begin
                           writeln('Ошибка ввода. Введите день (1-31)');
                           reset(input);
                           readln;
                           exit;
                          end;
                          if (m<1) or (m>12) then
                              begin
                              writeln('Ошибка ввода. Введите месяц (1-12)');
                              readln;
                              exit;
                          end;
                          if y<1 then
                              begin
                              writeln('Ошибка ввода. Год не долшен быть меньше 1.');
                              reset(input);
                              readln;
                              exit;
                          end;

                    (74,20) Fatal: Syntax error, ")" expected but "const char" found
                    Сообщение отредактировано: Yagami -
                      Телепаты в отпуске. Либо приводи код полностью, либо ищи ошибки сам. В приведенном фрагменте всего 32 строки, какая из них 74-я?
                        ExpandedWrap disabled
                          program NextDay;
                          uses crt;
                          var
                          y, y1, r: integer;
                          d, d1: 1..31;
                          m, m1: 1..12;
                          last: boolean;
                           
                          BEGIN
                           Write('Введите день, месяц, год, разделяя пробелами: ');
                           {$I-}
                             read(d, m, y);
                           {$I+}
                            if IOResult <> 0 then
                               begin
                              writeln('Вы не ввели три числа. Повторите ввод.');
                              reset(input);
                              readln;
                               exit;
                             end;
                             if (d<1) or (d>31) then
                                 begin
                               writeln('Ошибка ввода. Введите день (1-31)');
                               reset(input);
                               readln;
                               exit;
                              end;
                              if (m<1) or (m>12) then
                                  begin
                                  writeln('Ошибка ввода. Введите месяц (1-12)');
                                  readln;
                                  exit;
                              end;
                              if y<1 then
                                  begin
                                  writeln('Ошибка ввода. Год не долшен быть меньше 1.');
                                  reset(input);
                                  readln;
                                  exit;
                              end;
                             last:=false;
                                case m of
                                 4, 6, 9, 11: if d=30
                                                 then last:=true;
                                 2: if d=28
                                       then begin
                                                   if ((y mod 4) = 0) and
                                       not (((y mod 100) = 0) and ((y mod 400) <> 0))
                                                      then last:=true;
                                            end;
                                 else if d=31
                                         then last:=true;
                                end;
                           
                                if last
                                   then begin
                                         d:=1;
                                         if m=12
                                         then begin
                                               m:=1;
                                               y1:=y+1;
                                              end
                                         else m1:=m+1;
                                        end
                                   else d1:=d+1;
                                   writeln('Следующий день: ');
                                   writeln(d1',', m1',', y1',');
                          END.
                        Сообщение отредактировано: Yagami -
                          Цитата Yagami @
                          writeln(d1, ',', m1, ',', y1);
                          У тебя этих запятых (разделяющих строки и числа) не было, были только строковые литералы для вывода запятой на экран.
                            Исправил, спасибо. Почему-то выводит только день, а месяц и год - 0, 0.
                            Например:
                            Ввод: 10 2 1999
                            Вывод: 11,0,0
                              Потому что:
                              Цитата
                              ExpandedWrap disabled
                                      if last
                                         then begin
                                               d:=1;
                                               if m=12
                                               then begin
                                                     m:=1;
                                                     y1:=y+1;
                                                    end
                                               else m1:=m+1;
                                              end
                                         else d1:=d+1;

                              И что? Ну, допустим, при Last = true в Y1 что-то хотя бы теоретически может записаться (правда произойдет это только если месяц = декабрь, и должен меняться год, но хоть когда-то). Но если Last = False - то даже теоретически этого не произойдет. У тебя по Else просто нет кода, изменяющего Y1 и M1.

                              Выходов 2:
                              1) либо в самом начале присвоить Y1 := Y; M1 := M; D1 := D, и дальше все оставить без изменений, как сейчас есть, если данные должны измениться, они изменятся, нет - останутся те, что ты ввел (это может быть нужно в случае, если ты не хочешь портить начальную дату)
                              2) либо работать вообще без Y1, M1, D1. То есть, изменять прямо Y, M, D и печатать их же.

                              Выбирать тебе.
                                volvo877
                                Поправил, вроде.
                                Сообщение отредактировано: Yagami -
                                  Обнаружил ошибку. Раньше времени не было написать.

                                  Ввод: 28 2 2010
                                  Вывод: 29 2 2010

                                  Но 2010 - не высококлассный год.

                                  ExpandedWrap disabled
                                    program NextDay;
                                    uses crt;
                                    var
                                    y, y1, r: integer;
                                    d, d1: 1..31;
                                    m, m1: 1..12;
                                    last: boolean;
                                     
                                     
                                     
                                    BEGIN
                                     Write('Введите день, месяц, год, разделяя пробелами: ');
                                     {$I-}      {Проверка коррекности введенных данных}
                                       read(d, m, y);
                                     {$I+}
                                      if IOResult <> 0 then
                                         begin
                                        writeln('Вы не ввели три числа. Повторите ввод.');
                                        reset(input);
                                        readln;
                                         exit;
                                       end;
                                       if (d<1) or (d>31) then
                                           begin
                                         writeln('Ошибка ввода. Введите день (1-31)');
                                         reset(input);
                                         readln;
                                         exit;
                                        end;
                                        if (m<1) or (m>12) then
                                            begin
                                            writeln('Ошибка ввода. Введите месяц (1-12)');
                                            readln;
                                            exit;
                                        end;
                                        if y<1 then
                                            begin
                                            writeln('Ошибка ввода. Год не долшен быть меньше 1.');
                                            reset(input);
                                            readln;
                                            exit;
                                        end;
                                       last:=false;
                                       d1:=d;
                                       m1:=m;
                                       y1:=y;
                                          case m of
                                           4, 6, 9, 11: if d=30
                                                           then last:=true;
                                           2: if d=28
                                                 then begin
                                                             if ((y mod 4) = 0) and
                                                 not (((y mod 100) = 0) and ((y mod 400) <> 0))
                                                                then last:=true;
                                                      end;
                                           else if d=31
                                                   then last:=true;
                                          end;
                                     
                                          if last
                                             then begin
                                                   d:=1;
                                                   if m=12
                                                   then begin
                                                         m:=1;
                                                         y1:=y+1;
                                                        end
                                                   else m1:=m+1;
                                                  end
                                             else d1:=d+1;
                                            writeln('Следующий день: ', d1, '-', m1, '-', y1);
                                    END.




                                  При попытке внесения таких изменений в код:

                                  ExpandedWrap disabled
                                           last:=true;
                                           d1:=d;
                                           m1:=m;
                                           y1:=y;
                                           case m of
                                           4, 6, 9, 11: if d=30
                                                           then last:=true;
                                           2: if d=28
                                                 then begin
                                                             if ((y mod 4) = 0) and
                                                 not (((y mod 100) = 0) and ((y mod 400) <> 0))
                                                                then last:=false;
                                                      end;
                                           else if d=31
                                           then last:=true;
                                          end;


                                  Ввод: 28 2 2010
                                  Вывод: 1 3 2010

                                  Ввод: 27 2 2010
                                  Вывод: 1 3 2010

                                  Не знаю как исправить. :wall:
                                    Цитата Yagami @
                                    Не знаю как исправить.
                                    Все просто: ты проверяешь, високосный ли год, и если да - то 28-му февраля присваиваешь статус НЕпоследнего дня, да? Но ведь у тебя и в самом начале Last := false. Сделай так:

                                    ExpandedWrap disabled
                                             2: if d=28 then
                                                 begin
                                                       last := true;
                                                       if ((y mod 4) = 0) and not (((y mod 100) = 0) and ((y mod 400) <> 0))
                                                       then last:=false; // Если год - високосный, то 28 февраля - не последний день месяца !!!
                                                   end;


                                    Ну, и ниже по тексту. Ты ж выводишь d1, m1, y1? вот и работай ТОЛЬКО с ними. D, M, Y оставь в покое! Они уже не нужны тебе... Все изменения - только с d1, m1, y1...
                                    ExpandedWrap disabled
                                            if last
                                               then begin
                                                     d1:=1;
                                                     if m1=12
                                                     then begin
                                                           m1:=1;
                                                           y1:=y+1;
                                                          end
                                                     else m1:=m1+1;
                                                    end
                                               else d1:=d1+1;
                                              writeln('Следующий день: ', d1, '-', m1, '-', y1);
                                      volvo877
                                      Спасибо!
                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0,0641 ]   [ 15 queries used ]   [ Generated: 13.11.25, 19:08 GMT ]