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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2011, 21:00   #1
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию Удаление повторяющихся елементов в массиве.

Суть программы упорядочить по возрастанию и убыванию, а так же удалить повторяющиеся елементы.Код написал.(но не могу понять почему не отрабатывается именно этот момент.)
Помогите плиз, программа работает. Интересует момент выделенный красным.


Код:
Program Mas;
Type
    Massiv = Array [1..100] Of integer;
Var
   Mass: Massiv;
   Col, I, J: Integer;

Procedure OutputMass(OutCol:Integer;OutMass:Massiv);
Var
   I:Integer;
Begin
     WriteLn ('Vvedeno poslidovnist 4usel: ');
     For I:=1 To OutCol Do
     Begin
          Write (OutMass[I]:4,' ');
     End;
     WriteLn;
End;

Procedure Exam1 (ExCol:Integer;ExMass:Massiv);
Var
   Max, Min: integer;
Begin
     Max:=ExMass[1];
     Min:=ExMass[1];
     For I:=1 To ExCol Do
     Begin
          If Min>ExMass[I] Then Min:=ExMass[I];
          If Max<ExMass[I] Then Max:=ExMass[I];
     End;
     WriteLn ('Maxumalnui element: ',Max:4);
     WriteLn ('Minimalnui element: ',Min:4);
End;

Procedure Ex2AZ (ExCol:Integer;ExMass:Massiv);
Var
   MassAZ: Massiv;
   Buffer: integer;
   I, J, k: Integer;
Begin
     i:=1;
     For I:=1 To ExCol Do MassAZ[I]:=ExMass[I];
     For I:=1 To ExCol Do
         For J:=I To ExCol Do
             Begin
                  If MassAZ[I]>MassAZ[J] Then
                  Begin
                       Buffer:=MassAZ[J];
                       MassAZ[J]:=MassAZ[I];
                       MassAZ[I]:=Buffer;
                  End;
             End;
     WriteLn ('Vpor9dkovanuu za zrostann9m:');
     For I:=1 To ExCol Do
     Begin
          Write (MassAZ[I]:4,' ');
     End;
     writeln;
     while i<=Excol do
      begin
       j:=j+1;
        while j<=Excol do
         begin
          if Mass[j]=Mass[i]  then
           begin
            for k:=j to excol-1 do
            Mass[k]:=Mass[k+1];
            Excol:=Excol-1;
            end
            else j:=j+1;
           end;
          i:=i+1;
         end;
        writeln('Masiv bez povtoreniy');
        for i:=1 to excol do
        write(Mass[i],' ');
     WriteLn;
End;

Procedure Ex2ZA (ExCol:Integer;ExMass:Massiv);
Var
   MassZA: Massiv;
   Buffer: integer;
   I, J: Integer;
Begin
     For I:=1 To ExCol Do MassZA[I]:=ExMass[I];
     For I:=1 To ExCol Do
         For J:=I To ExCol Do
             Begin
                  If MassZA[I]<MassZA[J] Then
                  Begin
                       Buffer:=MassZA[J];
                       MassZA[J]:=MassZA[I];
                       MassZA[I]:=Buffer;
                  End;
             End;
     WriteLn ('Vpor9dkovanuu za spadann9m:');
     For I:=1 To ExCol Do
     Begin
          Write (MassZA[I]:4,' ');
     End;
     WriteLn;
End;

Begin
     Write ('Vvedite dlinny masuva (no ,ne bolshe 4em 100) : ');
     ReadLn (Col);
     For I:=1 To Col Do
     Begin
          Write ('Vvedite Mass[',I,']=');
          ReadLn (Mass[I]);
     End;

     OutputMass (Col,Mass);
     Exam1 (Col,Mass);
     Ex2AZ (Col,Mass);
     Ex2ZA (Col,Mass);
     ReadLn;
End.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 07.11.2011, 21:16   #2
DorianMark
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 15
По умолчанию

А удалить элементы, в смысле заменить на ноль или удалить один из эл-тов?

и еще. массив двумерный или одномерный?

Последний раз редактировалось Stilet; 08.11.2011 в 08:44.
DorianMark вне форума Ответить с цитированием
Старый 07.11.2011, 21:18   #3
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Одномерный, просто удалить и вывести без елемента который повторялся.
Ну суть алгоритма реализовал, вопрос, правильно ли?
Люблю на ты.Я человек простой

