Консультация № 85124
02.05.2007, 18:49
0.00 руб.
0 3 3
Добрый день уважаемые эксперты. Снова я - глупый студент. Есть 2 такие задачки
1) Есть массив (произвольный). Сколько в нём разных чисел?(если все одинаковые, то ответ 1).{составить программу}
2) Дан произвольный массив. Найти наименьшую(по модулю) разность между элементами массива(если все элементы массива равны, то ответ 0).{составить программу}

Обсуждение

Неизвестный
02.05.2007, 19:18
общий
это ответ
Здравствуйте, Peeny!
Один из вариантов решения задачи №1 см. в приложении. Неудобство в том, что в Turbo Pascal нет динамических массивов, поэтому приходится резервировать массив с расчётом на задачу, что количества элементов хватило. Алгоритм здесь такой: после ввода каждого числа записываем его в массив. Затем просматриваем массив таким способом: каждый элемент сравниваем со всеми, которые идут до него. Если хотя бы одно совпадение найдено, то число повторяется. Желаю удачи!

Приложение:
program Q85124;uses Crt;var a: array[1..100] of integer;c,n,i,j,x: integer; f: boolean;beginclrscr;c:=0;writeln(‘Введите числа. После ввода каждого числа нажмите <Enter>. Для окончания ввода и вывода результатов введите число 0.‘);repeatreadln(n);if n <> 0 thenbegin inc(c); a[c]:=n;end;until n = 0;x:=0;for i:=1 to c dobeginf:·lse;for j:=1 to i-1 do if a[j] = a[i] then begin f:=true; break; end;if not(f) then inc(x);end;write(‘Разных чисел: ‘,x);readln;end.
Неизвестный
02.05.2007, 20:01
общий
это ответ

<i>Здравствуйте, <b>Peeny</b>!</i>

Задачу №1 (Листинг 1 приложения) решил по такому алгоритму (я решил попроще, чем в предыдущем ответе):
<b>1.</b> Принимаем, что количество разных чисел = количеству элементов массива.
<b>2.</b> Выбираем один элемент массива
<b>3.</b> Ищем такой же один элемент массива, но стоящий после выбранного
<b>4.</b> Если элемент найден, то уменьшаем количество разных чисел на 1. Поиск прекращаем.
<b>5.</b> Выбираем следующий элемент массива
<b>6.</b> Если элемент массива не последний, переходим к п.3
<b>7.</b> Вывод результатов.

Задачу №2 (Листинг 2 приложения) решил по такому алгоритму:
<b>1.</b> Принимаем, что минимальная разность равна 1000 (т.е. больше, чем любое значение в массиве)
<b>2.</b> Выбираем первый элемент массива
<b>3.</b> Ищем модуль разности этого элемента массива с каждым последующим элементом, сравниваем с минимальным и, если меньше, то принимаем значение минимальной разности равным найденному.
<b>4.</b> Выбираем следующий элемент массива
<b>5.</b> Если массив не закончился, переходим к п.3.

Ввод массива можно взять и из примера, приведенного в предыдущем ответе.

Решение постарался максимально упростить. Использовал минимальное число дополнительных переменных.

<i>Удачи!</i>

Приложение:
Листинг 1:program q85124_1;uses crt; const {Размер массива} mxSize = 100; {№ последнего элемента массива} ms = mxSize - 1; var mass: array[0..ms] of Integer; i, j: Integer; {Собственно, результат} difCnt: Integer; begin {очистка экрана} ClrScr; {Заполнение массива} for i:= 0 to ms do mass[i]:= Random(100) - 50; {вычитаем половину, чтобы были как положительные, так и отрицательные числа в массиве} {Инициализация} difCnt:= mxSize; {Количества разных элементов массива} for i:= 0 to (ms - 1) do begin for j:= (i + 1) to ms do begin if (mass[i] = mass[j]) then begin dec(difCnt); Break; end; end; end; {Вывод массива} for i:= 0 to (ms - 1) do write(mass[i], ‘, ‘); writeln(mass[ms]); writeln; {Вывод результата} writeln(‘Different elements count = ‘, difCnt); write(‘Press any key...‘); readln;end.---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Листинг 2:program q85124_2;uses crt; const {Размер массива} mxSize = 10; {№ последнего элемента массива} ms = mxSize - 1; var mass: array[0..ms] of Integer; i, j: Integer; {Предыдущее минимальное значение} lastMin: Integer; {Следующая разница} nextSub: Integer; begin {очистка экрана} ClrScr; {Заполнение массива} for i:= 0 to ms do mass[i]:= Random(ms * 10) - (ms * 5); {вычитаем половину, чтобы были как положительные, так и отрицательные числа в массиве} {Инициализация} lastMin:= 1000; {Нахождение минимальной разности элементов} for i:= 0 to (ms - 1) do begin for j:= (i + 1) to (ms) do begin nextSub:= abs(mass[i] - mass[j]); if (lastMin > nextSub) then lastMin:= nextSub; end; end; {Вывод массива} for i:= 0 to (ms - 1) do write(mass[i], ‘, ‘); writeln(mass[ms]); writeln; {Вывод результата} writeln(‘Minimal substraction = ‘, lastMin); write(‘Press any key...‘); readln;end.
Неизвестный
03.05.2007, 14:46
общий
это ответ
Здравствуйте, Peeny!
у меня такой вариант, сначала сортируете массив, потом по циклу сравниваете данное i число с i-1 елси больше то счетчик увеличиваете
Форма ответа