Break вне цикла паскаль ошибка что делать

alina333

2 / 2 / 0

Регистрация: 10.11.2016

Сообщений: 9

1

12.11.2016, 14:11. Показов 2961. Ответов 14

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

День добрый, уважаемые форумчане! Находимся с дочерью на начальном уровне изучения Паскаля ) Спасибо данному форуму , очень помогает! Дали на дом задачу. Путем инетизысканий и приложения собственного творчества родилась вот такая программка (условие ее в теле программы). Учитель написала дочери, цитирую:» break; мы не используем в программах прерывание, т.к. оно нарушает пошаговость.» Отсюда вопрос:
Что она имела в виду? Программа же работает, результат выдает правильный, ошибок не выдает при компиляции. PS огромная просьба объяснить попроще, не углубляясь в дебри высокого программирования, мы еще чайники пока )

program summanechet; {Написать программу, которая находит наибольшее из чисел, кратных семи в
последовательности натуральных чисел. Гарантируется, что в последовательности есть хотя
бы одно такое число. Программа получает на вход натуральные числа, количество введённых
чисел неизвестно, последовательность чисел заканчивается числом 0 (0 — признак
окончания ввода, не входит в последовательность). Количество чисел не превышает 1000.
Введённые числа не превышают 30000. Программа должна вывести одно число: наибольшее
из чисел, кратных семи.}

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  c: integer;{c-вводимые числа}
  summa: integer;{значение максимального числа, кратного 7} 
  begin
  summa:=0;
  for var i:=1 to 1000 do begin
            Writeln('Введите двухзначное число. Для окончания ввода введите 0   '); readln(c);
               if abs (c)>30000 then Writeln('Ошибка ввода. Число не должно превышать 30000 по модулю ');
               if (c<10)and (c>0) or (c>99) then Writeln('Ошибка ввода. Число должно быть двухзначным ');
               if c=0 then break;
               if (c mod 2<>0) and (c<>0) and  (c>10) and (c<100) and (c<30000) and (c>-30000) then summa:=summa+c;
               end;       
      Writeln('Сумма чисел равна ',summa );
      end.



1



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

12.11.2016, 14:11

Ответы с готовыми решениями:

Оператор break как оператор go to next
Подскажите, в этом примере break эквивалентна действию оператора go to next?

оператор Break
Дано 20 чисел. Вывести на экран порядковые номера элементов и элементы удовлетворяющие условию 0&lt;…

Оператор break
Подскажите, пожалуйста почему оператор break в строке 44 выдаёт ошибку, и как её исправить?…

оператор break
Здравствуйте! Я где-то слышал, что использовать оператор break для выхода из цикла — не хорошо. И…

14

Puporev

Почетный модератор

64288 / 47587 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

12.11.2016, 14:46

2

Pascal
1
2
3
4
5
6
7
8
9
10
11
var
c: integer;{c-вводимые числа }
max: integer;{значение максимального числа, кратного 7}
begin
max:=0;
repeat
read(c);//читаем числа, первое точно не 0, это гараетировано системой конртроля
if (c<>0)and(c mod 7=0)and(c>max) then max:=c;
until c=0;
write(max);
end.



1



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

12.11.2016, 15:07

3

1) Программа не соответствует условию.
2) Программа далеко не оптимальна, хотелось бы увидеть условие для неё.
3) Использование Break/Continue, по мнению некоторых, противоречит теории формального доказательства правильности алгоритма. Любой циклический алгоритм можно переписать без них, но не всегда такой вариант будет удобен.
4) Обычно в учебных задачах исходные данные полагаются соответствующими описанию, дополнительных проверок не требуется.

Задача из комментария:

Pascal
1
2
3
4
5
6
7
8
var m, n: Integer;
begin
  {m:=0;}
  repeat
    Read(n); if (n mod 7=0) and (m<n) then m:=n;
  until n=0;
  WriteLn(m);
end.

Добавлено через 6 минут
Особым образом обрабатывать 0 как не входящее в последовательность число нет необходимости, поскольку гарантируется, что в последовательности есть натуральное число (>0), которое делится на 7, поэтому 0 не может быть максимумом, условие (m<n) для него всегда ложно.
Даже если бы гарантии наличия подходящего числа не было, 0 не менял бы первоначальное значение максимума и являлся бы индикатором отсутствия подходящего числа.
Но если бы искали минимум, пришлось бы добавить «and (n>0)».

