1. Модуль 1: Базовые понятия языка программирования С++
Темы лекции: Структура программы на языке С++.
Практическое задание: Структура программы на языке С++.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 4
3. http://www.slideshare.net/IgorShkulipa 3
Препроцессор
Препроцессирование - это процесс, на вход которого подаётся
текст (текстовый файл) и на выходе формируется текст. Во время
работы препроцессор занимается тем, что видоизменяет исходный
текстовый файл. И только после этого изменённый текстовый файл
в дальнейшем попадает в компиляцию. Команды препроцессора (их
называют директивами) начинаются на символ #, который должен
первым непробельным символом в строке. К директивам
препроцессора, относятся директивы:
#include, #define, #undef, #if, #else, #elif, #endif, #ifdef,
#ifndef, #error, #warning, #line, #pragma
4. http://www.slideshare.net/IgorShkulipa 4
Директива #include
#include “имя файла”
#include <имя файла>
Если имя файла указано в кавычках, то поиск файла осуществляется в
соответствии с заданным маршрутом, либо в текущем каталоге. Если
имя файла задано в угловых скобках, то поиск файла производится в
стандартных директориях операционной системы, задаваемых
переменной окружения PATH (‘C++Directory’/include).
#include “/home/user/lab4/header.h”
#include “../header.h”
#include <header.h>
5. http://www.slideshare.net/IgorShkulipa 5
Заголовочные файлы
Заголовочный файл *.h содержит
заголовки функций и классов.
Пример: файл functions.h
double sum(double, double);
double mul(double, double);
double dif(double, double);
double div(double, double);
Заголовочный файл подключается в
основную программу и на этапе
компиляции этого достаточно.
На этапе сборки:
● Среда разработки сама находит
нужные файлы реализации и
подключает их.
● В сценарии сборки (make - файл)
необходимо указать все файлы.
Файл программного кода *.cpp
содержит реализации функций и
классов.
Пример: файл functions.cpp
#include “functions.h”
double sum(double a, double b)
{
return a+b;
}
double mul(double a, double b)
{
return a*b;
}
double dif(double a, double b)
{
return a-b;
}
double div(double a, double b)
{
return a/b;
}
6. http://www.slideshare.net/IgorShkulipa 6
Наиболее используемые заголовочные файлы
ALLOC.Н Функции динамического выделения памяти
ASSERT.H Определяет макрос assert() (ANSI С)
BIOS.H Функции ROM-BIOS
CONIO.H Функции для работы с экраном
CTYPE.H Функции для работы с символами (ANSI С)
DIR.H Функции для работы с каталогами
ERRNO.H Определяет коды ошибок (ANSI С)
FSTREAM.H Файл определений ввода/вывода (С++)
GRAPHICS.Н Графические функции
IO.Н UNIX-подобные процедуры ввода/вивода
IOMANIP.H Определяет манипуляторы ввода/вывода (С++)
IOSTREAM.H Определяет классы потоков ввода/вывода (С++)
LIMITS.Н Определяет различные, зависящие от реализации, пределы (ANSI С)
LOCALE.Н Функции, зависящие от стран и языков (ANSI С)
МАТН.Н Разные определения, используемые математической библиотекой (ANSI С)
PROCESS.H Функции spawn() и ехес()
SETJMP.H Нелокальные переходы (ANSI С)
SHARE.H Совместное использование файлов
SIGNAL.H Определяет величины сигналов (ANSI С)
STDARG.H Списки аргументов длин переменных (ANSI С)
STDDEF.H Определяет некоторые общеупотребительные константы (ANSI С)
STDIO.H Объявления для стандартных потоков ввода/вывода (ANSI С)
STDLIB.H Различные определения (ANSI С)
STRING.H Обработка строк (ANSI С)
STRSTREA.H Классы потоков ввода/вывода на базе массивов
TIME.H Функции системного времени
7. http://www.slideshare.net/IgorShkulipa 7
Makefile
Makefile (сценарий сборки) — это набор инструкций для программы
make, которая помогает собирать программный проект.
цель: зависимости
[tab] команда
Пример: Программа содержит несколько файлов
• main.cpp
• functions1.h
• functions2.h
• functions1.cpp
• functions2.cpp
1. g++ main.cpp functions1.cpp functions2.cpp -o main_result
2. make –f ./main_make_file
8. http://www.slideshare.net/IgorShkulipa 8
Содержимое main_make_file
#CC указывает компилятор, используемый для сборки
CC=g++
#CFLAGS лежат флаги, которые передаются компилятору
CFLAGS=-c
#Основная цель сборки
all: main_result
#Как получить main_result
main_result : main.o functions1.o functions2.o
$(CC) main.o functions1.o functions2.o -o main_result
#Как получить main.o
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp
#Как получить functions1.o
functions1.o: functions1.cpp
$(CC) $(CFLAGS) functions1.cpp
#Как получить functions2.o
functions2.o: functions2.cpp
$(CC) $(CFLAGS) functions2.cpp
#Очистка
clean:
rm -rf *.o main_result
9. http://www.slideshare.net/IgorShkulipa 9
Директива #define
Директива #define определяет так называемые макросы.
Если мы определим
#define CON10 10
то в процессе работы препроцессора все вхождения сочетания
“CON10” будут в текстовом виде заменены на “10”.
Макрос для возвращения максимума двух чисел:
#define MAX(a,b) ((a>b)?(a):(b))
10. http://www.slideshare.net/IgorShkulipa 10
Директива #undef
Для того, чтобы отменить макрос, существует директива #undef. Как
только препроцессор встречает такую директиву, он "забывает"
определённый ранее макрос и больше не заменяет его.
#define N 20 // определяем макрос “N”
int a[N];
#undef N // здесь препроцессор “забудет” макрос "N"
void main ()
{
int N;
N++;
}
12. http://www.slideshare.net/IgorShkulipa 12
Директивы #if, #else, #elif, #endif, #ifdef, #ifndef
#if <условие>
...
#endif
#if <условие>
...
#else
...
#endif
#if <условие>
...
#elif <условие>
...
#elif <условие>
...
#else
...
#endif
#ifdef LINUX
код для Линукс
#endif
#ifndef LINUX
код НЕ для Линукс
#endif
13. http://www.slideshare.net/IgorShkulipa 13
Директивы #error и #warning
#if defined LINUX
...
#elif defined WINDOWS
...
#elif defined MACOS
...
#else
#error “Unknown Operating System”
#endif
#warning работает так же, как #error,
но выдает не ошибку, а
предупреждение
14. http://www.slideshare.net/IgorShkulipa 14
Директива #line
Директива #line изменяет содержимое __LINE__ и __FILE__, которые являются
зарезервированными идентификаторами в компиляторе. В первом из них
содержится номер компилируемой в данный момент строки кода. А второй
идентификатор — это строка, содержащая имя компилируемого исходного
файла.
В общем виде директива #line выглядит таким образом:
#line номер "имя_файла"
где номер — это положительное целое число, которое становится новым значением
__LINE__, а необязательное имя_файла — это любой допустимый идентификатор
файла, становящийся новым значением __FILE__.
Директива #line в основном используется для отладки и специальных применений.
Например, следующий код определяет, что счетчик строк будет начинаться с 100, а
оператор printf() выводит номер 102, потому что он расположен в третьей строке
программы после оператора #line 100:
#include <stdio.h>
#line 100 // установить счетчик строк
int main(void) // строка 100
{ // строка 101
printf("%dn",__LINE__); // строка 102
return 0;
}
15. http://www.slideshare.net/IgorShkulipa 15
Директива #pragma
Директива #pragma — это определяемая реализацией директива,
которая позволяет передавать компилятору различные
инструкции. Например, компилятор может поддерживать
трассировку выполнения программы или создание
параллельных ветвей программы (OpenMP). Тогда эти
возможности можно указывать в директиве #pragma.
Возможности этой директивы и относящиеся к ней подробности
должны быть описаны в документации по компилятору.
15
16. http://www.slideshare.net/IgorShkulipa 16
Аргументы функции main()
В языке C++ заданы два встроенных аргумента функции main: argc и
argv.
void main(int argc, char *argv[])
Аргумент argv типа char - указатель на массив строк. Каждый элемент
массива указывает на аргументы командной строки. Один параметр
отделяется от другого пробелами.
⚫ argv[0] - полное имя запущенной программы
⚫ argv[1] – первый аргумент после имени программы
⚫ argv[2] – второй аргумент после имени программы
⚫ argv[argc-1] – последний аргумент после имени программы
⚫ argv[argc] - NULL
argc – количество аргументов, включая имя самой программы
16
17. http://www.slideshare.net/IgorShkulipa 17
Лабораторная работа №4.
Создать консольный калькулятор, который выполняет арифметические действия
над числами в:
◾ Десятичной системе исчисления
◾ Двоичной системе исчисления
◾ Шестнадцатеричной системе исчисления
◾ Восьмеричной системе исчисления
Реализовать меню для управления вычислениями.
Реализовать меню с помощью массива указателей на функции.
Реализовать функции для перевода из одной системы в другую.
Реализовать все арифметико-логические операции - + - * / % | ^ ~ & >> <<, а
так же операции извлечения квадратного корня, тригонометрические функции,
функцию факториала и макросы максимума и минимума.
Реализовать ввод чисел в формате строк (char* или string) с последующим
переводом строк в числа.
Разбить программу на логические модули и оформить каждый модуль в отдельные
.h и .cpp файлы.
Создать makefile для сборки всего проекта и собрать его с помощью утилиты make
Темы для самостоятельного изучения: Работа со строками в С++.
◾ тип char*, заголовочный файл string.h
◾ тип std::string, заголовочный файл string