Определение символических констант 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение символических констант



Символической(именованной) константой называют имя в тексте программы, которое должно быть заменено на конкретное постоянное значение до трансляции. Их применение позволяет сократить текст программы и сделать ее более ясной. Обычно это некоторые общеупотребительные константы, такие как: p, e и т.п., а также константы, которые могут измениться при модификации программы.

Пример.

PI=3.141593 TAB_SIZE=100

Стиль записи: принято записывать символические константы прописными буквами. В примере с вычислением квадратичной формы замена размера массивов, равного 4, на константу SIZE позволяет при модификации программы сделать изменение размера в одном месте.

Формат директивы определения символической константы:

#define <имя> <постоянное_выражение>

Пример.

# define PI 3.141593

#define EOF (-1)

#define PI2 (2*PI)

Значение константы желательно заключать в скобки, поскольку при подстановке возможны ошибки.

Пример.

а) #define E (5+10)

б) #define E 5+10

Подстановка 2*E в случае б) даст ошибку.

Некоторые определения.

Макроопределение – определение имени с помощью директивы #define.

Макроподстановка – замена имени в тексте программы на значение соответствующей константы.

Макровызов – появление имени символической константы в тексте.

Макросредства или макросы – средства, реализующие макроподстановки.

Пример.

#define SIZE 10

...............

float maxmatr(float a[ ][SIZE], int *k, int *l){

…………..

}

Включение файлов в текст программы

Файл – любая совокупность данных, имеющая отдельную спецификацию и включенная в каталог (папку) операционной системы. Формат спецификации: <имя>.<тип (расширение)>

Принятые по умолчанию типы файлов для языков C и C++:

.c - исходный текст на языке C,

.cpp - исходный текст на языке C++,

.obj - объектный (оттранслированный) модуль,

.exe - загрузочный (выполняемый) модуль,

.h - заголовочный (header) файл.

Включение файла в текст программы выполняется с помощью директивы вида:

# include {"<спецификация_файла>"| < <спецификация_файла> > }

Пример.

# include <stdio.h>

# include "my.h"

Обычно в текст программы включают другие программные файлы (.c или .cpp) или заголовочные (.h) файлы. В заголовочные файлы принято включать общие для различных процедур символические константы, прототипы функций, другие описания и определения. Очень много .h файлов входят в состав транслятора, например, stdio.h описывает стандартный пакет библиотечных функций ввода-вывода, в частности функции scanf и printf, math.h содержит прототипы всех библиотечных математических функций.

В директиве заключение спецификации файла в "..." предписывает искать включаемый файл в папке, где находится вызов программы, а в случае его ненахождения там в определенных в среде разработки папках. Применение для этой цели <... > выполняет поиск файла в папках, определенных в среде разработки.

Теперь приведем в качестве примера законченную работоспособную программу.

#include <stdio.h>

#define SIZE 4

/*******************************************************/

/* ВЫЧИСЛЕНИЕ КВАДРАТИЧНОЙ ФОРМЫ */

/******************************************************/

void main( void ){

float u[SIZE], /* Входной вектор */

b[SIZE][SIZE], /* Входная матрица */

v[SIZE], /* Вектор b*u */

z, /* Результат */

scalar( float [ ], float [ ]); /* Скалярное произведение векторов */

int i, j;

void matrix(float [ ][SIZE], float [ ], float [ ]);

printf("Исходный вектор:\n");

for (i=0; i<SIZE; i++){

scanf("%f", & u[ i ]);

}

printf("Исходная матрица:\n");

for (i=0; i<SIZE; i++){

for (j=0; j<SIZE; j++){

scanf("%f", & b[ i ][ j ]);

}

}

matrix(b, u, v);

z=scalar(v, u);

printf("\n\n\nКвадратичная форма равна %.5g\n", z);

}/* End main */


/* Умножение матрицы на вектор */

void matrix(float a[ ][SIZE], float x[ ], float y[ ]){

int i, j;

for (i=0; i<SIZE; i++){

for (y[ i ]=j=0; j<SIZE; j++){

y[ i ]+=a[ i ][ j ]*x[ j ];

}

}

}/* End matrix */

/* Скалярное произведение векторов */

float scalar( float x[ ], float y[ ]){

int i;

for (z=i=0; i<SIZE; i++){

z+=x[ i ]*y[ i ];

}

return z;

}/* End scalar */

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. С какой позиции записываются директивы препроцессора?

2. Какова область действия директивы?

3. Можно ли обойтись без директивы #include в языке C?

Контрольные вопросы

1. Что такое препроцессор?

2. В чем выгода применения директивы #define?

3. В каких заголовочных файлах находятся прототипы математических функций и функций ввода-вывода?

 

СТИЛЬ ПРОГРАММИРОВАHИЯ

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

Стиль – набор приемов или методов программирования, используемых для получения правильных, удобных для применения, легкочитаемых и, желательно, эффективных программ. Особый стиль – это программы, понятные лишь автору. Практически стиль – это набор рекомендаций по написанию программ, удовлетворяющих перечисленным выше принципам. Приведенные ниже рекомендации в равной степени подходят и к языку C, и к языку Basic.

9.1. Формирование листинга

Исторически листингом называли распечатку текста программы. Сейчас под этим можно понимать размещение текста программы на любом носителе: бумаге, экране и т.п.

Размещение инструкций. Следует записывать 1 инструкцию (кроме сложных) в строку.

Причины:

- соответствует требованиям структурного программирования, требующим сдвигать инструкцию по строке в соответствии с уровнем ее вложенности;

- облегчает коррекцию текста.

Перенос:

- если слово не входит в строку, начинайте его с новой;

- делайте перенос после знака операции; это даст ошибку при трансляции в случае случайного удаления строки продолжения.

Пример.

a=b-c Hехорошо! a=b-c- Хорошо!

-(d+2); (d+2);

Отступы. Отступ – это абзац, выявление структуры программы. Используется, как правило, при записи сложных инструкций, имеющих в своем составе другие инструкции. Рекомедуемый размер отступа для вложенных инструкций 4-5 позиций. Размер отступа должен быть одинаков по всей программе.

Циклы.

for (i=0; i<16; i++){ for i=0 to 15

c=0; c=0

for (k=0; k<12; k++){ for k=0 to 11

c+=b[k]; d[k]= sqrt (k+1); c=c+b(k): a(k)= sqr (k+1)

} next k

a[ i ]=c; a(i)=c

} next i

Условные инструкции.

if (a>b){ if a>b then

a=-a; a=-a

b*=a; b=b*a

} else { else

a*=b; a=a*b

b=-b; b=-b

} end if

При переносе инструкции строки продолжения сдвигать вправо на 5-6 позиций.

Пропуск строк и пробелы. Пропуск строки – это вертикальная разрядка текста.

Применение:

- выделение логических частей текста;

- после нарушения естественного порядка выполнения программы (инструкции continue, break, goto, различные формы инструкции exit);

- выделение комментариев.

Пробелы следует употреблять везде, где это улучшает читабельность программы.

Пример.

if (a<b && b<c){

Комментарии

Цель – пояснить логику, облегчить отладку, тестирование и сопровождение программ.

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

Вопрос о количестве (объеме) комментариев является дискуссионным. Их количество зависит от сложности логики программы, числа процедур и используемых библиотечных функций, а также от того, является ли программа коллективной разработкой или нет. Можно указать такой косвенный критерий достаточности объема комментирования: объем комментариев должен быть таков, чтобы при чтении ее текста, скажем через 1 год, можно было достаточно легко разобраться в логике и структуре программы.

Можно также привести грубый количественный критерий: ориентировочный объем комментариев – 50-70% от объема кода программы.

Различают следующие типы комментариев: оглавления, вводные, пояснительные.

Оглавления. Разумно составлять для программ, объем кода которых превышает 300 – 500 КБ.

Вводные. Записываются перед началом текста процедуры. Содержание:

- функция, выполняемая процедурой;

- характеристики и особенности процедуры.

Пример.

/********************************************************/

/* WHEN_WHOLE_BASE */

/* Редактировать поле, если БД не разделена */

/********************************************************/

Пояснительные. Служат для пояснения:

- параметров и переменных при объявлении (помещаются справа от имени);

- смысла неочевидных проверок (справа от условия);

- логического фрагмента процедуры (на отдельных строках перед началом фрагмента).

Пример.

if (agpec == NULL){ /* Hесогласованная ссылка */

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


Имена



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 421; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.184.237 (0.023 с.)