
ЗАДАЧА 1.1. Задана окружность радиуса r. Вычислить длину дуги окружности и площадь круга.
Напомним формулы для вычисления длина дуги окружности L и площади круга S:
.
Текст программы:
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv) {
float r, S, L;
printf("r = ");
scanf("%f", &r);
L = 2 * M_PI * r;
S = M_PI * r * r;
printf("Длина окружности равна %f\n", L);
printf("Площадь круга равна %f\n", S);
return 0;
}
Давайте построчно рассмотрим текст программы и познакомимся со структурой программы на Си и с некоторыми операторами языка.
Строка 1-2. Указывает компилятору (а точнее, препроцессору), что надо использовать функции из стандартных библиотек stdio.h и math.h. Библиотека stdio нужна для организации ввода-вывода с помощью функций printf и scanf. Библиотека math.h содержит большинство математических функций и констант. В нашей программе из этой библиотеки будет использоваться M_PI для определения числа
. В программе на языке Си должны быть подключены все используемые библиотеки.
Строка 3. Заголовок главной функции (главная функция имеет имя main). В простых программах присутствует только функция main(). Любая функция начинается с символа {.
Строка 4. Описание вещественных (float) переменных: r (радиус окружности), S (площадь круга), L (длина окружности). Имя переменной1 состоит из латинских букв, цифр и символа подчёркивания. Имя не может начинаться с цифры. В языке Си большие и малые буквы различимы. Например, имена PR_1, pr_1, Pr_1 и pR_1 — разные.
Строка 5. Вывод строки символов r= с помощью функции printf. Программа выведет подсказку пользователю, что необходимо вводить переменную r.
Строка 6. Ввод вещественного числа a с помощью функции scanf. Сейчас надо запомнить, что в операторе scanf необходимо указывать не переменные, а их адрес. Для этого перед именем переменной необходимо использовать символ &. Кроме того в операторе явно присутствует указание типа переменной, для типа вещественной переменной необходимо использовать символ f, для целой – i или d. В это момент программа останавливается и ждёт, пока пользователь введёт значение переменой r с клавиатуры.
Строка 7. Оператор присваивания для вычисления длины дуги окружности (переменная L) по формуле
. В операторе присваивания могут использоваться круглые скобки и знаки операций: +(сложение), - (вычитание), * (умножение), / (деление).
Строка 8. Оператор присваивания для вычисления площади круга. Для определения числа
используется M_PI.
Строка 9. Вывод строки "Длина окружности равна " и значения L на экран. Символы "\n" предназначены для перевода курсора в новую строку дисплея2. Таким образом строка
printf("Длина окружности равна %f\n",L);
выводит на экран текст "Длина окружности равна "3, значение переменной L, и переводит курсор в новую строку.
Строка 10. Вывод строки "Площадь круга равна ", значения площади круга S, после чего курсор переводится в новую строку дисплея.
Строка 11. Оператор return, который возвращает значение в операционную систему. Об этом подробный разговор предстоит далее. Сейчас следует запомнить, если программа начинается со строки int main(), последним оператором должен быть return 04.
Строка 12. Любая функция (в том числе и main) заканчивается символом }.
Мы рассмотрели простейшую программу на языке Си, состоящую из операторов ввода данных, операторов присваивания (в которых происходит расчет по формулам) и операторов вывода.
Любая программа на языке Си представляет собой одну или несколько функций. В любой программе обязательно должна быть одна функция main(). С этой функции начинается выполнение программы. Правилом хорошего тона в программировании является разбиение задачи на подзадачи, и в главной функции чаще всего должны быть операторы вызова других функций. Общую структуру любой программы на языке Cи можно записать следующим образом:
Директивы препроцессора
Объявление глобальных переменных
Тип_результата f1(Список_переменных) {
Операторы
} Тип_результата f2(Список_переменных) {
Операторы
}
...
Тип_результата fn(Список_переменных) {
Операторы
} Тип_ результата main(Список_переменных) {
Операторы
}
На первом этапе знакомства с языком мы будем писать программы, состоящие только из функции main, без использования глобальных переменных. Структура самой простой программы на Си имеет вид:
Директивы препроцессора
Тип_результата main(Список_переменных) {
Операторы
}
Введенная в компьютер программа на языке Си должна быть переведена в двоичный машинный код (должен быть сформирован исполняемый файл). Для этого существуют специальные программы, называемые трансляторами. Все трансляторы делятся на два класса:
интерпретаторы — трансляторы, которые переводят каждый оператор программы в машинный код, и по мере перевода операторы выполняются процессором;
компиляторы переводят всю программу целиком, и если перевод всей программы прошел без ошибок, то полученный двоичный код можно запускать на выполнение.
Процесс перевода программы в машинный код называется трансляцией. Если в качестве транслятора выступает компилятор, то используют термин компиляция программы. При переводе программы с языка Си в машинный код используются именно компиляторы, и поэтому применительно к языку Си термины «компилятор» и «транслятор» эквивалентны.
Рассмотрим основные этапы обработки компилятором программы на языке Си и формирования машинного кода.
Сначала программа обрабатывается препроцессором5, который обрабатывает директивы препроцессора, в нашем случае это директивы включения заголовочных файлов (файлов с расширением .h) — текстовых файлов, в которых содержится описание используемых библиотек. В результате формируется полный текст программы, который поступает на вход компилятора.
Компилятор разбирает текст программ на составляющие элементы, проверяет синтаксические ошибки и в случае их отсутствия формирует объектный код (файл с расширением .o или .obj). Получаемый на этом этапе двоичный код не включает в себя двоичные коды библиотечных функций и функций пользователя.
Компоновщик подключает к объектному коду программы объектные модули библиотек и других файлов (если программа состоит из нескольких файлов) и генерирует исполняемый код программы (двоичный файл), который уже можно запускать на выполнение. Этот этап называется компоновкой или сборкой программы.
После написания программы её необходимо ввести в компьютер. Для ввода, редактирования, компиляции, отладки и запуска программ используется специальные интегрированные среды разработки (ИСР). В данном курсе в качестве ИСР будут использоваться текстовый редактор Geany и свободная кроссплатформенная среда разработки Code::Blocks. В дистрибутиве Альт Образование текстовый редактор Geany и интегрированная среда разработки Code::Blocks доступны сразу после установки6.
__________________________
1 В литературе равнозначно используются термины «имя переменной» и «идентификатор».
2 Обращаем внимание читателя, что символ пробел является обычным символом, который ничем не отличается от остальных. Для вывода пробела на экран его надо явно указывать в строке вывода.
3 С пробелом после слова «равен».
4 Вместо 0 может быть любое целое число.
5 Препроцессор — это программа, которая преобразовывает текст директив препроцессора в форму, понятную компилятору. О данных на выходе препроцессора говорят, что они находятся в препроцессированной форме.
6 Geany и Code::Blocks доступны не только в дистрибутиве Альт Образование, он входят в репозитории большинства дистрибутивов Linux, установка осуществляется стандартным для вашего дистрибутива образом.