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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 17:00   #1
Анастасия12
Пользователь
 
Регистрация: 03.10.2011
Сообщений: 93
По умолчанию Задача на массив...

Помогите написать программу.
Дано N чисел. Вывести числа встречающие более одного раза.

Последний раз редактировалось Анастасия12; 19.01.2012 в 17:09.
Анастасия12 вне форума Ответить с цитированием
Старый 19.01.2012, 17:15   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

два вложенных цикла.
первый от 1 до N-1
второй до I+1 до N
во вложенном цикле перебирать и сравнивать, если совпало A[i] = A[j] выводить A[i] и прерывать вложенный цикл.

такой простой подход позволит легко вывести все числа, встречающиеся в массиве более одного раза. НО! Числа будут выведены столько раз, сколько они встречаются.
Если хочется выводить число по одному разу, то в тот кусок кода, где нашли совпадение, нужно вставить ещё один цикл переборать числа от 1 до I-1. искать совпадение с A[i]. если ничего не нашлось - только в этом случае печатать найденное число.
(другими словами - число-дубликат должно быть найдено ПОСЛЕ текущего числа и не должно быть найдено ДО него же.. )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.01.2012, 17:18   #3
Анастасия12
Пользователь
 
Регистрация: 03.10.2011
Сообщений: 93
По умолчанию

Спасибо огромное, очень полезная для меня информация.
Извини пожалуйста что утруждаю тебя, но можешь написать эту задачу в Паскале. Если не сложно??
Анастасия12 вне форума Ответить с цитированием
Старый 19.01.2012, 17:31   #4
zmey31313
Форумчанин
 
Регистрация: 19.11.2009
Сообщений: 155
Сообщение

Код:
program zad;
var
  a : array[1..1000] of integer;
  k : array[0..9] of integer;
  n, i : integer;
begin
  writeln('Введите количество цифр: ');
  readln(n);

  for i := 1 to n do a[i] := random(10);
  
  for i := 1 to n do
    case a[i] of
      0 : k[0] := k[0] + 1;
      1 : k[1] := k[1] + 1;
      2 : k[2] := k[2] + 1;
      3 : k[3] := k[3] + 1;
      4 : k[4] := k[4] + 1;
      5 : k[5] := k[5] + 1;
      6 : k[6] := k[6] + 1;
      7 : k[7] := k[7] + 1;
      8 : k[8] := k[8] + 1;
      9 : k[9] := k[9] + 1;
    end;
    
  for i := 0 to 9 do
    If k[i] > 1 then writeln(k[i]);
end.
По всем вопросам связанным с Делфи или Паскаль обращайтесь, чем смогу тем и помогу.
Помог жми на весы!!!
dmi83206389@mail.ru
zmey31313 вне форума Ответить с цитированием
Старый 19.01.2012, 17:34   #5
Анастасия12
Пользователь
 
Регистрация: 03.10.2011
Сообщений: 93
По умолчанию

Огромное спаисбо)
Анастасия12 вне форума Ответить с цитированием
Старый 19.01.2012, 17:53   #6
tema12t
Новичок
Джуниор
 
Регистрация: 15.01.2012
Сообщений: 2
По умолчанию

Правильнее вот так:
Код:
 
program pr;
var
  a:array[1..100]of integer;
  n,i,j:byte;
begin
  writeln('Введите количество цифр: ');
  readln(n);
  for i:=1 to n do
   a[i]:=random(10);
  writeln('Введённые цифры: ');
  for i:=1 to n do
   write(' ',a[i]);
  writeln;
  writeln('числа встречающие более одного раза: ');
  for i:=1 to n-1 do
   for j:=i+1 to n do
    if a[i]=a[j] then
    begin
     write(a[i],' ');
    break;
    end;
end.

Последний раз редактировалось tema12t; 19.01.2012 в 18:07.
tema12t вне форума Ответить с цитированием
Старый 19.01.2012, 18:45   #7
bonjovi
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 46
По умолчанию

Эта программа выведет ВСЕ повторяющиеся числа!(например, если число 2 встречается 5 раз, то программа и выведет его 5 раз). А как сделать, чтобы она выводила только 1 раз повторяющееся число?
bonjovi вне форума Ответить с цитированием
Старый 19.01.2012, 19:18   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык вроде бы написано как.
Еще есть такой вариант решения задачи если известен диапазон значений чисел в массиве, т.е. например в массиве генератором псевдослучайных чисел генерируются числа от 0 до 50: создаем другoй массив [0..50], заполняем его например нулями (по-моему в паскале и так заполняется либо есть функция fillchar, ну или самое простое просто циклом по всему массиву), проходим первый массив в цикле и элемент второго массива под номером = значению в первом массиве увеличиваем на единицу (т.е. b[a[i]] := b[a[i]] + 1). Потом проходим его и если значение элемента больше единицы, выводим его номер.

т.е. примерно так, код похожей задачи:
Код:
type
  TArr = array [1..10000] of integer;

var
  i, len, n, c: integer;
  a, numarr: TArr;

procedure ArrFill(var a: TArr; len, n: integer);
var
  i: integer;
begin
  for i := 1 to len do 
     a[i] := random(n) + 1;
end;

procedure ArrPrint(var a: TArr; len: integer);
var
  i: integer;
begin
  for i := 1 to len do 
    write(a[i], '  '); 
end;


begin
  randomize; 
  write('Введите размер массива (не больше 10000): '); readln(len);
  write('Введите диапазон чисел в массиве (не больше 10000): 1—'); readln(n);
  ArrFill(a, len, n);
  ArrPrint(a, len);
  writeln;

  for i:=1 to len do
     numarr[a[i]]:=1;
  
  c:=0;
  for i:=1 to n do
     if (numarr[i] = 1) then 
        inc(c);
  
  writeln('Количество различных элементов: ', c);
