Условие задачи : В массиве из 30 элементов числа образуют неубывающую последовательность. Найти количество различных чисел в массиве (Язык Pascal)
Сложность : средняя .
Решение задачи :
Для начала продумаем наше решение. Случайным образом заполним массив, дальше постарайтесь понять что мы будем делать.
У нас будет цикл в цикл, т.е. мы возьмем первое число с помощью первого цикла и затем с помощью второго цикла будем сравнивать его в каждым числом этого массива, у нас будет переменная которая будет увеличиваться на 1 каждый раз как мы найдем одинаковой число, если эта переменная останется равна нулю, это будет означать что такое число одно в это массиве.
Сейчас всё разберем.
Для того чтобы найти количество различных чисел в массиве нам понадобятся следующие переменные :
1. Переменные i и j — для циклов
2. Переменная count — для количества различных чисел
3. Переменная k — переменная которая будет увеличиваться на 1 каждый раз как мы найдем одинаковой число
4. Переменная mass — для массива
Начнем мы с каркаса нашей программы :
uses crt;
type
massiv = array[1..100] of integer;
var
mass : massiv;
i , j , count , k : integer;
begin
clrscr;
randomize;
end.
Тут мы создали свой тип данных , зачем читайте (тут), объявили все переменные , и включили генератор случайных чисел, подробнее (тут)
Теперь заполним массив случайными числами :
for i:=1 to 30 do
begin
mass[i] := random(20);
write(mass[i], ' | ');
end;
Заполнили и вывели все числа массива. А вот дальше самое …..
for i:=1 to 30 do
begin
for j:=1 to 30 do
begin
if (mass[i] = mass[j]) and (i <> j) then
k := k + 1;
end;
if k = 0 then
begin
write(mass[i], ' | ');
count := count + 1;
end;
k := 0;
end;
Ну вот ваще нечего непонятно. Давайте попробуем разобраться, вот допустим у нас есть маленький массив из трех чисел:
3 2 2
Смотрим на 1-й цикл, мы берем 1-е число, в нашем случае 3 и пускаем второй в нем условие если элементы равны и их индексы не совпадают(это сделано чтобы не сравнивать одинаковые условия) , то увеличиваем k на 1, это будет означать что такое число есть в массиве.
К нашему примеру , у нас идет 3 и 3 условие не выполнятся, дальше 3 и 2 условие не выполнятся, дальше опять 3 и 2, тоже не выполнятся, в конечном итоге у нас переменная k осталась равна 0, это будет означать, что число 3 единственное на весь массив.
Если сравнивать двойки, то k у нас увеличиться, и это будет означать что в массиве есть еще одна или больше.
Ну вот такой принцип. Если вы не поняли то, напишите на бумажке себе маленький массив, и подставьте в этот цикл.
Всё решение задачи Pascal :
uses crt;
type
massiv = array[1..100] of integer; // создали тип данных для массива
var
mass : massiv; // объявили
i , j , count , k : integer; // переменные
begin
clrscr; // очистили экран
randomize; // включили генератор случайных чисел
for i:=1 to 30 do // пускайем цикл
begin
mass[i] := random(20); // заполняем массив
write(mass[i], ' | '); // выводим
end;
writeln;
writeln('Элементы которые не повторяются');
for i:=1 to 30 do // пускаем цикл
begin
for j:=1 to 30 do // второй цикл
begin
if (mass[i] = mass[j]) and (i <> j) then // если элементы равны и индексы не равны
k := k + 1; // k увеличиваем на 1
end;
if k = 0 then // если к = 0
begin
write(mass[i], ' | '); // выводим число которое не повторяется
count := count + 1; // увеличиваем кол-во таких чисел на 1
end;
k := 0; // обнуляем к
end;
writeln;
writeln('Кол-во не повторяющихся элементов : ', count); // выводим результат
readln; // чтобы программа не закрывалась
end.
Вот результат :

Спасибо за разъяснения. На С++, конечно короче, но пока его не знаю