Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Запись алгоритмов с помощью диаграмм Несси - Шнейдермана (структограмм )



Язык Си является достаточно развитым для того, чтобы вообще обойтись без каких-либо особых способов записи алгоритмов.

Однако для тех, кто только начинает программировать, может понадобится более наглядное средство иллюстрации алгоритмов.

Раньше для таких целей широко использовались так называемые блок-схемы. Однако их применение очень легко может привести к появлению программ с неоправданно сложной структурой, в которой трудно разобраться.

Для описания логики работы программ вместо блок-схем можно использовать диаграммы Несси - Шнейдермана, которые отличаются тем, что пригодны для описания только структуированных программ (состоящих из базовых логических структур).

Рассмотрим базовые логические структуры и их представление в виде структограмм.

Процесс - один или несколько операторов, выполнение которых происходит последовательно. Изображается в виде прямоугольника, управление в который передается сверху, а выходит из него снизу:

 
 

Проверка условия - управление передается в один из нижних процессов:

 
 

Цикл - пока. Процесс повторяется несколько раз пока истинно условие.

9.4.

 
 

Некоторые приемы программирования

Рассмотрим некоторые типовые приемы программирования и использования рассмотренных выше операторов.

Для подсчета различных объектов, получающихся в процессе работы программы используют счетчики, которые представляют собой переменные целого типа, меняющие свои значения в процессе выполнения счета. Использование счетчика покажем на примере

программы, которая подсчитывает количество отрицательных значений функции sin( x ) для x меняющегося от xn до xk с шагом h.

Вначале запишем алгоритм с помощью диаграммы Несси-Шнейдермана.


 
 

Теперь можно рассмотреть программу на языке Си:

 

#include < math.h>

#include < stdio.h>

 

/* использование счетчика */

 

void main( void )

{

double xn, xk, h, x;

int Count; /* счетчик */

 

printf( " Введите xn, xk, h \n" );

scanf( " %lf%lf%lf", & xn, & xk, & h );

x = xn;

Count = 0; /* инициализация счетчика */

while( x < = xk )

{

if( sin(x) < 0 ) Count++; /* выполнение счета */

x += h;

}

printf( " Число отрицательных синусов = %d\n", Count);

}

 

Довольно часто в программах приходится вычислять суммы и произведения. При нахождении суммы надо выделить переменную для ее хранения, обнулить ее, затем циклически добавлять к ней очередное значение. Найдем сумму отрицательных значений функции sin(x) для x меняющегося от xn до xk с шагом h. Следующая программа решает эту задачу:

 

#include < math.h>

#include < stdio.h>

 

/* нахождение суммы отрицательных значений синуса */

 

void main( void )

{

double xn, xk, h, x, sum;

 

printf( " Введите xn, xk, h \n" );

scanf( " %lf%lf%lf", & xn, & xk, & h );

x = xn;

sum = 0; /* обнуление суммы */

while( x < = xk )

{

if( sin(x)< 0 ) sum += sin(x); /* вычисление суммы */

x += h;

}

printf( " Сумма = %lf\n", sum);

}

 

Для повышения эффективности программы можно описать еще одну переменную, например sinus и изменить оператор вычисления суммы:

 

if( ( sinus = sin(x) ) < 0 ) sum += sinus;

 

В этом случае экономится время за счет однократного вычисления синуса.

Для вычисления произведения необходимо выделить переменную для его хранения, занести в эту переменную единицу и в цикле домножать ее на очередное значение.

Во многих сложных алгоритмах требуется запоминать факты наступления различных событий, связанных с процессом выполнения программы. Для этих целей используются флаги, которые представляют собой переменные целого типа, принимающие определенные значения в зависимости от этих событий. Простейший пример использования флагов иллюстрирует фрагмент программы, моделирующий работу оператора if с помощью оператора while. Иными словами, показывается, что при реализации программ можно вообще обойтись без оператора if. Действительно, рассмотрим следующий оператор if:

 

if( a > b ) k = sin(x); else k = x * x;

 

Очевидно, такие же действия будет выполнять группа операторов, использующая флаг и приведенная ниже:

 

fl = 1; /* флаг */

while ( a > b & & fl ) { k = sin(x); fl = 0; }

while ( fl ) { k = x * x; fl = 0; }

 

В данном случае флаг сигнализирует о выборе одной из альтернатив оператора if.

Следующая программа устанавливает факт наличия отрицательных значений sin(x) для x меняющегося от xn до xk c шагом h:

 

#include < math.h>

#include < stdio.h>

 

/* использование флагов */

 

void main( void )

{

double xn, xk, h, x;

int minus; /* флаг */

 

printf( " Введите xn, xk, h \n" );

scanf( " %lf%lf%lf", & xn, & xk, & h );

x = xn;

minus = 0; /* предполагается, что нет не одного

отрицательного значения */

 

while( x < = xk )

{

if( sin(x) < 0 ) minus = 1;

x += h;

}

if( minus ) printf( " Имеются отрицательные значения\n" );

else printf( " Все синусы положительные\n" );

}

 

В данной программе флаг устанавливается в 1, как только появляется отрицательный синус.

Оператор прерывания цикла

Предыдущая программа имеет существенный недостаток: перебираются все значения синуса, хотя цикл можно остановить, когда появится первое отрицательное значение. Этот недостаток можно исправить, как показано в следующем фрагменте:

 

x = xn;

minus = 0;

while( x < xk & & ! minus )

{

...

}

 

В языке Си есть специальный оператор для прерывания цикла. Это оператор " break; ". Выполнение его в программе немедленно прерывает цикл, в котором он находится и управление передается на следующий за циклом оператор. Используя оператор break, цикл предыдущей программы можно переписать в виде:

 

x = xn;

minus = 0;

while( x < xn )

{

if( sin(x) < 0 ) { minus = 1; break; }

x += h;

}

 

Оператор продолжения цикла

Оператор " continue; " вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются:

 

while(... )

{

...

if(...) continue;

... /* операторы пропускаются */

}

 

Операторы break и continue позволяют избавиться от необходимости применения оператора goto, поэтому последний в этом методическом пособии не рассматривается.

Пример организации простейшего меню

Современный стиль программирования предписывает использовать в программах различного рода меню, которые предоставляют пользователю возможность выбора одного из предложенных действий. Следующая программа вычисляет sin(x), cos(x), tan(x) в зависимости от выбора пользователя:

 

#include < math.h>

#include < stdio.h>

 

/* Организация простейшего меню */

void main ( void )

{

int loop; /* Флаг, который сигнализирует о конце работы */

int choice; /* Текущий выбор пункта меню */

double fun, x; /* Значения функции и аргумента */

printf( " \nВведите аргумент x=" );

scanf( " %lf", & x );

loop=1;

while ( loop )

{

printf ( " \n Введите номер функции: \n" );

printf ( " 1. sin(x)\n2. cos(x)\n" );

printf ( " 3. tan(x)\n4. Конец работы\n" );

scanf ( " %d", & choice );

if (choice==1) fun=sin(x);

else if (choice==2) fun=cos(x);

else if (choice==3) fun=tan(x);

else if (choice==4) { loop=0; continue; }

else { printf( " Неверный выбор\n" ); continue; }

printf( " Значение функции %lf\n", fun );

}

}

 

Данная программа выводит на экран дисплея список возможных действий. Пользователь должен выбрать нужное, введя его номер.

Для управления выходом из цикла и организации конца работы программы используется флаг loop.


Поделиться:



Популярное:

  1. DFD - диаграмма потоков данных
  2. А - структурная схема; б - условное обозначение в - временные диаграммы
  3. А. Переносом стальных опилок. Б. Переносом магнита. В. Переносом проводника с током. Г. Вытягиванием его с помощью сильного электромагнита. Д. Магнитное поле переместить невозможно.
  4. Алгоритмы записи произвольной функции, заданной в таблице в виде с помощью элементарных функций.
  5. Анализ производительности с помощью анализа последовательности событий
  6. Б. Обозначение мягкости согласных с помощью мягкого знака
  7. В глава 17 рассматриваются методы, с помощью которых стимулируется сбыт товаров и услуг, в частности реклама, прямой маркетинг и прочие средства стимулирования сбыта.
  8. В ПСИХОЛОГИИ ИСПОЛЬЗУЮТСЯ СПЕЦИАЛЬНЫЕ МЕТОДЫ. С ПОМОЩЬЮ
  9. Введение: Управляйте сами своим временем с помощью метода
  10. Векторная диаграмма полных напряжения и тока в различных сечениях линии
  11. Векторные диаграммы синхронных двигателей
  12. Виды асимметричных алгоритмов


Последнее изменение этой страницы: 2016-03-17; Просмотров: 790; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.03 с.)
Главная | Случайная страница | Обратная связь