Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.06.2023
Сообщений: 6

Вывести перестановки по заданному условию

11.12.2023, 15:49. Показов 1152. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сформировать одномерный массив и вывести перестановки при условии, что если элемент больше соседних в два и более раз, то такая перестановка не подходит.
Массив есть, перестановки есть, а вот как реализовать условие не понимаю.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
program Permutations;
const
  N = 5;// размер массива
type
  TArray = array[1..N] of Integer;
  TPerm = array[1..N] of Integer;
var
  arr: TArray;
  perm: TPerm;
 
procedure GenPerm(index: Integer);
var
  i, temp: Integer;
begin
  if index = N + 1 then
  begin
    for i := 1 to N do
      Write(perm[i], ' ');
    Writeln;
  end
  else
  begin
    for i := 1 to N do
    begin
      // проверяем, было ли уже использовано текущее число
      temp := perm[i];
      if temp = 0 then
      begin
        perm[i] := arr[index];
        GenPerm(index + 1);
        perm[i] := 0;
      end;
    end;
  end;
end;
 
var
  i: Integer;
 
begin
  // заполняем массив случайными числами
  Randomize;
  for i := 1 to N do
    arr[i] := Random(10) + 1;
  
  // выводим исходный массив
  write('Исходный');
  writeln;
  for i := 1 to N do
    Write(arr[i], ' ');
  Writeln;
  write('Перестановки');
  writeln;
  // генерируем перестановки
  GenPerm(1);
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2023, 15:49
Ответы с готовыми решениями:

Вывести элементы массива, соответствующие заданному условию
Дан массив целых чисел А (n элементов). Построить блок-схему алгоритма, выводящего значения элементов, для которых справедливо условие A -...

Вывести на экран значения функции по заданному условию
составить поставку,алгоритм и программу выдачи на экран в PASCALe неравных 3.2 значений функции t=ln(14.5q/152.9)+Sin5.3q на отрезке с...

Вывести номера элементов массива, удовлетворяющие заданному условию
Нужна помощь с решением задания: Вывести номера таких элементов массива Ai, что Ai-1<Ai<Ai+1, где i = 2 ... (n-1), n - кол-во...

6
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
11.12.2023, 16:51
Перестановки выводятся где? Правильно, в строках 18-19.
Соответственно, перед строкой 18 проверяем, соблюдается ли условие
если элемент больше соседних в два и более раз, то такая перестановка не подходит
и выводим, если не соблюдается, ибо не подходит.

Добавлено через 9 минут
Кликните здесь для просмотра всего текста
Pascal
17
18
19
20
21
22
23
    i:=N-1;
    while (i>1) and (perm[i]<=2*perm[i-1]) and (perm[i]<=2*perm[i-1]) do Dec(i);
    if (i=1) and (perm[N]>2*perm[N-1]) then Inc(i);
    if (i=1) and (perm[1]>2*perm[2]  ) then Inc(i);
    if i=1 then begin
      for i:=1 to N do Write(' ',perm[i]); WriteLn;
    end
1
0 / 0 / 0
Регистрация: 30.06.2023
Сообщений: 6
14.12.2023, 10:40  [ТС]
Сформировать одномерный массив и вывести перестановки при условии, что если элемент больше соседних в два и более раз, то такая перестановка не подходит. Сделал массив, перестановки, проверку на условие, но проблема с крайними элементами при проверке разницы.
Грубо говоря, если исходный массив [ 3 5 6 4 10], то [6 3 5 4 10] он всё равно выведет, но при [ 3 5 10 4 6] выполняется.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
program Perms;
 
const
  N = 5;// размер массива
 
type
  TArray = array[1..N] of Integer;
  TPerm = array[1..N] of Integer;
 
var
  arr: TArray;
  perm: TPerm;
 
procedure GenPerm(index: Integer);
var
  i, temp: Integer;
  valid: Boolean;
