• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Уникальный элемент массива

  • Автор темы Автор темы Linka
  • Дата начала Дата начала

Linka

Новые
Регистрация
24 Янв 2010
Сообщения
43
Реакции
1
Баллы
0
Уникальный элемент массива

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

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

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

Код:
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;

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.
Ну а конкретно разберитесь сами. Путем сопоставления двух кодов.
 
Спасибо) А как еще можно решить эту задачу ? Без счетчика ?
 
Спасибо) А как еще можно решить эту задачу ? Без счетчика ?
Например, так:
Код:
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.
 
Технически, счетчик остался - суть программы не изменилась.
Вариант такой: отсортировать массив. Тогда, если соседние элементы равны, имеются повторы.
 
Можно, конечно, и так. А это через MaxValue, или можно проще? Но в любом случае - муторное дело. Но если Linka хочет, пусть попробует.
 
В современных реализациях языков имеются готовые массивы сортировщики-сортировка реализуется одной строчкой.

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

Код:
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 ?
 
Как сделать, чтобы оно выводилось лишь единожды?
Например, так:
Код:
const n=10;
var
 a,c:array[1..n] of integer;
 k,i,j,m,Nc:integer;
 b:boolean;

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

 Nc:=0;

 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>=2 then
    begin
     b:=true;
     for m:=1 to Nc do
      if a[i]=c[m] then b:=false;
     if b then
      begin
       Nc:=Nc+1;
       c[Nc]:=a[i];
      end;
    end;
  end;

 for m:=1 to Nc do WriteLn(c[m]);

 Readln;
end.
З.Ы. А есть в паскале оператор "преждевременного" выхода из цикла ? Или надо использовать GOTO label ?
Нет. Но грамотное использование циклов типа REPEAT..UNTIL и WHILE..DO позволяет организовать прерывание цикла без всяких меток. И вообще - если Вы хотите научиться программированию, постарайтесь забыть о метках. Они - "дурной тон".

И еще. Ну почему Вы упорно перемещаете оператор k:=0 в конец цикла? Он должен быть в начале, чтобы срабатывал для всех, включая первое, значений переменной цикла.
 
Спасибо.

Владимир, такой вопрос не по теме немного, каким образом вы составляете алгоритм ? На бумаге, или сам в голове появляется, или есть какой-то определенный алгоритм составления алгоритма ? ) Не про эту задачу спрашиваю, а про вообще.

"Нельза научиться программировать. Это либо дано либо нет." - полная чушь ? =)
 
Спасибо.

Владимир, такой вопрос не по теме немного, каким образом вы составляете алгоритм ? На бумаге, или сам в голове появляется, или есть какой-то определенный алгоритм составления алгоритма ? ) Не про эту задачу спрашиваю, а про вообще.
По-разному. Скорее всё-таки "в голове". Ну и опыт большой, плюс, как правило, студенческие задачки сложностей не представляют.
"Нельза научиться программировать. Это либо дано либо нет." - полная чушь ? =)
Нет, не полная. Хотя, конечно, изрядное преувеличение. Мне кажется, тут, да как практически и в любом ремесле, первично желание. Есть желание - и навык появится, и мастерство. А если желание сводится к тому, чтобы спихнуть зачет и забыть, то тут ничего не выйдет.
 
Интерес должен появиться к программированию. А будет интерес - будут задачи, разные пути решений, опыт, а там уже и алгоритмы будут в голове моментально строиться
З.Ы. Кстати, в паскале есть оператор, завершающий выполнение текущего цикла - Break
 
Назад
Сверху