Правила записи программы на языке Си 5 Правила формального описания синтаксиса языка программирования 6
Вид материала | Лекции |
Содержание7.Понятие о препроцессоре языка Си 8.Операторы языка Си и приемы программирования 8.1.Оператор цикла while 8.2.Условный оператор и условная операция |
- Правила преобразований из одного типа в другой и правила приведения типов в языке Object, 19.03kb.
- Оформление программы на языке Паскаль. Оператор вывода. Описание переменных. Оператор, 186.34kb.
- Программа наименование дисциплины Латинский язык (1,2 уровни), 154.48kb.
- Экзаменационные вопросы по курсу "Методы программирования", 32.44kb.
- Вопросы по курсу Программирование на языке высокого уровня (яву), 102.97kb.
- Структура программы в языке программирования С++. Обмен данными между функциями (параметры, 37.24kb.
- Программа курса " Азы программирования", 26.19kb.
- Структура программы языка Турбо Паскаль Программа на языке Турбо Паскаль имеет вид, 792.5kb.
- Эволюция языков программирования, 493.92kb.
- Структура программы на языке Turbo Pascal, 26.15kb.
7.Понятие о препроцессоре языка Си
Препроцессором называется составная часть компилятора, которая производит обработку исходного текста программы перед ее трансляцией. Управление работой препроцессора осуществляется с помощью специальных директив. Все директивы препроцессора начинаются со знака #.
Ранее была рассмотрена директива include. Вместо нее в исходный текст программы препроцессор вставляет содержимое файла, указанного в директиве.
Так, по директиве #include
Если в директиве #include имя файла заключено в кавычки, то вставляемый файл вначале ищется по правилам, предусмотренным MSDOS, а только потом в специальном системном каталоге. Например, по директиве препроцессора #include "func.h" будет осуществлена вставка текста из файла func.h, находящегося в текущем каталоге текущего диска.
Директива #define используется для назначения символических имен различным строкам текста. Например, директива:
#define PI 3.14159
осуществляет назначение имени PI строки 3.14159. В дальнейшем, вместо 3.14159 в программе можно использовать имя PI. Вместо него перед трансляцией программы препроцессор подставит соответствующую строку.
В принципе строка может быть сколь угодно сложной, например:
#define TITLE printf("-------sin(x)-------cos(x)-------");
Однако использовать такие конструкции не рекомендуется ввиду сложности отыскания ошибок.
8.Операторы языка Си и приемы программирования
Оператор (statement - предложение) - блок, используемый при создании программы. Программа всегда представляет собой последовательность операторов ( предложений ).
Признаком конца оператора в простейшем случае является ";". Одиночная ";" является пустым оператором. Как было отмечено выше, точка с запятой поставленная в конце выражения превращает его в оператор.
Кроме простого оператора в языке Си вводится понятие составного оператора, который представляет собой несколько операторов, заключенных в фигурные скобки:
БНФ:
составной_оператор = "{" оператор { оператор } "}"
Пример:
{ a = b + c; scanf( "%lf", &t ); }
Составной оператор рассматриваются компилятором как одиночный оператор и может быть использован в любом месте, где допускается использование одиночного оператора.
Все операторы языка Си, кроме оператора-выражения начинаются с ключевых слов. Например, описания начинаются с int, double и т.д.
Ключевые слова являются зарезервированными, т.е. их нельзя использовать для обозначения объектов программ. Имена стандартных функций не являются зарезервированными.
8.1.Оператор цикла while
Оператор цикла while предназначен для реализации циклических алгоритмов и имеет следующую форму записи
БНФ:
"while" "(" выражение ")" оператор
Пример :
while( a < 18 ) a = a+2;
При выполнении оператора цикла while вначале вычисляется выражение. Если оно не равно 0, то выполняется оператор. Далее снова вычисляется выражение и если оно не равно 0, то снова выполняется оператор. Такие циклические действия продолжаются до тех пор, пока выражение отлично от 0. Отсюда и название цикла while ( пока ). Как только выражение станет равным 0 цикл прекращает выполнятся и управление передается на следующий за циклом оператор.
Циклически выполняемый оператор обычно называют телом цикла. Если в теле цикла необходимо разместить не один, а несколько операторов, то в этом случае используют составной оператор.
Все операторы тела цикла должны быть записаны с отступом, обычно в три пробела.
Рассмотрим пример программы, которая выводит на экран таблицу функций sin(x) и cos(x):
#include
#include
void main( void )
{
double x = 0;
while( x < 3.0 )
{
printf( "%6.3lf %9.6lf %9.6lf\n",x, sin(x), cos(x) );
x += 0.2;
}
}
Если после while( x < 3.0 ) ошибочно поставить точку с запятой, то никаких сообщений об ошибках выдано не будет, но цикл станет бесконечным. Действительно, в этом случае тело цикла будет пустым оператором ";", переменная x не будет меняться, следовательно, результат выражения x < 3.0 всегда будет отличен от нуля.
В теле правильно организованного цикла обязательно должны содержатся операции, влияющие на выражение в заголовке цикла так, чтобы цикл рано или поздно завершился.
8.2.Условный оператор и условная операция
Условный оператор предназначен для выбора одного из двух альтернативных действий и имеет следующую форму записи:
БНФ:
условный_оператор =
"if" "("выражение")" оператор_1 ["else" оператор_2]
Пример:
if ( a ) c = b+1; else c = b - 1;
if ( a > b ) k = sin( x ); else k = x + x;
При выполнении условного оператора вначале вычисляется <выражение>. Если его значение не равно нулю, то выполняется <оператор_1>, а <оператор_2> пропускается. Если значение выражения равно нулю, то выполняется <оператор_2>, а <оператор_1> пропускается.
При наличии вложенных операторов if следует иметь в виду, что ключевое слово else всегда относится к ближайшему if, как показано в следующем примере:
if( b > a )
if( c < d ) k= sin(x);
else t = cos(x);
else c = tan( x );
Для того чтобы избежать ошибок рекомендуется использовать операторные скобки
if( b < a )
{
if( c < d ) k = sin( x );
else t = cos( x );
}
else c = tan( x );
Особенно это важно если у вложенного оператора if отсутствует else, т.е
if( b > a )
if( c < d ) k = sin( x );
else c = tan( x ); /* else относится к
вложенному if */
if( b > a )
{
if( c < d ) k = sin( x );
}
else
c = tan( x ); /* else относится к первому if */
Если в качестве <оператора_1> или <оператора_2> используется группа операторов, то ее записывают как составной оператор, заключая ее в операторные скобки "{" и "}".
Для того, чтобы сделать программу более понятной, рекомендуется операторы записывать в следующих формах:
1) короткие операторы:
if( a > b ) k = sin( x ); else k = x*x;
if( a > b ) k = sin( x );
else k = x*x;
2) группы коротких операторов:
if( a > b ) { ... } else {... }
if( a > b ) { ... }
else { ... }
или
if( ... )
{ ..... }
else
{ ..... }
3) длинные группы операторов:
if(... )
{
.
.
.
}
else
{
.
.
.
}
4) множественный выбор:
if ( a == 6 ) { ... }
else if ( a == 8 ) { ... }
else if ( a == 15 ) { ... }
else if ( a > 20 && a < 28 ) { ... }
else { ... }
В некоторых случаях вместо оператора if удобно использовать условную операцию ?:, которая позволяет сократить запись программ и число используемых переменных.
БНФ:
условное_операция = выр_0 "?" выр_1 ":" выр_2
Значение условной операции равно <выр_1>, если <выр_0> не равно 0 и <выр_2> в противном случае. Например, следующий оператор
if ( x>a ) f = sin( x-a ); else f = sin(x);
можно заменить условной операцией, и сразу вычислить f:
f = sin( x>a ? x-a : x );
Очевидно, в последнем случае получился более короткий код, поскольку обращений к переменной f и функции sin вдвое меньше.