Последний раз редактировалось Leshii; 07.11.2011 в 21:22.
Leshii вне форума Ответить с цитированием
Старый 07.11.2011, 21:24   #4
DorianMark
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 15
По умолчанию

Как же не хочется вникать в написаный тобой код))
Так что предложу сразу свой вариант сортировки

Код:
....
for i:=1 to n do
  for j:=1 to m do
  begin 
  if a[i]<a[i+1] then 
     begin
     q:=[i];
     a[i]:=a[i+1];
     a[i+1]:=1;
     end;
  end;
for i:=1 to n do
  for j:=1 to m do
  begin 
  if a[i]=a[i+1] then 
     begin
     a[i]:=0;
     a[i+1]:=0;
     end;
  end;
for i:=1 to n do
  for j:=1 to m do
  begin 
  if a[i]<a[i+1] then 
     begin
     q:=[i];
     a[i]:=a[i+1];
     a[i+1]:=1;
     end;
  end;
....
DorianMark вне форума Ответить с цитированием
Старый 07.11.2011, 21:35   #5
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

А там вникать не надо =) Я для того и выделил интересующий момент)
Главное теперь чтоб этот вариант прижился.

Таки прижился Вот, только теперь просто вопрос как их удалить?
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 07.11.2011, 22:12   #6
DorianMark
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Leshii Посмотреть сообщение
А там вникать не надо =) Я для того и выделил интересующий момент)
Главное теперь чтоб этот вариант прижился.

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

Можно зменить все повторяющиеся чила на 0 и отсортировать массив по убыванию. соответственно все нули уйдут влево и их можно будет просто откинуть.
DorianMark вне форума Ответить с цитированием
Старый 08.11.2011, 04:30   #7
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Леший, привет.
У тебя там довольно много, чего следует исправить (не обязательно ошибок)).. Если я исправлю все сразу и сделаю тип-топ - боюсь, ты не уловишь сути. Поэтому давай так: я просто возьму фрагмент и вставлю в него замечания. Ты их посмотришь, подправишь, запостишь еще раз - и так, пока не разберем все до конца. Идет?
Код:
Procedure Ex2AZ (ExCol:Integer;ExMass:Massiv);
Var
   MassAZ: Massiv;
   Buffer: integer;
   I, J, k: Integer;
Begin
// зачем устанавливать значение параметра перед оператором цикла?..
     i:=1;   // не надо менять большие на маленькие и обратно в проге
// не рекомендую начинать служебные слова с заглавной букы - это прерогатива процедур/функций/переменных
// следующую строку всю можно (и нужно) заменить на MassAZ:=ExMass
     For I:=1 To ExCol Do MassAZ[I]:=ExMass[I];
     For I:=1 To ExCol Do
// не рекомендую тратить целую строку на begin - ставь его в конце строки
         For J:=I To ExCol Do Begin
// сдвиг должен быть всегда один и тот же!
            If MassAZ[I]>MassAZ[J] Then Begin  // остальные не буду исправлять
                Buffer:=MassAZ[J];    // дальше сдвиг тоже не исправляю..
                       MassAZ[J]:=MassAZ[I];
                       MassAZ[I]:=Buffer;
                  End;
             End;
     WriteLn ('Vpor9dkovanuu za zrostann9m:');
     For I:=1 To ExCol Do
     Begin
          Write (MassAZ[I]:4,' ');
     End;
     writeln;
// а тут ты забыл инициализировать переменную i
// навскидку, тут надо i:= 1;
     while i<=Excol do
      begin
       j:=j+1;   // тут, полагаю, надо j:= i+1;
        while j<=Excol do
         begin
          if Mass[j]=Mass[i]  then
           begin
            for k:=j to excol-1 do
            Mass[k]:=Mass[k+1];
            Excol:=Excol-1;
            end
            else j:=j+1;
           end;
          i:=i+1;
         end;
        writeln('Masiv bez povtoreniy');
// вот такие циклы - либо на одной строке, либо вторая сдвинута!
        for i:=1 to excol do
        write(Mass[i],' ');
// а зачем ты писал процедуру для вывода массива, если не используешь ее??
     WriteLn;
