Страница 1 из 1

Pascal.Массивы.Перестановка элементов

Добавлено: 10 янв 2018, 01:50
Gollum
PascalABC.NET
Дан целочисленный вектор а(n).Найти наименьшее из четных чисел,определить его индекс и поменять местами с макс. элементом.Вывести исходный вектор,полученный результат и преобразованный вектор.
Вот что получилось у меня.Объясните,что не так,пожалуйста.

Код: Выделить всё

program zadanie2;
  const n=10;
  var a: array[1..n] of integer;
      i,min,max,minind,z: integer;
    begin
      min:=maxint;
      writeln('Введите ',n,' элементов массива:' );
         for i:=1 to n do
             read(a[i]);
          for i:=1 to n do 
            if (a[i] mod 2=0)and(a[i]<min) then 
              begin 
                 min:=a[i];
                 minind:=i;
              end;
        writeln('Минимальный четный элемент: ',min);
        writeln('Индекс минимального четного элемента: ',minind);
      max:=a[i];
      for i:=2 to n do 
          if a[i]>max then max:=a[i];
             Writeln('Максимальный элемент массива:',max);
            i:=min;
            min:=max;
            max:=i;
          for i:=1 to n do
          write(a[i],' ');
   end.
[ATTACH]2451[/ATTACH]

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 10 янв 2018, 05:38
garmayev

Код: Выделить всё

type mas = array [1..10] of integer;
const n = 10;
function readArray: mas;
var i: integer;
    a: mas;
begin
    for i:=1 to n do read(a[i]);
    readArray:= a;
end;

procedure writeArray(a: mas);
var i: integer;
begin
    for i:=1 to n do 
    begin 
        write(a[i]);
        write(' ');
    end;
    writeln;
end;

procedure findMin(a: mas; min: integer; var value, index: integer);
var i: integer;
begin
    index:= -1;
    for i:=1 to n do
    if ( (a[i] mod 2 = 0) and (a[i] < min) ) then
    begin
        value:= a[i];
        index:= i;
        min:= a[i];
    end;
end;

procedure findMax(a: mas; max: integer; var value, index: integer);
var i: integer;
begin
    index:= -1;
    for i:=1 to n do
    if ( a[i] > max ) then
    begin
        value:= a[i];
        index:= i;
        max:= a[i]
    end;
end;

var a: mas;
    min, minIndex, max, maxIndex, buffer: integer;
begin
    a:= readArray();
    findMin(a, 32767, min, minIndex);
    findMax(a, -32767, max, maxIndex);
    writeArray(a);
    write(min,' ',minIndex);
    writeln;
    buffer:= a[minIndex];
    a[minIndex]:= a[maxIndex];
    a[maxIndex]:= buffer;
    writeArray(a);
end.
Как-то так

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 10 янв 2018, 14:32
Gollum
Спасибо большое!

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 12 янв 2018, 04:26
Oleg_Rus
В твоем решении:
1. Ты не сохраняешь индекс максимального элемента
2. Неправильная перестановка элементов

Посмотри решение выше Там все вынесено на функции/процедуры
readArray и writeArray - соответственно чтение и вывод массива
процедуры findMin и fnidMax - поиск минимального и максимального элемента с сохранением индекса
в основном теле программы идет вызов всех вышеописанных процедур и функций и перестановка необходимых элементов

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 12 янв 2018, 13:23
dr.Jekill
Позволю себе сделать небольшое дополнение, которое не влияет на правильность результата, а только на скорость выполнения программы.
Для решения данной задачи достаточно 2 циклов:
- в одном ввод массива, нахождение max и min, вывод исходного массива;
- во втором вывод преобразованного массива.

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 13 янв 2018, 17:39
garmayev
dr.Jekill писал(а):Позволю себе сделать небольшое дополнение, которое не влияет на правильность результата, а только на скорость выполнения программы.
Для решения данной задачи достаточно 2 циклов:
- в одном ввод массива, нахождение max и min, вывод исходного массива;
- во втором вывод преобразованного массива.

Нууу, оптимальный код я как-то даже не заморачивался =))) постарался написать "красиво", когда все аккуратно завернуто в функции и процедуры =))) для полного экстремизма можно все это завернуть в модуль, который отрабатывает автоматически при подключении. Т.о. весь код программы может свестись до 3 строк

uses myModule;
begin
end.

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 15 янв 2018, 21:22
Gollum
dr.Jekill писал(а): Для решения данной задачи достаточно 2 циклов:
- в одном ввод массива, нахождение max и min, вывод исходного массива;
- во втором вывод преобразованного массива.
У меня не выходит сделать с меньшим количеством циклов(

Re: Pascal.Массивы.Перестановка элементов

Добавлено: 17 янв 2018, 07:05
garmayev

Код: Выделить всё

max:= -32000;
min:= 32000;

for i:=1 to n do 
begin
  read(a[i]);
  if (a[i] > max) then
  begin
    max:= a[i];
    maxIndex:= i;
  end else if ( a[i] < min ) then
  begin
    min:= a[i];
    minIndex:= i;
  end;
end;

writeln(min, minIndex);
writeln(max, maxIndex);

for i:=1 to n do write(a[i]);
Как-то так в два цикла должно быть.