Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Tatjanka
Помогите пожалуйста решить задачи.
Вот одна из них:

Дан числовой массив А(35). Найдите, в массиве есть пара одинаковых чисел. Сколько одинаковых чисел, если они есть?
volvo
Tatjanka
А в массиве только одно число встречается не один раз? Что будет, если таких чисел несколько? Например:
1, 1, 1, 4, 4, 5, 5, 5, 3, 4, 9, 8, 7, 6, 5, 4, 3, 2, 1 ...
Tatjanka
Ой, я задание неправильгно с эстонского перевела.
В задаче спрашивается есть ли в массиве пара одинаковых знаков и сколько таких пар?
Tatjanka
volvo
помоги пожалуйста с решением. если конечно тебе не трудно. А за прошлие задачки огромное спасибо. У меня их приняли.
volvo
Что-то ты меня совсем запутала.
Цитата
есть ли в массиве пара одинаковых знаков

Приведи пример массива (не нужно 35, пусть будет 5 элементов, где такая пара есть, и где ее нет...) rolleyes.gif
Tatjanka
volvo
Например
1 2 4 5 1
здесь одна пара - 1,1


2 2 2 2 3
две пары 2,2 и 2,2

но нужно писать только количество пар
mithquessir
Ну, наверное так:

Код

var
 num,i,j:integer;
 a:array[1..35] of integer;
begin
 randomize;
 for i := 1 to 35 do
 a[i] := random(100);
 for i := 1 to 35 do
 for j := i + 1 to 35 do
 if a[i] = a[j] then
 Inc(num);
 for i := 1 to 35 do
 begin
   Write(a[i]:3);
 end;
WriteLn;
 WriteLn(num);
end.
volvo
mithquessir
Давайте не пользоваться красным цветом?

Плюс к этому, проверяйте программу перед тем, как запостить сюда. Программа с тестовым примером:
Код

const n = 12;
const
 a: array[1 .. n] of integer = (1, 2, 2, 3, 3, 6, 5, 8, 2, 3, 2, 3);
var
 num,i,j:integer;
 begin
   for i := 1 to n do
     for j := i + 1 to n do
       if a[i] = a[j] then Inc(num);
     for i := 1 to n do
       begin Write(a[i]:3); end;
     WriteLn;
     WriteLn(num);
   end.

выдает в результате 12, хотя здесь всего 4 пары...
Будьте внимательнее...
Tatjanka
volvo
Значит етот код неправильно написан?
volvo
Tatjanka
Вот, что мне пришло в голову:
Код

const
 n = 12;

const
 a: array[1 .. n] of integer = (1, 2, 2, 3, 3, 6, 5, 8, 2, 3, 2, 3);
var
 i, j, T: integer;
 pairTo, count: integer;
begin
 for i := 1 to n do
   for j := n downto i+1 do
     if a[j-1] > a[j] then
       begin
         t := a[j-1]; a[j-1] := a[j]; a[j] := t;
       end;

 i := 1;
 while i <= n-1 do
   begin
     pairto := a[i];
     if a[i+1] = pairto then
       begin
         inc(count); inc(i, 2)
       end
     else inc(i)
   end;
 writeln(count);
end.
Tatjanka
volvo
Я пишу этот код, а у меня выдает 1, а это неправильный ответ
rolleyes.gif

Вот я наверное подкинула тебе задачку, но я не специально, честно.
:flowers:
volvo
Tatjanka
Не может быть. Я только что еще раз прогнал тест. В ответе 4, как и есть на самом деле. Проверь еще раз, что все точно записала.
Tatjanka
volvo
Спасибо огромноебвсе замечательно работает.
А можно еще одно задание послать. Или я уже наглею?
volvo
Tatjanka
Только в новую тему, если оно не связано с массивами ;)
mithquessir
Извиняюсь за неправильный код.unsure.gif
А можно как-нибудь без сортировки?
volvo
mithquessir
Может и можно... Надо будет подумать...
ShadowWatcher
Некрасивое решение, но должнл пахать:
Код

Type
 TNum=Record
   Number:Integer;
   Count:Integer
 End;

Var
 Data:Array[1..35] Of TNum;
 i,j,n:Integer;
Begin
 Randomize();
 For i:=1 To 35 Do
 Begin
   Data[i].Number := Random(10);
   Data[i].Count := 1;
 End;
 For i:=1 To 34 Do
 Begin
   If Data[i].Count = 0 Then
     Continue;
   For j:=i+1 To 35 Do
     If (Data[i].Number=Data[j].Number) Then
     Begin
       Inc(Data[i].Count);
       Data[j].Count := 0
     End
 End;
 n:=0;
 For i:=1 To 35 Do
   If Data[i].Count > 0 Then
     Inc(n);
 WriteLn('Totally ',n,' non-single numbers')
End.
volvo
ShadowWatcher
Неправильный результат (проверял при значениях 1 .. 12, т.е. повторов нет совершенно) - выдает "12".
ShadowWatcher
Согласен.
Код

Type
TNum=Record
  Number:Integer;
  Count:Integer
End;

Var
Data:Array[1..35] Of TNum;
i,j,n:Integer;
Begin
Randomize();
For i:=1 To 35 Do
Begin
  Data[i].Number := Random(10);
  Data[i].Count := 1;
End;
For i:=1 To 34 Do
Begin
  If Data[i].Count = 0 Then
    Continue;
  For j:=i+1 To 35 Do
    If (Data[i].Number=Data[j].Number) Then
    Begin
      Inc(Data[i].Count);
      Data[j].Count := 0
    End
End;
n:=0;
For i:=1 To 35 Do
  If Data[i].Count > 1 Then
    Inc(n);
WriteLn('Totally ',n,' non-single numbers')
End.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.