Лекция 7.++Массивы в качестве параметров подпрограмм. Файлы. (Воробьева И.А. - Информатика. Язык Паскаль), страница 2
Описание файла
Файл "Лекция+7.++Массивы+в+качестве+параметров+подпрограмм.+Файлы." внутри архива находится в папке "Воробьева И.А. - Информатика. Язык Паскаль". PDF-файл из архива "Воробьева И.А. - Информатика. Язык Паскаль", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Остальные переменные должны бытьлокальными.(БЛОК *) для вставки в головной модуль, вместо функции-заглушкиFunction Otr (const Mt: Matrix; n1, m1: byte; out Sred: real): integer;Vari, j : integer;Sum: integer;Kol: integer;BeginSred:= -1;Kol:= 0;Sum:= 0;// индексы строк и столбцов// накапливаем сумму неотрицательных элементов// локальный счетчик отрицательных// собственная инициализация – это залог надежного// и независимого от компиляторов кода// обязательно инициализируем локальные переменныеfor i:=1 to n1 dofor j:=1 to m1 doif Mt[i,j] < 0 then inc(Kol)else Sum:=Sum+Mt[i,j];// увеличиваем счетчик отрицательных// накапливаем сумму// неотрицательных элементов89Воробьева И.А. «Информатика.
Язык Паскаль»// закончили просмотр матрицы с подсчетом числа// отрицательных и суммы неотрицательных элементов// матрицы и теперь исключим ошибку деления на нольif Kol <> (n1*m1) then// если есть неотрицательные,Sred:= (real)Sum/ ( n1*m1 – Kol ); // можем подсчитать ср. арифм.Otr:= Kol;End;Замечание 6.2. Мы не выводили среднее арифметическое на экран вкачестве результата, так как нас «не просили об этом» в задании (хотяна этапе отладки делать это вполне резонно). Выполнение программойстрогого соответствия заданию (не расширяем, не сокращаем, неизменяем) относится к критерию «правильность» в списке критериевкачества программного продукта1. В то же время аномалии иальтернативы – не относятся к данному замечанию, так как ониотвечают критерию надежности кода.Таблица 6.7.
Задачи на разработкупрограммы с использованием указанной в задании подпрограммыОбщая задачаСоставить п/п, которая проверяет есть ли хотя бы один «нулевой»элемент до K-й строки матрицы. Применить эту п/п для двухпрямоугольных целочисленных матриц.Уточнение задачиПо сути, в п/п надо проверить, что номер num первой строки, вкоторой найдется «нулевой» элемент, меньше K (либо «≤ K»). Ищемдо K-й строки не включительно, то есть по строгому условию.Уточнение важно для определения диапазонов параметров ирезультата. Для ситуаций: «до K-й строки не включительно» – «до K-й строки включительно» –1В список также входят критерии: работоспособность, надежность, читабельность, модифицируемость,документированность, эффективность и др.9Воробьева И.А.
«Информатика. Язык Паскаль»Решение этой задачи рассмотрим немного с иного ракурса. Еслипосмотреть ниже на блок-схему головного модуля, то мы, как ипрежде, увидим явно выделенную подзадачу, которая рассчитана наработу с определенным типом прямоугольных матриц и выполняеттребование к подпрограмме в «общей задаче».началоK, A(na,ma), B(nb,mb)вывод A(na,ma), B(nb,mb)na, ma, A, KА.0.1ПРОВЕРКА ДЛЯ «A»:номер строки с нулемNUM < K ?Flg+Flg = TRUE ?−«в A условиевыполнено»«в A условие невыполнено»nb, mb, В, KПРОВЕРКА ДЛЯ «В»:номер строки с нулемNUM < K ?А.0.110Flg+Flg = TRUE ?«в В условиевыполнено»−«в В условие невыполнено»конец1011Воробьева И.А.
«Информатика. Язык Паскаль»Следует отметить, что если просто написать процедуру илифункцию, реализующую A.0.1, так как показано в таблице 6.8, то этотолько начало понимания нисходящего метода проектирования.Таблица 6.8.(БЛОК **) для вставки в головной модуль,вместо процедуры-заглушки А.0.1constn= 10; // максимум 10 строкm= 10; // максимум 10 столбцовtypeMatr = array[1..n, 1..m] of integer;Procedure Proverka(K: byte; n, m: byte; const Mt: Matr; out flg: boolean);Vari, j: byte;num: byte;Beginflg:= false;num:= n;i:= 1; j:= 1;while( i <= n) AND NOT flg dobeginwhile (j <= m) AND NOT flg dobeginif Mt[i, j] <> 0 then beginnum:= i;flg:= false;end;inc(j);end;inc(i)end;if num < K then flg:= trueelse flg:= false;End;1112Воробьева И.А.
«Информатика. Язык Паскаль»На самом деле подзадача А.0.1 может содержать вложенныеподзадачи (что должно отражаться в отдельных блок-схемах болеенизкого уровня в спецификациях), причем, если писать программу срасчетом на гибкость и возможность использования, написанныхфункций, то вложение будет доходить до уровня А.0.1.1.1, как этопоказано в таблице 6.9. Одну процедуру заменили три функции,потребовалось немного больше времени потратить на разработкупроекта, но при этом мы получили следующие преимущества: число строк кода сократилось, несмотря на то, что добавленафункциональная проверка на аномальное значение параметра K; получено «без всяких накладных расходов» дополнительно двефункции, которые могут быть использованы в других задачах:− «проверка наличия «0» элемента в строке (столбце)»;− «получение номера первой строки (столбца) матрицы,содержащей «0» элемент»; использование этих функций без изменений, как для строк, так идля столбцов легко решается функцией транспонированияматрицы или переопределением типа матрицы; если функции написать чуть хитрее, просто добавив в них ещеодин параметр целого типа, то можно проверять в матрице истроке (столбце) наличие не только «0» элемента, но и любогоцелочисленного значения.Таким образом, код, приведенный в таблице 6.9, гораздо лучшесоответствует духу структурного программирования, чем код изтаблицы 6.8.Таблица 6.9.(БЛОК ***) для вставки в головной модуль,вместо функции-заглушки А.0.1constn= 10; // максимум 10 строкm= 10; // максимум 10 столбцовtypeVec = array[1..m] of integer; \\ целочисленный массивMatr = array[1..n] of Vec;\\ матрица представлена как\\ массив векторов1213Воробьева И.А.
«Информатика. Язык Паскаль»//_________ описание функции____ подзадача А.0.1.1.1_____//_________ Str – вектор (строка)//_________ m – его длина//_________ возвращает: vFlg – TRUE, если встретился элемент=0Function vFlg (m: byte; const Str: Vec): boolean;Varj : byte;\\ индексы элементов в вектореBeginj:= 1;while( j <= m) AND (Str[j] <>0) doinc(j);vFlg:= ( j <= m );\\ j = 1,.. ,m «0» есть, j=m+1 «0» нетEnd;//_________ описание функции____ подзадача А.0.1.1_____//_________ Mt – матрица//_________ n, m – ее размерность//_________ возвращает: sNum – номер строки с «0» или (n+1), если// ___________________________в матрице нет нулейFunction sNum (n, m: byte; const Mt: Matr): byte;Vari : byte;// индексы строкBegini:= 1;while( i <= n) AND NOT vFlg(m, Mt[i]) doinc(i);sNum:= i; \\ i = 1,..
,n – номер строки с «0»;\\ если i=n+1 нет строк с «0» вообщеEnd;//______________подзадача А.0.1__________________________Function mFlg (K: byte; n, m: byte; const Mt: Matr): integer;BeginmFlg:= -1; \\ признак аномалии – K вне допустимого диапазонаif (K >= 2) AND (K <= n) thenif ( sNum(n, m, Mt) < K then mFlg:= 1 \\ условие выполненоelse mFlg:= 0; \\ условие не выполненоEnd;1314Воробьева И.А. «Информатика. Язык Паскаль»7. ФАЙЛЫ В ПАСКАЛЕ7.1. Виды файлов. Файловые переменныеФайл — именованная область данных на носителе информации.В компьютере все программы и данные хранятся в долговременной(внешней) памяти компьютера в виде файлов.Имя файла состоит из двух частей, разделенных точкой, –название и расширение файла.Расширение указывает на типинформации, хранящейся в нем, что позволяет его правильносчитывать определенным устройствам и программам считывателям.Примеры соответствия типов и расширений:графический – “jpg”, “png”, “bmp”, “raw”;исполняемый код (программа) – “com”, “exe”;текстовый – “txt”, “doc”, “rtf”;видео-файл – “avi”, “mov”, “mpg”;аудио-файл – “wav”, “swa”.Хранение файла можно сравнить с хранением массивов, гдеэлементы расположены последовательно и представляют собойпростой тип или однотипную сложную структуру, связанную с типомфайла.
Каждый элемент файла имеет номер (позицию в файле),нумерация начинается с нуля, т.е. первый элемент файла будет иметьномер, равный «0».Различают файлы с последовательным доступом и спроизвольнымдоступом.Припоследовательномдоступесодержимое очередного элемента может быть прочитано только послепрочтения предыдущего. Чтобы прочитать в таком файле последнийэлемент, надо сначала прочитать весь файл. В файлах с произвольнымдоступом можно считывать элементы, перемещаясь на нужнуюпозицию в файле по номеру элемента.
Поэтому элементы в файле спроизвольным доступом должны иметь фиксированный размер, а вфайле с последовательным доступом это не обязательно.1415Воробьева И.А. «Информатика. Язык Паскаль»В Паскале различают три типа файлов: текстовый:− содержит коды графического представления символов(рассмотрим позже) скомпонованные построчно, длинастроки не превышает 255 символов и заканчиваетсяпризнаком «конец строки»;− это файлы с последовательным доступом;− их используют для работы с текстами; типизированный:− содержит элементы фиксированного размера, объявленноготипа (простого или структурированного);− это файлы с произвольным доступом;− наиболее удобны для работы с массивами данных, отличныхот простого текста, например записями баз данных; нетипизированный:− рассматривается как набор байтов;− это файлы с произвольным доступом;− они используются для быстрого обмена информацией,низкоуровневогосчитыванияданныхизфайлафиксированными блоками безо всякой предварительнойобработки.Для работы с файлами в Паскале существуют переменныефайлового типа (или дескриптор файла): описание файловой переменной текстового файла Имя_файловой_переменной : text;dat: TextFile; описание файловой переменной нетипизированного файла Имя_файловой_переменной : file;res: file; описание файловой переменной типизированного файла Имя_файловой_переменной : file of тип_элементов;fch: file of char;fint: file of integer;1516Воробьева И.А.