массивы

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

массивы

Сообщение Nick245 » 02.02.2017 22:40:50

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;
Nick245
новенький
 
Сообщения: 10
Зарегистрирован: 22.01.2017 00:31:07

Re: массивы

Сообщение vitaly_l » 02.02.2017 22:48:13

До тех пор пока 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.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение enot777 » 02.02.2017 23:17:00

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

Цикл, repeat ... until - это цикл с пост проверкой условия выполнения (repeat <операторы> until <условие>), поэтому он буден выполнен минимум один раз.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение Nick245 » 02.02.2017 23:24:35

vitaly_l А как работает For j:=1 to i ?
ТАК??
Код: Выделить всё
For j:=1 to 1 do
   if b[1]={например 45} then begin
      isFound:=1;
      break;       
Nick245
новенький
 
Сообщения: 10
Зарегистрирован: 22.01.2017 00:31:07

Re: массивы

Сообщение vitaly_l » 02.02.2017 23:30:37

верно,
там перебираются все значения, которые введены раньше ( :roll: если их удастся ввести).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение Nick245 » 02.02.2017 23:45:53

vitaly_l , а как же он проверяет первый раз ? Когда мы еще не знаем b[1]? ( Сразу в (if b[j]=element then ) идёт false?)
Nick245
новенький
 
Сообщения: 10
Зарегистрирован: 22.01.2017 00:31:07

Re: массивы

Сообщение vitaly_l » 02.02.2017 23:54:00

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

Не знаю. Это вопрос к тому волшебнику, который писал этот код. Чтобы это заработало, нужно вот это b[i] := element; поместить, туда, где программа сможет его заполнить, в случае если element нет в массиве b.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение Nick245 » 03.02.2017 00:20:46

vitaly_l Спасибо большое! :D
Nick245
новенький
 
Сообщения: 10
Зарегистрирован: 22.01.2017 00:31:07

Re: массивы

Сообщение enot777 » 03.02.2017 00:24:43

Имеется массив [1..10], при чём компилятор при создании этого массива обнуляет все элементы (зависит от настроек компиляции), т.е. если ввести первым 0, то программа скажет, что такое значение уже введено.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение Nick245 » 03.02.2017 00:40:15

enot777 Теперь понятно , спасибо!
Nick245
новенький
 
Сообщения: 10
Зарегистрирован: 22.01.2017 00:31:07

Re: массивы

Сообщение vitaly_l » 03.02.2017 09:43:27

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

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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение enot777 » 03.02.2017 12:18:08

Про настройки компиляции я конечно загнул.
Нашёл такой перевод документации 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 на новый круг.
Последний раз редактировалось enot777 03.02.2017 13:00:21, всего редактировалось 1 раз.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение vitaly_l » 03.02.2017 12:53:24

enot777 писал(а):Про настройки компиляции я конечно загнул.

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

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

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

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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение Снег Север » 03.02.2017 13:59:02

Если переменная не инициализирована, то в ней может быть всё, что угодно. Инициализация нулем или чем-то подобным зависит от версии компилятора и на нее никогда нельзя полагаться.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2994
Зарегистрирован: 27.11.2007 16:14:47

Re: массивы

Сообщение enot777 » 03.02.2017 14:35:46

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

Это, я так понимаю, было изначально характерно для первых версий Pascal, а дальше, как это часто бывает, начинается песня о совместимости.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru