Раздел 1. Основы программирования на языке C/C++ Компиляция программ на языке C/C++ Компиляция программы – это процесс преобразования программы, написанной на языке высокого уровня, в исполняемый файл, состоящий из набора машинных команд, понятных процессору. Пример: При помощи компилятора MINGW из файла с расширением .cpp можно получить файл с расширением .exe. Разберём пример компиляции программы при помощи компилятора под ОС Windows MinGW. Напишем простейшую программу на языке С: #include <stdio.h> int main() { printf(“Novosibirsk is the capital of Siberia\n”); } Файл с программой назовем task.cpp. Чтобы откомпилировать полученную программу, запустим командную строку CMD. В открывшемся окне с помощью команды CD необходимо перейти в папку с программой. После этого ввёдем команду «g++ task.cpp –o task.exe –O2 –Wall» и нажмём enter. g++ - это обращение к программе компилятора, а всё, что мы пишем далее – это параметры компиляции: task.cpp – имя компилируемой программы; -o – параметр, после которого следует имя получаемого исполняемого файла task.exe; -O2 – опция компиляции, которая включает оптимизацию второго уровня; -Wall – опция компиляции для включения обработки незначительных ошибок. В результате мы получим файл task.exe, который при запуске будет выводить на экран надпись «Novosibirsk is the capital of Siberia» и переводить указатель на следующую строку. Также, существуют куда более простые способы компиляции программ, которыми мы и будем пользоваться. Эти способы предполагают использование сред разработки. Мы будем использовать наиболее распространенную среду Dev-Cpp. Для компиляции программы в этой среде разработки необходимо всего лишь открыть программу с помощью меню и выбрать пункт «компилировать», либо нажать клавишу CTRL+F9 (рис.1). Рисунок 1. Интерфейс среды Dev-C++. Изучение синтаксических ошибок Каждый язык — английский, французский, немецкий и даже C++ — имеет набор правил, называемых синтаксисом, которым вы должны следовать, когда используете данный язык. В английском языке, например, предложения обычно заканчиваются точкой, восклицательным или вопросительным знаком. Вы также используете заглавные буквы в начале предложения. В синтаксисе C++ используется точка с запятой, круглые скобки, фигурные скобки и многие другие символы. Когда вы забываете или неправильно употребляете эти символы, компилятор C++ выводит на экран сообщение об ошибке, которое описывает ошибку и соответствующий ей номер строки в исходном файле. Компилятор C++ не может создать выполнимую программу, пока не будут исправлены все синтаксические ошибки. Чтобы понять процесс обнаружения и исправления синтаксических ошибок, создайте следующую программу с именем syntax.cpp: #include <stdio.h> int main() { printf(Сообщения необходимо заключать в кавычки); } Если посмотреть внимательно, можно заметить, что сообщение, выведенное предыдущей программой, в вашем исходном файле взято в кавычки. Синтаксис (правила) C++ требует кавычек. При компиляции данной программы компилятор выведет сообщения о синтаксических ошибках. В случае Dev-C++ компилятор выведет следующие сообщения: В первом столбце каждого сообщения пишется номер строки, в которой обнаружена ошибка. При двойном нажатии на строку с описанием ошибки курсор автоматически встаёт в нужную позицию в тексте программы. В данном случае выведено сообщение, в котором говорится, что в 5 строке находится неизвестный символ, т.е. компилятор не воспринимает строку «Сообщения необходимо заключать в кавычки» как строку сообщения. Любую строковую константу в языке C++ необходимо писать только внутри кавычек, к таковым относятся и сообщения, которые выводятся на экран. Стандартные функции ввода/вывода Стандартная библиотека C/C++ включает ряд функций для чтения данных с клавиатуры и вывода их на экран. Эти функции считывают и записывают данные как простой поток символов. Функция scanf() - функция форматированного ввода. С её помощью можно вводить данные со стандартного устройства ввода (клавиатуры). Вводимыми данными могут быть целые числа, числа с плавающей запятой, символы, строки и указатели. Прототип функции scanf() в файле stdio.h имеет следующий вид: int scanf (char *управляющая строка); Функция возвращает в качестве результата своей работы количество переменных, которым было присвоено значение. Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа % %c чтение символа %d чтение десятичного целого %i чтение десятичного целого %f чтение числа типа float (плавающая запятая) %h чтение short int %o чтение восьмеричного числа %s чтение строки %x чтение шестнадцатеричного числа %p чтение указателя %n чтение указателя в увеличенном формате При считывании строковой переменной с помощью функции scanf() строка вводится до первого пробела, т.е. если вы считываете строку "Привет, мир!" при помощи функции scanf() в переменную str, то после ввода результирующая строка будет состоять из одного слова "Привет,". Если вы хотите считывать строки с пробелами, то используйте функцию char *gets( char *buf ); С помощью функции gets() вы сможете считывать полноценные строки. Функция gets() читает символы с клавиатуры до появления символа новой строки (\n). Сам символ новой строки появляется, когда вы нажимаете клавишу enter. Для ввода данных с помощью функции scanf(), ей в качестве параметров нужно передавать адреса переменных, а не сами переменные. Чтобы получить адрес переменной, нужно поставить перед именем переменной знак &(амперсанд). Знак & означает взятие адреса. Функция printf() является стандартной функцией вывода. С помощью этой функции можно вывести на экран монитора строку символов, число, значение переменной. Функция printf() имеет следующий прототип: int printf(const char *форматная_строка,...); Первый аргумент форматная_строка определяет способ вывода последующих аргументов. Он часто называется форматной строкой и содержит два типа элементов: символы, выводимые на экран, и спецификаторы формата, определяющие способ вывода аргументов, следующих за форматной строкой. В спецификаторе формата после символа % может быть указана точность (число цифр после запятой). Точность задаётся следующим образом: %.n<код формата>, где n - количество цифр после запятой. Например, если у нас есть переменная x=10.3563 типа float и мы хотим вывести её значение с точностью до 3-х цифр после запятой, то мы должны написать: printf("Переменная x = %.3f",x); Результат: Переменная x = 10.356 Кроме спецификаторов формата данных в управляющей строке могут находиться управляющие символы: \b BackSpace, удаление последнего символа \f Новая страница, перевод страницы \n Новая строка, перевод строки \r Возврат каретки (устанавливает курсор в начало строки) \t Горизонтальная табуляция \v Вертикальная табуляция \" Двойная кавычка \' Апостроф \\ Обратная косая черта \0 Нулевой символ, нулевой байт \a Сигнал \N Восьмеричная константа \xN Шестнадцатеричная константа \? Знак вопроса Пример программы. Эта программа выводит на экран запрос "Сколько вам лет?" и ждёт ввода данных. Если, например, ввести число 20, то программа выведет строку "Вам 20 лет". При вызове функции scanf(), перед переменной age мы поставили знак &, так как функции scanf() нужны адреса переменных. Функция scanf() запишет введённое значение по указанному адресу. В нашем случае введённое значение 20 будет записано по адресу переменной age. При выводе значения переменной в функции printf() мы не ставим знак &, т.к. нам требуется не адрес переменной, а именно её значение. #include <stdio.h> void main(void) { int age; printf("\nСколько вам лет?"); scanf("%d",&age); printf("Вам %d лет.", age); } Ввод/вывод с помощью cin и cout cin - это переменная для работы со стандартным потоком ввода, которая находится в библиотеке iostream и относится к пространству имён std. cin позволяет удобно считывать переменные без указания формата ввода (как в функции scanf(), например). int x; cin >> x; Выше представлен пример использования cin. При помощи операции считывания из потока (>>) введённые данные считываются в записанную после этой операции переменную. cout – это аналогично cin переменная для работы со стандартным потоком вывода, она также находится в библиотеке iostream и относится к пространству имён std. cout позволяет выводить информацию в стандартный выходной поток, которым по умолчанию является окно консоли. Для вывода переменных при помощи cout не требуется указывать тип выводимых данных. cout <<"Выходной поток"; В данном коде программы используется оператор cout, операция поместить в поток <<, чтобы вывести на экран пользователю определенную информацию. В данном случае на экран выведется «Выходной поток». cout достаточно умный, чтобы определить, что нужно вывести на экран, то есть это будет переменная дробного числа, целого или символьного. Напишем программу, которая объявляет две переменных целочисленного числа. В них вы вводим с клавиатуры 2 числа и выводим полученный результат. #include <iostream> #include <conio.h> void main () { int x, y; //объявляем переменные целого типа cout << "X = "; //На экран выводится 'X = ' cin >> x; //вводим с клавиатуры число, например 5 cout << "Y = "; //На экран выводится 'Y = ' cin >> y; //вводим с клавиатуры число, например 8 cout << "x+y = " << (x+y) << endl; //На экран монитора выводится сообщение 'x + y = 13' getch(); //Экран не закрывается, пока не нажата любая клавиша } Заголовочный файл <iostream> включает объекты cin, cout, которые нам нужны. Если #include <iostream> убрать, то при компиляции выйдет ошибка. #include <conio.h> необходимо для того, чтобы мы видели результат на экране, благодаря функции _getch(). Если ее не будет, то программа выполнится и закроется. И мы не успеем увидеть результат работы программы. Объявление переменных Переменная — это «ячейка» оперативной памяти компьютера, в которой может храниться какая-либо информация. В программировании переменная, как и в математике, может иметь название, состоящее из одной латинской буквы, но также может состоять из нескольких символов, целого слова или нескольких слов. В языке С++ все переменные имеют определенный тип данных. Например, переменная, имеющая целочисленный тип, не может содержать ничего, кроме целых чисел. Тип данных присваивается переменной при ее объявлении или инициализации. Ниже приведены основные типы данных языка C++. Основные типы данных в C++ int — целочисленный тип данных. float — тип данных с плавающей точкой. double — тип данных с плавающей точкой двойной точности. char — символьный тип данных. bool — логический тип данных. Объявление переменной в C++ происходит таким образом: тип список_переменных Примеры: int a; // объявление переменной a целого типа. float b; // объявление переменной b типа данных с плавающей запятой. double c = 14.2; // инициализация переменной типа double. char d = 's'; // инициализация переменной типа char. bool k = true; // инициализация логической переменной k. Локальные и глобальные переменные Каждая переменная имеет свою область видимости, то есть такую область, в которой можно работать с переменной. За пределами этой области о данной переменной ничего известно не будет, а значит и использовать её нельзя. Итак, переменная находится в области видимости, если к ней можно получить доступ. Переменные, объявленные внутри функции, называются локальными. Локальные переменные имеют свои области видимости, этими областями являются функции, в которых объявлены переменные. Таким образом, в разных функциях можно использовать переменные с одинаковыми именами, что в свою очередь очень удобно. Разделение переменных на глобальные и локальные соответствует одному из главных правил программирования, а именно – принципу наименьших привилегий. То есть, переменные, объявленные внутри одной функции, должны быть доступны только для этой функции. Глобальные переменные объявляются вне тела какой-либо функции, и поэтому область видимости таких переменных распространяется на всю программу. Обычно глобальные переменные объявляются перед главной функцией, но можно объявлять и после функции main(), но тогда данная переменная не будет доступна в функции main(). Операции в C++ Унарные операции: & – операция взятия адреса. * – операция обращения по адресу. - – унарный минус. + – унарный плюс. ! – отрицание. ++ – автоувеличение на 1 (инкремент) -- – автоуменьшение на 1 (декремент) sizeof – операция вычисления размера в байтах. Бинарные операции: + – бинарный плюс. - – бинарный минус. * – умножение. / – деление (при делении двух целых чисел получается целая часть от частного). % – получение остатка от деления. Операции присваивания: = – присвоить операнду из левой части значение выражения из правой части. += – присвоить операнду из левой части сумму операндов левой и правой частей. -= – присвоить операнду из левой части разность операндов левой и правой частей. /= – присвоение частного от деления. %= – присвоение остатка от деления. Операции сравнения: < – меньше. > – больше. <= – меньше или равно. >= – больше или равно. == – равно. != – не равно. Логические бинарные операции: && – логическое И. || – логическое ИЛИ. Библиотека math Очень часто приходится сталкиваться с такой ситуацией, что нужно найти косинус или синус, возвести в степень какое-нибудь число. Для того, чтобы это сделать быстро, а не писать специальную программу для вычислений, можно подключить библиотеку math, в которой содержатся эти и другие сложные математические операции. Подключается библиотека следующим образом: #include <math.h> Некоторые функции, содержащиеся в этой библиотеке: abs – модуль, возвращает положительное число acos (x) — арккосинус asin (x) — арксинус atan (x) — арктангенс cos (x) — косинус sin(x) — синус tan(x) — тангенс random — вывод случайных чисел exp — экспонента log (x) — натуральный логарифм log10 (x) — это логарифм по основанию десять. pow(x,y) — возведение числа x в степень y. Более подробный список функций можно посмотреть в справочнике, который встроен в среду разработки.