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

Элементы массива на четных позициях отсортировать по возрастанию, а на нечетных – по убыванию

04.07.2014, 01:27. Показов 8547. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот задание:

Составить программу для сортировки массива размерностью элементов целого типа по следующему принципу: элементы на четных позициях по возрастанию, а на нечетных – по убыванию. Размерность массива вводится с клавиатуры. Отсортированную матрицу в отформатированном виде вывести в текстовый файл. Открыть файл для чтения и вывести его содержимое на экран.

я так понял, что работаю со всеми элементами массива, а не с каждой его строкой.

допустим, у нас есть массив:
1 2 3 4 5
6 7 8 9 10

результат сортировки по массиву должен быть таким:
9 2 7 4 5
6 1 8 3 10.
тут, формально, получается что я работаю с одномерным массивом, а потом перевожу его в двумерный

или же наоборот. нужно искать четные/нечетные в каждой строке двумерного массива и тогда там менять местами?
тогда будет:
5 2 3 4 1
10 7 8 9 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
 program sааа;
 uses crt;
 var mas:array[1..100,1..100] of integer;
 i,i1,j,j1,m,n:integer;
 tmp:integer;
 Begin
 writeln('введите размерность строк');
 readln(m);
 writeln('введите количество столбцов');
 readln(n);
      writeln('введите массив');
      for i:=1 to m do begin
      for j:=1 to n do begin
      read(mas[i,j]);
 
      end;
      writeln;
      end;
     for i:=1 to m-1 do begin
     for j:=1 to n-1 do
  if odd(mas[i,j]) then   begin
    for i1:=i+1 to m do
    for j1:=j+1 to n do
      if odd(mas[i1,j1]) and (mas[i1,j1] > mas[i,j]) then
    begin
                   tmp:=mas[i,j];
                   mas[i,j]:=mas[i1,j1];
                   mas[i1,j1]:=tmp;
              end;
    if odd(mas[i1,j1]) and (mas[i1,j1] < mas[i,j]) then
    begin
                   tmp:=mas[i,j];
                   mas[i,j]:=mas[i1,j1];
                   mas[i1,j1]:=tmp;
                   end;
                  end;
                   end;
      writeln('отсортированный массив:');
      for i:=1 to m do begin
      for j:=1 to n do
      write(mas[i,j],' ');
       writeln;
      end;
 
end.
эта программа выдает на массив массив:
1 2 3 4 5
6 7 8 9 10

такой результат:
9 2 7 4 5
6 1 8 3 10. здесь 1 и 3 находятся на неверных местах. посоветуйте, пожалуйста, что делать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2014, 01:27
Ответы с готовыми решениями:

Отсортировать элементы вектора, на нечетных местах - по убыванию, на четных местах - по возрастанию
дан вектор размера n состоящий из целых положительных и отрицательных элементов отсортировать вектор о следующему правилу элементы...

Разделить одномерный массив на два. Элементы, размещенные на четных и нечетных позициях
Очень нужно решить задачу... 3 ДНЯ ТУПЛЮ СПАСАЙТЕ:wall: Задан одномерный массив действительных чисел из элементов. Сформируйте из этого...

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

7
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
04.07.2014, 10:12
1. Не увидел в задании ничего про двумерный массив.
2. Что такое "чётная позиция" элемента в двумерном массиве не могу себе представить.
3. odd(mas[i,j]) проверяет чётность элемента массива, а не позиции.

Добавлено через 18 минут
Например, так:
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
var
  a: array [1..100] of integer;
  i, j, t, n: integer;
  s: string;
  f: text;
begin
  Randomize;
  Write('Введите число элементов: '); ReadLn(n);
  WriteLn('A=');
  for i:=1 to n do begin
    a[i]:=Random(100); Write(a[i]:4);
  end; WriteLn;
  for i := n downto 2 do
    for j := 2 to i do
      if odd(i) xor (a[j] < a[j-1]) then begin
        t := a[j]; a[j] := a[j-1]; a[j-1] := t;
      end;
  Assign(f,'matrix.txt'); Rewrite(f);
  WriteLn(f,'A''=');
  for i:=1 to n do begin
    Write(f,a[i]:4);
    if i mod 20 = 0 then WriteLn(f);
  end; WriteLn(f);
  Close(f); Reset(f);
  while not eof(f) do begin
    ReadLn(f,s); WriteLn(s);
  end;
  Close(f);
end.
Добавлено через 15 минут
Если речь о двумерном массиве и элементы считаются построчно, малой кровью схитрить можно так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  m, n, nn, i, j, t: integer;
  a: array [1..100*100] of integer;
begin
  Randomize;
  Write('Введите размерность матрицы m n: '); ReadLn(m,n);
  nn:=m*n;
  WriteLn('A=');
  for i:=1 to nn do begin
    a[i]:=Random(100); Write(a[i]:4);
    if i mod n = 0 then WriteLn;
  end;
...
То есть, хранить одномерный массив, двумерный симулировать при выводе, выводя построчно по n элементов в строке.
0
 Аватар для Don_Omare
