Top.Mail.Ru
Ответы
Аватар пользователя
10лет
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Массивы

Создал программу на паскале, суть в том, что мы должны ввести массив А и элемент k. После, мы должны проверить, есть ли элемент k в массиве А (используя цикл while), и вывести его на экран. Собственно, проблема: при вводе отрицательного значения к, мне выводит 11Й элемент массива, с учетом того, что элементов 10! В чем проблема? ? Скрин ошибки и текст программы ниже:


program Lab_4;
{$APPTYPE CONSOLE}
uses
SysUtils;
const n=10;
type mass=array[1..n] of integer;
var A:mass; i,k:byte;
begin
for i:=1 to n do
begin
Write('A[',i,']=');
Readln(A[i]);
end;
writeln('Enter k: ');
readln(k);
i:=1;
while A[i]<>k do
Inc(i);
if A[i]=k then writeln('Element znaiden, ' , 'A[',i,']=',k)
else Writeln('Elementa ne znaideno');
Readln;
readln
end.

По дате
По рейтингу
Аватар пользователя
Мудрец
10лет

2 ошибки:
1. Вы вводите отрицательное число, а для хранения используете байт, который не допускает отрицательных значений (поэтому вывелось 251=256-5)
2. Нет проверки на выход за границу массива, поэтому после i = 10 вы ищите значение байта где-то в памяти и благополучно находите.

Что делать:
1. var k: integer;
2. while (A[i] <> k) and (i <= n) do Inc(i);

ЗЫ
Проверьте значения Addr(k) и Addr(a[11]) есть большая вероятность, что вы нашли в памяти тот же самый k.

ЗЗЫ
Вы вновь открыли способ не проверять (i <= n) в каждом цикле:
Занести A[n+1]:=k ДО ЦИКЛА и сравнение i = n+1, когда мы его нашли, ЗНАЧИТЕЛЬНО сокращает количество сравнений.

Аватар пользователя
Мастер
10лет

.