ХКОИС
ХРРЦ
Регистрация
Забыли пароль?
Логин:
Пароль:
Поиск
Справочные сведения о системе образования Хабаровского края
Новости образования Хабаровского края
Информация и документы из министерства образования и науки Хабаровского края
Хабаровская краевая заочная физико-математическая школа
РЕГИОНАЛЬНАЯ ОЛИМПИАДА ШКОЛЬНИКОВ
Подготовка к олимпиадам по информатике
Подготовка к олимпиадам по информатикеДополнительные и справочные материалы > Указания по решению элементарных задач на обработку массивов и файлов (по материалом летней сессии ХК ЗФМШ-2009 года)
Указания по решению элементарных задач на обработку массивов и файлов (по материалом летней сессии ХК ЗФМШ-2009 года)
ЗАДАЧИ ОДНОПРОХОДНОЙ ОБРАБОТКИ МАССИВОВ И ФАЙЛОВ
 
1. ОСНОВНЫЕ ПОНЯТИЯ И КОНСТРУКЦИИ ЯЗЫКА ПАСКАЛЬ НА ПРИМЕРАХ ПРОСТЫХ ПРОГРАММ
 
Рассмотрим основные понятия языка программирования Паскаль на примерах решения простых задач. Отметим, что в Паскале:
  • необходимо описывать все поименованные данные, а также процедуры, функции и другие элементы перед их использованием,
  • программа имеет заголовок, после которого следуют описания используемых элементов, предваряемые служебными словами,
  • код программы начинается после слова begin, а заканчивается словом end после которого стоит точка,
  • команды языка отделяются знаком точка с запятой (;).
 
Описание переменных, ввод и вывод значений
 
Пример 1.
Ввести значения целых переменных x, y, а затем вывести на экран их сумму и разность.
В Паскале комментарии, включаемые в текст программы, заключаются в фигурные скобки {}.
 
Program prim1;
Var
x, y: integer;
begin
write(‘x=’);
readln(x);
write(‘y=’);
readln(y);
writeln(‘x+y=’,x+y); 
writeln(‘x-y=’,x-y)
 
end.
{Заголовок программы: слово program и имя программы (prim1)}
{Служебное слово – начало описания переменных}
{Описание переменных x, y целого типа (integer)}
{Начало программы. После begin начинается код программы}
{Вывод сообщения «x=», без перехода на новую строку}
{Ввод значения x с переходом на новую строку}
{Вывод сообщения «y=», без перехода на новую строку}
{Ввод значения y с переходом на новую строку}
{Вывод сообщения «y+x=» и значения суммы, с переходом на новую строку}
{Вывод сообщения «y-x=» и значения разности, с переходом на новую строку, суффикс ln (line new) – переход на новую строку}
{Конец программы. В конце программы после end ставится точка}
 
Присваивания и условный оператор
 
Пример 2.
Найти наибольшее значение двух вещественных чисел.
Решение с использованием неполной формы условного оператора.
 
Program prim2a;
Var
x, y, max: real;
begin
write(‘x=’);
readln(x);
write(‘y=’);
readln(y);
max:=x;
If max<y then 
            max:=y;
writeln(‘max’,max) 
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменных x, y, max вещественного типа (real)}
{Начало программы}
{Вывод сообщения «x=», без перехода на новую строку}
{Ввод значения x с переходом на новую строку}
{Вывод сообщения «y=», без перехода на новую строку}
{Ввод значения y с переходом на новую строку}
{Присваивание переменной max значения переменной x}
{Условный оператор в неполной форме: Если max<y то (после then не ставится точка с запятой)}
{Присваивание переменной max значения переменной y, если выполняется условие}
{Вывод сообщения «max=» и значения переменной max, с переходом на новую строку}
{Конец программы}
 
Решение с использованием полной формы условного оператора.
 
Program prim2b;
Var
x, y, max: real;
begin
write(‘x=’);
readln(x);
write(‘y=’);
readln(y);
If x>y then
            max:=x           
else
            max:=y;
 
