<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Два студента пишут лабы &#187; Теория программирования</title>
	<atom:link href="http://www.studcode.ru/archiv/category/konspekty/teoriya-programmirovaniya/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.studcode.ru</link>
	<description>Конспекты лекций, самостоятельные работы по  delphi, с++, php. Курсовые проекты. Все что мы сделали вы можете скачать без проблем!</description>
	<lastBuildDate>Wed, 27 Oct 2010 15:15:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Документирование программных средств</title>
		<link>http://www.studcode.ru/archiv/dokumentirovanie-programmnyx-sredstv/</link>
		<comments>http://www.studcode.ru/archiv/dokumentirovanie-programmnyx-sredstv/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 22:09:40 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=516</guid>
		<description><![CDATA[Документация, создаваемая в процессе разработки программных средств.
При разработке ПС создается большой объем разнообразной документации. Она необходима как средство передачи информации между разработчиками ПС, как средство управления разработкой ПС и как средство передачи пользователям информации, необходимой для применения и сопровождения ПС. На создание этой документации приходится большая доля стоимости ПС.
Эту документацию можно разбить на две группы [...]]]></description>
			<content:encoded><![CDATA[<h4>Документация, создаваемая в процессе разработки программных средств.</h4>
<p>При разработке ПС создается большой объем разнообразной документации. Она необходима как средство передачи информации между разработчиками ПС, как средство управления разработкой ПС и как средство передачи пользователям информации, необходимой для применения и сопровождения ПС. На создание этой документации приходится большая доля стоимости ПС.</p>
<p>Эту документацию можно разбить на две группы :</p>
<ul>
<li>Документы управления разработкой ПС.</li>
<li>Документы, входящие в состав ПС.</li>
</ul>
<p><span id="more-516"></span></p>
<p><em>Документы управления разработкой ПС (process documentation)</em>, протоколируют процессы разработки и сопровождения ПС, обеспечивая связи внутри коллектива разработчиков и между коллективом разработчиков и <em>менеджерами </em>(managers) &#8211; лицами, управляющими разработкой. Эти документы могут быть следующих типов :</p>
<ul>
<li><em>Планы, оценки, расписания</em>. Эти документы создаются менеджерами для прогнозирования и управления процессами разработки и сопровождения.</li>
<li><em>Отчеты об использовании ресурсов в процессе разработки</em>. Создаются менеджерами.</li>
<li><em>Стандарты</em>. Эти документы предписывают разработчикам, каким принципам, правилам, соглашениям они должны следовать в процессе разработки ПС. Эти стандарты могут быть как международными или национальными, так и специально созданными для организации, в которой ведется разработка данного ПС.</li>
<li><em>Рабочие документы</em>. Это основные технические документы, обеспечивающие связь между разработчиками. Они содержат фиксацию идей и проблем, возникающих в процессе разработки, описание используемых стратегий и подходов, а также рабочие (временные) версии документов, которые должны войти в ПС.</li>
<li><em>Заметки и переписка</em>. Эти документы фиксируют различные детали взаимодействия между менеджерами и разработчиками.</li>
</ul>
<p><em>Документы, входящие в состав ПС (product documentation)</em>, описывают программы ПС как с точки зрения их применения пользователями, так и с точки зрения их разработчиков и сопроводителей (в соответствии с назначением ПС). Здесь следует отметить, что эти документы будут использоваться не только на стадии эксплуатации ПС (в ее фазах применения и сопровождения), но и на стадии разработки для управления процессом разработки (вместе с рабочими документами) &#8211; во всяком случае они должны быть проверены (протестированы) на соответствие программам ПС. Эти документы образуют два комплекта с разным назначением:</p>
<ul>
<li>Пользовательская документация ПС (П-документация).</li>
<li>Документация по сопровождению ПС (С-документация).</li>
</ul>
<h4>Пользовательская документация программных средств.</h4>
<p><em>Пользовательская документация ПС (user documentation)</em> объясняет пользователям, как они должны действовать, чтобы применить данное ПС. Она необходима, если ПС предполагает какое-либо взаимодействие с пользователями. К такой документации относятся документы, которыми руководствуется пользователь при <em>инсталяции </em>ПС (при установке ПС с соответствующей настройкой на среду применения ПС), при применении ПС для решения своих задач и при управлении ПС (например, когда данное ПС взаимодействует с другими системами). Эти документы частично затрагивают вопросы сопровождения ПС, но не касаются вопросов, связанных с модификацией программ.</p>
<p>В связи с этим следует различать две категории пользователей ПС: ординарных пользователей ПС и администраторов ПС. <em>Ординарный пользователь ПС (end-user) </em>использует ПС для решения своих задач (в своей предметной области). Это может быть инженер, проектирующий техническое устройство, или кассир, продающий железнодорожные билеты с помощью ПС. Он может и не знать многих деталей работы компьютера или принципов программирования. <em>Администратор ПС (system administrator) </em>управляет использованием ПС ординарными пользователями и осуществляет сопровождение ПС, не связанное с модификацией программ. Например, он может регулировать права доступа к ПС между ординарными пользователями, поддерживать связь с поставщиками ПС или выполнять определенные действия, чтобы поддерживать ПС в рабочем состоянии, если оно включено как часть в другую систему.</p>
<p>Состав пользовательской документации зависит от аудиторий пользователей, на которые ориентировано данное ПС, и от режима использования документов. Под <em>аудиторией </em>здесь понимается контингент пользователей ПС, у которого есть необходимость в определенной пользовательской документации ПС. Удачный пользовательский документ существенно зависит от точного определения аудитории, для которой он предназначен. Пользовательская документация должна содержать информацию, необходимую для каждой аудитории. Под <em>режимом использования </em>документа понимается способ, определяющий, каким образом используется этот документ. Обычно пользователю достаточно больших программных систем требуются либо документы для изучения ПС (использование в виде <em>инструкции</em>), либо для уточнения некоторой информации (использование в виде <em>справочника</em>).</p>
<p>В соответствии с работами можно считать типичным следующий состав пользовательской документации для достаточно больших ПС:</p>
<ul>
<li><em>Общее функциональное описание ПС</em>. Дает краткую характеристику функциональных возможностей ПС. Предназначено для пользователей, которые должны решить, насколько необходимо им данное ПС.</li>
<li><em>Руководство по инсталяции ПС</em>. Предназначено для системных администраторов. Он должен детально предписывать, как устанавливать системы в конкретной среде. Он должен содержать описание машинно-считываемого носителя, на котором поставляется ПС, файлы, представляющие ПС, и требования к минимальной конфигурации аппаратуры.</li>
<li><em>Инструкция по применению ПС</em>. Предназначена для ординарных пользователей. Содержит необходимую информацию по применению ПС, организованную в форме удобной для ее изучения.</li>
<li><em>Справочник по применению ПС</em>. Предназначен для ординарных пользователей. Содержит необходимую информацию по применению ПС, организованную в форме удобной для избирательного поиска отдельных деталей.</li>
<li><em>Руководство по управлению ПС</em>. Предназначено для системных администраторов. Оно должно описывать сообщения, генерируемые, когда ПС взаимодействует с другими системами, и как реагировать на эти сообщения. Кроме того, если ПС использует системную аппаратуру, этот документ может объяснять, как сопровождать эту аппаратуру.</li>
</ul>
<p>Как уже говорилось ранее (см. лекцию 4), разработка пользовательской документации начинается сразу после создания внешнего описания. Качество этой документации может существенно определять успех ПС. Она должна быть достаточно проста и удобна для пользователя (в противном случае это ПС, вообще, не стоило создавать). Поэтому, хотя черновые варианты (наброски) пользовательских документов создаются основными разработчиками ПС, к созданию их окончательных вариантов часто привлекаются профессиональные технические писатели. Кроме того, для обеспечения качества пользовательской документации разработан ряд стандартов (см. например, [13.2]), в которых предписывается порядок разработки этой документации, формулируются требования к каждому виду пользовательских документов и определяются их структура и содержание .</p>
<h4>Документация по сопровождению программных средств.</h4>
<p><em>Документация по сопровождению ПС (system documentation) </em>описывает ПС с точки зрения ее разработки. Эта документация необходима, если ПС предполагает изучение того, как оно устроена (сконструирована), и модернизацию его программ. Как уже отмечалось, сопровождение &#8211; это продолжающаяся разработка. Поэтому в случае необходимости модернизации ПС к этой работе привлекается специальная команда разработчиков-сопроводителей. Этой команде придется иметь дело с такой же документацией, которая определяла деятельность команды первоначальных (основных) разработчиков ПС, &#8211; с той лишь разницей, что эта документация для команды разработчиков-сопроводителей будет, как правило, чужой (она создавалась другой командой). Команда разработчиков-сопроводителей должна будет изучать эту документацию, чтобы понять строение и процесс разработки модернизируемого ПС, и внести в эту документацию необходимые изменения, повторяя в значительной степени технологические процессы, с помощью которых создавалось первоначальное ПС.</p>
<p>Документация по сопровождению ПС можно разбить на две группы:</p>
<p>(1) документация, определяющая строение программ и структур данных ПС и технологию их разработки;</p>
<p>(2) документацию, помогающую вносить изменения в ПС.</p>
<p>Документация первой группы содержит итоговые документы каждого технологического этапа разработки ПС. Она включает следующие документы:</p>
<ul>
<li>Внешнее описание ПС .</li>
<li>Описание архитектуры ПС, включая внешнюю спецификацию каждой ее программы.</li>
<li>Для каждой программы ПС &#8211; описание ее модульной структуры, включая внешнюю спецификацию каждого включенного в нее модуля.</li>
<li>Для каждого модуля &#8211; его спецификация и описание его строения .</li>
<li>Тексты модулей на выбранном языке программирования.</li>
<li>Документы установления достоверности ПС, описывающие, как устанавливалась достоверность каждой программы ПС и как информация об установлении достоверности связывалась с требованиями к ПС.</li>
</ul>
<p>Документы установления достоверности ПС включают прежде всего документацию по тестированию (схема тестирования и описание комплекта тестов), но могут включать и результаты других видов проверки ПС, например, доказательства свойств программ.</p>
<p>Документация второй группы содержит</p>
<ul>
<li>Руководство по сопровождению ПС, которое описывает известные проблемы вместе с ПС, описывает, какие части системы являются аппаратно- и программно-зависимыми, и как развитие ПС принято в расчет в его строении (конструкции).</li>
</ul>
<p>Общая проблема сопровождения ПС &#8211; обеспечить, чтобы все его представления шли в ногу (оставались согласованными), когда ПС изменяется. Чтобы этому помочь, связи и зависимости между документами и их частями должны быть зафиксированы в базе данных управления конфигурацией.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/dokumentirovanie-programmnyx-sredstv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Внешнее описание программного средства</title>
		<link>http://www.studcode.ru/archiv/vneshnee-opisanie-prog/</link>
		<comments>http://www.studcode.ru/archiv/vneshnee-opisanie-prog/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:58:52 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=514</guid>
		<description><![CDATA[Назначение внешнего описания программного средства и его роль в обеспечении качества программного средства.
Разработчикам больших программных средств приходится решать весьма специфические и трудные проблемы, особенно, если это ПС должно представлять собой программную систему нового типа, в плохо компьютеризированной предметной области. Разработка ПС начинается с этапа формулирования требований к ПС, на котором, исходя из довольно смутных пожеланий [...]]]></description>
			<content:encoded><![CDATA[<h4>Назначение внешнего описания программного средства и его роль в обеспечении качества программного средства.</h4>
<p>Разработчикам больших программных средств приходится решать весьма специфические и трудные проблемы, особенно, если это ПС должно представлять собой программную систему нового типа, в плохо компьютеризированной предметной области. Разработка ПС начинается с этапа формулирования требований к ПС, на котором, исходя из довольно смутных пожеланий заказчика, должен быть получен документ, достаточно точно определяющий задачи разработчиков ПС. Этот документ мы называем <em>внешним описанием </em>ПС (в литературе его часто называют <em>спецификацией требований</em>).</p>
<p>Внешнее описание ПС играет роль точной постановки задачи, решение которой должно обеспечить разрабатываемое ПС. Более того, оно должно содержать всю информацию, которую необходимо знать пользователю для применения ПС. Оно является исходным документом для трех параллельно протекающих процессов: разработки текстов программ, входящих в ПС, разработки документации по применению ПС и разработки существенной части комплекта тестов для тестирования ПС. Ошибки и неточности во внешнем описании, в конечном счете, трансформируются в ошибки самой ПС и обходятся особенно дорого, во-первых, потому, что они делаются на самом раннем этапе разработки ПС, и, во-вторых, потому, что они распространяются на три параллельных процесса. Это требует особенно серьезных мер по их предупреждению.</p>
<p><span id="more-514"></span></p>
<p>Исходным документом для разработки внешнего описания ПС являются <em>определение требований </em>к ПС. Но так как через этот документ передается от заказчика (пользователя) к разработчику основная информация относительно требуемого ПС, то формирование этого документа представляет собой довольно длительный и трудный итерационный процесс взаимодействия между заказчиком и разработчиком, с которого и начинается этап разработки требований к ПС. Трудности, возникающие в этом процессе, связаны с тем, что пользователи часто плохо представляют, что им на самом деле нужно: использование компьютера в &#8220;узких&#8221; местах деятельности пользователей может на самом деле потребовать принципиального изменения всей технологии этой деятельности (о чем пользователи, как правило, и не догадываются).</p>
<p>В определении внешнего описания легко бросаются в глаза две самостоятельные его части. Описание поведения ПС определяет функции, которые должна выполнять ПС, и потому его называют <em>функциональной спецификацией </em>ПС. Функциональная спецификация определяет допустимые фрагменты программ, реализующих декларированные функции. Требования к качеству ПС должны быть сформулированы так, чтобы разработчику были ясны цели , которые он должен стремиться достигнуть при разработке этого ПС. Эту часть внешнего описания будем называть <em>спецификацией качества </em>ПС.</p>
<p>Таким образом, структуру внешнего описания ПС можно выразить формулой:</p>
<p>Внешнее описание ПС = спецификация качества ПС + функциональная спецификация ПС</p>
<p>Таким образом, внешнее описание определяет, что должно делать ПС и какими внешними свойствами оно должно обладать. Оно не отвечает на вопрос, как должно быть устроено это ПС и как обеспечить требуемые его внешние свойства. Оно должно достаточно точно и полно определять задачи, которые должны решить разработчики требуемого ПС. В то же время оно должно быть понято представителем пользователем &#8211; на его основании заказчиком достаточно часто принимается окончательное решение на заключение договора на разработку ПС. Внешнее описание играет большую роль в обеспечении требуемого качества ПС, так как спецификация качества ставит для разработчиков ПС конкретные ориентиры, управляющие выбором приемлемых решений при реализации специфицированных функций.</p>
<h4>Определение требований к программному средству.</h4>
<p>Определение требования к ПС являются исходным документом разработки ПС &#8211; заданием, выражающем в абстрактной форме потребности пользователя. Они в общих чертах определяют замысел ПС, характеризуют условия его использования. Неправильное понимание потребностей пользователя трансформируются в ошибки внешнего описания. Поэтому разработка ПС начинается с создания документа, достаточно полно характеризующего потребности пользователя и позволяющего разработчику адекватно воспринимать эти потребности.</p>
<p>Определение требований представляет собой смесь фрагментов на естественном языке, различных таблиц и диаграмм. Такая смесь, должна быть понятной пользователю, не знающего специальных программистских обозначений. Обычно в определении требований не содержится формализованных фрагментов, кроме случаев достаточно для этого подготовленных пользователей (например, математически) &#8211; формализация этих требований составляет содержание дальнейшей работы коллектива разработчиков.</p>
<p>Известны три способа определения требований к ПС :</p>
<ul>
<li>управляемый пользователем,</li>
<li>контролируемый пользователем,</li>
<li>независимый от пользователя.</li>
</ul>
<p>В <em>управляемой пользователем </em>разработке определения требований к ПС определяются заказчиком. Роль разработчика ПС в создании этих требований сводится, в основном, в выяснении того, насколько понятны ему эти требования с соответствующей критикой рассматриваемого документа.</p>
<p>В <em>контролируемой пользователем </em>разработке требования к ПС формулируются разработчиком при участии представителя пользователей. Роль пользователя в этом случае сводится к информированию разработчика о своих потребностях в ПС и контролю за тем, чтобы формулируемые требования действительно выражали его потребности в ПС.</p>
<p>В <em>независимой от пользователя </em>разработке требования к ПС определяются без какого-либо участия пользователя (на полную ответственность разработчика).</p>
<h4>Спецификация качества программного средства.</h4>
<p>Разработка спецификации качества сводится, по-существу, к построению своеобразной модели качества разрабатываемой ПС. В этой модели должен быть перечень всех тех достаточно элементарных свойств, которые требуется обеспечить в разрабатываемом ПС и которые в совокупности образуют приемлемое для пользователя качество ПС. При этом каждое из этих свойств должно быть в достаточной степени конкретизировано с учетом определения требований к разрабатываемому ПС и возможности оценки его наличия у разработанного ПС или необходимой степени обладания им этим ПС.</p>
<p>Для конкретизации качества ПС по каждому из критериев используется стандартизованный набор достаточно простых свойств ПС, однозначно интерпретируемых разработчиками. Такие свойства мы будем называть примитивами качества ПС. Некоторые из примитивов могут использоваться по нескольким критериям. Ниже приводится зависимость критериев качества от примитивов качества ПС.</p>
<p><strong><em>Функциональность</em></strong><em>:</em> завершенность.</p>
<p><strong><em>Надежность</em></strong><em>: </em>завершенность, точность, автономность, устойчивость, защищенность.</p>
<p><strong><em>Легкость применения</em></strong><em>:</em> П-документированность, информативность (только применительно к документации по применению), коммуникабельность, устойчивость, защищенность.</p>
<p><strong><em>Эффективность</em></strong><em>: </em>временнaя эффективность, эффективность по памяти, эффективность по устройствам.</p>
<p><strong><em>Сопровождаемость</em></strong><em>. </em>С данным критерием связано много различных примитивов качества. Однако их можно распределить по двум группам, выделив два подкритерия качества: изучаемость и модифицируемость. Изучаемость &#8211; это характеристики ПС, которые позволяют минимизировать усилия по изучению и пониманию программ и документации ПС. Модифицируемость &#8211; это характеристики ПС, которые упрощают внесение в него необходимых изменений и доработок.</p>
<p><strong><em>Изучаемость</em></strong><em>:</em> С-документированность, информативность (здесь применительно и к документации по сопровождению), понятность, структурированность, удобочитаемость.</p>
<p><strong><em>Модифицируемость</em></strong><em>:</em> расширяемость, структурированность, модульность.</p>
<p><strong><em>Мобильность</em></strong><em>:</em> независимость от устройств, автономность, структурированность, модульность.</p>
<p>Ниже даются определения используемых примитивов качества ПС [4.3-4.5].</p>
<p><strong><em>Завершенность</em></strong> &#8211; свойство, характеризующее степень обладания ПС всеми необходимыми частями и чертами, требующимися для выполнения своих явных и неявных функций.</p>
<p><strong><em>Точность </em></strong><strong>-</strong> мера, характеризующая приемлемость величины погрешности в выдаваемых программами ПС результатах с точки зрения предполагаемого их использования.</p>
<p><strong><em>Автономность</em></strong><strong> </strong>- свойство, характеризующее способность ПС выполнять предписанные функции без помощи или поддержки других компонент программного обеспечения.</p>
<p><strong><em>Устойчивость</em></strong><em> </em>- свойство, характеризующее способность ПС продолжать корректное функционирование, несмотря на задание неправильных (ошибочных) входных данных.</p>
<p><strong><em>Защищенность</em></strong><em> </em>- свойство, характеризующее способность ПС противостоять преднамеренным или нечаянным деструктивным (разрушающим) действиям пользователя.</p>
<p><strong><em>П-документированность</em></strong><em> </em>- свойство, характеризующее наличие, полноту, понятность, доступность и наглядность учебной, инструктивной и справочной документации, необходимой для применения ПС.</p>
<p><strong><em>Информативность</em></strong><em> </em>- свойство, характеризующее наличие в составе ПС информации, необходимой и достаточной для понимания назначения ПС, принятых предположений , существующих ограничений, входных данных и результатов работы отдельных компонент, а также текущего состояния программ в процессе их функционирования.</p>
<p><strong><em>Коммуникабельность</em></strong><em> </em>- свойство, характеризующее степень, в которой ПС облегчает задание или описание входных данных, а также обеспечивает выдачу полезных сведений в форме и с содержанием, простыми для понимания.</p>
<p><strong><em>Временнaя эффективность</em></strong><em> </em>- мера, характеризующая способность ПС выполнять возложенные на него функции за определенный отрезок времени.</p>
<p><strong><em>Эффективность по памяти</em></strong><em> </em>- мера, характеризующая способность ПС выполнять возложенные на него функции при определенных ограничениях на используемую память.</p>
<p><strong><em>Эффективность по устройствам</em></strong> &#8211; мера, характеризующая экономичность использования устройств машины для решения поставленной задачи.</p>
<p><strong><em>С-документировапнность</em></strong><em> </em>- свойство, характеризующее с точки зрения наличия документации, отражающей требования к ПС и результаты различных этапов разработки данной ПС, включающие возможности, ограничения и другие черты ПС, а также их обоснование.</p>
<p><strong><em>Понятность</em></strong><em> </em>- свойство, характеризующее степень в которой ПС позволяет изучающему его лицу понять его назначение, сделанные допущения и ограничения, входные данные и результаты работы его программ, тексты этих программ и состояние их реализации.</p>
<p><strong><em>Структурированность</em></strong><em> </em>- свойство, характеризующее программы ПС с точки зрения организации взаимосвязанных их частей в единое целое определенным образом (например, в соответствии с принципами структурного программирования).</p>
<p><strong><em>Удобочитаемость </em></strong><strong>-</strong> свойство, характеризующее легкость восприятия текста программ ПС (отступы, фрагментация, форматив- ность).</p>
<p><strong><em>Расширяемость</em></strong><em> </em>- свойство, характеризующее способность ПС к использованию большего объема памяти для хранения данных или расширению функциональных возможностей отдельных компонент.</p>
<p><strong><em>Модульность</em></strong><em> </em>- свойство, характеризующее ПС с точки зрения организации его программ из таких дискретных компонент, что изменение одной из них оказывает минимальное воздействие на другие компоненты.</p>
<p><strong><em>Независимость от устройств</em></strong><em> </em>- свойство, характеризующее способность ПС работать на разнообразном аппаратном обеспечении (различных типах, марках, моделях ЭВМ).</p>
<h4>Функциональная спецификация программного средства.</h4>
<p>С учетом назначения функциональной спецификации ПС и тяжелых последствий неточностей и ошибок в этом документе, функциональная спецификация должна быть математически точной. Это не означает, что она должна быть формализована настолько, что по ней можно было бы автоматически генерировать программы, решающие поставленную задачу. А означает лишь, что она должна базироваться на понятиях, построенных как математические объекты, и утверждениях, однозначно понимаемых разработчиками ПС. Достаточно часто функциональная спецификация формулируется на естественном языке. Тем не менее, использование математических методов и формализованных языков при разработке функциональной спецификации весьма желательно, поэтому этим вопросам будет посвящена отдельная лекция.</p>
<p>Функциональная спецификация состоит из трех частей:</p>
<ul>
<li>описания внешней информационной среды, к которой должны применяться программы разрабатываемой ПС;</li>
<li>определение функций ПС, определенных на множестве состояний этой информационной среды (такие функции будем называть <em>внешними функциями </em>ПС);</li>
<li>описание нежелательных (исключительных) ситуаций, которые могут возникнуть при выполнении программ ПС, и реакций на эти ситуации, которые должны обеспечить соответствующие программы.</li>
</ul>
<h4>Методы контроля внешнего описания программного средства.</h4>
<p>Разработка внешнего описания обязательно должна завершаться проведением тщательного и разнообразного контроля правильности внешнего описания. Целью этого процесса является найти как можно больше ошибок, сделанных на этом этапе. Учитывая, что результатом этого этапа является, как правило, еще неформализованный текст, то здесь на первый план выступают психологические факторы контроля. Можно выделить следующие методы контроля, применяемые на этом этапе:</p>
<ul>
<li>статический просмотр,</li>
<li>смежный контроль,</li>
<li>пользовательский контроль,</li>
<li>ручная имитация.</li>
</ul>
<p>Первый метод предполагает внимательное прочтение текста внешнего описания разработчиком с целью проверка его полноты и непротиворечивости, а также выявления других неточностей и ошибок.</p>
<p>Смежный контроль спецификации качества сверху &#8211; это ее проверка со стороны разработчика требований к ПС, а смежный контроль функциональной спецификации &#8211; это ее проверка разработчиками требований к ПС и спецификации качества. Смежный контроль внешнего описания снизу &#8211; это его изучение и проверка разработчиками архитектуры ПС и текстов программ, а также разработчиками документации по применению и разработчиками комплекта тестов.</p>
<p>Пользовательский контроль внешнего описания выражает участие пользователя (заказчика) в принятии решений при разработке внешнего описания и его контроле. Если разработка требований к ПС велась под управлением пользователя, то пользовательский контроль внешнего описания, по-существу, означает его смежный контроль сверху. Однако, если представителю пользователя оказывается трудно самостоятельно разобраться во внешнем описании, создается специальная группа разработчиков, выполняющая роль пользователя (и взаимодействующая с ним) для проведения такого контроля.</p>
<p>Ручная имитация выражает своеобразный динамический контроль внешнего описания, точнее говоря, функциональной спецификации ПС. Для этого необходимо подготовить исходные данные (тесты) и на основании функциональной спецификации осуществить имитацию поведения (работы) разрабатываемого ПС. При этом эту имитацию осуществляет специально назначенный разработчик, выполняющий, по-существу, роль будущих программ ПС. Разновидностью такого контроля является имитация за терминалом. В этом случае данные вводятся в компьютер человеком, играющего роль пользователя, и передаются с помощью несложной программы на другой терминал, за которым сидит разработчик, выполняющий роль программ ПС. Полученные результаты передаются через компьютер на первый терминал.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/vneshnee-opisanie-prog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тестирование и отладка</title>
		<link>http://www.studcode.ru/archiv/testirovanie-i-otladka/</link>
		<comments>http://www.studcode.ru/archiv/testirovanie-i-otladka/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:55:09 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=512</guid>
		<description><![CDATA[Целью тестирования является обнаружение ошибок в программе.
Тестирование программного обеспечения охватывает целый ряд видов деятельности, аналогичных последовательности процессов разработки программного обеспечения. В него входят/1:
а) постановка задачи для теста,
б) проектирование теста,
в) написание тестов,
г) тестирование тестов,
д) выполнение тестов,
е) изучение результатов тестирования.
Решающую роль играет проектирование тестов. Возможен целый ряд подходов к стратегии проектирования тестов. Чтобы ориентироваться в них, рассмотрим [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Целью тестирования является обнаружение ошибок в программе.</strong></p>
<p>Тестирование программного обеспечения охватывает целый ряд видов деятельности, аналогичных последовательности процессов разработки программного обеспечения. В него входят/1:</p>
<p>а) постановка задачи для теста,</p>
<p>б) проектирование теста,</p>
<p>в) написание тестов,</p>
<p>г) тестирование тестов,</p>
<p>д) выполнение тестов,</p>
<p>е) изучение результатов тестирования.</p>
<p>Решающую роль играет проектирование тестов. Возможен целый ряд подходов к стратегии проектирования тестов. Чтобы ориентироваться в них, рассмотрим два крайних подхода  /1/. Первый состоит в том, что тесты проектируются на основе внешних спецификаций программ и модулей, либо спецификаций сопряжения программы или модуля. Программа при этом рассматривается как черный ящик (стратегия ‘черного ящика’). Существо такого подхода &#8211; проверить соответствует ли программа внешним спецификациям. При этом логика модуля совершенно не принимается во внимание.</p>
<p>Второй подход основан на анализе логики программы (стратегия ‘белого ящика’). Существо подхода &#8211; в проверке каждого пути, каждой ветви алгоритма. При этом внешняя спецификация во внимание не принимается.</p>
<p>Альтернатива ‘черный ящик’ &#8211; ‘белый ящик’ является достаточно общей, что подтверждается ее применением не только при тестировании, но, например, в альтернативных направлениях исследований в области искусственного интеллекта.</p>
<p><span id="more-512"></span></p>
<p>Тестирование по принципу белого ящика характеризуется степенью, какой тесты выполняют или покрывают логику (исходный текст программы).</p>
<p>Если отказаться полностью от тестирования всех путей, можно показать, что критерием покрытия является выполнение каждого оператора программы хотя бы один раз.</p>
<p>Это необходимое, но недостаточное условие для приемлемого тестирования по принципу белого ящика.</p>
<p>В этой программе можно выполнить каждый оператор, записав один единственный тест, который реализовал бы путь <em>ace.</em> Т.е., если бы на входе было: А=2, В=0, Х=3, каждый оператор выполнился бы один раз. Но этот критерий на самом деле хуже, чем он кажется на первый взгляд. Пусть в первом условии вместо “<em>and”</em><em>®“or” </em>и во втором вместо <em>“x&gt;1”</em><em>®“x&lt;1”</em> (блок-схема правильной программы приведена на рисунке 15.2, а неправильной &#8211; на рисунке 15.3). Результаты тестирования приведены в таблице 15.1.  <strong>Обратите внимание: ожидаемый результат определяется по алгоритму на рисунке 15.2, а фактический &#8211; по алгоритму рисунка 15.3, поскольку определяется чувствительность метода тестирования к ошибкам программирования.</strong> Как видно из этой таблицы, ни одна из этих ошибок не будет обнаружена .</p>
<p>Таблица 15.1 &#8211; Результат тестирования методом покрытия операторов</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="161" valign="top">Тест</td>
<td width="159" valign="top">Ожидаемый   результат</td>
<td width="159" valign="top">Фактический   результат</td>
<td width="144" valign="top">Результат   тестирования</td>
</tr>
<tr>
<td width="161" valign="top">A=2, B=0, X=3</td>
<td width="159" valign="top">X=2,5</td>
<td width="159" valign="top">X=2,5</td>
<td width="144" valign="top">неуспешно</td>
</tr>
</tbody>
</table>
<p><strong>Метод покрытия решений (покрытия переходов)</strong></p>
<p>Более сильный метод тестирования известен как покрытие решений (покрытие переходов).</p>
<p>Согласно данному методу должно быть написано достаточное число тестов, такое, что каждое направление перехода должно быть реализовано по крайней мере один раз.</p>
<p>Покрытие решений обычно удовлетворяет критерию покрытия операторов. Поскольку каждый оператор лежит на некотором пути, исходящем либо из оператора перехода, либо из точки входа программы, при выполнении каждого направления перехода каждый оператор должен быть выполнен.</p>
<p>Для программы приведенной на рисунке 15.3 покрытие решений может быть выполнено двумя тестами, покрывающими пути {<em>ace, abd</em>}, либо {<em>aсd,abe</em>}. Пути {<em>aсd,abe</em>}покроим, выбрав следующие исходные данные: {A=3, B=0, X=3} и {A=2, B=1, X=1} (результаты тестирования &#8211; в таблице 15.2).</p>
<p>Таблица 15.2 &#8211; Результат тестирования методом покрытия решений</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="161" valign="top">Тест</td>
<td width="159" valign="top">Ожидаемый   результат</td>
<td width="159" valign="top">Фактический   результат</td>
<td width="144" valign="top">Результат   тестирования</td>
</tr>
<tr>
<td width="161" valign="top">A=3, B=0, X=3</td>
<td width="159" valign="top">X=1</td>
<td width="159" valign="top">X=1</td>
<td width="144" valign="top">неуспешно</td>
</tr>
<tr>
<td width="161" valign="top">А=2, В=1, Х=1</td>
<td width="159" valign="top">Х=2</td>
<td width="159" valign="top">Х=1,5</td>
<td width="144" valign="top">Успешно</td>
</tr>
</tbody>
</table>
<p><strong>Метод  покрытия условий</strong></p>
<p><strong> </strong></p>
<p>Лучшие результаты по сравнению с предыдущими может дать метод покрытия условий. В этом случае записывается число тестов, достаточное для того, чтобы все возможные результаты каждого условия в решении выполнялись по крайней мере один раз.</p>
<p>В предыдущем примере имеем четыре условия: {A&gt;1, B=0}, {A=2, X&gt;1}. Cледовательно, требуется достаточное число тестов, такое, чтобы реализовать ситуации, где A&gt;1, A£1, B=0 и B¹0 в точке <em>а</em> и A=2, A¹2, X&gt;1 и X£1 в точке В. Тесты, удовлетворяющие критерию покрытия условий и соответствующие им пути:</p>
<p>а) A=2, B=0, X=4                  <em>ace</em></p>
<p>б) A=1, B=1, X=0                  <em>abd</em></p>
<p>Таблица 2.3 &#8211; Результаты тестирования методом покрытия условий<em> </em></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="171" valign="top">Тест</td>
<td width="156" valign="top">Ожидаемый   результат</td>
<td width="156" valign="top">Фактический   результат</td>
<td width="150" valign="top">Результат   тестирования</td>
</tr>
<tr>
<td width="171" valign="top">A=2, B=0, X=4</td>
<td width="156" valign="top">X=3</td>
<td width="156" valign="top">X=3</td>
<td width="150" valign="top">неуспешно</td>
</tr>
<tr>
<td width="171" valign="top">A=1, B=1, X=0</td>
<td width="156" valign="top">X=0</td>
<td width="156" valign="top">X=1</td>
<td width="150" valign="top">успешно</td>
</tr>
</tbody>
</table>
<p><strong>Критерий решений (условий)</strong></p>
<p>Критерий покрытия решений/условий требует такого достаточного набора тестов, чтобы все возможные результаты каждого условия в решении выполнялись по крайней мере один раз, все результаты каждого решения выполнялись по крайней мере один раз и, кроме того, каждой точке входа передавалось управление по крайней мере один раз.</p>
<p>Два теста метода покрытия условий</p>
<p>а) A=2, B=0, X=4                  <em>ace</em></p>
<p>б) A=1, B=1, X=0                  <em>abd<br />
</em>отвечают и критерию покрытия решений/условий. Это является следствием того, что одни условия приведенных решений скрывают другие условия в этих решениях. Так, если условие А&gt;1 будет ложным, транслятор может не проверять условия В=0, поскольку при любом результате условия В=0, результат решения ((А&gt;1)&amp;(В=0)) примет значение <em>ложь.</em> Следовательно, недостатком критерия покрытия решений/условий является невозможность его применения для выполнения всех результатов всех условий.</p>
<p>Другая реализация рассматриваемого примера приведена на рисунке 15.4. Многоусловные решения исходной программы разбиты на отдельные решения и переходы. Наиболее полное покрытие тестами в этом случае выполняется так, чтобы выполнялись все возможные результаты каждого простого решения. Для этого нужно покрыть пути HILP (тест А=2,В=0,Х=4), HIMKT (тест А=3, В=1, Х=0), HJKT (тест А=0, В=0, Х=0), HJKR (тест А=0, В=0, Х=2).<em>.</em></p>
<p>Протестировав алгоритм на рисунке 2.4, нетрудно убедиться в том, что критерии покрытия условий и критерии покрытия решений/условий недостаточно чувствительны к ошибкам в логических выражениях.</p>
<p><strong>Метод эквивалентного разбиения</strong></p>
<p>Поскольку, как было обосновано выше, исчерпывающее входное тестирование программы невозможно, реально приходится ограничиваться использованием небольшого подмножества всех возможных входных данных. Исходя из этого:</p>
<p>а) каждый тест должен включать столько различных входных условий, сколько это возможно, с тем чтобы минимизировать общее число тестов;</p>
<p>б) необходимо пытаться разбить входную область программы на конечное число классов эквивалентности так, чтобы можно было предположить, что каждый тест, являющийся представителем некоторого класса, эквивалентен любому другому тесту этого класса. Другими словами, если один тест класса эквивалентности обнаруживает ошибку, то следует ожидать, что и все другие тесты этого класса эквивалентности будут обнаруживать эту ошибку. И наоборот, если тест не обнаруживает ошибки, то следует ожидать, что ни один тест этого класса эквивалентности не будет обнаруживать ошибки.</p>
<p>Эти два положения составляют основу методологии тестирования по стратегии “черного ящика”, известного как эквивалентное разбиение/1/. Второе положение используется для разработки набора “интересных условий”, которые должны быть протестированы, а первое &#8211; для разработки минимального набора тестов, покрывающих эти условия.</p>
<p>Разработка тестов методом эквивалентного разбиения осуществляется в два этапа:</p>
<p>а) выделение класса эквивалентности;</p>
<p>б)построение тестов.</p>
<p><strong>Выделение классов эквивалентности</strong></p>
<p>Классы эквивалентности выделяются путем выбора каждого входного условия (обычно это предложение или фраза в спецификации) и разбиением его на две или более групп. Для выполнения этой операции используют таблицу следующего вида:</p>
<p>Таблица 15.5 &#8211; Заголовок таблицы для определения классов эквивалентности</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="157" valign="top">Входные условия</td>
<td width="247" valign="top">Правильные классы   эквивалентности</td>
<td width="247" valign="top">Неправильные   классы эквивалентности</td>
</tr>
</tbody>
</table>
<p>Здесь &#8211; правильные классы эквивалентности соответствуют правильным входным данным программы, а неправильные классы эквивалентности представляют все другие возможные состояния  входных условий.</p>
<p>Если задаться входными или внешними условиями, то выделение классов эквивалентности представляет собой в значительной степени эвристический процесс. При этом существует ряд правил:</p>
<p>- если входное условие описывает область значений, например, “целое данное может принимать значения от 1 до 999, то определяется один правильный класс эквивалентности (1£значение целого данного £ 999) и два неправильных (значение целого данного&lt;1 и значение целого данного&gt;999);</p>
<p>- если входное условие описывает число значений, например, “в автомобиле могут ехать от одного до шести человек”, то определяется один правильный класс эквивалентности и два неправильных (ни одного и более 6 человек);</p>
<p>- если входное условие описывает множество входных значений (например, “известными способами передвижения являются: на автобусе, грузовике, такси, пешком или на мотоцикле”), то определяются правильные классы эквивалентности для каждого значения (таких “правильных” классов эквивалентности должно быть 5, по числу возможных способов передвижения) и один неправильный (например, “на прицепе”);</p>
<p>- если входное условие описывает ситуацию “должно быть” (например, “первым символом идентификатора должна быть буква”), то определяется один правильный класс эквивалентности (первый символ &#8211; буква) и один неправильный (первый символ &#8211; не буква);</p>
<p>- если есть основания считать, что различные элементы класса эквивалентности воспринимаются программой неодинаково, то данный класс эквивалентности разбивается на меньшие классы эквивалентности.</p>
<p><strong>Построение тестов</strong></p>
<p>Этот процесс включает в себя:</p>
<p>- назначение каждому классу эквивалентности уникального номера;</p>
<p>- проектирование новых тестов, каждый из которых покрывает как можно большее число непокрытых правильных классов эквивалентности, пока все правильные классы эквивалентности не будут покрыты тестами;</p>
<p>- запись тестов, каждый из которых покрывает один и только один из непокрытых неправильных классов эквивалентности. Каждый неправильный класс эквивалентности должен быть покрыт индивидуальным тестом. Причина этого состоит в том, что определенные проверки с ошибочными входами скрывают или заменяют другие ошибки с ошибочными входами.</p>
<p><strong>Метод анализа граничных значений</strong></p>
<p>Опыт показывает, что тесты, исследующие граничные условия, приносят большую пользу чем тесты, которые их не исследуют.</p>
<p>Определение: граничные условия это ситуации, возникающие непосредственно на, выше или ниже границ входных и выходных классов эквивалентности.</p>
<p>Анализ граничных значений отличается от эквивалентного разбиения в двух отношениях:</p>
<p>- выбор любого элемента в классе эквивалентности в качестве представительного при анализе граничных значений осуществляется таким образом, чтобы проверить тестом каждую границу этого класса.</p>
<p>- при разработке тестов рассматривают не только входные условия (пространство входов), но и пространство результатов, то есть выходные классы эквивалентности.</p>
<p>Метод анализа граничных значений требует творческого подхода и специализации. Приведем несколько общих правил этого метода /1/.</p>
<p>Построить тесты для границ области и тесты с неправильными входными данными для ситуаций незначительного выхода за границы области, если входное условие описывает область значений.</p>
<p>Пример: если правильная область входных значений есть -1.0 ¸ 1.0, то следует написать тесты для ситуаций: -1.0; 1.0; -1.001; 1.001.</p>
<p>Если входные условия удовлетворяют дискретному ряду значений, построить тесты для минимального и максимального значений условий и тесты для значений входных условий больших или меньших максимального и минимального.</p>
<p>Пример: если входной файл может содержать от 1 до 255 записей, то построить тесты для 0; 1; 255; 256 записей.</p>
<p>Использовать правило 1 для каждого входного условия.</p>
<p>Пример: Программа вычисляет ежемесячный расход. Минимум расхода составляет 0.00, а максимум &#8211; 1165.25 (усл. ед.). Нужно построить тесты для отрицательного расхода и расхода, большего 1165.25.</p>
<p>Важно проверить границы пространства результатов, поскольку не всегда границы входных областей представляют такой же набор условий, как и границы выходных областей. Пример: y=sin(x); xÎ[0;p]</p>
<p>Не всегда можно получить результат вне выходной области, но, тем не менее, стоит рассмотреть эту возможность.</p>
<p>Построить тесты для минимального и максимального значения каждого выходного условия, а также тесты, обеспечивающие нарушение границ выходных условий.</p>
<p>Пример: система информационного поиска отображает на экране терминала наиболее релевантные рефераты в зависимости от входного запроса, но никак не более четырех рефератов. Тесты:</p>
<ol>
<li>программа отображает ноль рефератов</li>
<li>- один</li>
<li>- четыре</li>
<li>- пять (ошибочная ситуация)</li>
</ol>
<p>5.Если вход или выход программы есть упорядоченное множество (последовательный файл, линейный список, таблицы), то сосредоточить внимание на первом и на последнем элементах одного множества.</p>
<p>Существенное различие между анализом граничных значений и эквивалентным разбиением состоит в том, что анализ граничных значений исследует ситуации, возникающие на и вблизи границ эквивалентных разбиений.</p>
<p><strong>Тестирование модульных программ</strong></p>
<p>Кроме тестирования логики программного модуля, существует проблема тестирования комплексирующих программ, состоящих из нескольких модулей, ибо объединение протестированных модулей не всегда позволяет получать работоспособную комплексирующую программу.</p>
<p>Наиболее распространенным приемом тестирования модульных программ является пошаговое тестирование /1/. На практике применяют две его разновидности:</p>
<p>n восходящее тестирование;</p>
<p>n нисходящее тестирование.<strong> </strong></p>
<p>Методика <strong>восходящего тестирования</strong> включает следующие щаги:</p>
<p>а) сначала тестируются ‘листья’ дерева структуры программы, т.е. модули  Е,C,F. Поскольку это вызываемые программы, то для их тестирования программируются <strong>драйверы</strong> (в некоторых литературных источниках для таких программ применяют термин ‘отлаживающий модуль’) В функции драйвера входит формирование тестовых данных для отлаживаемого модуля и передача ему управления (вызов модуля). Очевидно, что формирование тестовых данных в большинстве случаев</p>
<p>будет ни чем иным, как присвоением конкретных значений входным данным отлаживаемого модуля;</p>
<p>б) затем аналогично тестируются модули вышележащего уровня совместно с уже оттестированными модулями нижележащего уровня. Применительно к рассматриваемому нами примеру проектируются драйверы для тестирования пар B-E и D-F;</p>
<p>в) пошаговый процесс продолжается до тех пор, пока не будет включен в процесс тестирования последний модуль (‘корень’ дерева структуры программы). Для нашего примера это будет модуль А. Для его тестирования совместно с вызываемыми программами нижележащего уровня драйвер разрабатывать не требуется.</p>
<p>Альтернативное <strong>нисходящее тестирование</strong> состоит из следующих действий:</p>
<p>а) тестирование начинается с вызывающего модуля программы (‘корня’ дерева структуры программы). Для модулей нижележащего уровня (вызываемых) программируются так называемые ‘заглушки’ ( в некоторых литературных источниках эти программы называются ‘имитаторы’. Термин ‘имитатор’ точнее отражает выполняемую программой функцию &#8211; работа модуля нижележащего уровня имитируется, т.е без выполнения самого модуля формируются результаты обработки входных данных);</p>
<p>б) после проверки ‘корня’ дерева структуры комплексирующей программы переходят к тестированию нижележащих модулей. Причем, формализованной процедуры подключения к вызывающему модулю нижележащих вызываемых модулей не существует. Единственное ограничение, которым руководствуются при выборе очередного претендента на тестирование, заключается в том, что этот модуль должен вызываться уже оттестированным модулем вышележащего уровня. Если очередной тестируемый модуль вызывает модули еще нижележащего уровня, то аналогично пункту а) для нижележащих модулей программируются ‘заглушки’;</p>
<p>в) процесс тестирования продолжается до тех пор, пока не будет оттестирован последний модуль из ‘листьев’ дерева структуры программы.  Приведем две возможные последовательности тестирования модулей согласно этой методики для рассматриваемого примера:</p>
<p>n A (B,C,D), A-B (E), A-B-E, A-C, A-D (F), A-D-F;</p>
<p>n A (B,C,D), A-B (E), A-C, A-D (F), A-B-E, A-D-F.</p>
<p>В скобках указаны имена модулей, для которых должны быть запрограммированы ‘заглушки’. Через черточку указываются композиции тестируемых модулей.</p>
<p>Сравнительный анализ приведенных методик тестирования /  /, показывает, что нисходящее тестирование ставит перед программистом много проблем, касающихся разработки ‘заглушек’ и интерпретации результатов тестирования. Там же /1/ приводится сравнительная таблица недостатков и преимуществ методов восходящего и нисходящего тестирования, из которой явствует, что меньшими недостатками обладает восходящее тестирование.</p>
<h4>Отладка</h4>
<p>Отладкой называется процесс выявления природы ошибки программы и исправления ошибок, после того, как ошибки были обнаружены в процессе тестирования.</p>
<p>Из всех этапов проектирования логики программных модулей этап отладки является наименее формализованным. В нем выделяют две задачи:</p>
<p>n определение природы ошибки;</p>
<p>n исправление ошибки.</p>
<p>Решение первой из этих задач занимает около 95 % времени, затрачиваемых на отладку. Поэтому любые средства ускорения процесса определения местоположения ошибки в программ имеют важное значение.</p>
<p>Наиболее распространенными и наименее эффективными для отладки являются так называемые методы ‘грубой силы’. К ним относят:</p>
<p>n отладку с использованием дампа памяти;</p>
<p>n отладку с использованием операторов печати по всей программе;</p>
<p>n отладку с использованием автоматических средств.</p>
<p>Дампы памяти практически невозможно использовать при программировании на языке высокого уровня, поэтому на этом способе отладки останавливаться не будем</p>
<p>Расстановка печатей в программе бессистемно вряд ли может ускорить отладку. Для системной расстановки нужны четкие представления о структуре алгоритма (схема работы программы или блок-схема).Серьезным недостатком этого метода отладки является тот факт, что печати, вставляемые в программу, изменяют ее, вследствие чего могут послужить дополнительным источником ошибок.</p>
<p>Использование автоматических средств отладки из этой группы методов наиболее предпочтительно.</p>
<p>Общей характеристикой методов ‘грубой силы’ является то, что они не требуют значительных умственных затрат и могут продолжаться бесконечно долго, если наряду с ними не применять более гибкие методы, к которым относятся:</p>
<p>n метод индукции;</p>
<p>n метод дедукции.</p>
<p>Название методов напоминают о криминалистике и не напрасно, ибо есть аналогия между этими методами и расследованием преступления.</p>
<p>Метод индукции включает:</p>
<p>1) определение данных тестирования, имеющих отношение к ошибке;</p>
<p>2) анализ от частного к общему позволит выявить закономерности в данных пункта 1);</p>
<p>3) в результате анализа (п.2) выдвигается гипотеза о причине ошибки;</p>
<p>4) для подтверждения гипотезы 3 разрабатывается один или больше тестов, которые должны либо подтвердить, либо опровергнуть гипотезу;</p>
<p>5) если дополнительные тесты подтверждают гипотезу, можно приступать к исправлению ошибки, а вот если не подтверждают, то требуется в лучшем случае возврат к п.3, а в худшем &#8211; к п.2.</p>
<p>Альтернативный метод дедукции заключается в:</p>
<p>1) перечисление возможных причин или гипотез:</p>
<p>2) использование данных тестирования для исключения некоторых возможных причин;</p>
<p>3) уточнение выбранной наиболее вероятной гипотезы, возможно с использованием дополнительных тестов:</p>
<p>4) доказательство выбранной гипотезы совпадает с п.4 и п.5 метода индукции.</p>
<p>Ниже приводятся рекомендации по организации отладки в форме заповедей</p>
<p><strong><em>Заповедь 1.</em></strong> Считайте тестирование ключевой задачей разработки ПС, поручайте его самым квалифицированным и одаренным программистам; нежелательно тестировать свою собственную программу.</p>
<p><strong><em>Заповедь 2.</em></strong> Хорош тот тест, для которого высока вероятность обнаружить ошибку, а не тот, который демонстрирует правильную работу программы.</p>
<p><strong><em>Заповедь 3.</em></strong> Готовьте тесты как для правильных, так и для неправильных данных.</p>
<p><strong><em>Заповедь 4.</em></strong> Избегайте невоспроизводимых тестов, документируйте их пропуск через компьютер; детально изучайте результаты каждого теста.</p>
<p><strong><em>Заповедь 5.</em></strong> Каждый модуль подключайте к программе только один раз; никогда не изменяйте программу, чтобы облегчить ее тестирование.</p>
<p><strong><em>Заповедь 6.</em></strong> Пропускайте заново все тесты, связанные с проверкой работы какой-либо программы ПС или ее взаимодействия с другими программами, если в нее были внесены изменения (например, в результате устранения ошибки).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/testirovanie-i-otladka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Методы спецификации семантики функций</title>
		<link>http://www.studcode.ru/archiv/metody-specifikaci/</link>
		<comments>http://www.studcode.ru/archiv/metody-specifikaci/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:48:54 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=510</guid>
		<description><![CDATA[Метод таблиц решений.
Метод таблиц решений базируется на использовании таблиц следующего вида (см. табл. 12.1).
Верхняя часть этой таблицы определяет различные ситуации, в которых требуется выполнять некоторые действия (операции). Каждая строка этой части задает ряд значений некоторой переменной или некоторого условия, указанной (указанного) в первом поле (столбце) этой строки. Таким образом, первый столбец этой части   представляет собой [...]]]></description>
			<content:encoded><![CDATA[<h4>Метод таблиц решений.</h4>
<p>Метод таблиц решений базируется на использовании таблиц следующего вида (см. табл. 12.1).</p>
<p>Верхняя часть этой таблицы определяет различные ситуации, в которых требуется выполнять некоторые действия (операции). Каждая строка этой части задает ряд значений некоторой переменной или некоторого условия, указанной (указанного) в первом поле (столбце) этой строки. Таким образом, первый столбец этой части   представляет собой список переменных или условий, от значений которых зависит выбор определяемых ситуаций. В каждом следующем столбце указывается комбинация значений этих переменных (условий), определяющая конкретную ситуацию. При этом последний столбец определяет ситуацию, отличную от предыдущих, т.е.для любых других комбинаций значений (будем обозначать их звездочкой *), отличных от первых, определяется одна и та же, (m+1)-ая, ситуация. Впрочем в некоторых таблицах решений этот столбец может отсутствовать. Эта часть таблицы решений аналогична соответствующей части таблицы, определяющей какую-либо функцию обычным способом &#8211; в ней задаются комбинации значений аргументов функции, которым ставится в соответствие значения этой функции.</p>
<p><span id="more-510"></span></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="109" valign="top">Переменные/условия</td>
<td colspan="5" width="408" valign="top">Ситуации(комбинации значений)</td>
</tr>
<tr>
<td width="109" valign="top">x1</td>
<td width="60" valign="top">a[1,1]</td>
<td width="84" valign="top">a[1,2]</td>
<td width="48" valign="top">&#8230;</td>
<td width="108" valign="top">a[1,m]</td>
<td width="108" valign="top">*</td>
</tr>
<tr>
<td width="109" valign="top">x2</td>
<td width="60" valign="top">a[2,1]</td>
<td width="84" valign="top">a[2,2]</td>
<td width="48" valign="top">&#8230;</td>
<td width="108" valign="top">a[2,m]</td>
<td width="108" valign="top">*</td>
</tr>
<tr>
<td width="109" valign="top">. . .</td>
<td colspan="5" width="408" valign="top">. . .</td>
</tr>
<tr>
<td width="109" valign="top">xn</td>
<td width="60" valign="top">a[n,1]</td>
<td width="84" valign="top">a[n,2]</td>
<td width="48" valign="top">&#8230;</td>
<td width="108" valign="top">a[n,m]</td>
<td width="108" valign="top">*</td>
</tr>
<tr>
<td width="109" valign="top">s1</td>
<td width="60" valign="top">u[1,1]</td>
<td width="84" valign="top">u[1,2]</td>
<td width="48" valign="top">&#8230;</td>
<td width="108" valign="top">u[1,m]</td>
<td width="108" valign="top">u[1,m+1]</td>
</tr>
<tr>
<td width="109" valign="top">s2</td>
<td width="60" valign="top">u[2,1]</td>
<td width="84" valign="top">u[2,2]</td>
<td width="48" valign="top">&#8230;</td>
<td width="108" valign="top">u[2,m]</td>
<td width="108" valign="top">u[1,m+1]</td>
</tr>
<tr>
<td width="109" valign="top">. . .</td>
<td colspan="5" width="408" valign="top">. . .</td>
</tr>
<tr>
<td width="109" valign="top">sk</td>
<td width="60" valign="top">u[k,1]</td>
<td width="84" valign="top">u[k,2]</td>
<td width="48" valign="top">&#8230;</td>
<td width="108" valign="top">u[k,m]</td>
<td width="108" valign="top">u[k,m+1]</td>
</tr>
<tr>
<td width="109" valign="top">Действия</td>
<td colspan="5" width="408" valign="top">Комбинации выполняемых действий</td>
</tr>
</tbody>
</table>
<p>Табл. 12.1. Общая схема таблиц решений.</p>
<p>Нижняя часть таблицы решений определяет действия, которые требуется выполнить в той или иной ситуации, определяемой в верхней части таблицы решений. Она также состоит из нескольких (k) строк, каждая из которых связана с каким-либо одним конкретным действием, указанным в первом поле (столбце) этой строки. В остальных полях (столбцах) этой строки (т.е. для u[i, j], i=1, &#8230; m+1, j=1, &#8230; k) указывается, следует ли выполнять (u[i, j]= &#8216;+&#8217;) это действие в данной ситуации или не следует (u[i, j]= &#8216;-&#8217;). Таким образом, первый столбец нижней части этой таблицы представляет собой список обозначений действий, которые могут выполняться в той или иной ситуации, определяемой этой таблицей. В каждом следующем столбце этой части указывается комбинация действий, которые следует выполнить в ситуации, определяемой в том же столбце верхней части таблицы решений. Для ряда таблиц решений эти действия могут выполняться в произвольном порядке, но для некоторых таблиц решений этот порядок может быть предопределен, например, в порядке следования соответствующих строк в нижней части этой таблицы.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="138" valign="top">Условия</td>
<td colspan="8" width="488" valign="top">Ситуации</td>
</tr>
<tr>
<td width="138" valign="top">Состояние светофора</td>
<td width="56" valign="top">Кр</td>
<td width="56" valign="top">Кр</td>
<td width="56" valign="top">Кр</td>
<td width="69" valign="top">Жел</td>
<td width="69" valign="top">Жел</td>
<td width="69" valign="top">Зел</td>
<td width="56" valign="top">Зел</td>
<td width="56" valign="top">Зел</td>
</tr>
<tr>
<td width="138" valign="top">T=Tкр</td>
<td width="56" valign="top">Нет</td>
<td width="56" valign="top">Нет</td>
<td width="56" valign="top">Да</td>
<td width="69" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="56" valign="top">*</td>
<td width="56" valign="top">*</td>
</tr>
<tr>
<td width="138" valign="top">T=Tжел</td>
<td width="56" valign="top">*</td>
<td width="56" valign="top">*</td>
<td width="56" valign="top">*</td>
<td width="69" valign="top">Нет</td>
<td width="69" valign="top">Да</td>
<td width="69" valign="top">*</td>
<td width="56" valign="top">*</td>
<td width="56" valign="top">*</td>
</tr>
<tr>
<td width="138" valign="top">T&gt;Tзел</td>
<td width="56" valign="top">*</td>
<td width="56" valign="top">*</td>
<td width="56" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="69" valign="top">Нет</td>
<td width="56" valign="top">Да</td>
<td width="56" valign="top">Да</td>
</tr>
<tr>
<td width="138" valign="top">Появление привиле-гированной машины</td>
<td width="56" valign="top">Нет</td>
<td width="56" valign="top">Да</td>
<td width="56" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="69" valign="top">*</td>
<td width="56" valign="top">Нет</td>
<td width="56" valign="top">Да</td>
</tr>
<tr>
<td width="138" valign="top">Включить красный</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">-</td>
</tr>
<tr>
<td width="138" valign="top">Включить желтый</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
</tr>
<tr>
<td width="138" valign="top">Включить зеленый</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
</tr>
<tr>
<td width="138" valign="top">T:=0</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">-</td>
</tr>
<tr>
<td width="138" valign="top">T:=T+1</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="69" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">+</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">+</td>
</tr>
<tr>
<td width="138" valign="top">Освобож-дение пе-шеходной дорожки</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="69" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
</tr>
<tr>
<td width="138" valign="top">Пропуск пешеходов</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">+</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
</tr>
<tr>
<td width="138" valign="top">Пропуск машин</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="56" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">-</td>
<td width="69" valign="top">+</td>
<td width="56" valign="top">+</td>
<td width="56" valign="top">+</td>
</tr>
<tr>
<td width="138" valign="top">Действия</td>
<td colspan="8" width="488" valign="top">Комбинации выполняемых действий</td>
</tr>
</tbody>
</table>
<p>Рис. 12.2. Таблица решений &#8220;Светофор у пешеходной дорожки&#8221;.</p>
<p>Рассмотрим в качестве примера описание работы светофора у пешеходной дорожки. Переключение светофора в нормальных ситуациях должно производиться через фиксированное для каждого цвета число единиц времени (Tкр &#8211; для красного цвета, Tжел &#8211; для желтого, Tзел &#8211; для зеленого). У светофора имеется счетчик таких единиц. При переключении светофора в счетчике устанавливается 0. Работа светофора усложняется необходимостью пропускать привилегированные машины (на светофор о их появлении поступает специальный сигнал) с минимальной задержкой, но при обеспечении безопасности пешеходов. Приведенная на рис. 11.2 таблица решений описывает работу такого светофора и порядок движения у него в каждую единицу времени . Звездочка (*) в этой таблице означает произвольное значение соответствующего условия.</p>
<p>Поясним сказанное на примере спецификации процесса выбора символов из входного потока по следующим правилам:</p>
<p>а) если очередной символ является управляющим, то подать звуковой сигнал и вернуть код ошибки;</p>
<p>б) если буфер формируемой строки заполнен, то подать звуковой сигнал и вернуть код ошибки;</p>
<p>в) если очередной символ не находится в заданном диапазоне, (положим, от ‘а’ до ‘я’), то подать звуковой сигнал и вернуть код ошибки;</p>
<p>г) иначе поместить символ в буфер, увеличить значение счетчика выбранных символов и вернуть новое значение счетчика.</p>
<p>Таблица решений для данного примера приведена ниже ( таблица 1.1).</p>
<p>Здесь ‘Д’ означает  ‘да’, ‘Н’ &#8211; ‘нет’, 1,2 &#8211; помеченные действия выполняются в указанном порядке.</p>
<p>Таблица 12.3 &#8211; ТР для функции выбора символов из входного потока</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="272" valign="top"><strong>Условия</strong></td>
<td width="48" valign="top">1</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top">3</td>
<td width="48" valign="top">4</td>
<td width="48" valign="top">5</td>
<td width="48" valign="top">6</td>
<td width="48" valign="top">7</td>
<td width="48" valign="top">8</td>
</tr>
<tr>
<td width="272" valign="top">С1    символ управляющий?</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Н</td>
</tr>
<tr>
<td width="272" valign="top">С2   буфер заполнен?</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Н</td>
</tr>
<tr>
<td width="272" valign="top">С3   символ от ‘a’ до ’я’?</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
<td width="48" valign="top">Д</td>
<td width="48" valign="top">Н</td>
</tr>
<tr>
<td width="272" valign="top"><strong>Действия</strong></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
</tr>
<tr>
<td width="272" valign="top">D1  подать звуковой сигнал</td>
<td width="48" valign="top">1</td>
<td width="48" valign="top">1</td>
<td width="48" valign="top">1</td>
<td width="48" valign="top">1</td>
<td width="48" valign="top">1</td>
<td width="48" valign="top">1</td>
<td width="48" valign="top"></td>
<td width="48" valign="top">1</td>
</tr>
<tr>
<td width="272" valign="top">D2  вернуть код ошибки (&gt;0)</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top">2</td>
<td width="48" valign="top"></td>
<td width="48" valign="top">2</td>
</tr>
<tr>
<td width="272" valign="top">D3 увеличить   значение      счетчика и вернуть его</td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top">2</td>
<td width="48" valign="top"></td>
</tr>
<tr>
<td width="272" valign="top">D4  поместить символ в буфер</td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top"></td>
<td width="48" valign="top">1</td>
<td width="48" valign="top"></td>
</tr>
</tbody>
</table>
<p>Заметим, что если выполняется условие С1, то нет необходимости в проверке условий С2 и С3. Поэтому комбинации условий 1,2,3,4 могут быть заменены обобщающей комбинацией (Д, -,  -), где ‘-’ означает любую из возможных альтернатив (в данном случае Д или Н).</p>
<p>Аналогично комбинации условий 5 и 6 могут быть заменены обобщающей комбинацией  (Н, Д, -). Редуцированная таким образом ТР будет иметь вид таблицы 12.4.</p>
<p>Таблица 12.4 Редуцированная ТР</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="281" valign="top"><strong>Условия</strong></td>
<td width="94" valign="top">1</td>
<td width="94" valign="top">2</td>
<td width="94" valign="top">3</td>
<td width="94" valign="top">4</td>
</tr>
<tr>
<td width="281" valign="top">С1    символ управляющий?</td>
<td width="94" valign="top">Д</td>
<td width="94" valign="top">Н</td>
<td width="94" valign="top">Н</td>
<td width="94" valign="top">Н</td>
</tr>
<tr>
<td width="281" valign="top">С2   буфер заполнен?</td>
<td width="94" valign="top">-</td>
<td width="94" valign="top">Д</td>
<td width="94" valign="top">Н</td>
<td width="94" valign="top">Н</td>
</tr>
<tr>
<td width="281" valign="top">С3   символ от ‘a’ до ’я’?</td>
<td width="94" valign="top">-</td>
<td width="94" valign="top">-</td>
<td width="94" valign="top">Д</td>
<td width="94" valign="top">Н</td>
</tr>
<tr>
<td width="281" valign="top"><strong>Действия</strong></td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
</tr>
<tr>
<td width="281" valign="top">D1  подать звуковой сигнал</td>
<td width="94" valign="top">1</td>
<td width="94" valign="top">1</td>
<td width="94" valign="top"></td>
<td width="94" valign="top">1</td>
</tr>
<tr>
<td width="281" valign="top">D2  вернуть код ошибки (&gt;0)</td>
<td width="94" valign="top">2</td>
<td width="94" valign="top">2</td>
<td width="94" valign="top"></td>
<td width="94" valign="top">2</td>
</tr>
<tr>
<td width="281" valign="top">D3 увеличить   значение      счетчика и вернуть его</td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top">2</td>
<td width="94" valign="top"></td>
</tr>
<tr>
<td width="281" valign="top">D4  поместить символ в буфер</td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top">1</td>
<td width="94" valign="top"></td>
</tr>
<tr>
<td width="281" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
<td width="94" valign="top"></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/metody-specifikaci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разработка программного модуля</title>
		<link>http://www.studcode.ru/archiv/razrabotka-programmno/</link>
		<comments>http://www.studcode.ru/archiv/razrabotka-programmno/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:46:41 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=507</guid>
		<description><![CDATA[При разработке программного модуля целесообразно придерживаться следующего порядка :

изучение и проверка спецификации модуля, выбор языка  программирования;
выбор алгоритма и структуры данных;
программирование модуля;
шлифовка текста модуля;
проверка модуля;
компиляция модуля.

Первый шаг разработки программного модуля: изучая спецификацию модуля, разработчик должен убедиться, что она ему понятна и достаточна для разработки этого модуля. В завершении этого шага выбирается язык программирования: хотя язык программирования [...]]]></description>
			<content:encoded><![CDATA[<p>При разработке программного модуля целесообразно придерживаться следующего порядка :</p>
<ul>
<li>изучение и проверка спецификации модуля, выбор языка  программирования;</li>
<li>выбор алгоритма и структуры данных;</li>
<li>программирование модуля;</li>
<li>шлифовка текста модуля;</li>
<li>проверка модуля;</li>
<li>компиляция модуля.</li>
</ul>
<p><strong><em>Первый шаг</em></strong> разработки программного модуля: изучая спецификацию модуля, разработчик должен убедиться, что она ему понятна и достаточна для разработки этого модуля. В завершении этого шага выбирается язык программирования: хотя язык программирования может быть уже предопределен для всего ПС, все же в ряде случаев  может быть выбран другой язык, более подходящий для реализации данного модуля (например, язык ассемблера).</p>
<p><span id="more-507"></span></p>
<p><strong><em>На втором шаге</em></strong> разработки программного модуля необходимо выяснить, не известны ли уже какие-либо алгоритмы для решения поставленной и или близкой к ней задачи. И если найдется подходящий алгоритм, то целесообразно им воспользоваться. Выбор подходящих структур данных, которые будут использоваться при выполнении модулем своих функций, в значительной степени предопределяет логику и качественные показатели разрабатываемого модуля, поэтому его следует рассматривать как весьма ответственное решение.</p>
<p><strong><em>На третьем шаге</em></strong> осуществляется построение текста модуля на выбранном языке программирования. Обилие всевозможных деталей, которые должны быть учтены при реализации функций, указанных в спецификации модуля, легко могут привести к созданию весьма запутанного текста, содержащего массу ошибок и неточностей. Искать ошибки в таком модуле и вносить в него требуемые изменения может оказаться весьма трудоемкой задачей. Поэтому весьма важно для построения текста модуля пользоваться технологически обоснованной и практически проверенной дисциплиной программирования.</p>
<p><strong><em>Следующий шаг</em></strong> разработки модуля связан с приведением текста модуля к завершенному виду в соответствии со спецификацией качества ПС. При программировании модуля разработчик основное внимание уделяет правильности реализации функций модуля, оставляя недоработанными комментарии и допуская некоторые нарушения требований к стилю программы. При шлифовке текста модуля он должен отредактировать имеющиеся в тексте комментарии и, возможно, включить в него дополнительные комментарии с целью обеспечить требуемые примитивы качества . С этой же целью производится редактирование текста программы для выполнения стилистических требований.</p>
<p><strong><em>Шаг проверки</em></strong> модуля представляет собой ручную проверку внутренней логики модуля до начала его отладки (использующей выполнение его на компьютере), реализует общий принцип, сформулированный для обсуждаемой технологии программирования, о необходимости контроля принимаемых решений на каждом этапе разработки ПС.</p>
<p><strong><em>И, наконец, последний шаг разработки модуля</em></strong> означает завершение проверки модуля (с помощью компилятора) и переход к процессу отладки модуля.</p>
<h4>6.3. Пошаговая детализация и понятие о псевдокоде.</h4>
<p>В качестве основного метода построения текста модуля современная технология программирования рекомендует пошаговую детализацию. Сущность этого метода заключается в разбиении процесса разработки текста модуля на ряд шагов. На первом шаге описывается общая схема работы модуля в обозримой линейной текстовой форме (т.е. с использованием очень крупных понятий), причем это описание не является полностью формализованным и ориентировано на восприятие его человеком. На каждом следующем шаге производится уточнение и детализация одного из понятий (будем называть его уточняемым), использованного (как правило, не формализованно) в каком либо описании, разработанном на одном из предыдущих шагов. В результате такого шага создается описание выбранного уточняемого понятия либо в терминах базового языка программирования (т.е. выбранного для представления модуля), либо в такой же форме, что и на первом шаге с использованием новых уточняемых понятий. Этот процесс завершается, когда все уточняемые понятия будут выражены в конечном счете на базовом языке программирования. Последним шагом является получение текста модуля на базовом языке программирования путем замены всех вхождений уточняемых понятий заданными их описаниями.</p>
<p><strong> </strong></p>
<p>Для начального периода развития программотехники, когда программы были штучным продуктом, характерен стиль программирования, который впоследствии получил название “хаотическое” программирование. Суть его в том, чтобы из операторов языка программирования сконструировать программу, выполняющую некоторое (заданное) преобразование данных. Ни набор операторов, ни порядок их применения никак не регламентировался.</p>
<p>Главный недостаток разработанного таким образом ПО – большие трудности его сопровождения. В конце 60-х начале 70-х годов в сфере ПО обозначились трудности, порожденные расширением области применения компьютеров. Возросшая мощность вычислительной техники и появление языков высокого уровня позволили приступить к автоматизации процессов, с которыми люди перестали справляться или к которым еще не приступали из-за их высокой вычислительной сложности. Примерами таких задач могут служить автоматизированные системы управления безопасностью полетов или управления движением по железнодорожным магистралям. Такие системы разрабатывались в течение месяцев и лет. Стоимость ПО доходила до 80% всех затрат, однако обеспечить требуемый уровень их надежности не всегда удавалось.</p>
<p>Цель структурного программирования – разработка программы, которой присуща определенная структура, основанная на применении принципов структурного программирования.</p>
<p>Перечислим эти принципы:</p>
<ol>
<li>Каждый программный модуль (блок,      функция, процедура) должен иметь только один вход и один выход.</li>
</ol>
<p>Это позволяет максимально упростить стыковку модулей в программе.</p>
<ol>
<li>В программах рекомендуется      применять  4 типа конструкций:</li>
</ol>
<p>а)  последовательность (модулей, операторов)</p>
<p>б)  разветвление (условный оператор)</p>
<p>Перечеркивание означает, что Q может отсутствовать.</p>
<p>в)  цикл</p>
<p>1)       с предусловием</p>
<p>2)       с постусловием</p>
<p>г)  выбор из нескольких альтернатив (или переключатель)</p>
<p>3)        разработку программ рекомендуется вести сверху – вниз или по нисходящей стратегии.</p>
<p>Суть нисходящей стратегии в том, что проектировщик должен приступить к работе, имея только концептуальный абстрактный замысел о том, что система или программа будет делать. Затем этот замысел постепенно конкретизируется шаг за шагом, тем самым погружаясь в подробности окончательного программного продукта до тех пор, пока не будет достигнуто «дно», под которым понимаются программные модули, реализующие отдельные функции или процедуры преобразования данных (принцип декомпозиции).</p>
<p>Обобщением проектирования сверху – вниз является и разработка ПО по этому же принципу. Это означает, что до проработки всех деталей можно реализовать для системы скелет верхнего уровня и убедиться в том, что система работоспособна.</p>
<p><strong><em>Объектно-ориентированный стиль программирования</em></strong> основан на объектном моделировании задачи. Здесь происходит поворот &#8220;от процедуры и от структур данных к объекту&#8221;, представляющему собой целостную модель и естественную имитацию деятельности некоторого элемента реального мира. Он во многом снимает недостатки предшествующих стилей программирования, обеспечивает компактность текстов и кодов программ, устойчивость и эволюционное развитие программ через видовую специализацию программных объектов без их изменения и позволяет преодолеть новый уровень сложности разрабатываемых систем. Следует отметить, что этот стиль является логическим продолжением развития процедурно- и потоко-ориентированного программирования, получившего широкое распространение в начале 90-х годов.</p>
<p>Подобно модульному стилю, ОО стиль борется со сложностью программ путем расчленения их на независимые друг от друга небольшие фрагменты, взаимодействие между которыми тщательно проектируется.</p>
<p>Объекты взаимодействуют друг с другом путем передачи информации от одного объекта другому. Информация передается путем посылки сообщения. Объект, принимающий сообщение, реагирует на него особым, только ему известным образом. При этом он может послать сообщения другим объектам, получить от них ответы, изменить свое состояние и, наконец, вернуть ответ тому объекту, который послал ему сообщение. Объекты могут &#8220;порождаться&#8221; и &#8220;умирать&#8221;.</p>
<p><strong>Понятия ООП</strong></p>
<p>При переходе от процедурного к объектно-ориентированному программированию важно понять ключевую идею: схема &#8220;данные &#8211; &gt; процедура -&gt; данные&#8221; заменяется на схему &#8220;запрос -&gt; объект -&gt; данные&#8221;. Основными понятиями ООП являются <strong>объект </strong>(экземпляр класса), <strong>класс</strong>, <strong>метод</strong> и <strong>сообщение</strong> (запрос). Если проводить параллель с процедурным программированием, то этой четверке соответствуют переменная, тип, процедура и процедурный вызов.</p>
<h3>ПЕРЕМЕННАЯ         ТИП           ПРОЦЕДУРА         ВЫЗОВ ПРОЦЕДУРЫ</h3>
<h3>
<table border="0" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="47" height="0"></td>
<td width="12"></td>
<td width="111"></td>
<td width="12"></td>
<td width="83"></td>
<td width="12"></td>
<td width="149"></td>
<td width="12"></td>
</tr>
<tr>
<td height="40"></td>
<td align="left" valign="top"></td>
<td></td>
<td align="left" valign="top"></td>
<td></td>
<td align="left" valign="top"></td>
<td></td>
<td align="left" valign="top"></td>
</tr>
</tbody>
</table>
</h3>
<h3>ОБЪЕКТ                КЛАСС        МЕТОД                    СООБЩЕНИЕ</h3>
<p>Итак, <strong>ООП &#8211; это подход, в котором данные и поведение (методы обработки данных) жестко связаны.</strong> Данные и поведение представлены в виде классов, экземпляры которых &#8211; объекты. ООП позволяет пользователю вводить собственные типы данных, расширяя тем самым набор встроенных в язык типов данных.</p>
<p>Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм.</p>
<p>Под <strong><em>инкапсуляцией</em> </strong>понимается сокрытие данных и операций от внешних программ, использующих их.</p>
<p><strong><em>Наследование</em></strong><em> -</em> это средство получения новых типов данных (классов) из уже существующих типов, называемых базовыми классами. При этом повторно используется существующий код. Порождённый класс образуется из базового путем добавления или изменения кода. Различают единичное наследование, когда имеется только один базовый класс, и множественное наследование, когда базовых классов несколько.</p>
<p><strong><em>Полиморфизм</em> </strong>(множество форм) &#8211; средство для придания различных значений одному и тому же сообщению в зависимости от типа обрабатываемых данных. Например, если аргументы оператора целого типа, то используется целочисленное деление. Если же один или оба аргумента &#8211; значения с плавающей точкой, то используется деление с плавающей точкой.</p>
<p><strong>Сокрытие данных</strong> обеспечивается ключевым словом class и ключевыми словами, связанными с правами доступа: public, private и protected<strong>. <em>Класс</em></strong><em> -</em> это способ инкапсуляции типов данных и связанных с ними функций. Разрешение частной (private) и общей (public) видимости для членов класса дает программисту возможность управлять тем, какие части структуры данных будут модифицируемы. Private части скрыты от кода пользователя, a public &#8211; доступны. Члены класса со статусом доступа protected занимают промежуточное положение: они доступны как внутри класса, так и во всех производных от него классах.</p>
<h2>Достоинства и недостатки ООП</h2>
<p>Одной из самых значительных проблем в программировании является сложность. Чем больше и сложнее программа, тем важнее становится разбить ее на небольшие, четко очерченные части. Чтобы побороть сложность, нужно абстрагироваться от мелких деталей. В том смысле классы представляют собой весьма удобный инструмент.</p>
<p>• Классы позволяют <em>проводить конструирование из полезных</em> <strong>компонент</strong>, обладающих простыми инструментами, что дает возможность абстрагироваться от деталей реализации.</p>
<p>• Данные и операции вместе образуют определенную сущность, и они не «размываются» по всей программе, как это нередко бывает в случае процедурного программирования.</p>
<p>• Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения.</p>
<p>• Инкапсуляция информации защищает наиболее критичные данные от несанкционированного доступа.</p>
<p>Документирование классов – задача более трудная, чем это было в случае процедур и модулей. Поскольку любой метод может быть переопределен, в документации должно говориться не только о том, что делает данный метод, но также и о том, в каком контексте он вызывается.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/razrabotka-programmno/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разработка структуры программы и модульное программирование</title>
		<link>http://www.studcode.ru/archiv/razrabotka-struktury/</link>
		<comments>http://www.studcode.ru/archiv/razrabotka-struktury/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:27:43 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=503</guid>
		<description><![CDATA[Приступая к разработке ПП следует помнить, что ПП является большой системой, поэтому должны приниматься меры по ее упрощению. Одним из основополагающих принципов упрощения является принцип “разделяй и властвуй”, который получил научное название декомпозиция. При разработке ПП этот принцип реализуют путем разработки большой программы по частям, которые называют программными модулями, а сам такой метод разработки программ [...]]]></description>
			<content:encoded><![CDATA[<p>Приступая к разработке ПП следует помнить, что ПП является большой системой, поэтому должны приниматься меры по ее упрощению. Одним из основополагающих принципов упрощения является принцип “разделяй и властвуй”, который получил научное название декомпозиция. При разработке ПП этот принцип реализуют путем разработки большой программы по частям, которые называют программными модулями, а сам такой метод разработки программ называют модульным программированием</p>
<p>Что в теории понимается под модулем?</p>
<p><strong>Модуль – это замкнутая программа, которую можно вызвать из другого модуля и самостоятельно откомпилировать</strong>. Другое определение: программный модуль – это любой фрагмент описания процесса, оформляемый как самостоятельный программный продукт, пригодный для использования в описаниях процесса.</p>
<p><span id="more-503"></span></p>
<p><strong>Модуль – это программа, обладающая тремя основными атрибутами:</strong></p>
<ol>
<li><strong>1. </strong><strong>он выполняет одну или несколько функций;</strong></li>
<li><strong>2. </strong><strong>модуль реализует некоторую логику (алгоритм).</strong></li>
<li><strong>3. </strong><strong>используется в одном или нескольких контекстах.</strong></li>
</ol>
<p>При этом функция – это то, что делает модуль, а не то, как он это делает. А вот логика характеризует, как модуль выполняет свои функции. Контекст описывает конкретное применение.</p>
<p>Основная причина по которой разрабатываемое ПО разбивается на модули – борьба со сложностью ПО.</p>
<p>Принципы модульного программирования позволяют получать программные комплексы минимальной сложности. Эти  принципы следующие:</p>
<p>а) усиление внутренних связей в каждом модуле (иначе принцип называется повышением прочности модуля);</p>
<p>б) ослабление взаимосвязи между модулями (иначе этот принцип называется ослаблением сцепления модулей).</p>
<p>Если рассматривать программу как набор предложений, связанных между собой некоторыми отношениями (как по выполняемым функциям, так и по обрабатываемым данным), то применение принципов модульного программирования означает, что необходимо распределить предложения программы по отдельным модулям так, чтобы предложения внутри каждого модуля были тесно связаны, а связь между любыми двумя модулями была минимальной.</p>
<p>Стиль программирования &#8211; это способ построения программ, концептуальной основой которых являются соответствующая система понятий, стиль мышления и подход к решению задач.</p>
<p>Модульный стиль программирования заключается в том, что алгоритм любой исходной задачи представляется как композиция алгоритмов простых подзадач, последовательно выделенных из исходной задачи. Каждая подзадача может быть реализована с помощью функций и процедур или с помощью модулей. Поскольку в этом случае каждая подзадача имеет структуру, аналогичную структуре исходной основной программы, то можно продолжить детализацию каждой из подпрограмм (принцип декомпозиции).</p>
<p>Однако на практике при реализации больших проектов процедуры и функции оказываются недостаточно удобным средством по следующим причинам:</p>
<p>•  большой объем текста программы затрудняет ее понимание;</p>
<p>•  всякий раз после изменения программы ее необходимо перекомпилировать, затрачивая определенное время;</p>
<p>Поэтому структурные элементы подзадач, полученные в процессе декомпозиции исходной задачи, часто реализуются в виде программных модулей, расширяющих понятие подпрограмм. Программа исходной задачи теперь будет состоять из главного модуля и дополнительных модулей (или просто модулей). Главный модуль &#8211; это основная программа, использующая модули. Модуль &#8211; это совокупность операторов, описывающих независимые функции обработки программы исходной задачи. Модуль разрабатывается и может быть скомпилирован отдельно от главного модуля. Сам модуль может иметь средства связи с другими модулями.</p>
<p>При проектировании программы формируется иерархия модулей. Главный модуль передает подготовленные параметры и управление модулю, который сам может передавать управление и параметры другим модулям, последние после выполнения в них программного кода возвращают управление назад, вызвавшему его модулю. Подобная структура независимых модулей позволяет легко модифицировать программу исходной задачи путем замены старых модулей на новые, добавления и удаления ненужных модулей.</p>
<p><strong>Метод <em>восходящей разработки</em></strong><em> </em>заключается в следующем. Сначала строится модульная структура программы в виде дерева. Затемпоочередно программируются модули программы, начиная с модулей самого нижнего уровня (листья дерева модульной структуры программы), в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может обращаться. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в принципе в таком же (восходящем) порядке, в каком велось их программирование. На первый взгляд такой порядок разработки программы кажется вполне естественным: каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули. Однако, современная технология не рекомендует такой порядок разработки программы. Во-первых, для программирования какого-либо модуля совсем не требуется текстов используемых им модулей &#8211; для этого достаточно, чтобы каждый используемый модуль был лишь специфицирован (в объеме, позволяющем построить правильное обращение к нему), а для тестирования его возможно (и даже, как мы покажем ниже, полезно) используемые модули заменять их имитаторами (заглушками). Во-вторых, каждая программа в какой-то степени подчиняется некоторым внутренним для нее, но глобальным для ее модулей соображениям (принципам реализации, предположениям, структурам данных и т.п.), что определяет ее концептуальную целостность и формируется в процессе ее разработки. При восходящей разработке эта глобальная информация для модулей нижних уровней еще не ясна в полном объеме, поэтому очень часто приходится их перепрограммировать, когда при программировании других модулей производится существенное уточнение этой глобальной информации (например, изменяется глобальная структура данных). В-третьих, при восходящем тестировании для каждого модуля (кроме головного) приходится создавать ведущую программу (модуль), которая должна подготовить для тестируемого модуля необходимое состояние информационной среды и произвести требуемое обращение к нему. Это приводит к большому объему &#8220;отладочного&#8221; программирования и в то же время не дает никакой гарантии, что тестирование модулей производилось именно в тех условиях, в которых они будут выполняться в рабочей программе.</p>
<p><strong>Метод <em>нисходящей разработки</em></strong> заключается в следующем. Как и в предыдущем методе сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модуля самого верхнего уровня (головного), переходя к программированию какого-либо другого модуля только в том случае, если уже запрограммирован модуль, который к нему обращается. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же (нисходящем) порядке. При таком порядке разработки программы вся необходимая глобальная информация формируется своевременно, т.е. ликвидируется весьма неприятный источник просчетов при программировании модулей. Существенно облегчается и тестирование модулей, производимое при нисходящем тестировании программы. Первым тестируется головной модуль программы, который представляет всю тестируемую программу и поэтому тестируется при &#8220;естественном&#8221; состоянии информационной среды, при котором начинает выполняться эта программа. При этом все модули, к которым может обращаться головной, заменяются на их имитаторы (так называемые заглушки. Каждый <em>имитатор модуля </em>представляется весьма простым программным фрагментом, сигнализирующим, в основном, о самом факте обращения к имитируемому модулю с необходимой для правильной работы программы обработкой значений его входных параметров (иногда с их распечаткой) и с выдачей, если это необходимо, заранее запасенного подходящего результата. После завершения тестирования и отладки головного и любого последующего модуля производится переход к тестированию одного из модулей, которые в данный момент представлены имитаторами, если таковые имеются. Для этого имитатор выбранного для тестирования модуля заменяется на сам этот модуль и добавляются имитаторы тех модулей, к которым может обращаться выбранный для тестирования модуль. При этом каждый такой модуль будет тестироваться при &#8220;естественных&#8221; состояниях информационной среды, возникающих к моменту обращения к этому модулю при выполнении тестируемой программы. Таким образом большой объем &#8220;отладочного&#8221; программирования заменяется программированием достаточно простых имитаторов используемых в программе модулей. Кроме того, имитаторы удобно использовать для подыгрывания процессу подбора тестов путем задания нужных результатов, выдаваемых имитаторами.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/razrabotka-struktury/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Основные понятия и конструкции языков программирования</title>
		<link>http://www.studcode.ru/archiv/osnovnye-ponyatiya-i/</link>
		<comments>http://www.studcode.ru/archiv/osnovnye-ponyatiya-i/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:21:33 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=500</guid>
		<description><![CDATA[Языки программирования
Формально язык программирования — это открытое для пополнения множество текстов, записанных с помощью некоторого набора символов — алфавита языка
. Содержательно, по основному своему назначению, язык программирования — это средство общения между человеком, или, как еще говорят, пользователем языка и вычислительной машиной (компьютером).
Применительно к знаковым системам, в частности к языкам программирования, говорят об их синтаксисе [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Языки программирования</strong></p>
<p><strong><em>Формально язык программирования</em></strong> — это открытое для пополнения множество текстов, записанных с помощью некоторого набора символов — <strong><em>алфавита</em></strong><em> </em>языка</p>
<p>. <strong><em>Содержательно</em></strong>, по основному своему назначению, язык программирования — это средство общения между человеком, или, как еще говорят, <em>пользователем</em> языка и вычислительной машиной (компьютером).</p>
<p>Применительно к знаковым системам, в частности к языкам программирования, говорят об их <strong><em>синтаксисе</em></strong><em> —</em> правилах образования текстов, <strong><em>семантике</em></strong><em> — </em>правилах истолкования текстов тем, кому они адресованы.</p>
<p><span id="more-500"></span></p>
<p>В случае языков программирования:</p>
<p><strong><em>Синтаксис языков программирования </em></strong>— это совокупность требований, которым должна удовлетворять любая осмысленная программа</p>
<p><strong><em>Семантика языка программирования</em></strong><em> </em>— это правила, определяющие, какие операции и в какой последовательности должна исполнить машина, работая по произвольной заданной ей программе.</p>
<p>Простые значения — это числа, логические значения, литеры и ссылки. Типы простых значений часто называют <strong><em>простыми типами</em></strong><em>.</em> В некоторых языках встречаются н другие простые типы.</p>
<h2><span style="text-decoration: underline;">Числа</span></h2>
<p>Принято различать два основных типа <em>чисел<strong>: целые</strong></em> и так называемые <strong><em>вещественные</em></strong><em>.</em></p>
<p><strong><span style="text-decoration: underline;">Целое &#8211; множество целых чисел в диапазоне разрядной сетки ЭВМ.</span></strong></p>
<p>Характеристикой этого типа  данных  может  быть  длина, выражаемая максимальным объемом памяти (в байтах) или максимальным числом десятичных позиций для записи данных (в случае двоично-десятичного представления целых чисел).</p>
<p>Кроме арифметической операции сложения, вычитания, умножения и целочисленного деления над целыми числами выполняются такие операции, как вычисление по заданному модулю (нахождение остатка от деления), определение максимального и минимального числа среди  нескольких чисел, возведения в целую степень, определение следующего или предыдущего по значению чисел.</p>
<p>Для хранения целого числа в памяти ЭВМ выделяется фиксированное количество двоичных позиций .</p>
<p>Используется в ЭВМ формат представления чисел с фиксированной точкой, при этом представляется, что точка фиксирована после самого младшего разряда числа.</p>
<p><strong><span style="text-decoration: underline;">Действительные числа &#8211; множество вещественных чисел в диапазоне их представления в разрядной сетке ЭВМ.</span></strong></p>
<p>В ЭВМ точность представления действительного числа является ограниченной из-за конечности (ограниченности) разрядной сетки ЭВМ. Так, число 0.1 в ЭВМ представляется неточно, так как его двоичное представление является бесконечной дробью.</p>
<p>Типичные операции над  действительными числами – сложение, вычитание, умножение, деление, вычисление тригонометрических функций, возведение в степень, извлечение квадратного корня, логарифмирование, нахождение минимального и максимального числа из некоторого конечного множества чисел и некоторые другие.</p>
<p>Вещественные числа хранятся и используются в операциях над ними в формате с плавающей точкой.</p>
<p>X = M * E P ,</p>
<p>где М- мантисса со знаком, /М/&gt;1,</p>
<p>Е- фиксированное основание (для десятичных чисел Е= 10, в ЭВМ чаще используется  основание 16, но может быть и 2 или 8, во всяком случае, кратное 2).</p>
<p>Для  вещественных  чисел  точность  исполнения  даже  самых  простых  операций  не  гарантируется,  т.  е.  допускается,  что  результат  любой  операции  может  быть  получен  с  некоторой  погрешностью  —  ошибкой  округления.  Величина  этой  ошибки  зависит  от  операции,  значений  операндов,  диапазона,  которому  принадлежат  эти  значения,  и,  разумеется,  от  компьютера-  на  котором  исполняется  программа,  поскольку  вид  компьютера,  определяет  способ  представления  чисел  внутри  каждого  из  допустимых  диапазонов.</p>
<p>Опишем  синтаксис  обозначений,  принятый  в  –«Паскале».  Далее:</p>
<h2><span style="text-decoration: underline;">Логические значения</span></h2>
<p>Следующий  тип  простых  значений  —  это  <em>логические</em> или  <em>булевы</em> значения.</p>
<p><span style="text-decoration: underline;">Тип логический или </span><span style="text-decoration: underline;">BOOLEAN</span><span style="text-decoration: underline;"> характеризуется тем, что может принимать два значения “истина” или “ ложь”. В</span> разных языках программирования эти два логических значения могут записываться по разному. Например, в Паскале это true и false.</p>
<p>Они  служат  для  того,  чтобы  зафиксировать  один  из  двух  возможных  ответов  на  некоторый  вопрос,  один  из  двух  возможных  исходов  некоторой  проверки,  одно  из  двух  состояний  некоторого  объекта.</p>
<p>Типовыми операциями над этими данными является конъюнкция (и), дизъюнкция (или), отрицание (не). Часто в языках программирования используются и более сложные логические операции: исключающее или, импликация, эквивалентность. Кроме того, логическое значение является результатом выполнения операций (&lt;, £, &gt;, ³,  =, ¹) над целыми и вещественными числами, символьными и другими данными, над которыми эти операции имеют смысл.</p>
<h2><span style="text-decoration: underline;">Литеры и строки</span></h2>
<p><span style="text-decoration: underline;">Символьный тип (или данное типа строка) включает множество символов или литер, доступных в конкретной ЭВМ</span>.</p>
<p>В ЭВМ символы представляются в двоичном коде. Эти коды упорядочены и для каждого символа может быть определен соответствующий ему порядковый номер.</p>
<p>В некоторых языках программирования, таких, как Паскаль, есть стандартные операции определения кода по соответствующему номеру символа и обратная операция, определяющая номера в последовательности по заданному символу. В этом же языке реализованы и такие операции над символами, как определение последующего символа относительно заданного.</p>
<p>Значения  из  доступного  набора  литер  относятся  к  типу  <em>литерный.</em> Это  еще  не  тексты,  а  только  знаки:  из  которых  составляются  тексты  —  конечные  последовательности  литер,  называемые  обычно  <em>строками</em> или  <em>цепочками.</em> Строки  иногда  причисляют  к  простым  значениям  (типа  <em>строковый},  ин</em>огда  -  к  составным.</p>
<p>Ссылочный тип данных. Динамические объекты.</p>
<p><span style="text-decoration: underline;">Тип указатель (или </span><span style="text-decoration: underline;">POINTER</span><span style="text-decoration: underline;">) представляет собой множество адресов данных в пределах объема памяти ОЗУ (количество адресуемых байтов, слов). </span></p>
<p><strong>1</strong>. Природа <span style="text-decoration: underline;">динамических объектов</span> и способы их реализации.</p>
<p>Все объекты, представляющие данные в программе и которые рассматривали до сих пор, были статические в том смысле, что все их параметры, размеры были известны до выполнения программы. Следовательно, ресурсы для них можно было заранее спланировать и выделить.</p>
<p>Существуют задачи, для которых характерно наличие данных: &#8211; фактическое появление которых возможно, но не обязательно; &#8211; время жизни этих объектов меньше времени исполнения программы. Такие объекты называют <span style="text-decoration: underline;">динамическими объектами</span>.</p>
<p>Для работы со статическими объектами в языках программирования используется хорошо известный механизм имен. Однако, этот механизм вряд ли нам подходит для представления и манипуляции динамическими объектами. Дело в том, что имя должно быт известно до выполнения программы &#8211; это во-первых. Во вторых, порождение всякого именованного объекта связано с выделением памяти. Раз объекты возникают динамически, то заранее мы не знаем сколько их будет. Следовательно не можем заранее выделить  нужное количество имен.</p>
<p>Каждый раз, когда порождается динамический объект ему выделяется место в памяти. Адрес начала выделенной области памяти полагается в качестве значения ссылочной переменной, представляющей динамический объект. При уничтожении динамического объекта занимаемая им память считается свободной, а соответствующая ссылочная переменная принимает специальное значение &#8211; нет объекта. Все действия над динамическими объектами в программе описываются как действия над значениями ссылочных переменных.</p>
<p>Связь указателя (ссылочной переменной) с объектом графически можно проиллюстрировать так:</p>
<p>Значение ссылочной переменной, соответствующее отсутствию динамического объекта &#8211; nil (зарезервированное слово).</p>
<h2>Составные  значения  и  их  типы</h2>
<p>В  современных  языках  программирования  могут  использоваться  значения  сложной  структуры,  теоретически  —  сколь  угодно  сложной.  Надо  уметь  задавать  эту  структуру,  называемую  также  <em>типом</em> значения.</p>
<p><span style="text-decoration: underline;">Структура данных – это совокупность элементов данных, между которыми существуют некоторые отношения, причем элементами данных могут быть простые данные и структуры данных.</span></p>
<p>Структуру данных можно определить, как</p>
<p>S=(D,R),</p>
<p>где D- множество элементов данных, R-множество отношений (связей) между элементами данных.</p>
<p><span style="text-decoration: underline;">Массив – конечное упорядоченное множество простых данных или скаляров одного и того же типа. </span> Элементы вектора находятся между собой в отношении непосредственного следования. В памяти ЭВМ элементы вектора представляются последовательностью одинаковых по длине участков памяти, как правило, расположенных в порядке следования элементов в группе. Важнейшая операция над вектором – доступ к заданному элементу. Кроме того, над вектором можно выполнять операции определения верхней и нижней границ индекса. По сути эти операции дают описание вектора.</p>
<p>Э<em>лементы</em> вектора  нумеруются  целыми  числами  (<em>индексами).</em> Но,  в  отличие  от  векторов  в  алгебре,  нумерация  элементов  не  обязана  начинаться  с  1,  Индексы  могут  быть  и  отрицательными.  Их  диапазон  задается  так,  как  было  сказано  в  начале  раздела,  и  часто  называется  <em>граничной  парой,</em> состоящей  из  двух  <em>границ:  нижней</em> и  <em>верхней.</em></p>
<p><span style="text-decoration: underline;">к-мерным массивом называется конечное упорядоченное множество (к-1) мерных массивов, все элементы которых принадлежат одному и тому же типу. При к=1 получаем вектор.</span></p>
<h2>Записи</h2>
<p>Следующий  способ  образования  составных  значений  &#8211;  это  объединение  некоторого  фиксированного  числа  <em>k</em> значений,  возможно,  различных,  но  также  фиксированных  типов  &lt;тип1&gt;,.,.  ,  &lt;тии2&gt;,  в  одно.  Такое  объединение  принято  называть  <em>записью</em> (реже  <em>структурой),  а. </em>объединяемые  значения  —  <em>полями</em> этой  записи.  Чтобы  можно  было  выделять  из  записи  отдельные  поля,  они  снабжаются  индивидуальными  наименованиями  -  <em>идентификаторами  полей,</em> которые  входят  в  обозначение  типа  записи:</p>
<p>&lt;тип  записи&gt;<strong> ::= </strong><strong>record  &lt;список</strong> полей&gt;<strong> </strong><strong>end </strong></p>
<p>&lt;список  полей&gt;  <em>::=</em> &lt;идентификатор&gt;:&lt;тип&gt;</p>
<p>|  &lt;список  полей&gt;;  &lt;идентификатор&gt;:&lt;тип&gt;</p>
<p>Классический  пример  типа  записи  —  тип  комплексного  числа,  имеющий  обозначение</p>
<p><strong>record</strong> re  :  real;  <em>irn.  :</em> real  endrec</p>
<p>Тип  записи  для  календарной  даты  может  быть  таким:</p>
<p><strong>record</strong> <em>day  :</em><strong> byte;</strong> <em>month:</em><strong> string</strong> [8]:  <em>year  :</em><strong> word  endrec</strong></p>
<p><strong> </strong></p>
<p>Определения этих структур данных основаны на понятии списка или списковой структуры.</p>
<p><span style="text-decoration: underline;">Списком называется линейно-упорядоченная последовательность элементов данных </span><span style="text-decoration: underline;">E(1),</span><span style="text-decoration: underline;">E(2)…</span><span style="text-decoration: underline;">E(</span><span style="text-decoration: underline;">n),  где </span><span style="text-decoration: underline;">n&gt;0,причем каждый элемент </span><span style="text-decoration: underline;">E(</span><span style="text-decoration: underline;">i) характеризуется одним и тем же набором полей.</span> Такой список называют линейным списком из-за линейной упорядоченности элементов. Упорядоченность элементов списка может быть задана неявно путем последовательного расположения его элементов как в логической структуре, так и в памяти ЭВМ (т.е физической структуре данных). Список с таким неявным заданием упорядоченности в логической и физической структурах называют еще последовательным линейным списком. С другой стороны, упорядоченность может задаваться явно путем помещения в каждом элементе E(i) указателей или связок, в которых помещается адрес последующего или предыдущего элемента списка. Такие списки называют связными списками и о них мы буде мы говорить позже.</p>
<p><span style="text-decoration: underline;">Полустатические структуры данных- это последовательные линейные списки с переменной длиной, ограниченной фиксированной максимальной величиной и с ограниченным доступом.</span> К таким структурам относятся стеки и очереди. Есть еще деки, но они менее распространены и на них останавливаться не будем.</p>
<p><span style="text-decoration: underline;">Стек &#8211; такой последовательный линейный список с переменной длиной, включение и исключение элементов из которого выполняется только с одного конца списка.</span> Известно и другое название стека – магазин. Иногда стек называют еще очередью, функционирующей по принципу LIFO (Last- In-First- Out –последним пришел – первым вышел).</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="95">Emax</td>
</tr>
<tr>
<td width="95"></td>
</tr>
<tr>
<td width="95">En</td>
</tr>
<tr>
<td width="95">En-1</td>
</tr>
<tr>
<td width="95">…</td>
</tr>
<tr>
<td width="95">E1</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="175" height="27" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Верхняя граница стека</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="12" height="13"></td>
</tr>
<tr>
<td></td>
<td width="196" height="27" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Свободные слоты</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="196" height="26" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Нижняя граница стека</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="166" height="108" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Вершина стека, с ней связан       указатель стека = адрес последнего занятого элемента стека</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Логическая структура стека</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="287" height="27" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Физическая структура стека может быть изображена следующим образом:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="190" valign="top">ST – имя стека</td>
</tr>
<tr>
<td width="190" valign="top">Адрес верхней границы</td>
</tr>
<tr>
<td width="190" valign="top">Указатель вершины</td>
</tr>
<tr>
<td width="190" valign="top">Адрес нижней границы</td>
</tr>
<tr>
<td width="190" valign="top">Описание элемента</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
<td width="25" valign="top"></td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="246" height="26" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Ячейки     оперативной памяти ЭВМ</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="9" height="11"></td>
</tr>
<tr>
<td></td>
<td width="336" height="27" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Рис.4.2.  Физическая структура стека</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Для включения нового элемента в стек сначала изменяется значение указателя вершины стека на длину элемента стека, а затем по значению этого указателя помещается новый элемент стека. При исключении элемента стека сначала прочитывается информация из вершины стека по значению указателя, а затем значение указателя уменьшается на величину длины элемента стека.</p>
<p>Для хранения стека в памяти ЭВМ отводится сплошная область памяти ограниченного объема. Если в процессе заполнения стека указатель выходит за отведенные границы стека, то происходит переполнение стека и включение нового элемента становится невозможным.</p>
<p><span style="text-decoration: underline;">Очередь – такой последовательный список с переменной длиной,</span> включение элементов в который происходит с одной стороны, а исключение с другой стороны списка.</p>
<p>Очередь функционирует по принципу – FIFO (First-In-First-Out-первым пришел, первым вышел).</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="106" height="26" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Указатель P2</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Для индикации начала и конца очереди организуются 2 указателя: схема простейшей очереди будет следующая:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="34" valign="top">A1</td>
<td width="34" valign="top">A2</td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="31" valign="top"></td>
<td width="49" valign="top">Amax</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="136" height="27" bgcolor="white">
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>Указатель P1</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Из схемы следует: для очереди выделяется фиксированный участок памяти ЭВМ, в котором, как правило, заняты в каждый момент времени лишь некоторые слоты. Указатель P1 является адресом первого (начального), слота очереди, P2 – адресом первого свободного слота очереди.</p>
<p>При включении в очередь вносится по адресу P2, затем значение указателя P2 изменяется (передвигается на 1 элемент очереди), т.е. значение P2 увеличивается на длину элемента очереди.</p>
<p>При исключении из  очереди извлекается элемент, адресуемый указателем P1, и после этого указатель P1 перемещается к следующему слоту, т.е его значение увеличено на длину элемента очереди.</p>
<p>Динамическая структура имеет следующие основные признаки:</p>
<p>1.     Непостоянство и непредсказуемость размера (числа элементов) структуры в процессе ее обработки.</p>
<p>2. Отсутствие физической смежности элементов структуры в физической памяти. Логическая последовательность элементов задается в явном виде с помощью одного или нескольких указателей или связок, хранящихся в самих элементах. Следовательно, память, занимаемая динамической структурой не является непрерывной и может быть хаотически разработана в области памяти.</p>
<p>Часто динамические структуры физически представляются в форме связных списков.</p>
<p><span style="text-decoration: underline;">Связный список</span> – такая структура, элементами которой служат записи с одним и тем же форматом, связанные друг с другом с помощью указателей, хранящихся в самих элементах списка.</p>
<p>В  односвязном линейном списке каждый элемент состоит из двух различных по назначению полей: содержательного и поля указателя. Логическая структура может быть изображена так:</p>
<table border="0" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="154" height="16"></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="92" valign="top">Æ</td>
</tr>
<tr>
<td width="92" valign="top">данные</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="92" valign="top">Указатель</td>
</tr>
<tr>
<td width="92" valign="top">данные</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="83" valign="top">Указатель</td>
</tr>
<tr>
<td width="83" valign="top">данные</td>
</tr>
</tbody>
</table>
<p>Æ -пустой указатель, означает конец списка.</p>
<p>Физическая структура списка может быть такой :</p>
<p>Включение списка и исключения элемента из списка осуществляется путем корректировки указателей.</p>
<p>Схематично покажем включение в односвязный список нового элемента между двумя существующими элементами списка. Чаще всего местоположение нового элемента определяется по назначения ключа:</p>
<p>В этом случае значение L2 записывается в поле указателя включаемой записи значение поля указанной записи, после которого включается новый элемент, изменяется на LN   ,Þ,окончательная логическая структура будет следующей:</p>
<p>Исключение из списка может быть так:</p>
<p>В этом случае поле указателя записи, после которого удаляется элемент изменяется на значение адреса, следующего за исключаемым элемента списка (L2®L3). Оконченная логическая структура обновленного списка:</p>
<p>Аппарат  процедур  позволяет  дать  обозначение  некоторому  оператору  —  <strong><em>телу  процедуры</em></strong><em>,  с</em> тем,  чтобы  этот  оператор  мог  быть  исполнен  как  бы  в  том  месте  программы,  где  возникла  потребность  в  описываемых  им  действиях,  и  где  для  этой  цели  содержится  <strong><em>обращение  к  процедуре</em></strong> (в  другой  терминологии  —  ее  вызов).  Тело  процедуры  обычно  содержит  некоторые  идентификаторы,  называемые  <strong><em>{формальными}  параметрами</em></strong> процедуры.  При  обращении  к  процедуре,  непосредственно  перед  исполнением  ее  тела,  эти  параметры  либо  получают  значения  соответствующих  <em>аргументов</em> обращения  <strong><em>(фактических  параметров</em></strong><em>},</em> либо  заменяются  этими  аргументами.  Первый  вариант  называется  <em>вызовом</em> параметров  <em>значением,</em> второй  —  вызовом  <em>по  имени.</em></p>
<p><strong>Функции.</strong></p>
<p>В отличие от процедур, функции &#8211; определяют правила вычисления значений. В отличие от процедур функция не определяет, что надо делать с полученным значением. Заметим, что значения, получаемые через функции, могут быть только простых типов.</p>
<p><strong>Описание функции.</strong></p>
<p>Для определения правила вычисления значения используется понятие &lt;описание функции&gt;. Это описание размещается в разделе процедур и функций того блока, где они используются.</p>
<p>&lt;описание функции&gt;::=&lt;заголовок функции&gt;;&lt;блок&gt;</p>
<p>&lt;заголовок функции&gt;::=<strong>function </strong>&lt;имя функции&gt;</p>
<p>[(&lt;список формальных параметров&gt;)] :&lt;имя типа&gt;.</p>
<p>Подобно процедурам функции могут быть без параметров, могут иметь параметры-значения и параметры-переменные. Имя типа в заголовке функции необходимо по двум причинам:</p>
<ol>
<li>для определения типа выражения, надо знать типы операндов;</li>
<li>для контроля правильности использования функции в программе.</li>
</ol>
<p>Подобно процедуре, тело функции &#8211; блок. Как же определить какой из результатов, получаемых в теле функции &#8211; значение функции? Для этого в теле функции обязательно должен быть хотя бы один выполняемый оператор присваивания вида &lt;имя функции&gt;:=&lt;выражение&gt;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/osnovnye-ponyatiya-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Общие принципы разработки программных средств</title>
		<link>http://www.studcode.ru/archiv/obshhie-principy/</link>
		<comments>http://www.studcode.ru/archiv/obshhie-principy/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:15:42 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=497</guid>
		<description><![CDATA[Под жизненным циклом ПС понимают весь период его разработки и эксплуатации (использования), начиная от момента возникновения замысла ПС и кончая прекращением всех видов его использования. Жизненный цикл включает все процессы создания и использования ПС (software process).
Различают следующие стадии жизненного цикла ПС (см. рис. 3.1): разработку ПС, производство программных изделий (ПИ) и эксплуатацию ПС.
Стадия разработки (development) [...]]]></description>
			<content:encoded><![CDATA[<p>Под <strong><em>жизненным циклом </em>ПС</strong> понимают весь период его разработки и эксплуатации (использования), начиная от момента возникновения замысла ПС и кончая прекращением всех видов его использования. Жизненный цикл включает все процессы создания и использования ПС (<em>software process</em>).</p>
<p>Различают следующие стадии жизненного цикла ПС (см. рис. 3.1): разработку ПС, производство программных изделий (ПИ) и эксплуатацию ПС.</p>
<p>Стадия <em>разработки (development</em>) ПС состоит из</p>
<ul>
<li>этапа его внешнего описания,</li>
<li>этапа конструирования ПС,</li>
<li>этапа кодирования (программирование в узком смысле) ПС,</li>
<li>этапа аттестации ПС.</li>
</ul>
<p>Всем этим этапам сопутствуют процессы документирования и управление (<em>management</em>) разработкой ПС.</p>
<p><strong><em>Внешнее описание </em></strong><strong>ПС</strong> является описанием его поведения с точки зрения внешнего по отношению к нему наблюдателю с фиксацией требований относительно его качества.</p>
<p><strong><em>Конструирование </em></strong><strong>ПС</strong> охватывает процессы: разработку архитектуры ПС, разработку структур программ ПС и их детальную спецификацию.</p>
<p><span id="more-497"></span></p>
<p><strong><em>Кодирование</em></strong><em> </em>создание текстов программ на языках программирование, их отладку с тестированием ПС.</p>
<p>На этапе <strong><em>аттестации </em>ПС</strong> производится оценка качества ПС, после успешного завершения которого разработка ПС считается законченной.</p>
<p><strong><em>Программное изделие</em></strong><em> (ПИ)</em> &#8211; экземпляр или копия, снятая с разработанного ПС. <em>Изготовление </em>ПИ &#8211; это процесс генерации и/или воспроизведения (снятия копии) программ и программных документов ПС с целью их поставки пользователю для применения по назначению. <em>Производство </em>ПИ &#8211; это совокупность работ по обеспечению изготовления требуемого количества ПИ в установленные сроки</p>
<p>Стадия <em>эксплуатации </em>ПС охватывает процессы хранения, внедрения и сопровождения ПС, а также транспортировки и применения ПИ по своему назначению. Она состоит из двух параллельно проходящих фаз: фазы применения ПС и фазы сопровождения ПС .</p>
<p><strong><em>Применение</em></strong><strong> </strong>ПС &#8211; это использование ПС для решения практических задач на компьютере путем выполнения ее программ.</p>
<p><strong><em>Сопровождение </em></strong><em> </em>ПС &#8211; это процесс сбора информации о его качестве в эксплуатации, устранения обнаруженных в нем ошибок, его доработки и модификации, а также извещения пользователей о внесенных в него изменениях</p>
<p>Каждое ПС должно выполнять определенные функции, т.е. делать то, что задумано. Хорошее ПС должно обладать еще целым рядом свойств, позволяющим успешно его использовать в течении длительного периода, т.е. обладать определенным качеством.</p>
<p><strong><em>Качество </em></strong><strong>ПС</strong> &#8211; это совокупность его черт и характеристик, которые влияют на его способность удовлетворять заданные потребности пользователей . Это не означает, что разные ПС должны обладать одной и той же совокупностью таких свойств в их высшей возможной степени.  Качество ПС является удовлетворительным, когда оно обладает указанными свойствами в такой степени, чтобы гарантировать успешное его использование.</p>
<p>Совокупность свойств ПС, которая образует удовлетворительное для пользователя качество ПС, зависит от условий и характера эксплуатации этого ПС. Поэтому при описании качества ПС должны быть прежде всего фиксированы <strong><em>критерии</em></strong><em> </em>отбора требуемых свойств ПС. В настоящее время критериями качества ПС принято считать :</p>
<ul>
<li>функциональность,</li>
<li>надежность,</li>
<li>легкость применения,</li>
<li>эффективность,</li>
<li>сопровождаемость,</li>
<li>мобильность.</li>
</ul>
<p><strong><em>Функциональность</em></strong><em> </em>- это способность ПС выполнять набор функций, удовлетворяющих заданным или подразумеваемым потребностям пользователей. Набор указанных функций определяется во внешнем описании ПС.</p>
<p><strong><em>Надежность</em></strong><em> </em>подробно обсуждалась в первой лекции.</p>
<p><strong><em>Легкость применения</em></strong><em> </em>- это характеристики ПС, которые позволяют минимизировать усилия пользователя по подготовке исходных данных, применению ПС и оценке полученных результатов, а также вызывать положительные эмоции определенного или подразумеваемого пользователя.</p>
<p><strong><em>Эффективность</em></strong><em> </em>- это отношение уровня услуг, предоставляемых ПС пользователю при заданных условиях, к объему используемых ресурсов.</p>
<p><strong><em>Сопровождаемость</em></strong><em> </em>- это характеристики ПС, которые позволяют минимизировать усилия по внесению изменений для устранения в нем ошибок и по его модификации в соответствии с изменяющимися потребностями пользователей.</p>
<p><strong><em>Мобильность</em></strong><em> </em>- это способность ПС быть перенесенным из одной среды (окружения) в другую, в частности, с одной ЭВМ на другую.</p>
<p>Функциональность и надежность являются обязательными критериями качества ПС, причем обеспечение надежности будет красной нитью проходить по всем этапам и процессам разработки ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с требованиями к ПС &#8211; их обеспечение будет обсуждаться в подходящих разделах курса.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/obshhie-principy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>НАДЕЖНОЕ ПРОГРАММНОЕ СРЕДСТВО КАК ПРОДУКТ ТЕХНОЛОГИИ  ПРОГРАММИРОВАНИЯ.</title>
		<link>http://www.studcode.ru/archiv/nadezhnoe-programmnoe/</link>
		<comments>http://www.studcode.ru/archiv/nadezhnoe-programmnoe/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:12:58 +0000</pubDate>
		<dc:creator>sleepes</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=495</guid>
		<description><![CDATA[Целью программирования является описание процессов обработки данных (в дальнейшем &#8211; просто процессов).
Данные - это представление фактов и идей в формализованном виде, пригодном для передачи и переработке в некоем процессе,
 информация - это смысл, который придается данным при их представлении.
Обработка данных - это выполнение систематической последовательности действий с данными.
Описать процесс &#8211; значит определить последовательность состояний заданной [...]]]></description>
			<content:encoded><![CDATA[<p>Целью программирования является описание процессов обработки данных (в дальнейшем &#8211; просто <em>процессов</em>).</p>
<p><strong>Д<em>анные</em></strong><em> </em>- это представление фактов и идей в формализованном виде, пригодном для передачи и переработке в некоем процессе,</p>
<p><strong> <em>информация</em></strong><em> </em>- это смысл, который придается данным при их представлении.</p>
<p><strong><em>Обработка данных</em></strong><em> </em>- это выполнение систематической последовательности действий с данными.</p>
<p><strong><em>Описать процесс</em></strong> &#8211; значит определить последовательность состояний заданной информационной среды.  Такое описание называется <strong><em>программой</em>.</strong> С другой стороны, программа должна быть понятной и человеку, так как и при разработке программ, и при их использовании часто приходится выяснять, какой именно процесс она порождает. Поэтому программа составляется на удобном для человека формализованном <strong><em>языке программирования</em></strong>, с которого она автоматически переводится на язык соответствующего компьютера с помощью другой программы, называемой <strong><em>транслятором</em></strong>. Человеку (<strong><em>программисту</em></strong>), прежде чем составить программу на удобном для него языке программирования, приходится проделывать большую подготовительную работу по уточнению постановки задачи, выбору метода ее решения, выяснению специфики применения требуемой программы, прояснению общей организации разрабатываемой программы и многое другое. Использование этой информации может существенно упростить задачу понимания программы человеком, поэтому весьма полезно ее как-то фиксировать в виде отдельных документов (часто не формализованных, рассчитанных только для восприятия человеком).</p>
<p><span id="more-495"></span></p>
<p>Обычно программы разрабатываются в расчете на то, чтобы ими могли пользоваться люди, не участвующие в их разработке (их называют <strong><em>пользователями</em></strong>). Для освоения программы пользователем помимо ее текста требуется определенная дополнительная документация. <span style="text-decoration: underline;">Программа или логически связанная совокупность программ на носителях данных, снабженная программной документацией, называется <strong><em>программным средством</em></strong><em> (ПС</em></span><em>)</em>. Программа позволяет осуществлять некоторую автоматическую обработку данных на компьютере. Программная документация позволяет понять, какие функции выполняет та или иная программа ПС, как подготовить исходные данные и запустить требуемую программу в процесс ее выполнения, а также: что означают получаемые результаты (или каков эффект выполнения этой программы).</p>
<p><em>Надежность </em>ПС &#8211; это его способность безотказно выполнять определенные функции при заданных условиях в течение заданного периода времени с достаточно большой вероятностью. При этом под <em>отказом </em>в ПС понимают проявление в нем ошибки. Таким образом, надежная ПС не исключает наличия в ней ошибок &#8211; важно лишь, чтобы эти ошибки при практическом применении этого ПС в заданных условиях проявлялись достаточно редко. Убедиться, что ПС обладает таким свойством можно при его испытании путем тестирования, а также при практическом применении. Таким образом, фактически мы можем разрабатывать лишь надежные, а не правильные ПС.</p>
<p>Разрабатываемая ПС может обладать различной степенью надежности. Как измерять эту степень? Так же как в технике, степень надежности можно характеризовать вероятностью работы ПС без отказа в течении определенного периода времени. Однако в силу специфических особенностей ПС определение этой вероятности наталкивается на ряд трудностей по сравнению с решением этой задачи в технике. Позже мы вернемся к более обстоятельному обсуждению этого вопроса.</p>
<p>При оценке степени надежности ПС следует также учитывать последствия каждого отказа. Некоторые ошибки в ПС могут вызывать лишь некоторые неудобства при его применении, тогда как другие ошибки могут иметь катастрофические последствия, например, угрожать человеческой жизни. Поэтому для оценки надежности ПС иногда используют дополнительные показатели, учитывающие стоимость (вред) для пользователя каждого отказа.</p>
<p>Кто такой <em>профессионал</em>? Этим словом мы называем человека, который занимается каким-либо делом не просто как специалист, но и демонстрирует <em>профессионализм</em> &#8211; отличное владение своей профессией (в нашем случае &#8211; программированием). Профессионализм &#8211; это интегральная личностная характеристика человека (программиста), который:</p>
<ul>
<li>овладел нормами профессиональной деятельности и общения и осуществляет их на высоком уровне, добиваясь профессионального мастерства в своей области (программировании);</li>
<li>следует профессиональной ценностной ориентации, соблюдая профессиональную этику;</li>
<li>развивает свою личность средствами профессии;</li>
<li>стремится внести творческий вклад в профессию, обогащая ее опыт;</li>
<li>стремится и умеет вызвать интерес общества к результатам своей профессиональной деятельности, способствует повышению веса и престижа своей профессии в обществе, гибко учитывает новые запросы общества к ней.</li>
</ul>
<p>Природа профессионализма такова, что чем он выше, тем он уже.</p>
<p><strong> </strong></p>
<p>Выделим основные функции профессиональных программистов .</p>
<ul>
<li><em>Разработка систем большого объема</em>. Профессионалы знают, что &#8220;выход за некоторую границу сложности создаваемого программного продукта без надлежащей технологии разработки вообще невозможен&#8221;.</li>
<li><em>Создание системного и инструментального программного обеспечения</em>, которым будут пользоваться остальные. Профессиональными программистами создается инструментальное обеспечение в большом диапазоне &#8211; от профессионального до массового.</li>
<li><em>Разработка программного продукта с предъявлением особых требований к его качеству и эффективности</em>. Различные требования предъявляются к программам, создаваемым только для себя, и к программам, предназначенным для большого количества пользователей. Во втором случае любая неаккуратность и малейшая небрежность может повториться многократно в работах будущих пользователей.</li>
<li><em>Разработка программ на основе подхода открытых систем. Открытая система</em> (open system) &#8211; система, которая состоит из компонентов, взаимодействующих друг с другом через стандартные интерфейсы. Общие свойства открытых систем таковы:</li>
<li><em>мобильность</em> (переносимость) кода. Мобильность дает возможность легко переносить программное обеспечение на различные архитектурные и операционные платформы;</li>
<li><em>интероперабельность</em>. Дает возможность легко осуществить обмен данными и взаимодействие с прикладными задачами в других системах;</li>
<li><em>соответствие стандартам</em>. После того как стандарт принят, он становится силой, помогающей двигаться вперед. Как это ни парадоксально, но следование канонам дает новые степени свободы в современном мире.</li>
</ul>
<p>На наш взгляд, одни из наиболее удачных определений этих понятий принадлежат Бруксу .</p>
<p><strong><em>Программа</em></strong> &#8211; завершенный продукт, пригодный для запуска своим автором на системе, на которой он был разработан.</p>
<p><strong><em>Программный продукт</em></strong> &#8211; программа, которую любой человек может запускать, тестировать, исправлять и развивать. Такая программа должна быть написана в обобщенном стиле, тщательно оттестирована и сопровождена подробной документацией.</p>
<p><strong><em>Программное средство</em></strong> &#8211; это программа или логически связанная совокупность программ на носителях данных, снабженная программной документацией.</p>
<p><strong><em>Алгоритм</em> </strong>- точное и конечное описание того или иного общего метода, основанного на применении исполнимых элементарных тактов обработки.</p>
<p>Компьютер &#8211; <em>вычислитель</em>, он не понимает программу, а исполняет ее. Наиболее естественный способ указать компьютеру ход исполнения программы &#8211; записать ее в виде алгоритма (на алгоритмическом языке). Современное значение слова &#8220;алгоритм&#8221; во многом аналогично таким понятиям, как рецепт, процесс, метод, способ. Алгоритм имеет пять важных свойств .</p>
<ul>
<li><strong><em>Конечность</em></strong>. Алгоритм всегда должен заканчиваться после выполнения конечного      числа шагов.</li>
<li><strong><em>Определенность</em></strong>. Каждый шаг алгоритма должен быть точно определен.</li>
<li><strong><em>Наличие входных данных</em></strong>. Алгоритм имеет некоторое число входных данных, задающихся до      начала его работы или определяющихся динамически во время его выполнения.</li>
<li><strong><em>Наличие выходных данных</em></strong>. Алгоритм имеет одно или несколько выходных данных, имеющих      определенную связь с входными данными.</li>
<li><strong><em>Эффективность</em></strong>. Алгоритм обычно считается эффективном, если его операторы      достаточно просты для того, чтобы их можно было точно выполнить в течение      конечного промежутка времени с помощью карандаша и бумаги.</li>
</ul>
<p>С алгоритмами связаны приведенные ниже области исследований.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/nadezhnoe-programmnoe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Источники ошибок в программных средствах</title>
		<link>http://www.studcode.ru/archiv/istochniki-oshibok/</link>
		<comments>http://www.studcode.ru/archiv/istochniki-oshibok/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 12:06:26 +0000</pubDate>
		<dc:creator>archey</dc:creator>
				<category><![CDATA[Теория программирования]]></category>
		<category><![CDATA[лекции]]></category>

		<guid isPermaLink="false">http://www.studcode.ru/?p=319</guid>
		<description><![CDATA[При разработке и использовании ПС мы многократно имеем дело  с преобразованием (переводом) информации из одной формы в другую. Заказчик формулирует свои потребности в ПС в виде некоторых требований. Исходя из этих требований разработчик создает внешнее описание ПС, используя при этом спецификацию (описание) заданной аппаратуры и, возможно, спецификацию базового программного обеспечения. На основании внешнего описания [...]]]></description>
			<content:encoded><![CDATA[<p>При разработке и использовании ПС мы многократно имеем дело  с преобразованием (переводом) информации из одной формы в другую. Заказчик формулирует свои потребности в ПС в виде некоторых требований. Исходя из этих требований разработчик создает внешнее описание ПС, используя при этом спецификацию (описание) заданной аппаратуры и, возможно, спецификацию базового программного обеспечения. На основании внешнего описания и спецификации языка программирования создаются тексты программ ПС на этом языке. По внешнему описанию ПС разрабатывается также и пользовательская документация. Текст каждой программы является исходной информацией при любом ее преобразовании, в частности, при исправлении в ней ошибки.<span id="more-319"></span> Пользователь на основании документации выполняет ряд действий для применения ПС и осуществляет интерпретацию получаемых результатов. Везде здесь, а также в ряде других процессах разработки ПС, имеет место указанный перевод информации.  На каждом из этих этапов перевод информации может быть осуществлен неправильно, например, из-за неправильного понимания исходного представления информации. Возникнув на одном из этапов ошибка в представлении информации распространяется на последующие этапы разработки и, в конечном счете, окажется в самом ПС.  Чтобы понять природу ошибок при переводе рассмотрим модель, изображенную на рис.2.1. На ней человек осуществляет перевод информации из представления A в представление B. При этом он совершает четыре основных шага перевода:      Модель перевода. •	он получает информацию, содержащуюся в представлении A, с помощью своего читающего механизма R;  •	он запоминает полученную информацию в своей памяти M;  •	он выбирает из своей памяти преобразуемую информацию и информацию, описывающую процесс преобразования, выполняет перевод и посылает результат своему пишущему механизму W;  •	с помощью этого механизма он фиксирует представление B.  На каждом из этих шагов человек может совершить ошибку разной природы.  На первом шаге способность человека &#8220;читать между строк&#8221; (способность, позволяющая ему понимать текст, содержащий неточности или даже ошибки) может стать причиной ошибки в ПС. Ошибка возникает в том случае, когда при чтении документа A человек, пытаясь восстановить недостающую информацию, видит то, что он ожидает, а не то, что имел в виду автор документа A. В этом случае лучше было бы обратиться к автору документа за разъяснениями. При запоминании информации человек осуществляет ее осмысливание (здесь важен его уровень подготовки и знание предметной области, к которой относится документ A). И, если он поверхностно или неправильно поймет, то информация будет запомнена в искаженном виде.  На третьем этапе забывчивость человека может привести к тому, что он может выбрать из своей памяти не всю преобразуемую информацию или не все правила перевода, в результате чего перевод будет осуществлен неверно. Это обычно происходит при большом объеме плохо организованной информации.  И, наконец, на последнем этапе стремление человека побыстрее зафиксировать информацию часто приводит к тому, что представление этой информации оказывается неточным, создавая ситуацию для последующей неоднозначной ее интерпретации.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studcode.ru/archiv/istochniki-oshibok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