End;
Леший, продумай для себя вопрос форматирования кода и следуй ему ВСЕГДА, даже во временных затычках и в кусках, которые будут стерты через несколько минут. В любой момент времени прога должна быть отформатирована так, что хоть сейчас сдавать заказчику - даже если она не пашет.
Говори, если есть вопросы или не согласен.
Успехов тебе

Цитата:
Сообщение от DorianMark Посмотреть сообщение
Предполагаю, что мой совет будет являться дорогой чараз анальное отверстие, но все же.

Можно зменить все повторяющиеся чила на 0 и отсортировать массив по убыванию. соответственно все нули уйдут влево и их можно будет просто откинуть.
DorianMark, ты совершенно прав в своем предварительном замечании )).
Вообще, надо избегать ситауции, когда значения массива, кроме своей основной цели, служат еще побочным целям программера (как тут: ноль есть признак повтрений). Как ты будешь выпутываться, если в массиве уже есть нули? И -1 тоже есть, и -2.. ) Но это ладно, тут все гораздо запущеннее.. Ведь, если ты уже нашел повторения - почему бы их сразу и не выкинуть? ))
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 08.11.2011 в 04:48.
TinMan вне форума Ответить с цитированием
Старый 09.11.2011, 22:52   #8
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Привет TinMan, прошу прощение что не сразу ответил.
Я проделаю всё что описано выше,но в пятницу( времени нет )
Благодарен за то что есть желание у тебя помочь.

Ну по сути я студент(ленивый студент) иногда когда не на работе или не на учебе то берусь за проекты.Не скажу что дока в програмировании но активно учусь, и есть огромный потенциал желания(ну и соответственно знания).Скажу более того не стесняйтесь мне давать пинка ибо я могу ленится.
Вопросы будут, просто сегодня, завтра сижу с спичками в глазах и помогаю ребятам со своей группы к.р. сдавать.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 10.11.2011, 09:06   #9
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Ок, Лешак, нет проблем, take your time ). Я и так вижу, что ты понимаешь (в отличие от 99.99% приходящих сюда), что твоя выгода не в том, чтоб сдать, а в том, чтоб разобраться )).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 12.11.2011, 22:23   #10
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Тема: Создание модуля.


Задание:
1)Ввести размерность массива и его элементы с клавиатуры.
2)Вывести элементы массив на экран в строчку.
3)Возвратить значение True, если элементы упорядочены по возрастанию
при S=1, или по убыванию S=0;
4)Изъять из массива элементы которые повторяются.

Собственно готовый код но пока в модуль не пихал.Кому надо прошу юзать Единственное "но" касательно функции, правильна ли задумка?


Код:
Program Mas;
Uses crt;
Type
    Massiv = Array [1..100] Of integer;
Var
   Mass: Massiv;
   Col, i, j, n: Integer;
   x:boolean;

Procedure OutputMass(OutCol:Integer;OutMass:Massiv); // процедура для вывода введенго массива.В основном то что требовалось в условии.
Var
   I:Integer;
Begin
     WriteLn ('Vvedeno poslidovnist 4usel: ');
     for i:=1 To OutCol Do Begin
         Write (OutMass[I]:4,' ');
     End;
     WriteLn;
End;

Procedure Exam1 (ExCol:Integer;ExMass:Massiv); // Процедура для вывода максимального и минимального елемента ( использована для сортировки )
Var
   Max, Min: integer;
Begin
     Max:=ExMass[1];
     Min:=ExMass[1];
     for I:=1 To ExCol Do Begin
         If Min>ExMass[i] Then Min:=ExMass[i];
         If Max<ExMass[i] Then Max:=ExMass[i];
     End;
     WriteLn ('Maxumalnui element: ',Max:4);
     WriteLn ('Minimalnui element: ',Min:4);
End;

Procedure Ex2AZ (ExCol:Integer;ExMass:Massiv); // В даной процедуре используется метод  перестановкой местами большего и меньшего елемента ( себто сортировка ). 
Сортировка по возрастанию от минимального елемента до максимального.
Var
   MassAZ: Massiv;
   Buffer: integer;
   i, j, k: Integer;