78 / 80 / 70
Регистрация: 18.12.2013
Сообщений: 210
04.07.2014, 15:54
bormant, хитрить для двумерного необязательно

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
program ps2;
 
uses
  crt;
 
const
  n = 5;
 
var
  i, j, max, maxi, maxj, k, m, b: integer;
  A: array[1..n, 1..n] of integer;
 
begin
  Textcolor(12);
  writeln('Ваша матрица: ');
  for i := 1 to n do
  begin
    for j := 1 to n do
    begin
      A[i, j] := random(99);
      write(A[i, j]:3);
    end;
    writeln;
  end;
  Max := A[1, 1];
  Textcolor(10);
  
  for k := 1 to n do
  begin
    for m := 1 to n do
    begin
      for i := 1 to n do
      begin
        for j := 1 to n do
        begin
          if (i > k) or ((i = k) and ((j = m) or (j > m))) then  
            
            if A[i, j] > max then
            begin
              max := A[i, j];
              maxi := i;
              maxj := j;
            end;
        end;
      end;  
      max := 0;
      b := A[k, m];
      A[k, m] := A[maxi, maxj];
      A[maxi, maxj] := b;
    end;
  end;
  
  
  for i := 1 to n do
  begin
    for j := 1 to n do
    begin
      write(A[i, j]:3);
    end;
    writeln;
  end;
  readln
end.
Добавлено через 1 минуту
P.S. это обычная сортировка по убыванию. При желании, автор, можете подогнать данную программу под свою задачку.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
04.07.2014, 16:11
Don_Omare,
вот и я говорю, нет смысла делать сложно на ровном месте, когда можно сделать просто. Ваш пример кода -- наглядная тому иллюстрация
0
 Аватар для Don_Omare
78 / 80 / 70
Регистрация: 18.12.2013
Сообщений: 210
04.07.2014, 16:20
bormant, полезнее будет немного пошевелить мозгами и подумать над сложным. Прибавится капелька логики.

p.s. Не хвалюсь, а привожу пример. Пол года назад когда мы это проходили в универе, многие не сделали это задание, некоторые решили эту задачу как Вы. Но учитель сказал, что лучшее решение мое. Ибо додуматься до
Pascal
1
2
3
4
5
6
7
8
9
  for k := 1 to n do
  begin
    for m := 1 to n do
    begin
      for i := 1 to n do
      begin
        for j := 1 to n do
        begin
          if (i > k) or ((i = k) and ((j = m) or (j > m)))
куда более труднее чем до
Pascal
1
a: array [1..100*100] of integer;
Добавлено через 3 минуты
Цитата Сообщение от bormant Посмотреть сообщение
схитрить
ну и оригинальность иногда тоже не помешает.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
04.07.2014, 16:22
PS. Перевод из линейного индекса в двумерный и обратно тоже несложен. Особенно для индексов, начинающихся от 0. Пусть k - линейный индекс, тогда для построчного хранения строка i:=k div n; столбец j:=k mod n; обратно: k:=i*n+j;

46 строка вызывает сильное сомнение, раз уж хранить индексы максимума, зачем сам максимум:
Pascal
1
2
3
maxi:=1; maxj:=1;
...
if a[i,j]>a[maxi,maxj] then ...
0
 Аватар для Don_Omare
78 / 80 / 70
Регистрация: 18.12.2013
Сообщений: 210
04.07.2014, 16:30
Цитата Сообщение от bormant Посмотреть сообщение
раз уж хранить индексы максимума, зачем сам максимум:
Верно подметили
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
04.07.2014, 16:32
Цитата Сообщение от Don_Omare Посмотреть сообщение
куда более труднее
это обычный инвариант одномерного случая:
Pascal
1
2
3
for i:=1 to n do
  for j:=1 to n do
    if j>i then ...
просто в одномерном обычно так не пишут, поскольку внутренний цикл легко сразу сделать как for j:=i+1 to n do ...
Но додуматься, да, надо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2014, 16:32
Помогаю со студенческими работами здесь

Отсортировать по убыванию элементы, стоящие на четных местах, а элементы стоящие на нечетных местах - по возрастанию
Дан вектор размером N. Отсортировать по убыванию элементы, стоящие на четных местах, а элементы стоящие на нечетных местах - по возрастанию

Отсортировать элементы четных строк матрицы по возрастанию, а нечетных - по уменьшению значения
Отсортировать элементы четных строк матрицы по возрастанию, а нечетных - по уменьшению значения.

Отсортировать все элементы массива по убыванию и по возрастанию
привет всем. в общем такая задача. дан двумерный массив из десяти чисел. требуется: вывести исходный массив. сгенерировать для...

Отсортировать элементы нечетных строк массива целых чисел по убыванию
Отсортировать элементы нечетных строк массива целых чисел по убыванию. Сортировка прямой выбор.

Отсортировать элементы массива, с чётными индексами - по возрастанию, с нечётными - по убыванию
Организуйте массив содержащий 20 целых чисел. Отсортируйте отдельно элементы с четными инднксами по возрастанию, и элементы с нечетными...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru