Задание: В файле хранится набор целых чисел. Найти первые три наибольшие по абсолютной величине числа н после каждого из них вставить нулевой элемент. Результат сохранить в новый файл. содержимое исходного и конечного файлов распечатать на экране. программа поиска наибольших чисел должна находиться в отдельном модуле. Использование массивов недопустимо.
volvo
22.12.2008 22:41
Вот набросок:
var m1, m2, m3: integer; // Здесь будем хранить 3 максимума ... m1 := -maxint; m2 := -maxint; m3 := -maxint; // пока не конец файла // читаем из файла очередное число X if abs(X) > m1 then begin m3 := m2; m2 := m1; m1 := X; end else if abs(X) > m2 then begin m3 := m2; m2 := X; end else if abs(X) > m3 then m3 := X; // конец цикла...
После этого в переменных m1, m2, m3 будут 3 наибольших по абс. величине значения. Второй проход по файлу, опять читаем число X, и сравниваем его с каждым из максимумов. Что-то вот такого типа:
if (m1 <> -maxint) and (m1 = X) then begin // Записываем во второй файл число X и ноль end else if (m2 <> -maxint) and (m2 = X) then begin // Записываем во второй файл число X и ноль end else if (m3 <> -maxint) and (m3 = X) then begin // Записываем во второй файл число X и ноль end;
Дальше попробуй самостоятельно.
amega
23.12.2008 2:20
Хотел бы добавить что после прохода по файлу если он типизирован то незабыть поставить файловый указатель на начало файла после первогоо прохода по файлу там где искали максимальные значения.
Lapp
23.12.2008 3:14
volvo, так она вставит нули после каждого числа, равного m1, m2 и m3, тогда как в задании речь идет только о первых трех. Нужно еще затирать их при вставке нулей. Типа вот так:
if (m1 <> -maxint) and (m1 = X) then begin // Записываем во второй файл число X и ноль m1:=-maxint; end else if (m2 <> -maxint) and (m2 = X) then begin // Записываем во второй файл число X и ноль m2:=-maxint; end else if (m3 <> -maxint) and (m3 = X) then begin // Записываем во второй файл число X и ноль m3:=-maxint; end;
2 amega: а зачем переставлять файловый указатель?
volvo
23.12.2008 3:31
Цитата
так она вставит нули после каждого числа, равного m1, m2 и m3, тогда как в задании речь идет только о первых трех.
В задании - неоднозначность: <6, 7, 8, 3, 4, 5, 8, 7, 4> После каких элементов ставить нули? Только после 8, 8 и 7 (они же - три максимальных)? Либо после 6, 7, 8, 8, 7? (они же - три максимальных, но обязательно РАЗНЫХ, и добавлять нули после всех вхождений)? Если по первому варианту (я сначала его и рассматривал) - то и в первом фрагменте условия должны быть нестрогими:
if abs(X) >= m1 then begin m3 := m2; m2 := m1; m1 := X; end else if abs(X) >= m2 then begin m3 := m2; m2 := X; end else if abs(X) >= m3 then m3 := X;
+ твое исправление, если по второму - то так, как во втором посте...
Лично я склоняюсь ко второму варианту, иначе: <8, 8, 8, 8, 8, 8, 1, 2, 3, 4> - странно как-то, после первых трех восьмерок - нули будут, а после следующих трех (числа-то все же максимальны по модулю) уже нет...
Ждем автора с уточнением...
amega
23.12.2008 3:33
ну как мы прошли по файлу нашли 3 максимальних значения потом же нада в новый файл переписать только вставлять нули, но а считывать то с первого нада а файловый указатель то остался в конце файла онож выдаст ошыбку. Эт ели второй раз открыть в режиме ресет тогда не нада
Lapp
23.12.2008 3:42
Цитата(volvo @ 22.12.2008 23:31)
В задании - неоднозначность
Мне кажется, неоднозначности нет. Ключевым словом в задании является слово "первые". Второе толкование лишает это слово смысла - что, я полагаю, недопустимо при толковании задания.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.