Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2017, 11:05   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Да очень просто: в начале перед циклом ставим беусловное:
это совсем не обязательно (хотя допустимо, конечно).


Цитата:
Сообщение от peter965 Посмотреть сообщение
А как работает ( if b[j]=element then begin) в первый раз когда мы еще не знаем b[1]? Просто отправляет FALSE ?
когда у нас i=1
цикл

Цитата:
Код:
for j:=1 to i-1 do
получается
Код:
for j:=1 to 0 do
он не выполняется ни одного раза.

поэтому получается:
Код:
         ReadLn(element);  
         isFound := 0;  // ноль
         for j:=1 to i-1 do   .. цикл НЕ ВЫПОЛНЯЕТСЯ
           if b[j]=element then begin  // этого не происходит, т.к. внутрь цикла мы не попадаем
               isFound:=1; 
               Break;
           end; 
           if isFound=1 then WriteLn('Введённое значение уже есть в массиве. Вводите ещё раз!')
      until isFound=0; // выходим из repeat, т.к. isFound осталось равной нулю
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.02.2017, 14:45   #12
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Что-то чересчур замысловато - вводить цикл, который никогда не выполняется. А зачем ? Если бы я был компилятором, я бы его выкинул.
digitalis вне форума Ответить с цитированием
Старый 03.02.2017, 14:51   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Что-то чересчур замысловато - вводить цикл, который никогда не выполняется. А зачем ? Если бы я был компилятором, я бы его выкинул.
Вы шутите?
Не заметили, что это цикл, у которого верхняя граница i-1 ?
Т.е. это цикл, который выполнится i-1 раз.
т.е., когда мы вводим первое число в массив, цикл выполнится 0 раз.
когда мы вводим второе число в массив, цикл выполнится один раз.
когда мы вводим третье число в массив, цикл выполнится максимум два раза (если не прервётся раньше).
...
когда мы вводим десятое число в массив, цикл выполнится максимум девять раз (если не прервётся раньше).

Что Вы собрались выкидывать на месте компилятора?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.02.2017, 15:32   #14
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Пардон, не розобрался спросонья. Зима, авитаминоз, экология
digitalis вне форума Ответить с цитированием
Старый 04.02.2017, 20:15   #15
peter965
Пользователь
 
Регистрация: 01.02.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы шутите?
Не заметили, что это цикл, у которого верхняя граница i-1 ?
Т.е. это цикл, который выполнится i-1 раз.
т.е., когда мы вводим первое число в массив, цикл выполнится 0 раз.
когда мы вводим второе число в массив, цикл выполнится один раз.
когда мы вводим третье число в массив, цикл выполнится максимум два раза (если не прервётся раньше).
...
когда мы вводим десятое число в массив, цикл выполнится максимум девять раз (если не прервётся раньше).

Что Вы собрались выкидывать на месте компилятора?

Извиняй что мусолю эту тему но, есть вопрос.Глобальные переменные аннулируют все, правильно?А в случае локальных компилятор не берет на себя такую ответственность.В этом случае мы не инициализируем (b) но компилятор если мы в первый раз напишем 0 скажет что он уже есть,то есть компилятор нас обманывает что (b) не инициализирован? (ЕСЛИ УБРАТЬ i(-1) ).

Последний раз редактировалось peter965; 04.02.2017 в 20:18.
peter965 вне форума Ответить с цитированием
Старый 04.02.2017, 23:00   #16
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Кто-нибудь что-нибудь понял ? Я - ни хрена. Кто кого аннулирует, кто кого обманывает ? Внятно выражаться можно ?
digitalis вне форума Ответить с цитированием
Старый 04.02.2017, 23:25   #17
peter965
Пользователь
 
Регистрация: 01.02.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Кто-нибудь что-нибудь понял ? Я - ни хрена. Кто кого аннулирует, кто кого обманывает ? Внятно выражаться можно ?
В данном случае
Код:
 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;
.....
Если написать 0 в первый раз компилятор выевит ('Введённое значение уже есть в массиве. Вводите ещё раз!') при том что мы не инициализировали (b). ВОТ и вопрос( зачем глобальная переменная аннулирует все ?)
peter965 вне форума Ответить с цитированием
Старый 04.02.2017, 23:39   #18
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
зачем глобальная переменная аннулирует
Может обнуляется все таки? На счет зачем - у разработчиков стандарта языка спросить ))
Цитата:
первый раз компилятор выевит
Не компилятор, а твоя прога при выполнении сообщение такое выведет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.02.2017, 10:36   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от peter965 Посмотреть сообщение
Если написать 0 в первый раз компилятор выевит ('Введённое значение уже есть в массиве. Вводите ещё раз!') при том что мы не инициализировали (b).
именно поэтому и сказано, что я допустил ошибку - цикл нужно делать до i-1 - иначе обращаемся к элементам, которые ещё не не иницилизированы.
Это просто баг в программе.

теперь вторая часть вопроса.
Цитата:
Сообщение от peter965 Посмотреть сообщение
зачем глобальная переменная аннулирует все ?
многие компиляторы Паскаля (начиная с классических выпущенных Borland/Embarcadero) обнуляют все глобальные переменные.
Чтобы повысить надёжность кода.
Забыл программист обнулить указатель перед первым использованием - а ничего страшного, его компилятор сам обнулил.
Забыл программист в переменную ноль записать, а ничего страшного - там ноль по умолчанию.
Поэтому, многие программисты (особенно начинающие) считают (ошибочно), что переменные можно не иницилизировать.
Это, разумеется, не так.
Более того, сами авторы компилятора сообщают о том, что сейчас это компилятор делает, а потом, возможно, поведение изменится, это не будут делать.
Правда, пугают этим давно, но пока поведение не меняют.

Я считаю, что обязательно иницилизировать любую переменную, прежде чем её использовать. ОБЯЗАТЕЛЬНО.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.02.2017, 10:56   #20
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
обязательно иницилизировать любую переменную, прежде чем её использовать
Двумя руками за. Как-то здесь выкладывалась задачка, если не ошибаюсь с acmp.ru. Ошибка была в том, что глобальная переменная не была инициализирована нулем. Даже наличие нуля в ней не означает факт инициализации - вполне возможная случайность
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.02.2017 в 10:59.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна программа на си# и чтобы работала на протеусе Владимир_21 Фриланс 2 14.01.2017 02:09
Нужна программа чтобы за меня ставила ставки по моему алгоритму в БК на сайте igor889 Фриланс 9 12.04.2016 13:21
Дана матрица, преобразовать так, чтобы в начале были положительные числа, а потом отрицательные(с сохранением порядка) Non_stop Общие вопросы C/C++ 2 23.11.2014 18:01
assembler. Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала шли четные числа, а потом – нечетные Transcend Помощь студентам 5 18.03.2013 11:42
Нужна функция или процедура для того чтобы программа стала резидентной! star007 Помощь студентам 3 22.03.2010 08:59