Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2019, 11:41   #1
123Василий
Пользователь
 
Регистрация: 21.01.2019
Сообщений: 19
По умолчанию заменить максимальный и минимальный элементы массива, размер которого был указан с клавиатуры

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

Код:
Var   a1:array of integer;
        n,I,max,min,q:integer;

begin
     n:=StrToInt(edt1.Text);
     Randomize;
     SetLength(a1,n);
     for i:=0 to (n-1) do
     begin
     a1[i]:=Random(50);
     mmo1.Lines.Add(IntToStr(a1[i]));

     min:=a1[1];
     max:=a1[1];

     if a1[i]<min then min:=a1[i];
     if a1[i]>max then max:=i;

     q:=a1[min];
     a1[min]:=a1[max];
     a1[max]:=q;


     mmo2.Lines.add(intToStr(a1[i]));
     end;
123Василий вне форума Ответить с цитированием
Старый 21.01.2019, 11:46   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
     min:=a1[1];
     max:=a1[1];
Дин.массивы нумеруются с 0. Зачем вы их на каждой итерации сбрасываете?

Код:
     if a1[i]<min then min:=a1[i];
     if a1[i]>max then max:=i;
Так вы запоминаете индексы или значения?

Код:
     q:=a1[min];
     a1[min]:=a1[max];
     a1[max]:=q;
Зачем вы каждую итерацию цикла переставляете текущий макс с мин?
p51x вне форума Ответить с цитированием
Старый 21.01.2019, 11:58   #3
123Василий
Пользователь
 
Регистрация: 21.01.2019
Сообщений: 19
По умолчанию

Код:
if a1[i]<min then min:=i;
if a1[i]>max then max:=i;
Опечатка вышла.
Я запоминаю индексы,а потом меняю их местами
123Василий вне форума Ответить с цитированием
Старый 21.01.2019, 12:35   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Примерно вот так)
Весы = спасибо
Вложения
Тип файла: zip stok.zip (216.0 Кб, 8 просмотров)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.01.2019, 12:47   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Цикл по заполнению массива (исходный пост) - вижу, хотя он end ом не закрыт, а цикла поиска min-max - нету. Why?
Вообще мы с котом Мурзиком решили, что вот так будет работать, а так, как в #1 - лучше не вспоминать. Путать индексы со значениями - это не спортивно. Не говоря уже об форматировать код.
Код:
Var   a1:array of integer;
        n,i,max,min,i_max,i_min,q:integer;
begin
     n:=StrToInt(edt1.Text);
     Randomize;
     SetLength(a1,n);
     for i:=0 to (n-1) do
     begin
        a1[i]:=Random(50);
        mmo1.Lines.Add(IntToStr(a1[i]))
     end ;

     min:=a1[0]; i_min := 0 ;
     max:=a1[0]; i_max := 0 ;

     for i:=1 to (n-1) do
       begin 
          if a1[i]<min then
                  begin min:=a1[i]; i_min := i end ;
          if a1[i]>max then
                  begin max:=a1[i]; i_max := i end ;
       end ;
 ;

     q:=a1[i_min];
     a1[i_min]:=a1[i_max];
     a1[i_max]:=q;

Последний раз редактировалось digitalis; 21.01.2019 в 12:54.
digitalis вне форума Ответить с цитированием
Старый 21.01.2019, 12:54   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Цикл по заполнению массива - вижу, хотя он end ом не закрыт, а цикла поиска min-max - нету. Why?
Внимательней - закрыт, нет/не скопирован только последний "end."; цикл поиска есть - он просто тот же самый, ТС пытался все сделать в одном цикле.
p51x вне форума Ответить с цитированием
Старый 21.01.2019, 12:56   #7
123Василий
Пользователь
 
Регистрация: 21.01.2019
Сообщений: 19
По умолчанию

Благодарю за помощь!
123Василий вне форума Ответить с цитированием
Старый 21.01.2019, 13:07   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Ну если все утоптать в один цикл, то где-то так:
Код:
     i_min := 0 ;
     i_max := 0 ; 
     for i:=0 to (n-1) do
     begin
        a1[i]:=Random(50);
        mmo1.Lines.Add(IntToStr(a1[i])) ;
        if i=0 then
            begin  min:=a1[0];  max:=a1[0] end ;
        if a1[i]<min then
                  begin min:=a1[i]; i_min := i end ;
        if a1[i]>max then
                  begin max:=a1[i]; i_max := i end ;
     end ;
Можно было после первого if - else вставить - выиграли бы пару микросекунд во время выполнения

Но уж это - ни в дугу, ни в Красну Армию
Код:
   min:=a1[0];
  ......
  q:=a1[min];

Последний раз редактировалось digitalis; 21.01.2019 в 13:14.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить пару наиболее удаленных друг от друга позиций массива, в которых располагаются совпадающие элементы. (Размер массива не указан) Jackyliry Паскаль, Turbo Pascal, PascalABC.NET 1 24.12.2017 16:37
Максимальный и минимальный элементы массива. Программирование пользовательских функций. Serg017 Общие вопросы C/C++ 12 30.04.2014 22:02
Найти минимальный и максимальный элементы массива Х и поменять их в массиве местами. Элементы массива вычисляются по формуле Xi=(( Милашечка Помощь студентам 0 26.05.2013 13:01
[C++] Переставить местами первый минимальный и первый максимальный элементы массива Aaaaaa111 Помощь студентам 2 27.02.2012 11:56