Upload
igor-shkulipa
View
78
Download
1
Embed Size (px)
Citation preview
Модуль 1: Базовые понятия языка программирования С++
Темы лекции: Структура программы на языке С++.
Практическое задание: Структура программы на языке С++.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 4
http://www.slideshare.net/IgorShkulipa 2
Структура программы на С++
Директивы препроцессора
Объявление глобальных переменных
Описания функций
Функция main
{
Операторы функции main
}
http://www.slideshare.net/IgorShkulipa 3
Препроцессор
Препроцессирование - это процесс, на вход которого подаётсятекст (текстовый файл) и на выходе формируется текст. Во времяработы препроцессор занимается тем, что видоизменяет исходныйтекстовый файл. И только после этого изменённый текстовый файлв дальнейшем попадает в компиляцию. Команды препроцессора (ихназывают директивами) начинаются на символ #, который долженпервым непробельным символом в строке. К директивампрепроцессора, относятся директивы:
#include, #define, #undef, #if, #else, #elif, #endif, #ifdef,
#ifndef, #error, #warning, #line, #pragma
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>
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;
}
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 Функции системного времени
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
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
http://www.slideshare.net/IgorShkulipa 9
Директива #define
Директива #define определяет так называемые макросы.
Если мы определим
#define CON10 10
то в процессе работы препроцессора все вхождения сочетания“CON10” будут в текстовом виде заменены на “10”.
Макрос для возвращения максимума двух чисел:
#define MAX(a,b) ((a>b)?(a):(b))
http://www.slideshare.net/IgorShkulipa 10
Директива #undef
Для того, чтобы отменить макрос, существует директива #undef. Как
только препроцессор встречает такую директиву, он "забывает"определённый ранее макрос и больше не заменяет его.
#define N 20 // определяем макрос “N”
int a[N];
#undef N // здесь препроцессор “забудет” макрос "N"
void main ()
{
int N;
N++;
}
http://www.slideshare.net/IgorShkulipa 11
Директивы условной компиляции #if и #endif
#define DEBUG 1
#if DEBUG == 1
void debug_print()
{
cout<<“Debug mode\n”;
}
#endif
void main()
{
#if DEBUG == 1
debug_print();
#endif
...
}
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
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,
но выдает не ошибку, апредупреждение
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("%d\n",__LINE__); // строка 102
return 0;
}
http://www.slideshare.net/IgorShkulipa 15
Директива #pragma
Директива #pragma — это определяемая реализацией директива,
которая позволяет передавать компилятору различныеинструкции. Например, компилятор может поддерживатьтрассировку выполнения программы или созданиепараллельных ветвей программы (OpenMP). Тогда этивозможности можно указывать в директиве #pragma.
Возможности этой директивы и относящиеся к ней подробностидолжны быть описаны в документации по компилятору.
15
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
http://www.slideshare.net/IgorShkulipa 17
Лабораторная работа №4.Создать консольный калькулятор, который выполняет арифметические действия
над числами в:
◾ Десятичной системе исчисления
◾ Двоичной системе исчисления
◾ Шестнадцатеричной системе исчисления
◾ Восьмеричной системе исчисления
Реализовать меню для управления вычислениями.
Реализовать меню с помощью массива указателей на функции.
Реализовать функции для перевода из одной системы в другую.
Реализовать все арифметико-логические операции - + - * / % | ^ ~ & >> <<, а
так же операции извлечения квадратного корня, тригонометрические функции,функцию факториала и макросы максимума и минимума.
Реализовать ввод чисел в формате строк (char* или string) с последующим
переводом строк в числа.
Разбить программу на логические модули и оформить каждый модуль в отдельные.h и .cpp файлы.
Создать makefile для сборки всего проекта и собрать его с помощью утилиты make
Темы для самостоятельного изучения: Работа со строками в С++.
◾ тип char*, заголовочный файл string.h
◾ тип std::string, заголовочный файл string