Страница 1 из 5

массивы

СообщениеДобавлено: 02.02.2017 22:40:50
Nick245
Oбъясните пожалуйста как работает REPEAT UNTIL!
Код: Выделить всё
program ex;
const a=10;
type
  arr=array[1..a] of integer;
 
var
  b : arr;
  element : integer;
  i, j, isFound : integer;
Begin
  for i:=1 to a do
    begin
      repeat
         Write('Введите ',i,'-й элемент: ');
         ReadLn(element);
         isFound := 0;
         for j:=1 to i do
           if b[j]=element then begin
               isFound:=1;
               Break;
           end;
           if isFound=1 then WriteLn('Введённое значение уже есть в массиве. Вводите ещё раз!')
      until isFound=0;   
      b[i] := element;
  end;

Re: массивы

СообщениеДобавлено: 02.02.2017 22:48:13
vitaly_l
До тех пор пока isFound равно 0; постоянно повторяется, код, который между repeat until
там где присваивается isFound:=1; срабатывает Break; (остановка цикла) для третьего цикла for j:=1 to i do. Постольку поскольку, isFound уже равно 1;, repeat until - должен остановиться, но repeat until ещё успевает отработать if isFound=1 then WriteLn('Введённое значение уже есть в массиве. Вводите ещё раз!'). Однако постольку поскольку, isFound уже равно 1; то repeat until - "останавливается" и программа читается дальше. И тут, срабатывает третий, внешний цикл, и запускает всё это заново. И делает это ровно 10 раз, т.к. а = 10.

Re: массивы

СообщениеДобавлено: 02.02.2017 23:17:00
enot777
Цикл, repeat ... until, выполнятся до тех пор, пока условие выхода ложно (false).
Код: Выделить всё
repeat
// Операторы
until false; // Бесконечный цикл, для выхода необходимо использовать break в теле цикла.

Цикл, repeat ... until - это цикл с пост проверкой условия выполнения (repeat <операторы> until <условие>), поэтому он буден выполнен минимум один раз.

Re: массивы

СообщениеДобавлено: 02.02.2017 23:24:35
Nick245
vitaly_l А как работает For j:=1 to i ?
ТАК??
Код: Выделить всё
For j:=1 to 1 do
   if b[1]={например 45} then begin
      isFound:=1;
      break;       

Re: массивы

СообщениеДобавлено: 02.02.2017 23:30:37
vitaly_l
верно,
там перебираются все значения, которые введены раньше ( :roll: если их удастся ввести).

Re: массивы

СообщениеДобавлено: 02.02.2017 23:45:53
Nick245
vitaly_l , а как же он проверяет первый раз ? Когда мы еще не знаем b[1]? ( Сразу в (if b[j]=element then ) идёт false?)

Re: массивы

СообщениеДобавлено: 02.02.2017 23:54:00
vitaly_l
Nick245 писал(а):а как же он проверяет первый раз ? Когда мы еще не знаем b[1]? ( Сразу в (if b[j]=element then ) идёт false?)

Не знаю. Это вопрос к тому волшебнику, который писал этот код. Чтобы это заработало, нужно вот это b[i] := element; поместить, туда, где программа сможет его заполнить, в случае если element нет в массиве b.

Re: массивы

СообщениеДобавлено: 03.02.2017 00:20:46
Nick245
vitaly_l Спасибо большое! :D

Re: массивы

СообщениеДобавлено: 03.02.2017 00:24:43
enot777
Имеется массив [1..10], при чём компилятор при создании этого массива обнуляет все элементы (зависит от настроек компиляции), т.е. если ввести первым 0, то программа скажет, что такое значение уже введено.

Re: массивы

СообщениеДобавлено: 03.02.2017 00:40:15
Nick245
enot777 Теперь понятно , спасибо!

Re: массивы

СообщениеДобавлено: 03.02.2017 09:43:27
vitaly_l
enot777 писал(а):Имеется массив [1..10], при чём компилятор при создании этого массива обнуляет все элементы (зависит от настроек компиляции), т.е. если ввести первым 0, то программа скажет, что такое значение уже введено.

И потом ещё 9-ть раз придётся ввести это круглое значение, т.к. других значений программа ввести не позволит.
И тут возникает вопрос: Какие настройки компиляции нужно включить, чтобы принудительно обнулялся массив из integer, при его создании?

.

Re: массивы

СообщениеДобавлено: 03.02.2017 12:18:08
enot777
Про настройки компиляции я конечно загнул.
Нашёл такой перевод документации Delphi. Так же это, видимо, справедливо и для Free Pascal Compiler.
Если вы явно не инициализируете глобальную переменную, компилятор устанавливает для нее значение 0. Данные из экземпляров объектов (поля) также инициализируются нолем. На платформе Wiin32 содержимое локальных переменных не определено до того момента, как им не будет присвоено значение.
Также, если в IDE Free Pascal в настройках (Options->Compiler->Verbose) выбрать Warnings, Notes, Hints, General Info, то при компиляции программы из первого поста, выяснится, что переменная b может быть не инициализирована, то есть глобальная переменная "b" будут забита нулями.
И потом ещё 9-ть раз придётся ввести это круглое значение, т.к. других значений программа ввести не позволит.
И тут возникает вопрос: Какие настройки компиляции нужно включить, чтобы принудительно обнулялся массив из integer, при его создании?

Позволит ввести отличное от нуля, только ноль можно вводить до посинения (а не 9-ть раз), потому что isFound будет равен "1".
Смотрим в код
Код: Выделить всё
if b[j] = element then begin
  isFound:=1;
  break;
end;

Любой b[j] равен, по умолчанию, нулю и element равен нулю, а для завершения repeat until, isFount должен быть нулём, а получается единица. И пошёл repeat на новый круг.

Re: массивы

СообщениеДобавлено: 03.02.2017 12:53:24
vitaly_l
enot777 писал(а):Про настройки компиляции я конечно загнул.

Ну почему же, в С и С++ можно принудительно задавать обнуление arr = { 0 }; или arr = {};
enot777 писал(а):Если вы явно не инициализируете глобальную переменную, компилятор устанавливает для нее значение 0. Данные из экземпляров объектов (поля) также инициализируются нолем. На платформе Wiin32 содержимое локальных переменных не определено до того момента, как им не будет присвоено значение.

Встаёт вопрос: b <= это локальная или глобальная переменная?
И тут же встаёт, другой вопрос: type arr=array[1..a] of integer; <== это объявление переменной или объявление типа?
enot777 писал(а):выяснится, что переменная b может быть не инициализирована, то есть глобальная переменная "b" будут забита нулями.

Интересно, вот если компилятор говорит, что что-то: не инициализировано, то это значит что, там может быть, всё что угодно или только ноль? Если только ноль, то непонятно - зачем компилятор врёт, когда говорит что, ноль им не инициализирован? Зачем, коварный компилятор обманывает программистов?

Если это баг компилятора, то надо написать об этом в баг трекер.

.

Re: массивы

СообщениеДобавлено: 03.02.2017 13:59:02
Снег Север
Если переменная не инициализирована, то в ней может быть всё, что угодно. Инициализация нулем или чем-то подобным зависит от версии компилятора и на нее никогда нельзя полагаться.

Re: массивы

СообщениеДобавлено: 03.02.2017 14:35:46
enot777
Если вы явно не инициализируете глобальную переменную, компилятор устанавливает для нее значение 0.

Это, я так понимаю, было изначально характерно для первых версий Pascal, а дальше, как это часто бывает, начинается песня о совместимости.