Begin
     for i:=1 to ExCol do MassAZ[I]:=ExMass[I]; // делал замену но вместо сортировки получал нули, так  вспомнив что сам делал понял, упрощать не имело смысла( но попробовал :) ) 
     for i:=1 To ExCol do
         for j:=i To ExCol do Begin
             If MassAZ[i]>MassAZ[j] Then Begin
                Buffer:=MassAZ[j];
                MassAZ[j]:=MassAZ[i];
                MassAZ[i]:=Buffer;
             End;
         End;
     WriteLn ('Vpor9dkovanuu za zrostann9m:');
     for I:=1 To ExCol Do Begin
         Write (MassAZ[I]:4,' ');
     End;
     WriteLn;
     i:=1; // цикл удаления повторяющихся элеменов
     while i<=Excol do begin j:=i+1;
      while j<=Excol do begin
       if Mass[j]=Mass[i] then begin
        for k:=j to Excol-1 do
            Mass[k]:=Mass[k+1];
            Excol:=Excol-1; end
        else j:=j+1;
       end; i:=i+1;
      end;
      writeln('Massiv bez povtoreniu');
      for i:=1 to Excol do
      write(Mass[i]:4);
      writeln;
end;

Procedure Ex2ZA (ExCol:Integer;ExMass:Massiv); // Процедура обратная процедуре Ex2AZ (Сортирует в обратном порядке) .
Var
   MassZA: Massiv;
   Buffer: integer;
   I, J, k: Integer;
Begin
     for i:=1 to Excol do MassZA[i]:=ExMass[i];
     for i:=1 To ExCol do
         for j:=I To ExCol do Begin
             If MassZA[i]<MassZA[j] Then Begin
                Buffer:=MassZA[j];
                MassZA[j]:=MassZA[i];
                MassZA[i]:=Buffer;
             end;
         end;
     WriteLn ('Vpor9dkovanuu za spadann9m:');
     for i:=1 To ExCol Do Begin
          Write (MassZA[i]:4,' ');
     End;
     WriteLn;
     i:=1;
     while i<=Excol do begin j:=i+1;
      while j<=Excol do begin
       if Mass[j]=Mass[i] then begin
        for k:=j to Excol-1 do
            Mass[k]:=Mass[k+1];
            Excol:=Excol-1; end
        else j:=j+1;
       end; i:=i+1;
      end;
      writeln('Massiv bez povtoreniu');
      for i:=1 to Excol do
      write(Mass[i]:4);
     writeln;
End;

Function Sort (x:boolean):boolean; // функция которая возвращает при n=1 массив по возрастанию, или же по убыванию при n=0;
var n:integer;
 begin
  if n=1 then Ex2AZ(Col,Mass)
  else if n=0 then Ex2ZA(Col,Mass);
 end;

Begin
     clrscr;
     Write ('Vveditb rozmirnist masuvy (ale ne ,bilshe nig 100) : ');
     ReadLn (Col);
     for I:=1 To Col Do Begin
         Write ('Vvedite Mass[',I,']=');
         ReadLn (Mass[I]);
     End;
     writeln('Ypor9do4it masiv po vozrostaniIO ulu po ybuvaniIO 1/0 ');
     writeln('1 - po vozrastaniIO , 0 - po ybuvaniIO');
     readln(n);
     if Sort(x) then Ex2AZ (Col,Mass)
     else  Ex2ZA (Col,Mass);
     OutputMass (Col,Mass);
     Exam1 (Col,Mass);
     {Ex2AZ (Col,Mass);
     Ex2ZA (Col,Mass);}
     ReadLn;
End.
Вот собственно то что и хотел написать, уверен что возможны ошибки.
Собственно прошу критиковать
К замечаниям прислушался.
Ну и вопрос под конец или даже не вопрос.Ведь только мне кажется или же когда я удалил повторяющиеся элементы то надо и в новом массиве который получился упорядочить его или по возрастанию или же по убыванию!?

Не по сабжу и даному разделу, подскажите где можно скачать "прокси" и мануал, и веб-сервер + мануал.
Люблю на ты.Я человек простой

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление повторяющихся записей в БД Dinamik БД в Delphi 8 22.03.2012 22:05
Удаление повторяющихся нулей artemavd Общие вопросы Delphi 9 06.07.2011 00:13
Сортировка повторяющихся данных в массиве MDS Паскаль, Turbo Pascal, PascalABC.NET 0 25.04.2011 12:26
C++ поиск повторяющихся (строковых) элементов в массиве danslash Помощь студентам 5 29.03.2010 01:35
количество повторяющихся элементов в массиве Андрей.12 Помощь студентам 1 28.01.2010 23:57