Консультация № 185942
02.05.2012, 01:19
80.51 руб.
02.05.2012, 09:28
0 6 1
Здравствуйте уважаемые эксперты! Помогите мне написать программу на языке Pascal в среде turbo, которая:

написать программу генерации m-последовательностей 0 и 1, удовлетворяющих обоим требованиям:
1)число 1 должно быть не меньше m/2-2;
2)хотя бы две единицы шли подряд.

Я не знаю в какую рассылку отправить, ведь эта задача по дискретной математике, которую необходимо реализовать на языке pascal.

Заранее большое спасибо!

Обсуждение

давно
Профессионал
304622
583
02.05.2012, 20:19
общий
Непонятно. Это должен быть случайная последовательность?
давно
Профессионал
304622
583
02.05.2012, 20:22
общий
Если лишь строго следовать описаным вами требованиям, то, например, при
m=10
можно выдать
1 1 1 1 1 0 0 0 0 0
и всё. В чём задача-то?
Неизвестный
03.05.2012, 01:21
общий
Да, это должна быть случайная последовательность 0 и 1
давно
Профессионал
304622
583
03.05.2012, 11:05
общий
Цитата: 393234
Да, это должна быть случайная последовательность 0 и 1


Но если она случайная, то как должны обеспечиваться условия? Надо генерировать последовательность, а потом проверять на выполнение условий, и если не подходит, то отбраковывать и генерировать новую. Так?
давно
Профессор
399103
482
03.05.2012, 21:36
общий
это ответ
Здравствуйте, Пополитов Роман Станиславович!

Если я понял правильно, то требовалось это. Поправьте, если это не так.

Код:

{ Объявляем тип "указатель на слово" }
type pword = ^word;

{ Проверка на первый критерий }
function seqOK1(seq: pword; m: word): boolean;
var
i, sum: word;
begin
sum := 0;
for i := 1 to m do
begin
sum := sum + seq[i];
end;
seqOK1 := sum >= m/2-2;
end;

{ на второй }
function seqOK2(seq: pword; m: word): boolean;
var i: integer;
begin
{ пропускаем слишком короткие последовательности }
if (m < 2) then
begin
seqOK2 := true;
exit;
end;

for i := 1 to m-1 do
begin
if (seq[i] = seq[i+1]) and (seq[i] = 1) then
begin
seqOK2 := true;
exit;
end;
end;
seqOK2 := false;
end;

{ на оба }
function seqOK(seq: pword; m: word): boolean;
begin
seqOK := seqOK1(seq,m) and seqOK2(seq,m);
end;

{ генерируем случайную последовательность }
procedure makeSeq( seq:pword; m: word );
var i: word;
begin
for i := 1 to m do
begin
seq[i] := random(2);
end;
end;

var i: word;
var m: word;

var seq :^ word;
begin
{ инициализируем генератор случайных чисей }
randomize();

write( 'Введите m: ' );
readln( m );

{ выделяем мапять на массив }
GetMem( seq, m * sizeof(word) );
{ теперь seq указывает на начало области памяти, хранящей массив }

repeat
makeSeq( seq, m ); // генерируем последовательность
until seqOK(seq, m); // пока она не станет достаточно хороша

{ Вывод последовательности }
for i := 1 to m do
begin
write( seq[i] );
end;

readln;
end.
Неизвестный
04.05.2012, 11:34
общий
Сначала генерировать последовательность, а потом проверять на выполнение условий, и если не подходит, то отбраковывать и генерировать новую.

спасибо ещё раз за ответ!!!!!!!!!!!
Форма ответа