Практикум для изучения дисциплины «Основы программирования»



Pdf көрінісі
бет39/81
Дата08.07.2020
өлшемі1,55 Mb.
#74978
түріПрактикум
1   ...   35   36   37   38   39   40   41   42   ...   81
Байланысты:
А.А. Тюгашев

записями) файла осуществляется в Паскале с учетом порядкового номера, 
начиная с нуля. После открытия файла указатель стоит в его начале. После 
каждого  чтения  или  записи  указатель  сдвигается  к  следующему 
компоненту  с  изменением  номера  записи.  Чтение  из  файла  на  Паскале 
выглядит следующим образом: 
Read(f, <
список переменных>); 
Типы  записей файла  и переменных должны  совпадать.  Необходимо  либо 
точно рассчитывать количество компонентов, либо перед каждым чтением 


71 
 
данных  выполнять  проверку  их  существования,  для  чего  использовать 
специальную  функцию  EOF(f),  которая  возвращает  true,  если  при 
чтении  очередной  записи  достигнут  конец  файла —  прочитан  последний 
элемент в файле или файл после открытия оказался пуст. 
Запись в файл выглядит так: 
Write(f, <
список переменных>); 
Возможно смещение указателя файла без фактического чтения. Процедура 
Seek(f,n)
 
смещает указатель файла f на n-ную позицию. 
Весьма важная операция — определение длины файла (количества записей 
при  структурированном  доступе  и  количества  байтов —  при 
неструктурированном).  Функция  FileSize(f)  возвращает  количество 
компонентов в файле f. FilePos(f) возвращает позицию указателя. 
Текстовый  файл  воспринимается  как  совокупность  строк,  разделенных 
символом  перевода  строки.  Доступ  к  каждой  строке  возможен 
последовательно,  начиная  с  первой.  Одновременные  запись  и  чтение 
запрещены. 
Бинарные  файлы  воспринимаются  как  последовательность  байтов — 
подобным образом можно работать с файлами произвольных типов. 
Открытие нетипизированного файла на чтение и запись соответственно в 
Паскале выглядит так: 
Reset(f, BufSize) 
Rewrite(f, BufSize) 
Параметр  BufSize  задает  число  байтов,  считываемых  из  файла  или 
записываемых  в  него  за  одно  обращение.  Минимальное  значение 
BufSize
 — 
1  байт,  если  BufSize  не  указан,  то  по  умолчанию  он 
принимается  равным  128.  Чтение  данных  из  нетипизированного  файла 
выглядит следующим образом: 
BlockRead(f, X, n, QuantBlock); 
Эта  процедура  осуществляет  за  одно  обращение  чтение  в  переменную  X 
количества блоков, заданного параметром n, при этом длина блока равна 
длине буфера. Необязательный параметр QuantBlock возвращает число 
блоков,  прочитанных  текущей  операцией.  Запись  данных  в 
нетипизированный файл производится аналогично: 
BlockWrite(f, X, Count, QuantBlock); 
Для  нетипизированных  файлов  можно  также  использовать  Seek, 
FIlePos
 
и EOF. 


72 
 
Контрольные вопросы 
1. 
Что  такое  записи  в  языках  программирования?  В  чем  заключается 
назначение записей? В чем состоит связь между определением записи и 
объявлением типа данных?  
2. 
Что  такое  файл?  Опишите  основные  операции  над  файлами  в  языках 
программирования. 
3. 
В  чем  заключается  разница  в  работе  с  текстовыми  и  бинарными 
файлами? 
4. 
Какие существуют режимы доступа к файлам? 
5. 
Зачем используется указатель на файл? 
6. 
В  чем  разница  между  структурированным  и  байтовым  (блочным) 
доступом к файлу? 
7. 
В чем назначение функции eof? Приведите пример ее использования. 
Структурирование программ,  принцип 
модульности 
 
Современные программные комплексы зачастую содержат тысячи, десятки 
тысяч и даже миллионы строк исходного текста на языке высокого уровня. 
Их  сложность  современных  потрясает.  Единственным  способом 
справиться  со  сложностью,  известным  человечеству  с  незапамятных 
времен,  является  принцип  «разделяй  и  властвуй»,  или  решение  сложной 
задачи путем разбиения ее на менее сложные подзадачи. 
Программирование  не  является  исключением.  Принятым  термином  для 
обозначения  самостоятельной  части  программы,  обособленной  в 
соответствии  с  некоторыми  принципами,  приводимыми  ниже,  является 
модуль.  В  различных  языках  программирования  могут  использоваться  и 
другие  похожие  термины,  например  «пакет»  или  «компонент».  В 
объектно-ориентированном программировании в качестве аналога модулей 
часто  рассматриваются  классы.  Иногда  модули  хранятся  по  принципу 
«один  модуль»  -  «один  файл  исходного  текста  программы».  Часто  при 
этом  модули  компилируются  по  отдельности,  и  затем  из  них  собирается 
полностью программа. 
Если программа разбита на модули, мы получаем целый ряд преимуществ. 
Так,  можно  поручить  создание  разных  модулей  разным  программистам, 
распараллелив  работу,  тем  самым  избавив  каждого  программиста  от 
необходимости перетруждаться и ускорив процесс. Сложность разработки 
и тестирования отдельно взятого модуля при этом вполне может оказаться 


