Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Выбор в массиве определенных членов.


Автор: InviZible 7.10.2006, 12:34
Даны натуральные n, целые числа a1......an. Внутри данной последовательности могут быть повторяюшиеся члены. Получить числа. взятые по одному из каждой группы равных членов.

я делал так :

Код


Program laba3;
Uses Crt;
Var
 a:array[1..10000] of integer;
 k,i,n:integer;
Begin
 ClrScr;

 WriteLn('***************************');
 WriteLn('Vvedi n. 0 < n <=10000 ');
 ReadLn(n);
 WriteLn('***************************');

 for i:=1 to n do
  begin
   WriteLn('Enter a[',i,']');
   ReadLn(a[i]);
  end;

 WriteLn('***************************');

 Write('Massiv zapolnen. Sosoit iz : ');

 for i:=1 to n do
  Write(a[i],' ');

  WriteLn;

 for i:=1 to n do
  begin
   for k:=1 to n do
    if a[i]=a[i+k] then
     begin
      WriteLn('============================');
      WriteLn('Vot chislo iz pari : ',a[i]);
      WriteLn('============================');
     end;
  end;

  WriteLn('That''s all.');
  ReadLn;
End.



Но мою лабуду заброкавали. Прога работает, но если вводить: n=4, а потом 3 3 3 3, то фигня получается. Так же проблема с нулями.
Сказали, что нужно переделать.

Заранее спасибо.

Автор: comtat 7.10.2006, 12:44
Цитата(InviZible @  7.10.2006,  12:34 Найти цитируемый пост)
 n=4, а потом 3 3 3 3, то фигня получается

фигня в смысле, что выводит по несколько раз тройки (3) ??

Автор: volvo877 7.10.2006, 12:49
Цитата(InviZible @  7.10.2006,  11:34 Найти цитируемый пост)
Внутри данной последовательности могут быть повторяюшиеся члены. Получить числа. взятые по одному из каждой группы равных членов.
Это делается так:
Код

Program laba3;
Uses Crt;
Var
 a:array[1..10000] of integer;
 k,i,n:integer;
Begin
 ClrScr;
 WriteLn('***************************');
 WriteLn('Vvedi n. 0 < n <=10000 ');
 ReadLn(n);
 WriteLn('***************************');
 for i:=1 to n do
  begin
   WriteLn('Enter a[',i,']');
   ReadLn(a[i]);
  end;
 WriteLn('***************************');
 Write('Massiv zapolnen. Sosoit iz : ');
 for i:=1 to n do
  Write(a[i],' ');
  WriteLn;

  i := 1;
  while i <= n do begin

    writeln('Число из группы: ', a[i]);
    while (a[i] = a[i+1]) and (i <= n - 1) do inc(i);
    inc(i);

  end;

  WriteLn('That''s all.');
  ReadLn;
End.

Автор: InviZible 7.10.2006, 12:56
Ух ты, спасибо. Как быстро. Ты меня всегда спасаешь.
Но введи 4 а потом 3 3 2 1 и смотри, что он выдаст:

3
2
1

а нужно только 3
или 4 , а потом 1 2 3 4, будет 
1
2
3
4

а нужно ничего

Добавлено @ 12:58 
comtat, да

Автор: Kuvaldis 7.10.2006, 13:03
InviZible, 
тогда сначала сделать сортировку исходного массива.
Ты ж даже, похоже, и не пытался понять логику алгоритма, который тебе предложил VOLVO:  он основан на идее, что все повторяющиеся элементы идут подряд

Автор: comtat 7.10.2006, 13:10
либо заводить еще массив (B) размерностью n
в которой писать число из группы если его там до этого небыло  smile 

Автор: volvo877 7.10.2006, 13:11
InviZible, задание внимательно читаем?

Цитата(InviZible @  7.10.2006,  11:34 Найти цитируемый пост)
Получить числа. взятые по одному из каждой группы равных членов.

И что? В массиве <1 2 3 4> есть 4 группы по одному члену... Вот ты их и печатаешь...


Kuvaldis, сортировать нельзя, группы перемешаются...

Автор: InviZible 7.10.2006, 13:22
нет, этоо вы не поняли.
Например, есть числа 10 20 30 10 55 44 11 20

вывести надо только 10 20 это точно!

Автор: Kuvaldis 7.10.2006, 13:24
volvo877, 
Цитата

Kuvaldis, сортировать нельзя, группы перемешаются...

Прочитал внимательнее, согласен с тобой.
InviZible,
если хочешь, чтобы выводились элементы из групп, в которых более одного элемента, то
 модифицированный вариант решения задачи Volvo. 
Код

Var
 a:array[1..1000] of integer;
 k,i,n, j :integer;
Begin
 WriteLn('***************************');
 WriteLn('Vvedi n. 0 < n <= 1000 ');
 ReadLn(n);
 WriteLn('***************************');
 for i := 1 to n do
  begin
   WriteLn('Enter a[',i,']');
   ReadLn(a[i]);
  end;
 WriteLn('***************************');
 Write('Massiv zapolnen. Sosoit iz : ');
 for i:=1 to n do
  Write(a[i],' ');
  WriteLn;
  i := 1;
  while i <= n do
  begin
    j := i;
    while (a[i] = a[i+1]) and (i <= n - 1) do
        inc(i);
    if (i - j > 0) then
       writeln('Number from group: ', a[j]);
    inc(i);
  end;
  WriteLn('That''s all.');    
  ReadLn;    
End.

Автор: InviZible 7.10.2006, 13:30
Уже ближе, но не так.
Введи n=6 и числа 6 7 8 8 7 8

будет только 8, а где же 7?

Автор: volvo877 7.10.2006, 13:39
Цитата
а где же 7? 
Да прочти ты задание, наконец!!! Семерки - в РАЗНЫХ группах !!!

Автор: Kuvaldis 7.10.2006, 13:39
Тогда сортировка и первоначальный вариант Volvo

Автор: InviZible 7.10.2006, 19:45
Нужно именно так, как я говорю.
Т.е. если есть числа 7 8 21 23 8 7 2 1 7 8

то вывести 7 и 8

Уж вот такая у меня проблема.

Автор: Kuvaldis 7.10.2006, 20:03
InviZible, 
Тогда сортировка и мой вариант решения задачи
Цитата

Т.е. если есть числа 7 8 21 23 8 7 2 1 7 8

то вывести 7 и 8


после сортировки
1 2 7 7 7 8 8 8 23 21
теперь запускаешь мой вариант
который и выдаст 7 8

Автор: InviZible 9.11.2006, 19:14
Всем спасибо, вот мой вариант

Код

Program laba3; 
Uses Crt;
Var
 a:array[1..10000] of integer;
 d,p,j,i,n:integer;
Begin
 ClrScr;
 WriteLn('Vesion 0.3 . yes or die');
 WriteLn('***************************');
 WriteLn('Vvedi n. 0 < n <=10000 ');
 ReadLn(n);
 WriteLn('***************************');

 for i:=1 to n do
  begin
   WriteLn('Enter a[',i,']');
   ReadLn(a[i]);
  end;

 WriteLn('***************************');

 Write('Massiv zapolnen. Sosoit iz : ');

 for i:=1 to n do
  Write(a[i],' ');

  WriteLn;

 for i:=1 to n-1 do
  begin
   d:=0;
   p:=0;

   for j:=1 to i-1 do
    if a[j]=a[i] then inc(d);

   for j:=i+1 to n do
    if a[j]=a[i] then inc(p);

   if (p>0) and (d=0) then
    writeln('Chislo iz pari : ',a[i],' ');
  end;

 WriteLn('That''s all!');
 readln;
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)