Добавлено через 9 минут
m:=0; — не требуется, поскольку m — это глобальная переменная, такие числовые переменные инициалируются нулем при старте программы (операционная система заполняет нулями сегмент BSS, содержащий глобальные переменные). Иногда от учащихся требуют явной инициализации в коде программы — достаточно убрать фигурные скобки.



1



2 / 2 / 0

Регистрация: 10.11.2016

Сообщений: 9

12.11.2016, 15:39

 [ТС]

4

оеей, я балда! Условие к задаче вот такое:
Написать программу, которая находит сумму двухзначных нечётных чисел в
последовательности целых чисел. Программа получает на вход целые числа, количество
введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 —
признак окончания ввода, не входит в последовательность). Количество чисел не превышает
1000. Введённые числа по модулю не превышают 30000. Программа должна вывести одно
число: сумму двухзначных нечётных чисел в последовательности.



0



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

12.11.2016, 15:53

5

Pascal
1
2
3
4
5
6
7
8
var n, k: Integer;
begin
  {k:=0;}
  repeat
    Read(n); if Odd(n) and (n in [10..99]) then Inc(k);
  until n=0;
  WriteLn(k);
end.

Особой обработки для 0 опять не требуется.

Добавлено через 4 минуты
Проверка условия могла быть такой:

Pascal
1
if Odd(n) and (n>=10) and (n<=99) then ...

Добавлено через 3 минуты
Если нужно считать и отрицательные двузначные, то

Pascal
1
  if Odd(n) and (Abs(n) in [10..99]) then ...



0



Почетный модератор

64288 / 47587 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

12.11.2016, 15:55

6

Цитата
Сообщение от bormant
Посмотреть сообщение

Если нужно считать и отрицательные двузначные, то

Нужно ибо сказано

Цитата
Сообщение от alina333
Посмотреть сообщение

Введённые числа по модулю не превышают 30000.



0



2 / 2 / 0

Регистрация: 10.11.2016

Сообщений: 9

12.11.2016, 16:02

 [ТС]

7

bormant, Спасибо огромное! Я так понимаю что мы перемудрили,, точнее я Подошла к решению проблемы с точки зрения «тупого» юзера, вдруг он введет значения, которые не соответствуют условию. Ноль обрабатывали потому, что если его исключить из условия, тогда программа его воспринимала как число, которое нельзя вводить и выдавала ошибку ввода. Что такое Odd, n in [10..99] и Inc? Они не проходили еще такого

Добавлено через 7 минут
bormant, Подводя итоги про оператор break. Нужно просто тупо уяснить для себя что по классическим канонам его использовать нельзя, дабы не напрягать отношений с учителем?



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

12.11.2016, 16:14

8

Odd — http://pascal.net.ru/Odd , (n mod 2<>0) или (n and 1<>0) дадут тот же результат
Inc — http://pascal.net.ru/Inc , k:=k+1
in [10..99] — принадлежит множеству от 10 до 99, включая границы, то же самое, что и (n>=10) and (n<=99)

Про Break — просто считайте его запрет дополнительным ограничением в условии задачи. Возможно, это врЕменное ограничение, возможно только для циклов for.



0



alina333

2 / 2 / 0

Регистрация: 10.11.2016

Сообщений: 9

12.11.2016, 16:33

 [ТС]

9

bormant, Спасибо! Но я так поняла постановку задачи, что использовать надо было именно те знания, которые им давали на уроке. Иначе учитель вряд ли бы поверил, что ребенок написал программу сам. Я и так там перемудрила с лишними проверками

Добавлено через 11 минут
bormant, У меня неправильный результат получается в вашей программке

Pascal
1
2
3
4
5
6
7
8
var n, k: Integer;
begin
  {k:=0;}
  repeat
    Read(n); if Odd(n) and (n in [10..99]) then Inc(k);
  until n=0;
  WriteLn(k);
end.

Может Inc(k) здесь не нужно? Я правильно поняла, что изначально все переменные в программе имеют нулевые значения, поэтому {k:=0;} в фигурных скобках, т.е их принудительно обнулять не нужно?



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