73 
 
«по  силам»  обыкновенному  программисту,  а  не  гению,  способному 
удержать в голове сотни тысяч операторов и переменных единой большой 
программы.  Более  того,  можно  реализовывать  программу  «по  частям», 
сначала создав главный модуль, обращающийся к остальным, а вместо них 
поначалу  использовать  так  называемые  «заглушки»,  постепенно 
наполняемые содержимым. 
Важнейшим  преимуществом  модульности  является  возможность  так 
наызываемого  повторного  использования  кода.  В  случае,  если  у  нас 
имеется  написанный  ранее  и  отлаженный  модуль,  можно  при 
необходиморсти его использовать и в последующих программах без затрат 
труда,  времени  и  ресурсов.  Вообще,  в  программировании  при  создании 
нового  продукта  процессы  выглядят  весьма  отсталыми  по  сравнению  с 
такими  инженерными  дисциплинами,  как  строительство  или 
машиностроение,  где  инженер-конструктор,  не  задумываясь,  использует 
стандартные типовые шурупы, болты и даже значительно более сложные 
узлы  и  сборки  при  создании  нового  изделия.  Использование  как  можно 
большего  числа  ранее  созданных  модулей  –  правильный  подход  к 
проектированию  сложной  программной  системы.  В  свою  очередь, 
инженер-программист  должен  при  написании  каждого  модуля  задаться 
вопросом, а не возможно ли его последующее повторное использование и 
как нужно доработать/изменить модуль для этого в случае необходимости. 
В  идеале  при  производстве  программного  обеспечения  было  бы  неплохо 
иметь  возможность  собирать  новые  приложения,  взяв  все  необходимые 
компоненты из соответствующих библиотек. 
Естественно, модули в программе должны быть согласованы между собой 
по  интерфейсу,  под  которым  понимается  порядок  вызова  модуля, 
передачи ему входных данных (и их стуруктура) и получения результатов 
его работы. 
Весьма важна также так называемая инкапсуляция – или, выражаясь проще, 
сокрытие  «внутренностей»  модуля  от  доступа  извне.  Так,  данные  внутри 
модуля  обычно  недоступны  из  других  модулей,  за  исключением 
специально  указываемых  случаев.  Это  предохраняет  их  от  случайной 
порчи  информации  и  повышает  надежность  программного  комплекса  в 
целом.  
Еще одним важным преимуществом модульной программы с разделением 
доступа  к  данным  внутри  модулей  является  упрощение  модификации. 
Часто  достаточно  для  модификации  большой  программы  лишь  заменить 
один модуль другим – исправленным, более эффективным, и пр. При этом 
подобная замена никак не влияет на остальные модули. Когда необходимо 
устранить  ошибку  или  улучшить  некую  функцию,  модульность  помогает 
ограничить  поиск  неисправных  или  подлежащих  модернизации  частей 


74 
 
конкретными компонентами. 
Чтобы  максимизировать  эффект  от  модульности,  программист  должен 
стараться создавать модули, имеющие высокую связность внутри модуля и 
низкую  связность  между  модулями.  Это  –  целое  искусство,  и  в  больших 
программных  проектах  является  одной  из  задач  гуру  программирования, 
выполняющего  роль  архитектора  системы.  Межмодульная  связность 
характеризует  зависимость  между  модулями,  когда,  например,  модуль  А 
использует  некую  подпрограмму,  располагающуюся  в  модуле  Б,  или 
функция  в  модуле  Б  обращается  к  данным  модуля  В  (существует 
множество возможных видов связи между модулями). 
Несмотря  на  то,  что  способность  правильно  проектировать  модульную 
программную  систему  обычно  приходит  с  опытом,  приведем  несколько 
простых  эмпирических  правил,  помогающих  с  пользой  применять 
модульность при написании программ. Итак: 
1) 
Хорошо, 
если 
программный 
модуль 
реализует 
некую 
самостоятельную независимую функциональность; 
2) 
Желательно, чтобы каждый модуль был как можно более простым и 
обозримым (до 100 строк); 
3) 
Данные  внутри  модуля  должны  максимально  использоваться 
подпрограммами  и  функциями,  находящимися  в  этом  модуле,  и  не 
использоваться из других модулей. 
 
Язык программирования Си 
Эффективность,  эффективность  и  еще  раз 
эффективность! 


Достарыңызбен бөлісу:
1   ...   35   36   37   38   39   40   41   42   ...   81




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет