Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах.
Как научится читать по диагонали? Скорость чтения зависит от скорости восприятия каждого отдельного слова в тексте.
Как быстро и эффективно исправить почерк? Люди часто предполагают, что каллиграфия и почерк являются синонимами, но это не так.
Как научится говорить грамотно и правильно? Общение на хорошем, уверенном и естественном русском языке является достижимой целью.
- Обратная связь
- Правила сайта
Источник: www.soloby.ru
Уроки Arduino #1 — структура программы и типы данных
Модульное программирование
Сегодня термин «информатика» принято употреблять в двух смыслах:
- отдельное научное направление, изучающее информацию и информационные процессы, реализующее разработку и создание новых средств для работы с информацией;
- практическая область деятельности людей, непосредственно связанная с использованием компьютеров при обработке информации.
Одним из направлений информатики как науки является программирование – наука, которая изучает теорию и методы разработки, производства и эксплуатации программного обеспечения ЭВМ.
Грамотное написание компьютерных программ подразумевает не только хорошее знание различных языков и средств разработки, но и достаточно развитое алгоритмическое мышление. На протяжении последних десятилетий сложилась специальная практика обучения программированию. Согласно этой практике основной причиной неудач в процессе обучения является именно недостаток алгоритмического мышления.
Алгоритмическим мышлением называется умение выстраивать логически безупречную последовательность действий для получения решения поставленной задачи. Многолетний опыт показывает, что для развития алгоритмического мышления в первую очередь требуется тщательно прорабатывать алгоритмы для небольших, но полезных программ, которые формируют базовые приемы программирования. Таких приемов достаточно немного, однако их обобщение, накопление, и умение осознанно применять при решении практических задач дает возможность научиться писать программы практически любому человеку [3].
Все вышесказанное объясняет актуальность выбранной темы – разработка программного обеспечения для различных устройств сегодня является одним из основных направлений в области информатики. Однако, не зная базовых основ алгоритмов, очень сложно преуспеть в этом деле и быть хорошим специалистом в сфере программирования.
Объект исследования данной работы – языки программирования.
Предмет исследования –языки программирования высокого уровня.
[C++ Урок 1] Структура программы
Целью работы является классификация языков программирования.
Для достижения поставленной цели предстоит решить ряд задач:
- проанализировать литературу по заданной теме;
- дать определения основным терминам;
- привести классификацию языков программирования.
В качестве опорных источников при написании работы были использованы следующие: А.Ф. Новиков – «Учебно-методическое пособие по дисциплине «Технологические подходы к разработке программного обеспечения»» и В.В. Ммухортов – «Объектно-ориентированное программирование, анализ и дизайн»
1. ЯЗЫКИ ПРОГРАММИРОВАНИЯ
На протяжении всего развития языков программирования четко выделяется ряд тенденций, постоянно сменяющих друг друга и оказывающих влияние на технологии:
- смещение акцентов от частного к общему – переход от программирования мелких деталей к программированию более крупных компонентов;
- совершенствование и развитие прикладного инструментария программиста – создание новых методологий, языков программирования и рабочей среды;
- увеличение объема и сложности информационных и программных систем.
Именно расширение области использования вычислительной техники и информационных технологий являетсяс основной движущей силой прогресса в сфере программирования. На протяжении всей истории развития информационных технологий проводилось огромное множество прикладных исследований по методологии проектирования, декомпозиции, абстрагированию и иерархиям. Результатом данных исследований стало создание новых, более выразительных языков программирования [7].
Обычно под программированием понимается процесс разработки программ. Однако к этому же термину относятся и некоторые виды человеческой деятельности. Например, «политическое программирование» – термин, который часто используется в средствах массовой информации, или «математическое программирование» – специальный раздел математики. Применимо к созданию программ обычно используется выражение «разработка программного обеспечения» [14].
Таким образом, программированием (computer programming) называется процесс создания человеком-программистом информационной структуры — программы, целью которой является исполнение на компьютере.
В большинстве случаев в программировании важным является не только факт исполнения программы компьютером, но и факт использования полученного результата человеком. Однако, бываете и ряд исключений, примером которого является программа первоначальной загрузки операционной системы [12].
Таким образом, в процессе программирования выделяются следующие элементы:
- цель – выполнение программы, которое приводит к решению поставленной задачи или публикация ее текста;
- субъект – человек, осознанно ведущий процесс программирования, или другая программа (в случае автоматического синтеза программы, при этом процесс не является осознанным, а программа может быть выражена на языке нейрокомпьютера или не иметь материального носителя);
- объект – текст, записанный на формальном языке [10].
Сегодня результативность и эффективность программирования в целом оставляет желать лучшего. Несмотря на массовое распространение компьютеров и быстрый рост характеристик их программного и аппаратного обеспечения, весьма значительной остается доля неудачных проектов, целью которых является разработка программного обеспечения. Наряду с эффектными достижениями имеются и сравнительно многочисленные досадные неудачи. К сожалению, до сих пор слишком часто приходится делать вывод, что программирование рискованно, программы ненадежны, а программисты неуправляемы [6].
Нельзя отрицать существование проблем в области программирования. Лучшие программисты, ведущие предприятия и компьютерное сообщество в целом постоянно тратят значительные и все возрастающие усилия на решение этих проблем. Результатом этой деятельности стало создание нескольких специализированных отраслей науки. Дисциплина, главной задачей которой является решение внутренних проблем программирования, называется технологией программирования, или инженерии программных систем. Последний термин является точным переводом английского термина «software engineering».
Технология программирования (software engineering) представляет собой совокупность средств и методов, которая позволяет налаживать производственный процесс создания программного обеспечения.
Ключевым словом в данном определении является «производственный», так как оно отражает главную особенность технологии программирования. Например, с точки зрения информатики (computer science), указание на производственный характер дисциплины отсутствует [15].
Информатикой называется дисциплина, предметом изучения которой являются общие свойства информации, а также вопросы, связанные с ее накоплением, хранением и обработкой.
Информатика тесно связана с программированием за счет того, что в современном мире функции накопления, хранения и обработки информации реализуются при помощи программного обеспечения компьютеров.
Соотношение информатики и технологии программирования является сложным вопросом. Информатика представляет собой более общее понятие, однако нельзя считать технологию программирования отдельной частью информатики. В настоящее время вопросы теоретического характера относят к информатике, а практические приемы решения задач считаются элементами технологии программирования. Например, методы математического доказательства правильности программ относятся к теоретической информатике, а методы тестирования – к технологии программирования, хотя это совершенно разные методы решения одной задачи. Важно отметить, что такое отделение технологии программирования от информатики является условным [8].
1.1. Первое поколение
Первые языки программирования были очень сложны. Схема их развития отражена в таблице 1.
Таблица 1 – Первые языки программирования
Источник: www.evkova.org
Модульное программирование Понятие модуля Приступая к разработке
Понятие модуля Приступая к разработке программы, следует иметь в виду, что она, как правило, является большой системой, поэтому необходимо принять меры для ее упрощения. Для этого программу разрабатывают по частям, которые называются программными модулями. Такой метод создания программ называют модульным программированием. Модульное программирование основано на понятии модуля — программы или функционально завершенного фрагмента программы.
Свойства модуля • один вход и один выход. На входе программный модуль получает определенный набор исходных данных, выполняет их обработку и возвращает один набор выходных данных; • функциональная завершенность. Модуль выполняет набор определенных операций для реализации каждой отдельной функции, достаточных для завершения начатой обработки данных; • логическая независимость. Результат работы данного фрагмента программы не зависит от работы других модулей; • слабые информационные связи с другими программными модулями. Обмен информацией между отдельными модулями должен быть минимален; • размер и сложность программного элемента в разумных рамках.
Основные характеристики программного модуля • Размер модуля — число содержащихся в нем операторов • Прочность модуля — мера его внутренних связей. Чем выше прочность модуля, тем больше связей скрыто от внешней по отношению к нему части программы и, следовательно, тем проще сама программа • Сцепление модуля — мера его зависимости по способу передачи данных от других модулей • Рутинность модуля — независимость от предыстории обращений к модулю • Связность модуля — мера прочности соединения функциональных и информационных объектов внутри одного модуля
Прочность модуля мера его внутренних связей Самой слабой степенью прочности обладает модуль, прочный по совпадению. В данном случае в программный модуль оформляется повторяющаяся в нескольких местах программы последовательность операторов.
Если вдруг возникнет необходимость изменения этой последовательности в одном из контекстов, придется изменять сам модуль, что может сделать его использование в других контекстах ошибочным. Такой класс программных модулей не рекомендуется для использования. Функционально прочный модуль — это модуль, реализующий одну какуюлибо определенную функцию.
При этом он может использовать и другие модули. Такой вид прочности модулей рекомендуется для использования. Высшей степенью прочности обладает информационно прочный модуль — это модуль, выполняющий несколько операций над одной и той же структурой данных, которая неизвестна вне этого модуля.
Для каждой из этих операций в таком модуле имеется свой вход со своей формой обращения к нему. Информационно прочный модуль может реализовывать, например, абстрактный тип данных (объект. АД).
Сцепление модуля мера его зависимости по способу передачи данных от других модулей Чем слабее сцепление модуля с другими модулями, тем сильнее его независимость от других модулей. Для оценки степени сцепления существует шесть видов сцепления модулей по: • данным; • образцу; • управлению; • внешним ссылкам; • общей области данных; • содержимому. Худшим видом сцепления модулей является сцепление по содержимому. Таким является сцепление двух модулей, когда один из них имеет прямые ссылки на содержимое другого модуля (например, на константу, содержащуюся в другом модуле). Такое сцепление модулей недопустимо. Лучший вид – сцепление по данным
Сцепление модуля. Продолжение Не рекомендуется использовать также сцепление по общей области — это такое сцепление модулей, когда несколько модулей используют одну и ту же область памяти. Сцепление по образцу предполагает, что модули обмениваются данными, объединенными в структуры. Этот тип обеспечивает неплохие характеристики по сравнению с предыдущими.
Недостаток заключается в том, что конкретные передаваемые данные «спрятаны» в структуры, и потому уменьшается «прозрачность» связи между модулями. Кроме того, при изменении структуры передаваемых данных необходимо модифицировать все использующие ее модули.
При сцеплении по управлению один модуль посылает другому некоторый информационный объект (флаг), предназначенный для управления внутренней логикой модуля. Таким способом часто выполняют настройку режимов работы программного обеспечения. Подобные настройки также снижают наглядность взаимодействия модулей и потому обеспечивают не лучшие характеристики технологичности разрабатываемого программного обеспечения. Сцепление по внешним ссылкам предполагает, что модули ссылаются на один и тот же глобальный элемент данных Рекомендуется использовать сцепление по данным (параметрическое сцепление) — это случай, когда данные передаются модулю либо при обращении к нему как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Такой вид сцепления модулей реализуется на языках программирования при использовании обращений к процедурам (функциям).
Рутинность модуля независимость от предыстории обращений Модуль будем называть рутинным, если результат обращения к нему зависит только от значений его параметров и не зависит от результатов предыдущих обращений к нему. Модуль будем называть зависящим от предыстории, если результат обращения к нему зависит от внутреннего состояния этого модуля, хранящего следы предыдущих обращений к нему. Использовать зависящие от предыстории модули рискованно, так как они провоцируют появление в программах неуловимых ошибок. Однако во многих случаях именно зависящий от предыстории модуль является наиболее информационно прочным. Поэтому более приемлема следующая рекомендация: • всегда следует использовать рутинный модуль, если это не приводит к плохим сцеплениям модулей; • зависящие от предыстории модули следует использовать только в случае, когда это необходимо для обеспечения параметрического сцепления; • в спецификации зависящего от предыстории модуля должна быть четко сформулирована эта зависимость таким образом, чтобы было возможно прогнозировать поведение данного модуля при разных последующих обращениях к нему.
Связность модулей мера прочности соединения функциональных и информационных объектов внутри одного модуля Размещение сильно связанных элементов в одном модуле уменьшает межмодульные связи, в то время как помещение сильно связанных элементов в разные модули не только усиливает межмодульные связи, но и усложняет понимание их взаимодействия. Объединение слабо связанных элементов также уменьшает технологичность модулей, делая их сложнее для понимания. Различают следующие виды связности (в порядке убывания уровня) : • функциональную; • последовательную; • информационную (коммуникативную); • процедурную; • временную; • логическую; • случайную.
Связность модулей. Продолжение При функциональной связности модуль предназначен для выполнения одной функции. Его исходные данные и операции предназначены для решения одной конкретной задачи. Такой модуль имеет максимальную связность и, как следствие, хорошую технологичность (простота компиляции, тестирования, со- провождения).
При последовательной связности модуля результат обработки данных одной функцией служит исходными данными для другой функции. Такой модуль реализует одну подпрограмму, выполняющую две функции. Модуль с последовательной связностью функций можно разбить на два модуля или более, как с последовательной, так и с функциональной связностью.
При этом данные, используемые последовательными функциями, также связаны последовательно. Такой модуль выполняет несколько функций, и, следовательно, его технологичность хуже с точки зрения понимания и тестирования. Информационно связанными считают функции, обрабатывающие одни и те же данные. Информационно связанный модуль имеет неплохие показатели технологичности, так как все функции, работающие с одними и теми же данными, собраны в один модуль, что позволяет при изменении формата данных корректировать только его. Данные, которые обрабатываются одной функцией, также считают информационно связанными.
Связность модулей. Продолжение Логическая связь строится на основе объединения данных или функций в одну логическую группу, например, логически связаны компоненты модуля, содержащего функции обработки текстовой информации или данные одного и того же типа. При выполнении модуля с логически связанными компонентами всегда будет вызываться одна какая-либо его часть, при этом вызывающий и вызываемый модули будут связаны по управлению. Показатели технологичности таких модулей ниже предыдущих, так как сложно понять логику их работы. Модуль, элементы которого имеют случайную связность, имеет самые низкие показатели технологичности, так как его элементы вообще не связаны.
Сравнительные характеристики различных видов связности Вид связности Сцепле- Наглядность ние, (понятность) балл Возможность Сопровождаизменения емость Функциональная 10 Хорошая Последовательная 9 Хорошая Информационная 8 Средняя Процедурная 5 Средняя Плохая Временная 3 Средняя Плохая Логическая 1 Плохая Случайная 0 Плохая
Модульная структура программных продуктов Модульная структура программы представляет собой древовидную структуру, в узлах которой размещаются программные модули, а направленные дуги показывают статическую подчиненность модулей. Если в тексте модуля имеется ссылка на другой модуль, то их на структурной схеме соединяет дуга, которая исходит из первого и входит во второй модуль. Функция верхнего уровня обеспечивается главным модулем; он управляет выполнением нижестоящих функций, которым соответствуют подчиненные модули. При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующее: 1) модуль вызывается на выполнение вышестоящим по иерархии модулем и, закончив работу, возвращает ему управление; 2) принятие основных решений в алгоритме выносится на максимально высокий по иерархии уровень; 3) если в разных местах алгоритма используется одна и та же функция, то она оформляется в отдельный модуль, который будет вызываться по мере необходимости. Состав, назначение и характер использования программных модулей в значительной степени определяются инструментальными средствами.
Методы разработки при модульном программировании Существуют разные методы разработки модульной структуры Программы, в зависимости от которых определяется порядок программирования и отладки модулей, указанных в этой структуре. Обычно в литературе обсуждаются два метода: метод восходящей разработки и метод нисходящей разработки.
Метод восходящей разработки Сначала строится древовидная модульная структура программы. Затем поочередно проектируются и разрабатываются модули программы, начиная с модулей самого нижнего уровня, затем предыдущего уровня и т. д. То есть модули реализуются в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может обращаться. После того как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же восходящем порядке. Достоинство метода заключается в том, что каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули. Недостатки метода восходящей разработки заключаются в следующем: • на нижних уровнях модульной структуры спецификации могут быть еще определены не полностью, что может привести к полной переработке этих модулей после уточнения спецификаций на верхнем уровне; • для восходящего тестирования всех модулей, кроме головного, который является модулем самого верхнего уровня, приходится создавать вызывающие программы, что приводит к созданию большого количества отладочного материала, но не гарантирует, что результаты тестирования верны; • головной модуль проектируется и реализуется в последнюю очередь, что не дает продемонстрировать его заказчику для уточнения спецификаций.
Метод нисходящей разработки Как и в предыдущем методе, сначала строится модульная структура программы в виде дерева. Затем проектируются и реализуются модули программы, начиная с модуля самого верхнего уровня — головного, далее разрабатываются модули уровнем ниже и т. д. При этом переход к программированию какого-либо модуля осуществляется только в том случае, если уже запрограммирован модуль, который к нему обращается.
Затем производится их поочередное тестирование и отладка в таком же нисходящем порядке. При таком порядке разработки программы вся необходимая глобальная информация формируется своевременно, т. е. ликвидируется весьма неприятный источник просчетов при программировании модулей. Существенно облегчается и тестирование модулей, производимое при нисходящем тестировании программы. Первым тестируется головной модуль программы, который представляет всю тестируемую программу, при этом все модули, к которым может обращаться головной, заменяются их имитаторами (так называемыми «заглушками» Недостатком нисходящего подхода к программированию является необходимость абстрагироваться от реальных возможностей выбранного языка программирования и придумывать абстрактные операции, которые позже будут реализованы с помощью модулей. Однако способность к таким абстракциям является необходимым условием разработки больших программных средств.
Рассмотренные методы (нисходящей и восходящей разработок), являющиеся классическими, требуют, чтобы модульная древовидная структура была готова до начала программирования модулей. Как правило, точно и содержательно разработать структуру программы до начала программирования невозможно. При конструктивном и архитектурном подходах к разработке модульная структура формируется в процессе реализации модулей.
Источник: present5.com