writeln(‘max’,max)
 
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменных x, y, max вещественного типа (real)}
{Начало программы}
{Вывод сообщения «x=», без перехода на новую строку}
{Ввод значения x с переходом на новую строку}
{Вывод сообщения «y=», без перехода на новую строку}
{Ввод значения y с переходом на новую строку}
{Условный оператор в полной форме: Если max<y то }
{Присваивание переменной max значения переменной x, если выполняется условие}
{Иначе (перед else не ставится точка с запятой)}
{Присваивание переменной max значения переменной y, если не выполняется условие}
{Вывод сообщения «max=» и значения переменной max, с переходом на новую строку}
{Конец программы}
 
Циклические конструкции. Цикл с параметром
 
Особенности цикла с параметром в Паскале:
  • параметр цикла должен быть перечисляемого типа – целого, символьного или другого, для которого однозначно определены значения соседних элементов,
  • вещественный тип недопустим, так как он не относится к перечисляемым типам,
  • значение параметра изменяется либо на следующее, либо на предыдущее при разных вариантах записи оператора.
 
Пример 3.
Напечатать значения чисел от 1 до 100 по 6 в ряд сначала в порядке возрастания, а затем в порядке убывания.
 
Program prim3;
Var
i, k: integer;
begin
k:=1;
for i:=1 to 100 do 
begin 
 
write (i:4); 
If k mod 6=0 then
            writeln;
k:=k+1
end;
writeln(‘--------‘);
k:=1;
for i:=100 downto 1 do 
begin
write (i:4);
If k mod 6=0 then
            writeln;
k:=k+1
end
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменных i, k целого типа}
{Начало программы}
{Инициализация номера печатаемого числа}
{Для значений переменной i от 1 до 100 с переходом к следующему (to)}
{begin – открывающая инструктивная скобка для перечисления команд, выполняемых в цикле, используется когда нужно выполнить больше одной команды}
{Вывод текущего значения числа i,:4 – задает ширину поля для вывода в 4 символа}
{Если номер печатаемого числа кратен 6, то
выполнить перевод строки}
{Увеличим номер выводимого числа на 1}
{end — Закрывающая инструктивная скобка парная к begin}
{Печать разделительной черты}
{Инициализация номера печатаемого числа}
{Для значений переменной i от 100 до 1 с переходом к предыдущему (downto)}
{begin – открывающая инструктивная скобка}
{Вывод текущего значения числа i}
{Если номер печатаемого числа кратен 6, то
выполнить перевод строки}
{Увеличим номер выводимого числа на 1}
{end — Закрывающая инструктивная скобка}
{Конец программы}
 
Циклические конструкции. Цикл с предусловием
 
Цикл с предусловием в Паскале выполняется пока условие является истинным.
 
Пример 4.
На вход программы подается последовательность целых чисел, заканчивающаяся нулем. Первое число отлично от нуля. Вычислить среднее арифметическое значение модулей чисел, отличных от нуля.
 
Program prim4;
Var
i, k: integer;
s:real;
begin
i:=0;
s:=0:
readln(k);
while k<>0 do
begin
s:=s+abs(k);
i:=i+1;
readln(k)
end;
s:=s/i;
writeln(‘s=’,s:8:2) 
 
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменных i, k целого типа}
{Описание переменной s вещественного типа}
{Начало программы}
{Инициализация количества введенных чисел не равных нулю}
{Инициализация значения для суммы модулей чисел}
{Ввод первого значения}
{Пока k<>0 выполнять следующие действия}
{begin – открывающая инструктивная скобка}
{Увеличение суммы на величину модуля введенного числа}
{Увеличение счетчика введенных чисел}
{Ввод следующего значения }
{end — Закрывающая инструктивная скобка парная к begin}
{Вычисление среднего арифметического}
{Печать результата, здесь:8:2 – задает формат вывода значения переменной s, всего 8 символов, в том числе десятичная точка и 2 знака после нее}
{Конец программы}
 
Циклические конструкции. Цикл с постусловием
Цикл с постусловием выполняется до тех пор, пока условие не станет истинным. В этом операторе цикла слова repeat и until выполняют функции инструктивных скобок.
 
Пример 5.
На вход программы подается строка символов. Подсчитать число повторений в ней латинской буквы L.
В этой задаче используются данные символьного типа – char, его значение — один символ. Кроме того применяется функция eoln – она принимает значение TRUE=ИСТИНА, если была нажата клавиша перевода строки (она же клавиша ввода или <Enter>).
 
Program prim5;
Var
c:char;
i:integer;
begin
i:=0;
repeat
read(c);
if c=’L’ then
            i:=i+1
until eoln;
writeln(‘i=’,i)
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменной c символьного типа}
{Описание переменной i целого типа}
{Начало программы}
{Инициализация количества введенных символов 'L'}
{Начало цикла с постусловием}
{Ввод значения символа}
{Если введен символ 'L', то}
{увеличим i на 1}
{Повторяем до тех пор, пока не нажата клавиша ввода <Enter>}
{Печать результата}
{Конец программы}
 
Задания к первой части
Упражнения:
1.     Реализуйте все приведенные примеры программ в среде Borland Pascal и протестируйте их.
2.     Напишите самостоятельно программу выбора наибольшего или наименьшего значений для трех введенных чисел.
Задачи:
1.     На вход программы подается строка символов, соответствующая арифметическому выражению. Напишите программу, проверяющую правильность расстановки открывающих и закрывающих скобок.
2.     На вход программы подается N целых чисел. Найдите сумму их последних цифр. Для нахождения последней цифры используйте операцию нахождения остатка от целочисленного деления mod. Например, выражение 1212 mod 20 будет иметь значение 12, а 1221 mod 4 равно 1.
 
2. ОСНОВНЫЕ ПОНЯТИЯ О МАССИВАХ В ПАСКАЛЕ
 
Определение массива
 
Под массивом в Паскале понимается сложная переменная, объединяющая под общим именем набор однородных (одного типа) данных, для доступа к которым применяются индексы.
Мы будем рассматривать одномерные массивы, то есть такие, для доступа к элементам которых достаточно одного индекса. Отметим, что в Паскале возможно задавать массивы большей размерности.
Аналогом одномерного массива является таблица, состоящая из одной строки или одного столбца. Аналогом двумерного массива является таблица, состоящая из нескольких строк и нескольких столбцов.
 
Описание и использование массивов в программе
 
Паскаль имеет большие возможности для создания различных сложных типов данных, однако их подробное изучение не входит в наши планы. Массивы можно описывать непосредственно в разделе описания переменных, а также предварительно определив для них соответствующий тип данных. Рассмотрим пример.
 
Пример 6.
Описать два одномерных массива, состоящих из 20 вещественных чисел. Ввести в один из них значения, заполнить второй массив половинами величин соответствующих значений первого и распечатать в обратном порядке.
 
Program prim6;
Type
Arr=array[1..20] of real;
 
Var
A:Arr;
B: array[1..20] of real; 
 
 
i:integer; 
begin
for i:=1 to 20 do
begin
readln(A[i]);
B[i]:=A[i]/2
end;
for i:=20 downto 1 do
writeln(‘A[‘,i,’]=’,A[i]:8:2, ‘ B[‘,i,’]=’,B[i]:8:2)
end.
{Заголовок программы}
{Служебное слово – начало описания типов}
{Описание типа данных Arr — одномерный массив вещественных чисел для доступа к которым используются целые числа – индексы в диапазоне от 1 до 20, всего 20 индексов для 20 элементов}
{Служебное слово – начало описания переменных}
{Описание переменной A типа Arr – вещественный массив}
{Описание переменной B — одномерный массив вещественных чисел для доступа к которым используются целые числа – индексы в диапазоне от 1 до 20, всего 20 индексов для 20 элементов. Это альтернативный вариант непосредственного определения массива в разделе описания переменных}
{Описание переменной i целого типа, для использования в качестве индекса}
{Начало программы}
{Начало цикла с параметром i от 1 до 20}
{Начало инструкции}
{Ввод значения I-того элемента массива A}
{Присваивание значения I-тому элементу массива B}
{Конец инструкции}
{Начало цикла с параметром i от 20 до 1}
{Печать пары соответствующих значений элементов массивов A и B}
 
{Конец программы}
 
Типичные задачи на поиск в массиве
 
Задачи поиска сводятся к тому, что необходимо найти в массиве элементы, удовлетворяющие определенным условиям. Кроме того в задачах поиска бывает также необходимо вычислить значения каких либо величин, например, количество или сумму найденных элементов. Особо выделяются задачи, требующие поиска наибольшего или наименьшего элементов или сводящиеся к таким. Отметим, что в заданиях типа С2 ЕГЭ по информатике и ИКТ встречаются задачи, сводящиеся к поиску элементов имеющих соседние значения со значением наибольшего или наименьшего элементов.
 
Пример 7.
Найти среднее арифметическое положительных элементов вещественного массива из 10 элементов.
В этой задаче нужно найти элементы массива, являющиеся положительными числами, вычислить их сумму и посчитать количество. Затем найти среднее арифметическое.
 
Program prim7;
Var
B: array[1..10] of real; 
i,k:integer; 
s:real; 
begin
s:=0;
k:=0;
for i:=1 to 10 do
begin
readln(B[i]);
if B[i]>0 then
begin
s:=s+B[i];
k:=k+1
end
end;
if k>0 then s:=s/k;
 
writeln(‘s=’,s)
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменной B — одномерный массив вещественных чисел с индексами от 1 до 10}
{Описание переменных целого типа i, для использования в качестве индекса и k для счетчика найденных чисел}
{Описание переменной вещественного типа s, для суммирования найденных чисел}
{Начало программы}
{Инициализация переменной s}
{Инициализация переменной k}
{Начало цикла с параметром i от 1 до 10}
{Начало инструкции  цикла}
{Ввод значения I-того элемента массива B}
{Если элемент положительный, то}
{Начало инструкции условного оператора}
{Суммируем положительный элемент}
{Увеличиваем счетчик найденных элементов}
{Конец инструкции условного оператора}
{Конец инструкции оператора цикла}
{Если положительные элементы были, то найти их среднее арифметическое, в противном случае оно останется равным 0}
{Печать результата}
{Конец программы}
 
Пример 8.
Найти номер элемента вещественного массива из 10 элементов, значение которого наиболее удалено на числовой оси от точки Y0.
В этой задаче нужно выбрать такой элемент, который наиболее удален от заданной точки числовой прямой. Для этого необходимо сравнивать расстояния от точки Y0 до каждого из элементов массива. Для решения таких задач сначала предполагают, что искомым является первый элемент, а затем сравнивают параметры выбранного элемента с параметрами всех остальных элементов массива. В случае если встретился элемент с более подходящим параметром, он считается искомым, а сравнение продолжается до конца массива.
 
Program prim8;
Var
B: array[1..10] of real;
 
i,k:integer; 
Y0:real;
begin
Write(’Y0=’);
Readln(Y0);
for i:=1 to 10 do
readln(B[i]);
k:=1;
for i:=2 to 10 do 
if abs(Y0-B[i])>abs(Y0-B[k])
            then
                        k:=i;
writeln(‘k=’,k)
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание вещественного массива B — с индексами от 1 до 10}
{Описание переменных целого типа i, для использования в качестве индекса и k для номера найденного элемента}
{Описание переменной вещественного типа Y0}
{Начало программы} 
{Ввод значения переменной Y0}
{Начало цикла с параметром i от 1 до 10}
{Ввод значения I-того элемента массива B}
{Инициализация переменной k – выбран первый элемент}
{Начало цикла с параметром i от 2 до 10 – последовательно сравниваем выбранный элемент со всеми остальными}
{Если i-тый элемент дальше, чем выбранный k-тый,}
{то}
{Выбираем i-тый элемент}
{Печать результата}
{Конец программы}
 
Пример 9.
Дан вещественный массив из 10 элементов. Найти расстояние до элемента массива, значение которого является вторым по удаленности от точки Y0 на числовой оси.
В этой задаче нужно выбрать второй по удаленности элемент, это предполагает, что нужно найти и наиболее удаленный также.
В этой задаче можно воспользоваться тем, что самое минимальное расстояние между точками может быть равно только 0. Сначала предположим, что наибольшее и следующее расстояния будут равны 0, то есть точки будут совпадать с Y0. Затем сравним расстояния до всех остальных элементов сначала с наибольшим, а потом, если оно меньше, то и со вторым по величине. Если найдутся точки более удаленные, чем выбранные, то изменим значения переменных y1, y2. После перебора всех элементов массива в y2 будет значение элемента второго по удаленности от Y0. Искомое расстояние найдем как абсолютную величину разности между y2 и Y0.
 
Program prim9;
Var
B:array[1..10] of real; 
i:integer; 
Y0,y1,y2:real;
 
begin
readln(Y0);
for i:=1 to 10 do
readln(B[i]);
y1:=Y0; y2:=Y0;
for i:=1 to 10 do
 