12.11.2016, 17:05

10

alina333,
давайте посмотрим, на каких данных какой результат получился и почему он неправильный?



0



2 / 2 / 0

Регистрация: 10.11.2016

Сообщений: 9

12.11.2016, 19:00

 [ТС]

11

bormant, Ввела значения 52, 43,85. В ответе 2



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

12.11.2016, 19:02

12

alina333,
вы забыли написать, почему по-вашему 2 — это неправильное количество нечетных двузначных чисел.
Я вижу только 2 таких числа: 43 и 85. Число 52, если правильно путаю, является четным.



0



Почетный модератор

64288 / 47587 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

12.11.2016, 19:07

13

Цитата
Сообщение от bormant
Посмотреть сообщение

это неправильное количество нечетных

Так нужно сумму.

Цитата
Сообщение от alina333
Посмотреть сообщение

Программа должна вывести одно
число: сумму двухзначных нечётных чисел в последовательности.

Добавлено через 1 минуту
А ТCу влом поправить k:=k+n



0



bormant

Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

12.11.2016, 19:08

14

Цитата
Сообщение от Puporev
Посмотреть сообщение

нужно сумму

Война давно закончилась, а я всё эшелоны под откос пускаю

Pascal
1
2
3
4
5
6
7
8
var n: Integer; s: Longint;
begin
  {s:=0;}
  repeat
    Read(n); if Odd(n) and (Abs(n) in [10..99]) then s:=s+n;
  until n=0;
  WriteLn(s);
end.



1



2 / 2 / 0

Регистрация: 10.11.2016

Сообщений: 9

13.11.2016, 00:45

 [ТС]

15

Всем огромное спасибо за терпение! Впредь обязуюсь правильно вставлять текст программы в тело поста и не лениться думать



1



Процедуры прерываний

Обработка <Ctrl
+ Break>

Прерывание
исполнения программы можно вызвать
нажатием комбинации клавиш Ctrl
+
Break
(применяется,
если программа «зависла»)

Процедура Break

Осуществляет
принудительный выход из цикла.

Если цикл организован
с помощью оператора FOR,
WHILE
или REPEAT,
применение процедуры Break
приводит к передаче управления следующему
(после тела цикла) оператору. Это
напоминает действие оператора GOTO,
осуществляющего переход к метке,
находящейся сразу после тела цикла.

При вызове
процедуры
Break
вне цикла
FOR,
WHILE
или
REPEAT
имеет место ошибка.

Процедура Continue

Осуществляет
переход к следующей итерации цикла.

Если цикл организован
с помощью оператора FOR,
WHILE
или REPEAT,
применение процедуры Continue
прерывает
текущую итерацию и инициирует переход
к следующей итерации. При
вызове процедуры
Continue
вне цикла
FOR,
WHILE
или
REPEAT
имеет место ошибка.

Процедура Exit

Осуществляет выход
из текущего блока программы.

Если текущим блоком
является тело программы, обращение к
процедуре Exit
инициирует
завершение программы.

Процедура
Halt(Cod)

Останавливает
выполнение программы и передаёт
управление операционной системе. Cod
– необязательный параметр, содержащий
код завершения программы.

Пример:

Найти первое
отрицательное число во входном потоке
из вещественных чисел (не более 100)

———————————————————————

Program L_6;

Var i: integer;

a: real;

begin

for
i:=1 to 100 do

begin

read(a);

if
a>=0
then
continue;
{при выполнении
условия изменяется

параметр
цикла и цикл повторяется сначала}

writeln(‘первое
отр. число =,а:5:2’);

Break
{выход
из
цикла}

end;

end.

———————————————————

Ответ:

4

2

1

-8

первое отр
число=-8.00

———————————————————-

Типизированные константы

Пример

.

.

const

Вид <идентификатор>
= <значение>

c1=value

Вид <идентификатор>
: <тип> = <значение>
c2:type=value

.

.

Здесь для
сравнения даны описания обычной(c1)
и типизированной(c2)
констант.

c1
и c2
– идентификаторы обычной и типизированной
констант

type
– тип константы, данный элемент
присутствует в описании только
типизированной константы – это и
является её основной внешней отличительной
особенностью;

