Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с файлами, внешними модулями.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Света
Задание: В файле хранится набор целых чисел. Найти первые три наибольшие по абсолютной величине числа н после каждого из них вставить нулевой элемент. Результат сохранить в новый файл. содержимое исходного и конечного файлов распечатать на экране. программа поиска наибольших чисел должна находиться в отдельном модуле. Использование массивов недопустимо.
volvo
Вот набросок:

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
Хотел бы добавить что после прохода по файлу если он типизирован то незабыть поставить файловый указатель на начало файла после первогоо прохода по файлу там где искали максимальные значения.
Lapp
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
Цитата
так она вставит нули после каждого числа, равного 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
ну как мы прошли по файлу нашли 3 максимальних значения потом же нада в новый файл переписать только вставлять нули, но а считывать то с первого нада а файловый указатель то остался в конце файла онож выдаст ошыбку. Эт ели второй раз открыть в режиме ресет тогда не нада
Lapp
Цитата(volvo @ 22.12.2008 23:31) *
В задании - неоднозначность
Мне кажется, неоднозначности нет. Ключевым словом в задании является слово "первые". Второе толкование лишает это слово смысла - что, я полагаю, недопустимо при толковании задания.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.