IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Одномерный массив
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Для данного одномерного массива укажите индексы тех его элементов, сумма которых равна заданному числу(если такие есть). Найдите все наборы элементов, удовлетворяющих условию задачи.
Помогите плиз! Чё то и с формулировкой не всё ясно мне. Буду благодарен любой помощи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Массив: <1, 2, 3, 6, 7, 8>
Заданное число = 16

Какие элементы массива дают в сумме 16?
Перечисли ВСЕ комбинации, только печатай НЕ сами элементы, а их индексы, т.е.
вместо <1, 7, 8> будет <1, 5, 6>
вместо <3, 6, 7> будет <3, 4, 5>

Чуть раньше была тема про разложение на слагаемые, она тебе может помочь, загляни в нее...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Спасибо, постараюсь найти тему. Если ничего не получиться напишу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Нашёл тему о разложение числа на слагаемые.
Вот один из способов заполнения массива
Uses Crt;
var
m,k: integer;
x: array[1..100] of integer;
begin
clrscr;
writeln('vvedite razmer massiva');
readln(M);
k:=1;
while (k<=m) do
begin
write('x(',k,')=');
readln(x[k]);
k:=k+1
end;
for k:=1 to m do write (x[k]:2);
readln
end.

А вот ваша процедура
Uses Crt;
var
n: integer;
c: array[1..100] of integer;
print: boolean;

const
diapazon: set of byte = [1,2,3,5];


procedure find(num,k,len: integer);
var i: integer;
begin
if num=0 then begin
print := true;
for i := 1 to pred(len) do
if not (c[i] in diapazon) then print := false;

if print then begin
for i:=1 to len-1 do write(c[i],' '); writeln
end;
end
else begin
for i:=1 to k do
if num-i>=0 then begin
c[len]:=i;
find(num-i,i,len+1);
end;
end;
end;

begin
clrscr;
writeln('vvedite chiso');
readln(n);
find(n,n,1);
readln
end.

Допустим, после заполнения массива вводим нужное число n.
А как теперь подключить процедуру которая переберёт все варианты слагаемых составляющее это число и выведет их номера? Так как число n должно состоять из слагаемых входящих в массив, то они должны параллельно вводиться в diapason?
{ diapason: set of byte [1,5,7]??? }
Т.е массив из {1,5,7}
Вводим число 8.
{1,1,1,1,1,1,1,1}
{5,1,1,1}
{7,1}
И выводит их индексы
{1}
{2,1}
{3,1}
??????????
Помоги, пожалуйста, с реализацией! Что-то вообще запутано! Если есть время конечно.
Буду очень благодарен! Спасибо за предоставленную помощ!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Ну, например, вот такой вариант прекрасно отрабатывает на том примере, который я привел во втором посте:
var
n: integer;
print: boolean;

const
size = 6;
cSize = 100;
type
T = array[1 .. size] of integer;
cType = array[1 .. cSize] of smallint;

var
arr: T;
c: cType;

const
diapazon: set of byte = [];

function contains(myArray: T; const cArr: cType;
const len: integer; var indexes: T): boolean;
var
i, j: integer;
found: boolean;
index: integer;
begin

index := 0;

contains := false;
for i := 1 to len do begin

found := false;
for j := 1 to high(T) do
if myArray[j] = c[i] then begin
found := true;
myArray[j] := -1;
inc(index); indexes[index] := j;
break
end;

if not found then exit;
end;
contains := true;

end;

procedure find(num,k,len: smallint);
var
i: smallint;
indexes: T;
begin
if num=0 then begin
print := true;
for i := 1 to pred(len) do
if not (c[i] in diapazon) then print := false;

if print and (len <= size + 1) then begin

if contains(arr, c, len - 1, indexes) then begin
{ for i:=1 to len-1 do write(c[i],' '); writeln }
for i:=1 to len-1 do write(indexes[i]:3); writeln
end;

end;
end
else begin
for i:=1 to k do
if num-i>=0 then begin
c[len]:=i;
find(num-i,i,len+1);
end;
end;
end;

var i: integer;
begin
write('n = '); readln(n); { n := 6; }
for i := 1 to size do begin
write('arr[', i:2, '] = '); readln(arr[i]);
include(diapazon, arr[i]);
end;

find(n,n,1);
readln
end.
Вот так это выглядит:
Цитата(Console)
n = 16
arr[ 1] = 1
arr[ 2] = 2
arr[ 3] = 3
arr[ 4] = 6
arr[ 5] = 7
arr[ 6] = 8
5 4 2 1
5 4 3
6 4 2
6 5 1
(индексы, правда, выводятся в порядке, соответствующем от большего элемента массива к меньшему - хотя индексы как раз можно и пересортировать, они могут выводиться в любом порядке - и существует ограничение: элементы массива - типа Byte, т.е. в интервале 0 .. 255, но я думаю, тебе этого хватит...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Спасибо! Всё работает! Но кроме smallint аписал везде integer. Т.к паскаль не распазнают что такое smallint.
Вопрос закрыт! Ещё раз спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 16:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name