end.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.01.2012, 19:33   #9
tema12t
Новичок
Джуниор
 
Регистрация: 15.01.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Дык вроде бы написано как.
Еще есть такой вариант решения задачи если известен диапазон значений чисел в массиве, т.е. например в массиве генератором псевдослучайных чисел генерируются числа от 0 до 50: создаем другoй массив [0..50], заполняем его например нулями (по-моему в паскале и так заполняется либо есть функция fillchar, ну или самое простое просто циклом по всему массиву), проходим первый массив в цикле и элемент второго массива под номером = значению в первом массиве увеличиваем на единицу (т.е. b[a[i]] := b[a[i]] + 1). Потом проходим его и если значение элемента больше единицы, выводим его номер.

т.е. примерно так, код похожей задачи:
Код:
type
  TArr = array [1..10000] of integer;

var
  i, len, n, c: integer;
  a, numarr: TArr;

procedure ArrFill(var a: TArr; len, n: integer);
var
  i: integer;
begin
  for i := 1 to len do 
     a[i] := random(n) + 1;
end;

procedure ArrPrint(var a: TArr; len: integer);
var
  i: integer;
begin
  for i := 1 to len do 
    write(a[i], '  '); 
end;


begin
  randomize; 
  write('Введите размер массива (не больше 10000): '); readln(len);
  write('Введите диапазон чисел в массиве (не больше 10000): 1—'); readln(n);
  ArrFill(a, len, n);
  ArrPrint(a, len);
  writeln;

  for i:=1 to len do
     numarr[a[i]]:=1;
  
  c:=0;
  for i:=1 to n do
     if (numarr[i] = 1) then 
        inc(c);
  
  writeln('Количество различных элементов: ', c);
end.
Можно проще но немного громоздко:
Код:
program pr;
const c=10;
var
  a:array[1..100]of integer;
  n,i,j:byte;e:integer;
begin
  writeln('Введите количество цифр: ');
  readln(n);
  for i:=1 to n do
  a[i]:=random(c);
  writeln('Введённые цифры: ');
  for i:=1 to n do
   write(' ',a[i]);
  writeln;
  for i:=1 to n-1 do
   for j:=i+1 to n do
    if a[i]>a[j] then
    begin
    e:=a[i];
    a[i]:=a[j];
    a[j]:=e
    end;
  writeln('числа встречающие более одного раза: ');
  e:=c+1;
  for i:=1 to n-1 do
   for j:=i+1 to n do
    if (a[i]=a[j])and(e<>a[j]) then
    begin
     e:=a[i];
     write(a[i],' ');
    break;
    end;
end.
tema12t вне форума Ответить с цитированием
Старый 20.01.2012, 09:55   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мда... а моим алгоритмом никто не захотел воспользоваться..
ладно. тогда ловите мой вариант решения этой простенькой задачки:

Код:
program pr;
const 
   MaxSize = 100;  { масимальный размер массива }
   RandomMax = 10; { числа будут в диапазоне от 1 до 10 }
var
  a:array[1..MaxSize] of integer;
  n,i,j, k :integer;
  wasBefore : boolean;
begin
  Randomize;
  {ввод массива }
  repeat
    writeln('Введите количество чисел в массиве (от 1 до ',MaxSize,'): ');
    readln(n);
  until (n>=1) and (n<=100);

  {заполним массив случайными числами и одновременно выведем их на экран}
  writeln('Введённые цифры: ');
  for i:=1 to n do begin
    a[i]:=random(RandomMax) + 1; { сл.число в диапазоне от 1 до RandomMax }
    write(' ',a[i]);
  end;
  writeln;

  {собственно вывод повторяющихся чисел}
  Write('Повторяющиеся числа: ');
  for i:=1 to n-1 do
    for j:=i+1 to n do
      {если есть повтор, то } 
      if a[i]=a[j] then begin
        {проверим, не было ли данного числа раньше }
        wasBefore := false;
        for k:=1 to i-1 do 
          if a[i]=a[k] then begin
            wasBefore := true; {было такое число раньше}
            Break; {раз было - прерываем цикл - нечего тут большое ловить}
          end; 
       {если ещё не было такого числа, то выведем его}
       if Not wasBefore then Write(a[i],' ');
       Break; {раз нашли повторяющее число, то его дальше не проверяем}
      end;
  WriteLn;

  Readln;

end.


___________
tema12t не теряйте Randomize; - это важно, чтобы последовательность случайных чисел была разной!


Цитата:
Сообщение от zmey31313
Код:
    case a[i] of
      0 : k[0] := k[0] + 1;
      1 : k[1] := k[1] + 1;
Жуть! zmey31313, никогда! Слышите - НИКОГДА не пишите такой код! Вы же не индус!!! это ужас с кейсом заменяется одной строчкой кода (два оператора):
if (a[i]>=0) and (a[i]<=9) then Inc( k[a[i]] );
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на массив serg93 Помощь студентам 2 19.10.2011 16:50
Задача на массив Casper098 Помощь студентам 1 18.10.2011 14:44
задача на массив кира1005 Паскаль, Turbo Pascal, PascalABC.NET 1 25.06.2011 19:33
Задача на МАССИВ Новичок1 Помощь студентам 3 11.12.2010 13:41
Задача на массив foxzibit123 Паскаль, Turbo Pascal, PascalABC.NET 4 25.07.2010 21:16