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


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