Форум «Всё о Паскале» _ Задачи _ Последовательность чисел
Автор: topoR 12.04.2007 4:58
Помогите решить задачу
Вводится последовательность чисел. 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 !!! Иначе ничего делать не надо, переходишь ко вводу следующего числа...
Это алгоритм (сорри, если сумбурно, но я его составлял с готовой программы, поэтому...) Попробуй разобраться, в нем и хотя бы начни делать что-то... Не получится - приходи
Автор: 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 безусловно положить первое введенное.
Догадайся, где здесь узкое место? Для этого надо вынести ввод по крайней мере первого числа из цикла, а это значит, дублирование кода... Или усложнять программу проверками, какое именно число введено, для чего придется вводить какой-нибудь счетчик...
Автор: topoR 12.04.2007 5:57
Блин, люди, я в паскале человек относительно новый. У меня вопрос появился, как вводить последовательность чисел, (которая вдобавок оканчивается на 0), чтобы в последствии сравнивать числа с min_1 и min_2?..С помощью array ?! Только не смейтесь Завтра лабу надо сдавать..
Автор: Lapp 12.04.2007 6:00
Цитата(volvo @ 12.04.2007 2:55)
Догадайся, где здесь узкое место? Для этого надо вынести ввод по крайней мере первого числа из цикла, а это значит, дублирование кода... Или усложнять программу проверками, какое именно число введено, для чего придется вводить какой-нибудь счетчик...
Да, я все это, конечно, понимаю.. Я бы не стал называть это узким местом.. Код, действительно, немного увеличится. Замедления можно избежать, если сделать заполнение первых двух отдельным блоком. Но мне кажется, оно того стОит..
Добавлено через 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.
.
Не работает по-моему (
Автор: Lapp 12.04.2007 6:53
Цитата(topoR @ 12.04.2007 3:22)
Не работает по-моему (
Угу. Ты забыл расставить операторные скобки, 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
Программа работает, спасибо Ошибку полностью осознал.. Сейчас подумаю над выходом из ситуации, когда почти сразу вводится ноль..
Автор: topoR 12.04.2007 18:12
Вот еще одна задачка.. Такого же типа.
Дана последовательность чисел, также заканчивающаяся на ноль. Определить, сколько раз в последовательности числа меняют свой знак.
Вроде бы с помощью массива решается элементарно. Однако их запретили использовать ..
Решил без них.. Боюсь, что заставят перерешивать всвязи с отдельным вводом первого числа и всей последовательности в целом. Кто чем поможет?
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;