Количество различных элементов в массиве - Free Pascal
Формулировка задачи:
Вот такой у меня получился код :
То есть сравниваем текущий элемент с последующими, при первом совпадении увеличиваем счетчик, в свою очередь счетчик различных элементов увеличивается за счет счетчика совпадений.
Но не работает. Не понимаю,почему.
Он тоже работает,но я не понимаю,почему. Изначально флажок опущен. Нашли совпадение, флажок поднялся. Так почему в условии цикла , как и в условии увеличения счетчика различных цифр стоит "not b ", ведь not b = true,а true у нас появляется,если мы НАШЛИ совпадение.
Или же я не понимаю,как работает в данном случае ""not"?
Program CalculateTheQuantityOfDifferentNumbers;
const N=10;
type
array1 = array [1..N] of integer;
var arrray : array1;
iCountDifferentNumbers, iCounter,NewCount,iNextElement: Integer;
Procedure FillOut;
var iCounter : integer;
Begin
Randomize;
for iCounter:=1 to N do
Begin
arrray[iCounter]:=Random(550);
Write(arrray[iCounter], ' ');
end;
end;
Begin
FillOut;
iCountDifferentNumbers:=0;
for iCounter:=1 to N do
Begin
newCount:=0;
iNextElement:=iCounter+1;
while (iNextElement<=N) and ( newCount=0) do
Begin
if arrray[iCounter]=arrray[iNextElement] then
Begin
newCount:=newCount+1;
break;
end;
inc(iNextElement);
end;
if ( newCount=0) then
inc(iCountDifferentNumbers);
end;
Writeln;
Writeln('The quantity of different elements : ', iCountDifferentNumbers);
end.
Нет,он всё-таки работает. По крайне мере,похоже на то. Но вопрос в другом.
Вот такой код я нашел :
Begin
b:=False; {Считаем, что это число единственное}
j:=i+1; {Проверку начинаем со следующего элемента}
{Пока не просмотрены все элементы и не найден совпадающий}
While (j<=m) And Not b Do
Begin
If A[i]=A[j] Then b:=True; {Есть совпадение!}
j:=j+1;
End;
If Not b Then s:=s+1; {Если не было совпадения, то увеличиваем s}
End;
WriteLn('Количество различных элементов = ',s);
End.Решение задачи: «Количество различных элементов в массиве»
textual
Листинг программы
var b:boolean;//по умолчанию=true
.............
b:=false;//или b:=not b;
While (j<=m) And Not b Do//пока not b или b=false
Begin
If A[i]=A[j] Then b:=True; {Есть совпадение!}//сменили флаг b=true или просто b
j:=j+1;
End;
If Not b Then s:=s+1; {Если не было совпадения, то увеличиваем s}//если же флаг не изменился, b=false или not b
End;
Объяснение кода листинга программы
- Объявляется булевая переменная b, по умолчанию равная true.
- Задаётся условие для цикла while: j <= m и not b.
- В цикле while выполняется следующая логика:
- Если A[i] равно A[j], то b устанавливается в true.
- j увеличивается на 1.
- После цикла while проверяется значение b.
- Если b не изменилось (осталось равным false), то счётчик s увеличивается на 1.