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

Вводится последовательность чисел. 0 - конец последовательности. НАйти 2 наименьших числа.
volvo
В чем проблема? Изначально 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
Похоже в задании есть некоторая двусмысленность... Что есть 2 наименьших числа, например, в массиве
<2, 3, 6, 7, 2, 3>
?

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

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

volvo, а есть ли необходимость связываться с максимальным возможным значением? Иногда найти его не так просто..
Можно, мне кажется, просто в min_2 безусловно положить первое введенное. Если второе введенное меньше него, сделать переприсвоение (как описано), если нет - положить во второе. Далее по твоему алгоритму..
volvo
Цитата
Можно, мне кажется, просто в min_2 безусловно положить первое введенное.
smile.gif Догадайся, где здесь узкое место? Для этого надо вынести ввод по крайней мере первого числа из цикла, а это значит, дублирование кода... Или усложнять программу проверками, какое именно число введено, для чего придется вводить какой-нибудь счетчик...
topoR
Блин, люди, я в паскале человек относительно новый. У меня вопрос появился, как вводить последовательность чисел, (которая вдобавок оканчивается на 0), чтобы в последствии сравнивать числа с min_1 и min_2?..С помощью array ?!
Только не смейтесь smile.gif Завтра лабу надо сдавать..
Lapp
Цитата(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
 

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
Цитата(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
Программа работает, спасибо smile.gif Ошибку полностью осознал..
Сейчас подумаю над выходом из ситуации, когда почти сразу вводится ноль..
topoR
Вот еще одна задачка.. Такого же типа.

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


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

Решил без них.. Боюсь, что заставят перерешивать всвязи с отдельным вводом первого числа и всей последовательности в целом. Кто чем поможет? 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.


.


Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.