Функция b( )
Функция a( )
. . . . . . . . .
#директивы препроцессора
{ тело функции а}
.
.
{тело функции b }
void main ( ) //функция, с которой начинается выполнение программы
{последовательность определений, описаний и исполняемых операторов}
Правила препроцессорной обработки определяет программист с помощью директив препроцессора.
Директива начинается с #.
#define – указывает правила замены в тексте.
Например, #define ZERO 0.0 означает, что каждое использование в программе имени ZERO будет заменяться на 0.0.
Директива #include < имя заголовочного файла> – предназначена для включения в программу текста из каталога «Заголовочных файлов»
.
Программа представляет собой набор описаний и определений, и состоит из набора функций.
Среди этих функций всегда должна быть функция с именем main. Без нее программа не может быть выполнена. Это точка входа в программу.
Перед именем функции помещаются сведения о типе возвращаемого функцией значения (тип результата): double sqrt (double arg)
Если функция ничего не возвращает, то указывается тип void: void main ( );
Каждая функция, в том числе и main должна иметь набор параметров, он может быть пустым.
Если функция не объявлена как void, она должна возвращать значение.
Возвращаемое значение задается инструкцией return e; где е – выражение, значение которого возвращается в качестве результата работы функции.
Пример 1. Определение функции извлечения квадратного корня.
double sqrt (double arg) // вещественный аргумент, и возвращается
// вещественное число.
{
//код, вычисляющий квадратный корень.Тело функции
}
Использование (вызов) этой функции:
int main()
// Тело функции
{
double root2 = sqrt(2);
…
return 0; // возврат значения из функции
}
Пример 2.
float x; //описание переменной
int y=10; // описание и инициализация переменной
Пример 3. Простейшая программа на языке C++
#include "stdafx.h" //препроцессорная директива
#include <iostream> //препроцессорная директива
using namespace std;
void main() //функция
{ //начало
cout << "Hello!\n";//печать
} //конец
В программах на C++ используется два способа комментариев:
· первый способ для многострочных комментариев (начинается с комбинации символов косой черты и звёздочки (/*), и заканчивается обратной комбинацией этих же символов (*/). Неможет быть вложенным.),
· второй – для коротких замечаний (начинается с двух символов косой черты (//) и заканчивается концом строки).
Пример 4. Использование комментариев
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{ SetConsoleOutputCP(1251);
int num; /* это многострочный комментарий C++
ввод числа */
cout << "Введите проверяемое число: ";
cin >> num;
// проверка на чётность. Это однострочный комментарий C++
if((num%2)==0) cout << "Число чётное.\n";
else cout << "Число нечётное.\n";
return 0;
}
4.3. Базовые средства языка C++
Алгоритмический язык содержит слова, их называют лексемами (элементарными конструкциями), словосочетания – выражениями, предложения – операторами.Лексемы образуются из символов, выражения из лексем и символов, операторы из символов выражений и лексем (рис. 2).
Рис. 2. Состав алгоритмического языка
Таким образом, элементами алгоритмического языка являются:
1. Алфавит языка С++, который включает
– прописные и строчные латинские буквы и знак подчеркивания;
– арабские цифры от 0 до 9;
– специальные знаки “ { } , | [ ] ( ) + – / % * . \ ’ : ; & ? < > = ! # ^
– пробельные символы (пробел, символ табуляции, символы перехода на новую строку).
2. Из символов формируются лексемы языка:
· Идентификаторы – имена объектов С-программ.
PROG1, prog1 и Prog1 – три различных идентификатора).
_PROG1, prog_1, P1ro2g1 - правильные идентификаторы.
3PROG1, prog_*, №5_Prog1 – ошибка!
· Ключевые (зарезервированные) слова – это слова, которые имеют специальное значение для компилятора (main, else, int и т.д.). Их нельзя использовать в качестве идентификаторов.
· Знаки операций – это один или несколько символов, определяющих действие над операндами. Операции делятся на
· унарные (применяется к одному операнду, например: ++a),
· бинарные (применяется к двум операндам, например: a+b)
· тернарные (применяется к трем операндам, например: условие ? действие А : действие Б).
· Константы – это неизменяемые величины.
· Разделители –скобки, точка, запятая, пробельные символы.
4.3.1. Знаки операций в C++
Знаки операций обеспечивают формирование выражений.
Унарные операции приведены в табл. 1.
Таблица 1
Унарные операции
Операция | Описание |
& | Получение адреса операнда |
* | Обращение по адресу (разыменование) |
- | унарный минус, меняет знак арифметического операнда |
~ | поразрядное инвертирование внутреннего двоичного кода целочисленного операнда (побитовое отрицание) |
! | ! логическое отрицание (НЕ). В качестве логических значений используется 0 – ложь и не 0 – истина, отрицанием 0 будет 1, отрицанием любого ненулевого числа будет 0. |
++ | ++ Увеличение на единицу: префиксная операция – увеличивает операнд до его использования, постфиксная операция увеличивает операнд после его использования |
- - | - - уменьшение на единицу: префиксная операция – уменьшает операнд до его использования, постфиксная операция уменьшает операнд после его использования |
sizeof | вычисление размера (в байтах) для объекта того типа, который имеет операнд имеет две формы: sizeof выражение; sizeof (тип) |
Операторы инкремента (++) и декремента (--)увеличивают или уменьшают значение операнда на единицу. В языке имеется префиксная (++t) и постфиксная формы (t++) операторов инкремента и декремента.
Пример 11.
int t = 1, s = 2, z, f;
z = (t++) * 5;
Вначале происходит умножение t*5, а затем увеличение t. В результате получится: z = 5, t = 2.
f = (++s) / 3;
Вначале значение s увеличивается, а затем используется в операции деления. В результате получим: s = 3, f = 1.
В случае, если операторы инкремента и декремента используются как самостоятельные инструкции, префиксная и постфиксная формы записи становятся эквивалентными:
z++; // эта инструкция
// эквивалентна
++z; // этой инструкции
Бинарные операции представлены в табл. 2.
Таблица 2
Бинарные операции
Операция | Описание |
Аддитивные | |
+ | бинарный плюс (сложение арифметических операндов) |
- | бинарный минус (вычитание арифметических операндов) |
Мультипликативные | |
* | умножение операндов арифметического типа |
/ | деление операндов арифметического типа (если операнды целочисленные, то выполняется целочисленное деление) |
% | получение остатка от деления целочисленных операндов |
Операции сдвига (определены только для целочисленных операндов).Формат выражения с операцией сдвига: операнд_левый операция_сдвига операнд_правый | |
<< | сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого операнда, освободившиеся разряды обнуляются |
>> | сдвиг вправо битового представления значения правого целочисленного операнда на количество разрядов, равное значению правого операнда, освободившиеся разряды обнуляются, если операнд беззнакового типа и заполняются знаковым разрядом, если – знакового |
Поразрядные операции | |
& | поразрядная конъюнкция (И) битовых представлений значений целочисленных операндов (бит =1, если соответствующие биты обоих операндов=1) |
| | поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов (бит =1, если соответствующий бит одного из операндов=1) |
^ | поразрядное исключающее ИЛИ битовых представлений значений целочисленных операндов (бит =1, если соответствующий бит только одного из операндов=1) |
Операции сравнения: результатом являются true (не 0) или false (0) | |
< | меньше, чем |
> | больше, чем |
<= | меньше или равно |
>= | больше или равно |
== | равно |
!= | не равно |
Логические бинарные операции | |
&& | конъюнкция (И) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина (не 0) |
|| | || дизъюнкция (ИЛИ) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина (не 0) |
Пример 12.
Оператор умножения (*) выполняет умножение операндов:
int i = 5;
float f = 0.2;
double g;
g = f * i;
Тип результата умножения f на i преобразуется к типу double, затем результат присваивается переменной g.
Оператор деления (/) выполняет деление первого операнда на второй. Если две целые величины не делятся нацело, то результатом будет целая часть от деления (дробная часть отбрасывается):
int i = 49, j = 10, n, m;
n = i / j; // результат 4
m = i / (-j); // результат -4
Оператор остаток от деления (%) дает остаток от деления первого операнда на второй (только для целых операндов). Знак результата совпадает со знаком делимого:
int n = 49, m = 10, i, j, k, l;
i = n % m; // результат 9
j = n % (-m); // результат 9
k = (-n) % m; // результат -9
l = (-n) % (-m); // результат -9
Пример13. Написать программу, которая преобразует введенное пользователем количество дней в количество полных недель и оставшихся дней.
#include "stdafx.h"
#include <iostream> // подключить файл, где объявлены cin и cout
#include <conio.h> // файл, где определена функция getch()
#include <windows.h>// файл, где определена функция SetConsoleOutputCP(1251);
int main()
{
using namespace std; // использовать стандартное пространство имен
SetConsoleOutputCP(1251); //функция для вывода текста кириллицей
int day, days, week;
cout<<"Введите количество дней = ";
cin>>days;
day=days%7;
week=(days-day)/7;
cout<<week<<" недель и "<<day<<" ден(ь/ей)";
getch(); // ждать нажатия любой клавиши
return 0; // функция возвращает 0
}
Результат деления на 0 в операциях деления и получения остатка не определён и вызывает ошибку (исключение) во время выполнения. Поэтому следующие две инструкции дадут ошибочные, неопределённые результаты:
i = n % 0;
g = f / 0.0;
Операции присваивания имеют следующие виды:
=, +=, -=, *= и т.д.
Сокращенные формы арифметических действий, иногда нужно сделать какое либо одно арифметическое действие над одной переменной, прибавить, умножить.
Например:
S=S+32; в сокращенной форме это будет S+=32;
F=F-k; в сокращенной форме это будет F-=k;
N=N/2; в сокращенной форме это будет N/=2;
Формат операции простого присваивания:
операнд1=операнд2