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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 02.01.2013, 19:06   #1
Uzver004
 
Регистрация: 02.01.2013
Сообщений: 4
Вопрос Ошибка 215 Переполнение

Задача: Составить программу вычисления произведения минимального и максимального элементов массива. Вот мой код, на коменты внимания не обращайте, это для преподавателя.
Код:
program lr2_3; {Заголовок программы}
  uses crt; {Подключение модуля управления экраном}
  var min,max,P:real; i,n:integer; A:array[1..50] of real; {Раздел описания переменных}
begin {Начало программы}
  clrscr; {Очистка экрана}
  randomize; {включение генератора случайных чисел}
  writeln('Программа вычисления произведения минимального и максимального элементов массива');
  write('Введите количество элементов массива: '); {Вывод на экран пользовательского текста}
  readln(n); {Запрос на ввод переменной}
  for i:=1 to n do {цикл, для генерирования значений элементов массива}
    begin {начало операторных скобок}
      A[i]:=(random(100)-50)/10; {случайное число в диапазоне [0.1;10]}
      writeln('A[',i,']=',A[i]:3:1) {Вывод на экран сгенерированого числа}
    end; {конец операторных скобок}
  max:=a[1]; {присвоение начального значения максимальному элементу}
  min:=a[1]; {присвоение начального значения минимальному элементу}
  for i:=2 to n do {цикл, для нахождения минимального и максимального значения среди элементов массива}
    begin {начало операторных скобок}
      if A[i]<min then min:=A[i]; {Присваивание нового минимума если новый элемент меньше текущего минимума}
      if A[i]>max then max:=A[i] {Присваивание нового максимума если новый элемент больше текущего максимума}
    end; {конец операторных скобок}
  P:=min*max; {Вычисление произведения минимального и максимального элементов массива}
  writeln; {Перевод курсора на строку ниже}
  writeln('max=',max:3:1,'   min=',min:3:1); {Вывод на экран min и max элементов массива}
  writeln('Произведение минимального и максимального элементов массива P=',P:5:2); {Вывод на экран результата вычислений}
  readln {Задержка изображения на экране}
end. {Конец программы}
Ошибка возникает во время выполнения выделенного куска кода, причем если я генератору задам положительный диапазон - ошибки не возникает, например так A[i]:=0.1+random(100)/10.

В чем причина? Вроде же с типами переменных ничего не напутал.
Uzver004 вне форума
Старый 02.01.2013, 20:02   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Известная штука у старых версий. Дело в неявном указании типов. Random возвращает целое число, затем целое делится на целое нецелочисленно, следовательно результат должен хранится в вещественном типе, вот тут и проблема. По старой идеологии результат должен хранится в переменной тип которой выбирается среди типов которые участвуют в операции, но подходящих типов нет, поэтому тип в котором хранится результат рандома приводится к вещественному "слишком поздно" (тут читать в инете про то, что 0 и 0,000000000 это разные вещи, а также поиск по форуму - давно очень уже писал про подобное). Выход - явно указывать типы. Примеры выхода из ситуации:
Код:
  for i:=1 to n do {цикл, для генерирования значений элементов массива}
    begin {начало операторных скобок}
      xxx := random(100)-50;{где xxx типа integer;}
      A[i]:=xxx/10; {случайное число в диапазоне [0.1;10]}
      writeln('A[',i,']=',A[i]:3:1) {Вывод на экран сгенерированого числа}
    end; {конец операторных скобок}
Код:
  for i:=1 to n do {цикл, для генерирования значений элементов массива}
    begin {начало операторных скобок}
      A[i]:=(random(100)-50.0)/10; {случайное число в диапазоне [0.1;10]}
      writeln('A[',i,']=',A[i]:3:1) {Вывод на экран сгенерированого числа}
    end; {конец операторных скобок}
Последнии версии эти хитрости сами разрешают
eoln вне форума
Старый 02.01.2013, 20:21   #3
Uzver004
 
Регистрация: 02.01.2013
Сообщений: 4
По умолчанию

Спасибо огромное, я понял. 2-й вариант, кстати, интереснее - меньше переменных.

Цитата:
Последнии версии эти хитрости сами разрешают
Турбопаскаль вроде на 7-ке закончил существование, куда ж еще новее.
ЗЫ Забыл добавить, что по программе изучаем ТР7

Уррра, по второму варианту все работает как надо, еще раз спасибо!

Последний раз редактировалось Uzver004; 02.01.2013 в 20:29.
Uzver004 вне форума
Старый 02.01.2013, 20:50   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от Uzver004 Посмотреть сообщение
куда ж еще новее.
Это я про FreePascal, Delphi и т.п.
eoln вне форума
Закрытая тема


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В двух произвольно заданных матрицах размером n×n элементов поменять строки, содержащие максимальные элементы. Vetal888888 Помощь студентам 0 15.12.2011 13:42
В двух произвольно заданных матрицах размером n×n элементов поменять строки, содержащие максимальные элементы. Vetal888888 C# (си шарп) 0 15.12.2011 11:35
Ошибка: переполнение программного стека Yana92 Помощь студентам 2 28.05.2011 14:47
Исправление ошибки 215 в коде Stefansson Помощь студентам 3 20.01.2011 23:13
Дана целочисленная матрица размера M × N. Найти номер последнего из ее столбцов, содержащих равное количе tanjusha Общие вопросы C/C++ 4 01.04.2010 20:03