Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 22.02.2010, 01:42   #1 (permalink)
Linka
Member
 
Аватар для Linka
 
Регистрация: 24.01.2010
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 26
По умолчанию Уникальный элемент массива

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

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

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

Код:
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;
Что тут неправильно ?
Linka вне форума   Ответить с цитированием

Старый 22.02.2010, 01:42
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Посмотрите, в данных обсуждениях может находиться нужная информация

Не понимаю как, в Паскале найти второй нечетный элемент двумерного массива
Приобрести элемент Пельтье
Логический элемент ИЛИ-НЕ

Старый 22.02.2010, 10:04   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,874
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

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

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

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

Код:
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.
Ну а конкретно разберитесь сами. Путем сопоставления двух кодов.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 22.02.2010, 15:45   #3 (permalink)
Linka
Member
 
Аватар для Linka
 
Регистрация: 24.01.2010
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 26
По умолчанию

Спасибо) А как еще можно решить эту задачу ? Без счетчика ?
Linka вне форума   Ответить с цитированием
Старый 22.02.2010, 16:15   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,874
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Linka Посмотреть сообщение
Спасибо) А как еще можно решить эту задачу ? Без счетчика ?
Например, так:
Код:
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.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 22.02.2010, 16:28   #5 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 22.02.2010, 16:56   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,874
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Можно, конечно, и так. А это через MaxValue, или можно проще? Но в любом случае - муторное дело. Но если Linka хочет, пусть попробует.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 22.02.2010, 17:00   #7 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

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

Кроме этого, сортировка имеет меньшую вычислительную сложность, чем двойной перебор, и да по этому поводу есть годный том Кнута.
Long Cat вне форума   Ответить с цитированием
Старый 22.02.2010, 17:17   #8 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,874
Сказал(а) спасибо: 318
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от Long Cat Посмотреть сообщение
и да по этому поводу есть годный том Кнута.
Ага, нашим студентам - только том Кнута! Им бы просто кнута (можно розгу). К Linka, впрочем, не относится. И вообще, справедливости ради, не ко всем, конечно.
Но ко многим.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 22.02.2010, 17:20   #9 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Его трехтомник сейчас активно рекомендуют школьникам, конкретнее - тем кто занимается олимпиадами по информатике.
Без знания хотя бы содержания этих книг квалифицированного программиста быть не может.
Long Cat вне форума   Ответить с цитированием
Старый 23.02.2010, 04:10   #10 (permalink)
Linka
Member
 
Аватар для Linka
 
Регистрация: 24.01.2010
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 26
По умолчанию

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

Код:
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 ?
Linka вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.