if abs(Y0-y1)<abs(Y0-B[i]) then
  
begin
   y2:=y1;
   y1:=B[i]
   end
   else
   if abs(Y0-y2)<abs(Y0-B[i])
   then
   y2:=B[i];
Writeln(abs(Y0-y2):10:2)
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание вещественного массива B — с индексами от 1 до 10}
{Описание целой переменной типа i, для использования в качестве индекса}
{Описание переменных вещественного типа Y0-точка, y1-наиболее удаленный элемент, y2- второй по удаленности}
{Начало программы}
{Ввод значения переменной Y0}
{Начало цикла с параметром i от 1 до 10}
{Ввод значения I-того элемента массива B}
{Инициализация переменных y1, y2}
{Начало цикла с параметром i от 1 до 10 – последовательно сравниваем выбранный элемент со всеми остальными}
{Если i-тый элемент дальше, чем y1,}
{то}
{Начало инструкции «то» условного оператора}
{Второй по удаленности равен первому}
{Первый по удаленности равен текущему элементу массива}
{Конец инструкции «то» условного оператора}
{иначе}
{Если i-тый элемент дальше, чем y2,}
{то}
{Второй по удаленности равен текущему элементу массива}
{Печать результата}
{Конец программы}
 
Задания ко второй части
Упражнения:
1.     Реализуйте все приведенные примеры программ в среде Borland Pascal и протестируйте их.
2.     Измените программу восьмого примера так, чтобы находить значение элемента, наиболее приближенного к точке Y0 и подсчитать, сколько таких элементов.
Задачи:
1.     Дан вещественный массив из 10 элементов. Определить каких элементов больше, наиболее удаленных от точки Y0 на числовой оси, или наиболее приближенных к ней.
2.     Дан вещественный массив из 10 элементов. Найти расстояние на числовой прямой между средним арифметическим положительных и средним арифметическим отрицательных элементов массива.
3.     Дан целочисленный массив из 10 элементов. Найти количество элементов, у которых вторая цифра их десятичной записи имеет второе по величине значение.
 
3. ОСНОВНЫЕ ПОНЯТИЯ О ФАЙЛАХ В ПАСКАЛЕ
 
Под файлом в Паскале понимается набор данных на внешнем устройстве. Для доступа к файлам в версиях Паскаля, реализованных компанией “Borland”, применяются специальные файловые переменные.
Существуют различные типы файлов, однако в тех задачах, которые предлагаются на различных олимпиадах и экзаменах школьникам используются только текстовые файлы. Текстовый файл содержит символы из набора символов, реализованного в данной операционной системе. Как правило, в любых наборах содержатся одинаковые латинские буквы, знаки препинания и цифры. Наборы символов кириллицы и других национальных алфавитов и псевдографических элементов могут различаться составом или порядком следования символов.
Текст в текстовом файле рассматривается как набор строк произвольной длины. Каждая строка заканчивается символом перехода к началу следующей строки. Файл закачивается символом конца файла. По достижению символа конца файла данные больше не могут быть считаны, хотя после этого символа могут присутствовать другие данные. Наличие специальных символов для отметки конца строки и конца файла позволило ввести логические функции, принимающие значение ИСТИНА при обнаружении соответствующего события в процессе чтения данных из файла.
Ниже приводятся основные понятия, процедуры и функции для управления текстовыми файлами.
 
Для доступа к текстовым файлам определяются специальные переменные файлового типа, которые описываются следующим образом:
Var
<имя файловой переменной>:text;
Отождествление файловой переменной с физическим файлом производится процедурой:
assign(<имя файловой переменной>,<спецификация файла>).
Открытие файла производится процедурами:
reset(<имя файловой переменной>) для чтения,
rewrite(<имя файловой переменной>) для записи.
Чтение данных из файла производится процедурами:
read(<имя файловой переменной>,<список ввода>)
readln(<имя файловой переменной>,<список ввода>) – только для чтения из текстового файла.
Запись данных в файл производится процедурами:
write(<имя файловой переменной>,<список вывода>)
writeln(<имя файловой переменной>,<список вывода>) – только для записи в текстовый файл.
Определены следующие функции для текстовых файлов:
Функция eoln(<имя файловой переменной>) имеет значение ИСТИНА если достигнут конец строки и ЛОЖЬ в противном случае.
Функция eof(<имя файловой переменной>) имеет значение ИСТИНА если достигнут конец файла и ЛОЖЬ в противном случае.
Закрытие файла производиться процедурой:
 close(<имя файловой переменной>).
 
Приведем пример простой задачи с использованием текстовых файлов.
 
Пример 10.
В текстовом файле «PRIM10.IN», расположенном в корневом каталоге диска «G:», в первой строке хранится значение целого числа, во второй строке значения двух целых чисел, разделенных пробелом. Ввести значения целых переменных x, y, z, а затем вывести в выходной файл «PRIM10.OUT», расположенный в корневом каталоге диска «G:», значение наименьшего из этих чисел.
 
Program prim10;
Var
x, y, z: integer;
f:text;
begin
assign(f,’g:\prim10.in’);
reset(f);
readln(f,x);
read(f,y);
readln(f,z);
close(f);
if x>y then x:=y;
if x>z then x:=z;
assign(f,’g:\prim10.out’);
rewrite(f);
writeln(f,x);
close(f);
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменных x, y, z целого типа (integer)}
{Описание файловой переменной f, для текстового файла}
{Начало программы}
{Отождествление файловой переменной с физическим файлом}
{Открытие файла для чтения}
{Ввод значения x из файла с переходом на новую строку}
{Ввод значения y из файла без перехода на новую строку}
{Ввод значения z из файла с переходом на новую строку}
{Закрытие файла}
{Переменная x будет иметь меньшее значение из двух}
{Переменная x будет иметь меньшее значение из трех}
{Отождествление файловой переменной с физическим файлом}
{Открытие файла для записи}
{Вывод значения x в файл с переходом на новую строку}
{Закрытие файла}
{Конец программы}
 
Работа с тестовыми файлами требует определенной аккуратности. Особенно внимательно нужно относиться к задачам, в которых во входных файлах содержатся как числовые, так и сроковые данные. Такие задачи часто встречаются на школьных олимпиадах, кроме того, в задачах части С ЕГЭ по информатике и ИКТ тоже встречаются аналогичные ситуации при вводе данных.
В этих задачах наборы данных разного типа располагаются в одной строке и разделяются пробелами, причем данные строкового типа (в Паскале и в некоторых версиях Бейсика это тип string) могут иметь различную длину. Существенным ограничением в данном случае является то, что при считывании из файла значения для такой переменной в отличии от числовых данных пробел не будет распознаваться как маркер конца данных, а будет считано столько символов, какова заданная при описании переменной максимальная длина строки (если строка считываемых данных короче, то ввод прекратится при достижении маркера конца строки).
Описанные выше особенности считывания данных требуют специальной организации их ввода из текстового файла. Рассмотрим пример.
 
Пример 11.
Во входном файле содержится список учащихся, в каждой строке которого записаны фамилия, имя и отчество, разделенные одним пробелом. Необходимо сформировать выходной файл, в котором в том же порядке будут выведены сведения об учащихся, но на первом месте будет стоять имя, а на втором фамилия, отчество не выводится. Максимальная длина слова в данных не превышает 30 символов.
 
Program prim11;
Var
s1,s2: string[30];
ch:char;
f1,f2:text;
begin
assign(f1,’g:\prim11.in’);
reset(f1);
assign(f2,’g:\prim11.out’);
rewrite(f2);
while not eof(f1) do
begin
s1:=’’;
read(f1,ch);
while ch<>’ ‘ do
begin
s1:=s1+ch;
read(f1,ch)
end;
s2:=’’;
read(f1,ch);
while ch<>’ ‘ do
begin
s2:=s2+ch;
read(f1,ch)
end;
readln(f1);
writeln(f2,s2,’ ‘,s1)
end;
close(f1);
close(f2)
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание переменных строчного типа (string)}
{Описание переменной символьного типа (char)}
{Описание переменных f1 и f2, для текстовых файлов}
{Начало программы}
{Отождествление переменной f1 с физическим файлом}
{Открытие файла f1 для чтения}
{Отождествление переменной f2 с физическим файлом}
{Открытие файла f2 для записи}
{Пока не достигнут конец файла f1}
{Начало инструкции цикла пока}
{Инициализация переменной для фамилии}
{Ввод символа из файла f1 в переменную ch}
{Пока не был прочитан пробел}
{Начало инструкции вложенного цикла пока}
{Добавление к фамилии считанной буквы}
{Ввод следующего символа из файла f1 в переменную ch}
{Конец инструкции вложенного цикла пока}
{Инициализация переменной для имени}
{Ввод символа из файла f1 в переменную ch}
{Пока не был прочитан пробел}
{Начало инструкции вложенного цикла пока}
{Добавление к имени считанной буквы}
{Ввод следующего символа из файла f1 в переменную ch}
{Конец инструкции вложенного цикла пока}
{Переход на новую строку файла игнорируя лишние буквы}
{Запись в файл f2 имени и фамилии через пробел}
{Конец инструкции цикла пока}
{Закрытие файла f1}
{Закрытие файла f2}
{Конец программы}
 
В приведенном выше примере мы рассмотрели задачу ввода строковых данных, разделенных пробелами. Однако есть проблема и при организации ввода числовых данных включенных в такие задачи. В таких случаях можно использовать функции и процедуры языков программирования, предназначенные для работы со строками и для преобразования данных, однако их использование считается неоптимальным и, к тому же, они имеют довольно сложный синтаксис. Один из оптимальных распространенных способов считывания числовых данных из смешанных строк основывается на том, что символы цифр стоят в кодовых таблицах рядом и их номера возрастают с возрастанием значения цифры. Используя функцию, возвращающую код (номер) символа можно легко выполнять преобразование текстовой записи числа в числовые данные.
Рассмотрим еще один пример.
 
Пример 12.
Во входном файле содержится список целых положительных чисел вперемежку со словами. Слова и числа отделены друг от  друга пробелами. В одной строке может быть произвольное число слов и чисел. Найти и вывести на экран сумму чисел, включенных в текстовый файл.
 
Program prim12;
var
f:text;
ch:char;
n:integer;
s:real;
begin
assign(f,'g:\prim11.in');
reset(f);
s:=0.0;
n:=0;
while not eof(f) do
begin
read(f,ch);
if (ch>='0') and (ch<='9') then
   n:=n*10+ord(ch)-ord('0')
   else begin
   s:=s+n;
   n:=0
   end
end;
close(f);
if n<>0 then s:=s+n;
writeln(s:10:0)
end.
{Заголовок программы}
{Служебное слово – начало описания переменных}
{Описание целой переменной для найденного числа}
{Описание вещественной переменной для суммы}
{Описание переменной символьного типа (char)}
{Описание переменной f, для текстового файла}
{Начало программы}
{Отождествление переменной f с физическим файлом}
{Открытие файла f для чтения}
{Инициализация переменной для суммы}
{Инициализация переменной для числа}
{Пока не закончился файл}
{Начало инструкции цикла}
{Читаем символ из файла}
{Если прочитана цифра, то}
{К переменной n дописывается цифра справа}
{Иначе, начало инструкции иначе условного оператора }
{Сумма увеличивается на значение считанного числа}
{Инициализация переменной для числа}
{Конец инструкции иначе условного оператора}
{Конец инструкции цикла}
{Закрытие файла f}
{Если последнее число не 0, то добавим его с сумме}
{Вывод результата на экран}
{Конец программы}
 
 
Задания к третьей части
Упражнения:
1.     Реализуйте все приведенные примеры программ в среде Borland Pascal и протестируйте их.
2.     Измените программу одиннадцатого примера так, чтобы использовать вместо двух строчных переменных одну.
Задачи:
1.     Доработайте программу двенадцатого примера так, чтобы распознавались и отрицательные числа.
2.     Напишите программу, которая будет посимвольно считывать из файла вещественные числа и выводить их на экран.
3.     Напишите программу, которая ищет во входном текстовом файле, состоящем из строк произвольной длины слова «fly» (муха) и «cutlet» (котлета). Разложите мух и котлеты по двум разным выходным файлам. Мухи или котлеты из одной строки должны быть выведены через пробел в одной строке, а из разных строк – в разных. Пустых строк в выходных файлах быть не должно. Считаем, что все слова написаны только маленькими латинскими буквами.
Copyright © 2005–2017 ХабЦНИТ ТОГУ Отправить письмо
Создание сайтов в Хабаровске
уряд блокує біоетанол