Sin(x) - х задается в радианах




Void main(void)

{

priтtf(“Hello, World!”);

getch();

}

 

При написании текста необходимо иметь ввиду, что язык C/C++ различает малые и большие буквы алфавита: a и A – это разные символы. Расположение текста в программе, в принципе, довольно произвольно. Однако сразу следует приучить себя к структурированному размещению символов и строк. Что это значит? Это значит, что программа должна быть представлена в удобном для чтения виде. Представленный выше листинг тому пример.

После написания текста и сохранения проекта можно его компилировать линковать и запускать на выполнение. Как уже отмечалось выше, можно сразу нажать функциональную клавишу F9. Если будут обнаружены ошибки, следует из исправить. В данном случае ошибки могут появится только из-за неправильно воспроизведенного текста.

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

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

 

#include<stdio.h>

#include<conio.h>

Void main(void)

{

int a,b,c;

a=4; b=3;

c=a+b;

priтtf('%d+%d=%d",a,b,c);

getch();

}

Теперь еще несколько слов о размещении отдельных частей программы друг относительно друга. Здесь вам предоставлена боль­шая свобода, которой нужно воспользоваться для созда­ния текста, удобного для чтения. В программе можно оставлять пустые строки, вставлять последовательности пробелов (за исключением неразрываемых конструкций, таких, как служебные слова). Не рекомендуется делать длинные строки, не вписывающиеся в ширину экрана - строку можно разорвать, перенеся оставшуюся часть на новую строчку. Нельзя разрывать только текст внутри кавычек. Вернее, в этом случае следует принимать спе­циальные меры.

Приведенная выше программа начинается с так назы­ваемой директивы препроцессора - строки, следующей за символом #, и одной функции, имеющей имя main. О директивах препроцессора речь пойдет позже, а сей­час - ВАЖНЕЙШИЙ МОМЕНТ: любая консольная программа обяза­на содержать функцию с именем main - главная. Эта функция, вне зависимости от того, где она находится в тексте, всегда будет выполняться первой. В данном же случае функция main вообще является единственной функцией программы. Общая структура функции выгля­дит следующим образом:

 

ТипФункции ИмяФуякции(Параметры)

{

ТелоФункции

}

Исходя из этого, мы видим, что наша функция с именем main имеет загадочный тип void, и в качестве параметра тоже фигурирует это замечательное слово. Не вдаваясь пока в подробности, укажем, что слово это может иметь смысл "никакой" или, как это ни странно, "любой". Дословно же, в переводе с английского, это означает ПУСТОТА. Тогда вторую строку программы следует понимать в том смысле, что функция main не имеет никакого типа и не имеет никаких параметров. Что означают эти прему­дрости, будет ясно из дальнейшего, ну, а пока читателю предлагается оформлять главную функцию именно в та­ком виде.

Все действия, которые предписывается выполнять функции, находятся в теле функции, внутри фигур­ных скобок. Важнейшими элементами программы явля­ются переменные. Понятие переменной близко к понятию переменной величины в математике. Переменная может принимать те или иные значения, изменять свое значе­ние в процессе выполнения программы, входить в раз­личные выражения. Каждая переменная, используемая в программе, наделяется именем (идентификатором). Имя должно начинаться с буквы и не должно содержать специальных символов вроде @ или *. Напомним, что переменные f и F - это две разные переменные. Для того чтобы оперировать пе­ременной, ее необходимо описать (объявить, деклариро­вать - все три термина в ходу у программистов и имеют близкие смыслы) внутри или вне функции, причем все описания внутри функции в языке С, но не в С++, делаются в начале тела функции, сразу за открываю­щей фигурной скобкой. Структура описания такова:

 

ТипПеременных Имя1,Имя2,ИмяЗ,...;

Здесь перечисляются через запятую имена всех пере­менных, имеющих данный тип. Взглянув на нашу про­грамму, мы увидим, что в ней описаны три переменные, имеющие тип int.

В С существуют следующие основ­ные типы данных:

 

int - тип целых чисел, двоичное представление ко­торых может занимать до 2 байтов;

short - короткие целые, которые занимают до 1 бай­та;

long - длинные целые (для переменных, принимаю­щих большие целочисленные значения);

float - тип вещественных чисел (чисел с плаваю­щей точкой);

double - вещественные двойной точности (для веще­ственных чисел, в диапазоне от очень больших до очень малых по модулю значения);

char - символьный тип (для переменных, принима­ющих значение символа).

 

Последний тип, наверное, несколько непривычен. То, что целая переменная х имеет значение, равное семи, выглядит вполне естественным, но нужно принять как должное и то, что символьная переменная s может иметь зна­чение R, или значение #, или, к примеру, значение <. Более того, символьные переменные могут иметь даже "невидимые" значения, которые не отображаются на мо­ниторе и не присутствуют в явном виде на клавиатуре компьютера. Но об этом чуть позже...

Название типа может быть снабжено модификато­ром unsigned, что означает беззнаковый. Перемен­ные, описанные таким образом, могут принимать толь­ко неотрицательные значения. Так, переменная, описан­ная как short, может изменяться в диапазоне целых чисел от -128 до +127. Если же она описана как unsigned short, то пределы ее допустимых значений - это числа от 0 до 255.

Итак, в нашей программе сразу в начале тела функ­ции имеется описание переменных. Это описание явля­ется частным случаем того, что в С называется вы­ражением. Если в естественных языках текст состоит из отдельных предложений, заканчивающихся точкой, то текст на языке С состоит из отдельных выражений, как правило, заканчивающихся точкой с запятой - символом «;». Понятие выражения близко к понятию оператора в других языках программирования, однако является более широким.

В двух следующих строках программы записаны так называемые выражения присваивания. Смысл их очеви­ден - переменные получают конкретные значения. Рас­смотрим, каким образом записываются эти конкретные значения в языке. Проще всего дело обстоит с записью це­лочисленных констант. Они представляются точно так, как в арифметике, - совокупностью арабских цифр со знаком или без знака перед числом: 6, 14, -21, +457, 0012. Есть возможность использования шестнадцатеричного, восьмеричного, а при необходимости и двоич­ного представления чисел. Запись вещественных чисел в форме с фиксированной запятой отличается от ариф­метической записи только тем, что вместо десятичной запятой, отделяющей целую часть числа от дробной, использует­ся десятичная точка: 3.1415927, -12.7. Число.872 есть не что иное, как 0,872 в арифметической записи. То есть вы можете не писать незначащий 0 как в целой, так и в дробной части. Число 23. есть число 23,0. Однако по­следнее число является вещественным - это не совсем то, что 23. Важность этого различия будет понятна из последующего материала.

Другая форма представления вещественных чисел называется экспоненциальной, или формой с плавающей точкой. Речь идет о записи чисел с мантиссой и порядком, например, 2,72 107. При записи таких чисел сначала пишется мантисса, затем символ е или Е и после него - порядок. Например, для записи постоян­ной Больцмана 1,38 10-16 эрг/град следует использовать форму 1.38е-16 или 1.38Е-16.

Символьная константа - это символ, заключенный в апострофы: 'Р', 'с'. Не следует путать апостроф ' и ка­вычки ". Наряду с обычными символами в языке С, как уже говорилось, имеется набор специальных символов, кото­рые не имеют изображения, однако имеют вполне опре­деленное значение, а, следовательно, и назначение в про­грамме. В тексте программы такие символы изобража­ются последовательностью двух знаков, первый из кото­рых есть "обратная черта" \ (обратный слеш). Перечислим некоторые из таких символов с указанием действий, вызываемых ими:

 

\n - переход на новую строку,

- выдача звукового сигнала,

\b - возврат на 1 шаг влево,

\f - переход на новую страницу,

\r - возврат в начало строки,

\\ - сам символ \,

\? - символ?,

\' – символ ,

\" - символ ".

 

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

 

Вывод информации на экран, функция printf

 

Читатель не ошибается, полагая, что конструкция, содержащая слово printf предназначена для вывода информации на экран монитора компьютера. Действительно это слово является именем соответствующей функции. Но где же описание этой функции? Его ведь в программе нет. Да, в явном виде мы такого описания в программе не имеем. Дело в том, что эта функция относится к разряду так называемых стандартных функций. Ее изготовили без нас разработчики системы. Спасибо им за это! Описа­ние, или прототип, этой функции находится там, где ему положено быть, а наша забота в том, чтобы указать си­стеме, где его искать. Именно это мы и делаем в первой строке препроцессорной директивой #include<stdio.h>. Эта ди­ректива подключает к нашей программе так называемый заголовочный файл stdio.h, который в каком-то смысле и содержит описание ряда стандартных функций, в том числе и printf. Расширение .h как раз и происходит от термина "заголовок" - head.

Структура функции с именем printf в общем виде такова:

 

рrintf("строка",Выражение1,Выражение2,ВыражениеЗ,...);

Заметим, что в зависимости от того, что находится вну­три кавычек, эти самые Выражение1, Выражение2 и т. д. могут присутствовать или отсутствовать, а их количе­ство практически не ограничено.

Функция работает следующим образом. Начинается просмотр содержимого строки в кавычках. Все симво­лы после открывающих кавычек дословно и последова­тельно отображаются на экране, начиная с той позиции, где курсор находился перед началом работы функции. Если встречается один из специальных символов, указан­ных выше, выполняется действие, предписываемое этим символом. В частности, если встретился символ \n, то курсор переместится в начало следующей строки, и пе­чать на экран будет продолжена с этой позиции. Со­держимое строки будет печататься таким образом пока не встретятся закрывающие кавычки (и на этом рабо­та printf завершится и программа будет выполняться дальше) или очередным символом в строке не окажется знак %. В последнем случае система анализирует то, что находится после этого знака. Если далее снова следует %, то про­сто выводится сам символ %, иначе будет напечатано значение очередного выражения из списка, следующего после закрывающих кавычек и запятой. Таким образом, программист должен следить за соответствием количе­ства знаков % в строке внутри кавычек и количеством выражений в списке.

За знаком %, предписывающим печать значения выражения, должна следовать форматная конструкция, определяющая, в какой форме будет выведено это значе­ние. В простейшем случае форматная конструкция пред­ставляет собой букву. Наиболее часто используются сле­дующие форматные буквы:

 

%d — для вывода целых десятичных чисел (int, long, short),

— для вывода целого числа в шестнадцатеричной системе счисления,

%f - для вывода вещественных чисел с фиксированной за­пятой (типа float, double),

- для вывода вещественных чисел в экспоненциальной форме (float, double),

%g - для вывода вещественных с автоматическим (выбираемым самой системой) определением формы с пла­вающей или фиксированной запятой,

% с - для вывода символа (char),

%s - для вывода строки символов (этот вариант бу­дет прокомментирован позже),

- для вывода адреса объекта (об этом мы также будем говорить дальше).

 

Перед форматной буквой может стоять буква - моди­фикатора l (от слова long) или u (unsigned). Так формат %lf применяется к длинному вещественному, то есть к типу double, а формат %ud - к беззнаковому целому.

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

 

4+3=7

 

Между символом % и форматной буквой может сто­ять конструкция, управляющая количеством позиций, отводимых под печатаемую величину. Для целого и сим­вольного форматов эта конструкция - просто целое чи­сло. Формат %4d означает, что под целое число будет от­ведено на экране поле из четырех позиций. Печатаемое число будет прижато к правому краю этого поля так, что, например, перед двухзначным положительным числом слева в таком формате будут две пустые позиции (два пробела), число -123 займет все выделенное ему поле, а при печати числа 32 767 будет автоматиче­ски добавлена одна недостающая позиция. Аналогично этому при выводе символа по формату %5с сначала бу­дет напечатано четыре пустых позиции, а затем символ. При выводе вещественного числа управляющая полем конструкция представляет собой два беззнаковых целых числа, разделенных точкой, например 6.2. Первое число есть полная ширина поля, предоставляемого выводимо­му числу, второе - количество позиций, выделяемых под дробную часть числа. Поскольку десятичная точка сама занимает одну позицию, понятно, что первое число должно быть, как минимум, на единицу больше второго. Впрочем, если система обнаружит какое-либо несоответ­ствие в форматном выражении, она сама добавит необ­ходимое число позиций. Так, в результате выполнения фрагмента программы:

 

а=-0.016722272;

printf("a=%7.3lf",a);

будет напечатано а= -0.017 (после знака равенства вставлена одна пустая позиция). Как видите, умная система оставила три знака в дробной части, выполнив округление.

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

Попробуем разобраться, что будет напечатано в результате работы следующего фрагмента программы:

 

t=’u’;

printf("Koд символа %c=%d",t,t);

Символьная переменная t принимает значение сим­вола u. Первое форматное выражение обычным образом выведет значение переменной - букву u. Второе форматное выражение %d обратится к своему аргу­менту, а это снова переменная t, и попытается вывести его значение в целом числовом формате. Здесь уместно напомнить, что вся информация в компьютере хранится в цифровом виде, и в ячейках памяти, отведенных для пе­ременной t, находится вовсе не сам символ, а некий набор нулей и единиц - цифровой код символа. Поэтому ясно, что нет никакого "криминала" в попытке вывести символь­ное выражение в целом формате. Все символы имеют свой код, и именно десятичное представление этого кода будет напечатано:

 

Код символа u=...

 

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

Еще одно замечание общего характера. В приведенных выше и последующих примерах мы используем русские слова, точнее, кириллические символы. На самом деле Builder с кириллицей «не дружит». По этой причине в реальных программах вам придется использовать латиницу. В крайнем случае, можно воспользоваться так называемым транслитом – изображением русских слов латинскими буквами.

 

Арифметические выражения, математические и некоторые другие полезные функции

 

Вооружившись изрядным запасом знаний, переходим к новой программе:

 

#include<stdio.h>

#include<conio.h>

#include<math.h>

double a;

const double Pi=3.1415927;

Void main()

{

a=30.0;

printf("Sin(%.4.1lf)=%6.3lf",a,sin(a*Pi/180.0));

getch();

}

Что здесь нового? Прежде всего, мы подключили к программе новыq заголовочныq файла math.h, позволяющий использовать функ­цию sin. Далее мы видим, что описание переменной а оказалось вне главной функ­ции main. Тем самым, переменная а стала глобальной и имела бы право на существование не только в функ­ции main, но и в любых других функциях программы, если бы таковые имелись. Поскольку у нас в программе лишь одна функция, не имеет никакого значения, является ли переменная глобальной или локальной. Дальше мы могли бы сказать, что делается описание глобальной ве­щественной переменной Pi, если бы не служебное слово const. Это слово указывает на то, что мы описали не переменную, а, напротив, постоянную величину - глобальную констан­ту Pi, которая получила значение числа Пифагора. Слово const означает, что величина Pi не должна и не может быть изменена нигде в программе. Указанным способом константы, как и переменные, могут получать началь­ные значения непосредственно при их описании.

Следующая новость - внутри круглых скобок после имени головной функции теперь нет слова void. Но мы уже знаем, что это слово означает "никакой". Ну, а коли так, значит можно обойтись и пустыми скобками. Да бу­дет так!

Теперь наша программа использует функцию sin. Читатель понимает, что это знакомая тригонометрическая функция. Чтобы полу­чить полную информацию о новой, пока вам незнакомой, конструкции языка, можно воспользоваться справочной системой Builder. Для этого, как уже упоминалось, курсор наводится на любую букву конструкции и нажи­мается комбинация клавиш Ctrl+F1. Открывается окно, содержащее описание конструкции и пример ее использо­вания. Просмотрев справку, вы возвращаетесь в рабочий режим, нажав клавишу Esc. Проделав такую операцию для sin, вы узнаете все, что относится к этой функции, включая пример программы с ее использованием. Кроме того, вы узнаете, что функция требует подключения за­головочного файла math.h.

В нашей программе производится вычисление значе­ния тригонометрической функции sin от угла 30.0 гра­дусов. Первое форматное выражение в printf печатает сам угол, значение которого получила переменная a, a второе форматное выражение печатает значение синуса этого угла. Читателю уже понятно оформление печати текстом, обеспечивающим красивый вывод результата работы программы:

 

Sin(30.0)= 0.500

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

Основных арифметических действий в С, в отличие от школьной арифметики, шесть. Сложение и вычитание не имеют каких-либо особенностей и выполняются с помощью традиционных знаков + и -. С умножением тоже нет никаких хлопот. Надо только помнить, что, в силу отсутствия на клавиатуре подходящих символов, знаком операции умножения является звездочка *. У операции деления, использующей символ /, есть особенность. Во-первых, деление может быть двух видов. Значение выра­жения 3/4.0 равно 0.75, в чем у читателя нет оснований сомневаться. А зря, поскольку значение выражения 3/4 равно нулю! Секрет прост. Если и делимое и делитель есть выражения целого типа, как в последнем случае, то деление выполняется целочисленно (еще пример: 6/4 да­ет 1), если же любой из операндов - или делимое, или делитель, или и тот и другое вместе вещественного ти­па, то выполняется привычное вещественное деление. В первом случае делитель является вещественным числом, благодаря наличию десятичной точки, хотя значение его равно точно четырем.

Пятым арифметическим действи­ем является целочисленная операция получения остатка от деления. Знак операции есть %. Так, результат действия 16%3 равен 1, 1 5%3 дает 0 (15 на 3 делится нацело), а 14%3 = 2.

Последняя рассматриваемая нами операция, а, точнее, две операции, называется сдвигом и применяется к целочисленным величинам. Записываются эти опера­ции в виде m<<n и m>>n. В результате их выполнения двоичный код числа m сдвигается на n разрядов влево или вправо, соответственно. Не очень понятно? Не вдава­ясь в некоторые детали, требующие представлений о дво­ичной системе счисления, самостоятельное рассмотрение которых предлагаем любопытным читателям, поясним, что первая из операций дает результат m2n, а вторая - m/2n. В частности, действие m<<1 просто удваивает значение переменной m.

Наряду с основными, так называемыми бинарными, операциями в С существуют унарные операции инкре­мента и декремента. Эти операции по канонам классиче­ского С также применяются к целым. Однако в Builder допущена «не рекламируемая» вольность, по кото­рой операции применимы и к вещественным. Все же ав­тор не рекомендует такой вольностью пользоваться. Опе­рация инкремента записывается в виде ++Имя (префикс­ная форма) или Имя++ (постфиксная форма). В обоих случаях в результате инкрементирования значение пе­ременной увеличивается на единицу. Разница в записи заключается в том, что в первом случае переменная сна­чала увеличивается, а затем ее увеличенное значение ис­пользуется в выражении, а во втором случае переменная сначала используется в выражении, а потом увеличивается. Точно так обстоит дело и с унарной операцией де­кремента --Имя и Имя--, однако здесь происходит уменьшение значения на единицу.

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

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

Вот типичный при­мер ошибки, свойственной новичкам. Допустим, необхо­димо вычислить частное 1/2a. Начинающий программист может записать выражение 1/2*а. В результате вооб­ще получится 0. Догадываетесь почему? Нет? Верни­тесь на несколько строк назад. Ну, исправим допущен­ную оплошность, записав 1.0/2*а. Теперь при вычисле­нии значения выражения единица разделится веществен­ным делением на двойку и результат 0.5 умножится на а. Оказывается, мы подсчитали величину a/2. Верной будет такая запись: 1.0/(2*а). Этот вариант действи­тельно правильный, но не оптимальный. Поскольку опе­рация умножения выполняется процессором значительно медленнее, чем операция сложения, оптимальным по бы­стродействию будет запись 1.0/ (а+а).

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

 

#include<stdio.h>

#include<conio.h>

Void main()

{

int i==7,j=4; double id=7.0,jd=4.;

printf("i/j=%d\n",i/j);

printf("id/jd=%lf\n",id/jd);

printf ("i%%j =%d\n", i%j);

printf("id*jd=%lf",id*jd);

getch();

}

В результате работы этой программы на экран будет вы­ведена следующая информация:

 

i/j=l

id/jd=1.750000

i%j==3

id*jd=28.000000

Печать будет выполнена в четырех строках, поскольку в первых трех функциях печати предусмотрен переход на новую строку - символ \n. Автор надеется, что число­вые значения выполненных операций теперь читателю понятны.

Обещанная новая функция находится в самом конце про­граммы - это функция ge tch(), прототип которой за­дается через уже знакомый заголовочный файл conio.h. Функция производит передачу в программу символа, ко­торый вводится с клавиатуры (а если вы хотите щеголь­нуть компьютерным жаргоном, то сообщите своему зна­комому, что здесь производится ввод символа с консоли).

Когда программа запускается на ис­полнение, в частности, из оболочки Builder, перед ва­ми на секунду открывается рабочий экран с результа­тами работы, после чего система снова возвращается в экран текстового редактора оболочки. Если же в конце программы стоит обращение к функции getch, то рабочий экран будет открыт до тех пор, пока вы не введе­те символ с консоли, то есть пока не нажмете какую-либо клавишу. Вот и вся маленькая хитрость. Теперь мы подошли к ответственному моменту - ис­пользованию в С-программах математических функ­ций. Таких функций в Builder весьма большое коли­чество. Мы познакомимся только с частью из них с по­мощью следующей таблицы:

 

sin(x) - х задается в радианах



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: