Чаще всего линейные алгоритмы используются для программирования вычислений по формулам. В этом случае удобно использовать набор стандартных функций Си, содержащихся в библиотеке и доступных при подключении заголовочного файла math.h :
sin (x) - sin x; cos (x) – cos x ; tan(x) - tg х ; log (x) - ln x; log10(x) – lg x; exp(x) - показательная функция ex ; sqrt (x)- корень квадратный от х; роw(x, y) – x в степени y; abs(x)- модуль x.; acos(x) – arccos x; asin(x) – arcsin x; atan(x)- arctg x; sinh(x)- sh x; cosh (x) – ch x; tanh(x)-th x.
Для тригонометрических функций аргумент х измеряется в радианах и имеет тип double, как и значения функций.
Пример программы линейной структуры:
Вычислить площадь и стороны прямоугольного треугольника, если известны гипотенуза c и угол x. Для вычислений воспользуемся формулами :
a=c• sin x; b=c• cos x; S=ab;
Программа вычислений имеет вид:
// вычисление сторон и площади треугольника
#include <stdio.h> //заголовочный файл для организации ввода-вывода
#include <math.h> //заголовочный файл математических функций
main() //главная функция
{float a,b,c,x, S; //описание переменных вещественного типа
printf (“\n Введите гипотенузу и угол треугольника ”);
scanf (“%f%f “,&c,&x); // ввод значений вещественного типа
a=c*sin(x);
b=c*cos(x);
S=a*b;
printf (“\n Результаты: a=%7.2f b=%7.2f S=%7.2f “,a, b, S);
return 0;
}
Комментарий в программе не влияет на компиляцию программы, а служит для разъяснения действий основных блоков текста и программы в целом. Однострочный комментарий действует от двух символов // до конца строки. Многострочный комментарий заключается в пары символов /* и */.
Вторая строка программы #include <stdio.h> является директивой компилятора для включения заголовочного файла stdio.h для доступа к средствам ввода-вывода (связи с внешними устройствами), отсутствующими в самом языке Си. Третья строка - #include<math.h> является директивой компилятора для включения заголовочного файла math.h, обеспечивающего выполнение математических функций.
Программа на языке Си состоит из ряда функций, из которых функция main (главная) является обязательной и служит точкой входа в программу. В круглые скобки заключаются параметры функции, причем наличие круглых скобок обязательно, если даже список параметров пуст. В фигурные скобки заключаются составной оператор (несколько операторов). Для придания тексту программы наглядности открывающая и соответствующая ей закрывающая фигурные скобки печатаются на одном уровне, а заключенный между ними текст сдвигается на 1-2 символа вправо, вложенный блок также сдвигается вправо и т.д. Образуется иерархия вложенных блоков, придающая программе на Си характерный вид.
В программе описаны переменные a, b, c, х, S вещественного типа (float). В отличие от других языков в Си учитывается регистр при определении имени переменной, т.е. s и S – разные переменные. Функции printf и scanf доступны при подключении заголовочного файла stdio.h и служат для вывода на экран и ввода с клавиатуры соответственно. Управляющие символы \n в функции printf служат для перевода на новую строку. Символ & в функции scanf указывает на адрес вводимой переменной. Ввод и вывод переменных вещественного типа производится в формате f. Признаком форматного вывода в функции printf является %. При выводе между знаком процента и форматной переменной f можно включить общую ширину поля вывода и число позиций после десятичной точки. Оператор return 0; служит для выхода из функции main , 0 является признаком успешного окончания программы. Завершает текст программы закрывающая фигурная скобка, означающая конец функции main.
Понятие о препроцессоре языка Си
Препроцессором называется составная часть компилятора, которая производит обработку исходного текста программы перед ее трансляцией. Управление работой препроцессора осуществляется с помощью специальных директив. Все директивы препроцессора начинаются со знака #.
Ранее была рассмотрена директива include. Вместо нее в исходный текст программы препроцессор вставляет содержимое файла, указанного в директиве.
Так, по директиве #include <stdio.h> в текст программы вставляет содержимое файла stdio. h, находящегося в специальном системном каталоге, а только потом происходит трансляция.
Если в директиве #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)-------");
Однако использовать такие конструкции не рекомендуется ввиду сложности отыскания ошибок.
Операторы языка Си и приемы программирования
Оператор (statement - предложение) - блок, используемый при создании программы. Программа всегда представляет собой последовательность операторов ( предложений ).
Признаком конца оператора в простейшем случае является ";". Одиночная ";" является пустым оператором. Как было отмечено выше, точка с запятой поставленная в конце выражения превращает его в оператор.
Кроме простого оператора в языке Си вводится понятие составного оператора, который представляет собой несколько операторов, заключенных в фигурные скобки:
составной_оператор = "{" оператор { оператор } "}"
Пример:
{ a = b + c; scanf( "%lf", &t ); }
Составной оператор рассматриваются компилятором как одиночный оператор и может быть использован в любом месте, где допускается использование одиночного оператора.
Все операторы языка Си, кроме оператора-выражения начинаются с ключевых слов. Например, описания начинаются с int, double и т.д.
Ключевые слова являются зарезервированными, т.е. их нельзя использовать для обозначения объектов программ. Имена стандартных функций не являются зарезервированными.
Оператор цикла while
Оператор цикла while предназначен для реализации циклических алгоритмов и имеет следующую форму записи
"while" "(" выражение ")" оператор
Пример :
while( a < 18 ) a = a+2;
При выполнении оператора цикла while вначале вычисляется выражение. Если оно не равно 0, то выполняется оператор. Далее снова вычисляется выражение и если оно не равно 0, то снова выполняется оператор. Такие циклические действия продолжаются до тех пор, пока выражение отлично от 0. Отсюда и название цикла while ( пока ). Как только выражение станет равным 0 цикл прекращает выполнятся и управление передается на следующий за циклом оператор.
Циклически выполняемый оператор обычно называют телом цикла. Если в теле цикла необходимо разместить не один, а несколько операторов, то в этом случае используют составной оператор.
Все операторы тела цикла должны быть записаны с отступом, обычно в три пробела.
Рассмотрим пример программы, которая выводит на экран таблицу функций sin(x) и cos(x):
#include <math.h>
#include <stdio.h>
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 всегда будет отличен от нуля.
В теле правильно организованного цикла обязательно должны содержатся операции, влияющие на выражение в заголовке цикла так, чтобы цикл рано или поздно завершился.