17
Модуль 1 : Базовые понятия языка программирования С++ Темы лекции : Структура программы на языке С++. Практическое задание : Структура программы на языке С++. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 4

C++ Базовый. Занятие 04

Embed Size (px)

Citation preview

Page 1: C++ Базовый. Занятие 04

Модуль 1: Базовые понятия языка программирования С++

Темы лекции: Структура программы на языке С++.

Практическое задание: Структура программы на языке С++.

Тренер: Игорь Шкулипа, к.т.н.

C++ Базовый. Занятие 4

Page 2: C++ Базовый. Занятие 04

http://www.slideshare.net/IgorShkulipa 2

Структура программы на С++

Директивы препроцессора

Объявление глобальных переменных

Описания функций

Функция main

{

Операторы функции main

}

Page 3: C++ Базовый. Занятие 04

http://www.slideshare.net/IgorShkulipa 3

Препроцессор

Препроцессирование - это процесс, на вход которого подаётсятекст (текстовый файл) и на выходе формируется текст. Во времяработы препроцессор занимается тем, что видоизменяет исходныйтекстовый файл. И только после этого изменённый текстовый файлв дальнейшем попадает в компиляцию. Команды препроцессора (ихназывают директивами) начинаются на символ #, который долженпервым непробельным символом в строке. К директивампрепроцессора, относятся директивы:

#include, #define, #undef, #if, #else, #elif, #endif, #ifdef,

#ifndef, #error, #warning, #line, #pragma

Page 4: C++ Базовый. Занятие 04

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>

Page 5: C++ Базовый. Занятие 04

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;

}

Page 6: C++ Базовый. Занятие 04

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 Функции системного времени

Page 7: C++ Базовый. Занятие 04

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

Page 8: C++ Базовый. Занятие 04

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

Page 9: C++ Базовый. Занятие 04

http://www.slideshare.net/IgorShkulipa 9

Директива #define

Директива #define определяет так называемые макросы.

Если мы определим

#define CON10 10

то в процессе работы препроцессора все вхождения сочетания“CON10” будут в текстовом виде заменены на “10”.

Макрос для возвращения максимума двух чисел:

#define MAX(a,b) ((a>b)?(a):(b))

Page 10: C++ Базовый. Занятие 04

http://www.slideshare.net/IgorShkulipa 10

Директива #undef

Для того, чтобы отменить макрос, существует директива #undef. Как

только препроцессор встречает такую директиву, он "забывает"определённый ранее макрос и больше не заменяет его.

#define N 20 // определяем макрос “N”

int a[N];

#undef N // здесь препроцессор “забудет” макрос "N"

void main ()

{

int N;

N++;

}

Page 11: C++ Базовый. Занятие 04

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

...

}

Page 12: C++ Базовый. Занятие 04

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

Page 13: C++ Базовый. Занятие 04

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,

но выдает не ошибку, апредупреждение

Page 14: C++ Базовый. Занятие 04

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;

}

Page 15: C++ Базовый. Занятие 04

http://www.slideshare.net/IgorShkulipa 15

Директива #pragma

Директива #pragma — это определяемая реализацией директива,

которая позволяет передавать компилятору различныеинструкции. Например, компилятор может поддерживатьтрассировку выполнения программы или созданиепараллельных ветвей программы (OpenMP). Тогда этивозможности можно указывать в директиве #pragma.

Возможности этой директивы и относящиеся к ней подробностидолжны быть описаны в документации по компилятору.

15

Page 16: C++ Базовый. Занятие 04

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

Page 17: C++ Базовый. Занятие 04

http://www.slideshare.net/IgorShkulipa 17

Лабораторная работа №4.Создать консольный калькулятор, который выполняет арифметические действия

над числами в:

◾ Десятичной системе исчисления

◾ Двоичной системе исчисления

◾ Шестнадцатеричной системе исчисления

◾ Восьмеричной системе исчисления

Реализовать меню для управления вычислениями.

Реализовать меню с помощью массива указателей на функции.

Реализовать функции для перевода из одной системы в другую.

Реализовать все арифметико-логические операции - + - * / % | ^ ~ & >> <<, а

так же операции извлечения квадратного корня, тригонометрические функции,функцию факториала и макросы максимума и минимума.

Реализовать ввод чисел в формате строк (char* или string) с последующим

переводом строк в числа.

Разбить программу на логические модули и оформить каждый модуль в отдельные.h и .cpp файлы.

Создать makefile для сборки всего проекта и собрать его с помощью утилиты make

Темы для самостоятельного изучения: Работа со строками в С++.

◾ тип char*, заголовочный файл string.h

◾ тип std::string, заголовочный файл string