Автор |
Сообщение |
GUCHI АнониМ |
|
Надо срочно програмку написать на паскале для зачета. Помогите кто может!
Задача:
Из последовательности отрицательных чисел выбрать меньшие -8. Если таких нет то выдать сообщение. |
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
достаточно простая задача. делается за 5-10 минут
Код: |
var
_numbers: array[1..10] of Integer;
_flag: Boolean;
i: Byte;
begin
Randomize;
_flag := False;
for I := 1 to 10 do
begin
_numbers[I] := 0 - Random(20);
if _numbers[I] < -8 then
_flag := True;
end;
if _flag then
begin
for I := 1 to 10 do
if _numbers[I] < -8 then
Write(_numbers[I],' ');
end
else
Write('нет таких чисел');
Readln;
end. |
|
|
|
|
|
BS Эксперт |
|
Без заполнения массива 3 минуты |
|
|
|
|
ДобрыйФей Мечтатель Предупреждений : 5
|
|
GUCHI писал(а): |
Из последовательности отрицательных чисел выбрать меньшие -8. Если таких нет то выдать сообщение. |
9й класс. |
|
|
|
|
NeoN Гуру |
|
просто любопытно, где такие зачеты? |
|
|
|
|
ДобрыйФей Мечтатель Предупреждений : 5
|
|
Хм...в ВКИ возможно... |
|
|
|
|
dlnsk Гуру |
|
Вообще-то препод может придраться к такому решению, т.к. наличие чисел меньше -8 определяется не в момент поиска, а в момент заполнения массива...
...я бы не зачел. |
|
|
|
|
ДобрыйФей Мечтатель Предупреждений : 5
|
|
Ну можно так, например:
Код: |
var
a: array[1..10] of Integer;
i,x: integer;
begin
randomize;
x:=0;
for i:=1 to 10 do
begin
a[i]:= 0-random(25);
write (a[i],' ');
end;
for i:=1 to 10 do
if a[i]<-8 then
begin
writeln (a[i]);
x:=x+1;
end;
if x=0 then
writeln ('takih chisel net');
readln;
end.
|
|
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
ДобрыйФей
мой вариант будет быстрей работать например на
в цикле уйдет меньше процессорного времени, нежеле на бессмысленное сложение
dlnsk
наоборот так лучше, если чисел -8 не было, то и искать ничего не нужно, цикл не запускаем = экономим процессорное время )))
я так написал, как будто недавно i8086 появился |
|
|
|
|
ДобрыйФей Мечтатель Предупреждений : 5
|
|
not_available писал(а): |
dlnsk
наоборот так лучше, если чисел -8 не было, то и искать ничего не нужно, цикл не запускаем = экономим процессорное время ))) |
У парнишки другое задание было просто.
not_available писал(а): |
мой вариант будет быстрей работать |
Мой вариант проще и понятней. Легче будет преподу объяснить что там и где, если что.
not_available писал(а): |
процессорного времени |
Это роли не играет. Там разница несущественная. Хотя, конечно, в идеале его стоит экономить... |
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
вот более оптимизированный вариант. версия 2.0. всего 1 цикл и 2 проверки. Быстрее помоему только на asm можно сделать
Код: |
var
_numbers: array[1..10] of Integer;
_flag: Boolean;
i: Byte;
begin
Randomize;
_flag := False;
for i := 1 to 10 do
begin
_numbers[i] := 0 - Random(20);
if _numbers[i] < -8 then
begin
Write(_numbers[i],' ');
_flag := True
end;
end;
if not _flag then
Write('нет таких чисел');
Readln;
end. |
|
|
|
|
|
dlnsk Гуру |
|
not_available
Дело не в том, чтобы быстрее было, а в том, чтобы соответствовало заданию.
Если в задании сказано
GUCHI писал(а): |
Из последовательности отрицательных чисел |
то тут два варианта:
1. Эта последовательность заранее имеется (массив), тогда предполагается что он уже заполнен данными (заполнять его или нет в задании не сказано и к решению задачи не относится, а значит если хочется заполнить, то делать это нужно заранее, но ни как не в том же цикле, где поиск).
2. Последовательности заранее нет, но тогда задача решается вообще без участия массива.
Короче, опять тебе незачет... |
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
dlnsk
Так я его и заполняю заранее, перед проверкой элемента.
Что сначала заполнить последовательно массив, а потом его отдельным циклом крутить в поиске нужных значений.
Что заполнить элемент массива и сразу его проверить. Разницы для юзера никакой. Но во втором варианте это будет происходить быстрее.
Массив-то просто указатель на область памяти, и нет разницы при последовательном доступе к элементам когда они там запишутся. При случайном доступе, да, тогда сначала надо было его заполнить полностью, а потом проверять.
Последовательность есть? Есть. Есть задача, есть цель, есть результат. Зачет я сам себе ставлю |
|
|
|
|
dlnsk Гуру |
|
not_available
Любая задача подразумевает ее применение где-либо. Поэтому любой алгоритм правильно было бы требовать оформлять в виде процедуры/функции (если конечно этот материал уже пройден). Соответственно любая функция в идеале должна быть универсальна, что не наблюдается в твоем примере...
Формально ответ у тебя будет правильным, но с точки зрения здравого смысла не все в порядке... |
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
dlnsk
Ну это само собой, для вуз'овской задачки начального уровня сойдет. |
|
|
|
|
$vetlii Гуру |
|
Цитата: |
Быстрее помоему только на asm можно сделать |
...считаю, что так работать будет ещё эффективней)
Код: |
var
_numbers: array[1..10] of Integer;
_flag, flag2: Boolean;
i: Byte;
begin
Randomize;
flag2 := True;
_flag := False;
for i := 1 to 10 do
begin
_numbers[i] := 0 - Random(20);
if _numbers[i] < -8 then
begin
Write(_numbers[i],' ');
If flag2 then
begin
_flag := True;
flag2 := False;
end;
end;
end;
if not _flag then
Write('нет таких чисел');
Readln;
end. |
...теперь всего один раз запоминается, что есть число <-8 (а не перезаписывается при каждом выполнении условия)... |
|
|
|
|
not_available Эксперт Предупреждений : 1
|
|
$vetlii
ладно)))
тоже самое, но экономим 1 байт памяти
Код: |
var
_numbers: array[1..10] of Integer;
_flag: Boolean;
i: Byte;
begin
Randomize;
_flag := False;
for i := 1 to 10 do
begin
_numbers[i] := 0 - Random(20);
if _numbers[i] < -8 then
begin
Write(_numbers[i],' ');
if not _flag then
_flag := True;
end;
end;
if not _flag then
Write('нет таких чисел');
Readln;
end. |
|
|
|
|
|
|