value
– значение, присваиваемое константе
(как типизированной, так и нетипизированной)
при объявлении.

И те и другие
константы описываются в разделе
описаний констант
.

Константы вида
<идентификатор>=<значение>
изменять в программе нельзя.

Типизированным
же константам можно присваивать другие
значения в ходе выполнения программы,
физически они представляют собой
переменные с начальными (стартовыми)
значениями.

Типизированная
константа приобретает указанное при
объявлении значение только к моменту
начала работы программы. При повторном
входе в блок, в котором она объявлена,
константа сохраняет то значение, которое
она имела к моменту выхода из блока.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Я пытаюсь создать цикл for для своего алгоритма сортировки пузырьком и использую разрыв в качестве условия, если больше нет числа для сортировки. Но потом компилятор сказал, что BREAK не разрешен. Вот мой код

Procedure Sort(var data : arr; j : integer);
var
    temp: integer;

begin
    temp := data[j];
    data[j] := data[j + 1];
    data[j + 1] := temp;
end;

Procedure sortDescending(var data : arr; n : integer);
var
    i, j : integer;
    marker : boolean;

begin
    for i := 1 to n do
    marker := false;
    begin
        for j := 1 to n do
        begin
            if(data[j] < data[j + 1]) then
            begin
                Sort(data, j);
                marker := true;
            end;
        end;
        if(marker = false) then
        begin
        break;
        end;
    end;
end;

1 ответ

Вот твой код.

for i := 1 to n do
marker := false;
begin
    for j := 1 to n do
    begin
        if(data[j] < data[j + 1]) then
        begin
            Sort(data, j);
            marker := true;
        end;
    end;
    if(marker = false) then
    begin
    break;
    end;
end;

Давайте добавим немного пробелов после циклов и отступов, чтобы сделать проблему более ясной.

for i := 1 to n do
    marker := false;

begin
    for j := 1 to n do
    begin
        if (data[j] < data[j + 1]) then
        begin
            Sort(data, j);
            marker := true;
        end;
    end;

    if (marker = false) then
    begin
        break;
    end;
end;

Что эквивалентно:

for i := 1 to n do
    marker := false;

for j := 1 to n do
begin
    if (data[j] < data[j + 1]) then
    begin
        Sort(data, j);
        marker := true;
    end;
end;

if (marker = false) then
begin
    break;
end;

break не находится внутри цикла.

Вероятно, вы хотели поставить begin перед marker := false;.

for i := 1 to n do
begin
    marker := false;

    for j := 1 to n do
    begin
        if (data[j] < data[j + 1]) then
        begin
            Sort(data, j);
            marker := true;
        end;
    end;

    if (marker = false) then
    begin
        break;
    end;
end;


1

Chris
6 Авг 2022 в 01:22

Раздел: Стандартные функции Паскаля

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

Процедура Break в Паскале выполняет прерывание цикла. Синтаксис:


procedure Break;

Процедура Break выполняет переход к оператору, следующему после текущего блока цикла.

Код после вызова Break и окончанием блока цикла не выполняется. Состояние текущего цикла при этом прекращает отслеживаться.

Процедура Break может использоваться с циклами
FOR и
WHILE.

Учтите, что Break — это зарезервированное слово и оно не может быть переопределено.

Как прервать цикл в Паскале

Пример программы, которая использует процедуру Break для прерывания цикла, приведён ниже:

program breakproc;

{$mode objfpc}{$H+}

var i, j : byte;

//****************************************************************
// Так делать нельзя, потому что тогда прерывание цикла 
// с помощью Break не будет работать
//****************************************************************
{procedure Break;
begin
end;}

begin

  //Будут выведены 4 числа от 1 до 4
  for i := 1 to 10 do
    begin
      Write(i:3);
      if i = 4 then Break;
    end;

  WriteLn;

  //Будут выведены 3 числа от 1 до 3
  for i := 1 to 10 do
    begin
      if i = 4 then Break;
      Write(i:3);  //!!! Этот код после вызова Break 
                   //уже не будет выполнен !!!
    end;

  WriteLn;

  //Прерывание вложенного цикла
  for j := 11 to 15 do    //Цикл 1
    begin
      for i := 1 to 10 do //Вложенный цикл 2
        begin
          if i = 3 then
            Break;        //Прерывает вложенный цикл 2,
          Write(i:3);     //но цикл 1 будет выполнен до конца !!!
        end;
      Write(j:3);
    end;

  WriteLn;

  //Прерывание основного цикла
  for j := 11 to 15 do    //Цикл 1
    begin
      for i := 1 to 10 do //Вложенный цикл 2
        begin
          if i = 3 then
            Break;        //Прерывает вложенный цикл 2
          Write(i:3);
        end;
      if j = 13 then
        Break;            //Прерывает цикл 1
      Write(j:3);
    end;

  ReadLn;
end.

Обратите внимание на то, что код в теле цикла, расположенный после вызова Break, уже не будет выполняться (так как цикл прерывается в том месте, где вызывается процедура Break).

Также обратите внимание на то, как работает прерывание вложенного цикла: прерывается только вложенный цикл, а основной продолжает работать.

Также обратите внимание на нашу собственную процедуру Break в начале программы. Она закомментирована и не компилируется.

Однако, если вы её раскомментируете, то процедура Break будет переопределена. Ошибки компиляции это не вызовет — программа будет создана.

Но стандартная процедура Break не будет работать!!! То есть выйти из цикла с помощью процедуры Break вы не сможете, потому что вызываться будет уже не стандартная процедура из модуля SYSTEM, а ваша собственная процедура, объявленная в начале программы, которая не выполняет выход из цикла.

Как стать программистом 2.0

Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки…
Подробнее…

Помощь в технических вопросах

Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
Подробнее…

Что означает ошибка SyntaxError: 'break' outside loop

Что означает ошибка SyntaxError: ‘break’ outside loop

Это значит, что мы пытаемся выйти из цикла, которого нет

Это значит, что мы пытаемся выйти из цикла, которого нет

Ситуация: мы пишем опросник на Python, и нам важно, чтобы его мог пройти только совершеннолетний. Для этого мы добавляем в код такую логику: 

  1. Спрашиваем про возраст.
  2. Смотрим, он больше 18 или нет.
  3. Если нет — останавливаем программу.
  4. Пишем дальше код, который будет работать, если участнику есть 18 лет и программа не остановилась.

На Python это выглядит так:

# запрашиваем возраст
age_txt = input('Введите свой возраст: ')
# переводим введённое значение в число
age = int(age_txt)
# если меньше 18 лет
if age < 18:
        # выводим сообщение
        print('Вы не можете участвовать в опросе')
        # выходим из программы
        break
    
# спрашиваем имя
name_txt = input('Как вас зовут: ')

Вроде всё логично, но после запуска мы получаем ошибку:

❌ SyntaxError: ‘break’ outside loop

Что это значит: в отличие от многих других языков, команда break в Python используется только для выхода из цикла, а не выхода из программы в целом.

Когда встречается: когда мы хотим выйти из программы в середине её работы, но не знаем как.

Что делать с ошибкой SyntaxError: ‘break’ outside loop

Всё зависит от того, что вы хотите сделать.

Если вы хотите выйти из цикла, то break служит как раз для этого — нужно только убедиться, что всё в порядке с отступами. Например, здесь мы выйдем из цикла, как только переменная станет больше 9:

for i in range(10):
    print(i)
    if i > 8:
break

А если вы хотите закончить работу программы в произвольном месте, то нужно вместо break использовать команду exit(). Она штатно завершит все процессы в коде и остановит программу. Это как раз подойдёт для нашего примера с опросником — теперь программа остановится, если возраст будет меньше 18:

# запрашиваем возраст
age_txt = input('Введите свой возраст: ')
# переводим введённое значение в число
age = int(age_txt)
# если меньше 18 лет
if age < 18:
        # выводим сообщение
        print('Вы не можете участвовать в опросе')
        # выходим из программы
        exit()
    
# спрашиваем имя
name_txt = input('Как вас зовут: ')

Возможно, вам также будет интересно:

  • Brandt кромкооблицовочный станок ошибки
  • Brandt bwt6008e коды ошибок
  • Brand 502 ошибка е3 ремонт
  • Brand 502 ошибка e3 устранение
  • Braking fault рено меган 2 что означает ошибка

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии