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

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, dr.Jekill, MOTOCoder, Medved

Ответить
Gollum
Сообщения: 3
Зарегистрирован: 10 янв 2018, 00:53

10 янв 2018, 01:50

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]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
garmayev
Сообщения: 26
Зарегистрирован: 19 дек 2013, 17:40
Откуда: Irkutsk
Контактная информация:

10 янв 2018, 05:38

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

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.
Как-то так
Gollum
Сообщения: 3
Зарегистрирован: 10 янв 2018, 00:53

10 янв 2018, 14:32

Спасибо большое!
Аватара пользователя
Oleg_Rus
Сообщения: 330
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

12 янв 2018, 04:26

В твоем решении:
1. Ты не сохраняешь индекс максимального элемента
2. Неправильная перестановка элементов

Посмотри решение выше Там все вынесено на функции/процедуры
readArray и writeArray - соответственно чтение и вывод массива
процедуры findMin и fnidMax - поиск минимального и максимального элемента с сохранением индекса
в основном теле программы идет вызов всех вышеописанных процедур и функций и перестановка необходимых элементов
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
dr.Jekill
Сообщения: 509
Зарегистрирован: 03 янв 2009, 23:17
Откуда: Voronezh
Контактная информация:

12 янв 2018, 13:23

Позволю себе сделать небольшое дополнение, которое не влияет на правильность результата, а только на скорость выполнения программы.
Для решения данной задачи достаточно 2 циклов:
- в одном ввод массива, нахождение max и min, вывод исходного массива;
- во втором вывод преобразованного массива.
Нет религии выше истины
garmayev
Сообщения: 26
Зарегистрирован: 19 дек 2013, 17:40
Откуда: Irkutsk
Контактная информация:

13 янв 2018, 17:39

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

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

uses myModule;
begin
end.
Gollum
Сообщения: 3
Зарегистрирован: 10 янв 2018, 00:53

15 янв 2018, 21:22

dr.Jekill писал(а): Для решения данной задачи достаточно 2 циклов:
- в одном ввод массива, нахождение max и min, вывод исходного массива;
- во втором вывод преобразованного массива.
У меня не выходит сделать с меньшим количеством циклов(
garmayev
Сообщения: 26
Зарегистрирован: 19 дек 2013, 17:40
Откуда: Irkutsk
Контактная информация:

17 янв 2018, 07:05

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

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]);
Как-то так в два цикла должно быть.
Ответить