Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Последовательность чисел

Автор: topoR 12.04.2007 4:58

Помогите решить задачу smile.gif

Вводится последовательность чисел. 0 - конец последовательности. НАйти 2 наименьших числа.

Автор: volvo 12.04.2007 5:17

В чем проблема? Изначально min_1, min_2 = максимально возможному значению, которое может быть введено... Если числа целые - то MaxInt, например...

А потом делаешь следующее: если очередное введенное с клавиатуры число (назовем его X) не 0, то сравниваешь его сначала с min_1 (это наименьшее из чисел), и если новое число строго меньше него, то

min_2 := min_1;
min_1 := X;

Если же min_1 < X < min_2, то
min_2 := X;


Внимание! Все эти сравнения производятся только, если X отличается от значений КАК min_1, ТАК и min_2 !!! Иначе ничего делать не надо, переходишь ко вводу следующего числа...

Это алгоритм (сорри, если сумбурно, но я его составлял с готовой программы, поэтому...) Попробуй разобраться, в нем и хотя бы начни делать что-то... Не получится - приходи smile.gif

Автор: volvo 12.04.2007 5:51

Похоже в задании есть некоторая двусмысленность... Что есть 2 наименьших числа, например, в массиве
<2, 3, 6, 7, 2, 3>
?

Это будут 2, 2 или 2, 3 ? Т.е., тебе надо найти 2 абсолютно минимальных числа, или 2 разных минимальных числа? Мой алгоритм - для нахождения 2-х разных... Чтобы найти 2 абсолютно минимальных - выкини из того, что я написал абзац со словом "Внимание!"

Автор: Lapp 12.04.2007 5:52

Цитата(volvo @ 12.04.2007 2:17) *

Изначально min_1, min_2 = максимально возможному значению, которое может быть введено... Если числа целые - то MaxInt, например...

volvo, а есть ли необходимость связываться с максимальным возможным значением? Иногда найти его не так просто..
Можно, мне кажется, просто в min_2 безусловно положить первое введенное. Если второе введенное меньше него, сделать переприсвоение (как описано), если нет - положить во второе. Далее по твоему алгоритму..

Автор: volvo 12.04.2007 5:55

Цитата
Можно, мне кажется, просто в min_2 безусловно положить первое введенное.
smile.gif Догадайся, где здесь узкое место? Для этого надо вынести ввод по крайней мере первого числа из цикла, а это значит, дублирование кода... Или усложнять программу проверками, какое именно число введено, для чего придется вводить какой-нибудь счетчик...

Автор: topoR 12.04.2007 5:57

Блин, люди, я в паскале человек относительно новый. У меня вопрос появился, как вводить последовательность чисел, (которая вдобавок оканчивается на 0), чтобы в последствии сравнивать числа с min_1 и min_2?..С помощью array ?!
Только не смейтесь smile.gif Завтра лабу надо сдавать..

Автор: Lapp 12.04.2007 6:00

Цитата(volvo @ 12.04.2007 2:55) *

smile.gif Догадайся, где здесь узкое место? Для этого надо вынести ввод по крайней мере первого числа из цикла, а это значит, дублирование кода... Или усложнять программу проверками, какое именно число введено, для чего придется вводить какой-нибудь счетчик...

Да, я все это, конечно, понимаю.. Я бы не стал называть это узким местом.. Код, действительно, немного увеличится. Замедления можно избежать, если сделать заполнение первых двух отдельным блоком. Но мне кажется, оно того стОит..

Добавлено через 6 мин.
Цитата(topoR @ 12.04.2007 2:57) *

как вводить последовательность чисел, чтобы в последствии сравнивать числа с min_1 и min_2?..С помощью array ?!
Только не смейтесь

Нет, вводи в цикле и сразу в этом же цикле делай сравнения. Типа так:


n:=0;
repeat
ReadLn(x);
if x<>0 do begin
Inc(n);
{тут сравнения и присвоения}
end
until x=0

Я тут ввел еще и счетчик введенных чисел - думаю, может пригодиться..

А чего смеяться? Все начинали..
Напиши, что у тебя получается..


Автор: topoR 12.04.2007 6:22

 

program unknown;
uses crt;
var min_1, min_2, n, x: integer;
begin
clrscr;
min_1 := 32767;
min_2 := 32767;
n:=0;

repeat

writeln ('Vvedite chislo');
readln (x);
if (x <> 0) then
Inc(n);
if (x < min_1) then
min_2 := min_1;
min_1 := x;
if (x > min_1) and (x < min_2) then
min_2 := x;


until x=0;
writeln ('Sredi vvedennih', n, 'chisel 2 naimenshih - eto chisla:');
writeln (min_1);
writeln (min_2);
readln;
end.



.

Не работает по-моему sad.gif(

Автор: Lapp 12.04.2007 6:53

Цитата(topoR @ 12.04.2007 3:22) *

Не работает по-моему sad.gif(

Угу.
Ты забыл расставить операторные скобки, begin и end. Без них после оператора IF выполняется (в случае выполнения условия) только один оператор. Короче, посмотри внимательно, что я добавил..
program Find2min;
uses crt;
var min_1, min_2, n, x: integer;
begin
clrscr;
min_1 := 32767;
min_2 := 32767;
n:=0;

repeat
writeln ('Vvedite chislo');
readln (x);
if (x <> 0) then begin
Inc(n);
if (x < min_1) then begin
min_2 := min_1;
min_1 := x
end;
if (x > min_1) and (x < min_2) then min_2 := x
end
until x=0;
writeln ('Sredi vvedennih', n, 'chisel 2 naimenshih - eto chisla:');
writeln (min_1);
writeln (min_2);
readln;
end.

Еще - добавь пару пробелов при выводе результата, а также подумай, что будет, если последовательность будет состоять только из одного числа, а может и совсем пустая (сразу ввели 0).

Еще совет: обрати внимание на форматирование программного текста в моем варианте. Если усвоишь, тебе это поможет. Кстати, тут как раз про begin и end (и не только), то есть про твою ошибку..
Успехов!

Автор: topoR 12.04.2007 7:02

Программа работает, спасибо smile.gif Ошибку полностью осознал..
Сейчас подумаю над выходом из ситуации, когда почти сразу вводится ноль..

Автор: topoR 12.04.2007 18:12

Вот еще одна задачка.. Такого же типа.

Дана последовательность чисел, также заканчивающаяся на ноль. Определить, сколько раз в последовательности числа меняют свой знак.


Вроде бы с помощью массива решается элементарно. Однако их запретили использовать ..

Решил без них.. Боюсь, что заставят перерешивать всвязи с отдельным вводом первого числа и всей последовательности в целом. Кто чем поможет? smile.gif

 
program n1;
uses crt;
var a,i,x,y : integer;
begin
clrscr;
writeln ('Vvedite pervoe 4islo');
readln (i);
repeat

writeln ('Vvedite sleduushee chislo');
readln (a);
if (a <> 0) then
begin
if (a*i < 0) then
begin
y:=y+1;
i:=a;
end;
end;

until a=0;

writeln ('Posledovatelnost menaet znak' ,y, 'raz');
readln;
end.


.