Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Уникальный элемент массива (http://www.tehnari.ru/f41/t33387/)

Linka 22.02.2010 01:42

Уникальный элемент массива
 
Целочисленный массив, вывести все числа которые встречаются по одному разу.

Я не прошу готового решения. Сам решить хочу, не получается. Как это реализовать ?
Получаестя, каждый элемент массива надо сравнить с другими элементами этого массива ? Если он уникален то его вывести.

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

Код:

const n=10;
var a:array[1..n] of integer;

p,k,i,j:integer;

begin
p:=n;
 for i:=1 to p do  begin
    for j:=2 to p do
      begin
    if a[i]<>a[j] then k:=k+1;
    if k=n-1 then writeln(a[j-1]);
      end;
      k:=0;
      end;

Что тут неправильно ?

Vladimir_S 22.02.2010 10:04

Цитата:

Сообщение от Linka (Сообщение 298366)
Целочисленный массив, вывести все числа которые встречаются по одному разу.

Я не прошу готового решения. Сам решить хочу, не получается. Как это реализовать ?
Получаестя, каждый элемент массива надо сравнить с другими элементами этого массива ? Если он уникален то его вывести.

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

Код:

const n=10;
var a:array[1..n] of integer;

p,k,i,j:integer;

begin
p:=n;
 for i:=1 to p do  begin
    for j:=2 to p do
      begin
    if a[i]<>a[j] then k:=k+1;
    if k=n-1 then writeln(a[j-1]);
      end;
      k:=0;
      end;

Что тут неправильно ?

Знаете... по-моему, там всё неправильно. Чего-то накрутили лишнего... Правильно Ваш алгоритм реализуется так:
Код:

const n=10;
var
 a:array[1..n] of integer;
 k,i,j:integer;

begin
 
 for i:=1 to n do
  begin
  Write('a[',i:2,']= ');
  Readln(a[i]);
  end;
 
 for i:=1 to n do
  begin
  k:=0;
  for j:=1 to n do
    if a[i]<>a[j] then k:=k+1;
  if k=n-1 then writeln(a[i]);
  end;
 readln;

end.

Ну а конкретно разберитесь сами. Путем сопоставления двух кодов.

Linka 22.02.2010 15:45

Спасибо) А как еще можно решить эту задачу ? Без счетчика ?

Vladimir_S 22.02.2010 16:15

Цитата:

Сообщение от Linka (Сообщение 298577)
Спасибо) А как еще можно решить эту задачу ? Без счетчика ?

Например, так:
Код:

const n=10;
var
 a:array[1..n] of integer;
 i,j:integer;
 b:boolean;
begin
 for i:=1 to n do
  begin
  Write('a[',i:2,']= ');
  Readln(a[i]);
  end;
 for i:=1 to n do
  begin
  b:=true;
  for j:=1 to i-1 do
    if a[i]=a[j] then b:=false;
  for j:=i+1 to n do
    if a[i]=a[j] then b:=false;
  if b then writeln(a[i]);
  end;
 Readln;
end.


Long Cat 22.02.2010 16:28

Технически, счетчик остался - суть программы не изменилась.
Вариант такой: отсортировать массив. Тогда, если соседние элементы равны, имеются повторы.

Vladimir_S 22.02.2010 16:56

Можно, конечно, и так. А это через MaxValue, или можно проще? Но в любом случае - муторное дело. Но если Linka хочет, пусть попробует.

Long Cat 22.02.2010 17:00

В современных реализациях языков имеются готовые массивы сортировщики-сортировка реализуется одной строчкой.

Кроме этого, сортировка имеет меньшую вычислительную сложность, чем двойной перебор, и да по этому поводу есть годный том Кнута.

Vladimir_S 22.02.2010 17:17

Цитата:

Сообщение от Long Cat (Сообщение 298618)
и да по этому поводу есть годный том Кнута.

Ага, нашим студентам - только том Кнута! Им бы просто кнута (можно розгу). К Linka, впрочем, не относится. И вообще, справедливости ради, не ко всем, конечно.
Но ко многим.

Long Cat 22.02.2010 17:20

Его трехтомник сейчас активно рекомендуют школьникам, конкретнее - тем кто занимается олимпиадами по информатике.
Без знания хотя бы содержания этих книг квалифицированного программиста быть не может.

Linka 23.02.2010 04:10

Тот же массив, но надо вывести все числа, которые встречаются несколько раз.

Код:

const n=10;
var
 a:array[1..n] of integer;
 k,i,j:integer;

begin

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

  for i:=1 to n do
 begin
        for j:=1 to n do
    if a[i]=a[j] then k:=k+1;
      if k>=2 then writeln(a[i]);
                  k:=0;

  end;
 readln;

end.

Работает, но если число к примеру встречается 3 раза, то 3 раза оно и выведется. Как сделать, чтобы оно выводилось лишь единожды ?

З.Ы. А есть в паскале оператор "преждевременного" выхода из цикла ? Или надо использовать GOTO label ?


Часовой пояс GMT +4, время: 01:17.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.