begin
  if index = N + 1 then
  begin
    valid := true;
    for i := 2 to N - 1 do
    begin
      if (perm[i] >= perm[i - 1] * 2) or (perm[i] >= perm[i + 1] * 2) then
      begin
        valid := false;
        Break;
      end;
    end;
    
    if valid then
    begin
      for i := 1 to N do
        Write(perm[i], ' ');
      Writeln;
    end;
  end
  else
  begin
    for i := 1 to N do
    begin
      // проверяем, было ли уже использовано текущее число
      temp := perm[i];
      if temp = 0 then
      begin
        perm[i] := arr[index];
        GenPerm(index + 1);
        perm[i] := 0;
      end;
    end;
  end;
end;
 
var
  i: Integer;
 
begin
  // заполняем массив случайными числами
  Randomize;
  for i := 1 to N do
    arr[i] := Random(10) + 1;
  
  // выводим исходный массив
  write('Исходный');
  writeln;
  for i := 1 to N do
    Write(arr[i], ' ');
  Writeln;
  write('Перестановки');
  writeln;
  // генерируем перестановки
  GenPerm(1);
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
14.12.2023, 20:51
Цитата Сообщение от Rat999 Посмотреть сообщение
Грубо говоря, если исходный массив [ 3 5 6 4 10], то [6 3 5 4 10] он всё равно выведет, но при [ 3 5 10 4 6] выполняется.
Можно как-то связанно пояснить, что хотели сказать?
Что 10 в 2 раза больше 4, но эта перестановка все равно выводится, но не должна? Так для элементов 2..N-1 условие соблюдается, а проверки крайних элементов вы писать не стали, код проверок выкинули, потому перестановка и выводится. Мне совсем непонятно, чему вы удивляетесь и что непонятно. А объяснять, что не так, вам, похоже, недосуг

Добавлено через 2 минуты
В сообщении #2 под спойлером есть готовый код проверки, почему б не попробовать его в деле?
0
0 / 0 / 0
Регистрация: 30.06.2023
Сообщений: 6
16.12.2023, 16:19  [ТС]
Так в этом и проблема, что я не понимаю, как именно прописать условие. Выдаёт ошибку размерности. Если же брать ранее написанную прогу, то каждая строчка выводится по нескольку раз.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
16.12.2023, 16:43
Цитата Сообщение от Rat999 Посмотреть сообщение
проблема, что я не понимаю, как именно прописать условие
Идете к сообщению #2 в этой теме, щелкаете "Кликните здесь для просмотра всего текста".
Вы же код внутри открывшегося блока видели? Вот ровно так и прописать, буквально.
Строки 19, 20 как раз про проверку последнего и первого элементов массива соответственно.
0
0 / 0 / 0
Регистрация: 30.06.2023
Сообщений: 6
17.12.2023, 15:04  [ТС]
Это- то понятно. Но всё, понял, где был недочёт, прога теперь работает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2023, 15:04
Помогаю со студенческими работами здесь

По заданному N вывести все перестановки из целых чисел от 1 до N
Нужно по задоному N вывести все перестановки из целых чисел от 1 до N в лексикографическом порядке.

Цикл: Вывести наименьшее из чисел K по заданному условию
Дано вещественное число A(&gt; 1). Вывести наименьшее из целых чисел K, для которых сумма 1 + 1/2 + ... + 1/K будет больше A, и саму эту...

Создать и вывести квадратную матрицу по заданному условию
Нужно вывести квадратную матрицу 8*8 (задание ниже) Сам код в Free Pascal : var a:array of integer; i,x,y,n:integer; ...

Вывести элементы массива, которые удовлетворяют заданному условию
Дан целочисленный массив А размера 10. Вывести элементы массива Ак, которые удовлетворяют двойному неравенству А1 &lt; Ак &lt; А10. Если...

Вывести каждое значение, которое удовлетворяет заданному условию
Вот есть программный код, нужно чтобы в конце он выводил отдельно каждое значение, которое удовлетворяется условию, а потом только сумму....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru