Структуры. Объединения. Поля битов в структурах и объединениях. (Лекция 17)

Содержание

Слайд 2

Функция main() – это относительная точка входа в программу, а не

Функция main() – это относительная точка входа в программу, а не

абсолютная (перед вызовом функции, в отличие от всех других, компилятор генерирует невидимый программисту стартовый блок кода – пролог, а после завершения – эпилог всей программы )
Точка входа – одна.
Точки выхода:
по закрывающей скобке main() - корректное завершение программы
по инструкции return
по функции exit()
по функции abort() - аварийное завершение (немедленное завершение, открытые файлы не закрываются, буферы потоков не очищаются, atexit() не обрабатывается,…)
Слайд 3

Посмотрим на задания из лабораторной 6 (повторение материала 1-го семестра)

Посмотрим на задания из лабораторной 6
(повторение материала 1-го семестра)

Слайд 4

Дано целое число N>0. Найти сумму: N2 +(N+1)2 + (N+2)2 +…+(2N)2

Дано целое число N>0. Найти сумму: N2 +(N+1)2 + (N+2)2 +…+(2N)2
Чтобы

избежать целочисленного переполнения, вычислять слагаемые этой суммы с помощью вещественной переменной, не используя функцию возведения в степень.
Дано натуральное n. Получить все натуральные числа, меньшие n, взаимно простые с ним.

6.1. ** Выполнить задание с использованием функций и циклов

6.2. ***Выполнить задание с использованием функций и массивов
Реализовать задание с использованием функций (ввод матрицы, вывод матрицы, вычисление суммы) и цикла for для вычисления суммы. Изменение индексов задавать в заголовке цикла.
Организовать проект в виде двух заголовочных и двух программных файлов. Выполнить многофайловую компиляцию. Тестирование проводить на целочисленной матрице 5-го порядка, все элементы которой равны 1.

Слайд 5

Многофайловая программа Многофайловая программа – это возможность следования принципу абстракции. При

Многофайловая программа

Многофайловая программа – это возможность следования принципу абстракции. При создании

большой системы хорошо бы ее разбивать на отдельные части, и отвлекаться (абстрагироваться), при необходимости, от того, что внутри какой-то из них, а работать с другой.
Многофайловая программа – это возможность разрабатывать программу нескольким программистам одновременно (кто-то делает графику, кто-то – смысловую начинку и пр.).
Многофайловая программа – это возможность раздельной компиляции модулей: модули (исходные файлы .cpp ) можно компилировать раздельно, что позволяет проверить компилируемость модуля отдельно и увеличить скорость повторной компиляции (если изменялся только один, например, файл, то не компилировать заново остальные). За счет этого происходит увеличение быстродействия при компиляции больших проектов.
Слайд 6

Многофайловая компиляция Раздельной компиляции способствует механизм precompiled headers (прикомпайл хэдэр) –

Многофайловая компиляция

Раздельной компиляции способствует механизм precompiled headers (прикомпайл хэдэр) – предварительно

собранные заголовки. Технология предназначена для ускорения сборки проектов, но пользу (выигрыш) от этой нее можно заметить, если в проекте много файлов.

Если посмотреть в проекте *.cpp файлы, то можно заметить, что во многие включаются одни и те же наборы заголовочных файлов. Это приводит к тому, что препроцессор в компиляторе вновь и вновь выполняет идентичную работу (читает одни и те же файлы, вставляет их друг в друга) – происходит дублирование одних и тех же операций. Можно существенно сократить объем работы, которую должен проделать препроцессор при компиляции проекта, если заранее препроцессировать группу файлов и затем просто подставлять готовый фрагмент текста.

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

Слайд 7

Многофайловая компиляция prog.pch – файл precompiled headers для проекта prog stdafx.obj

Многофайловая компиляция

prog.pch – файл precompiled headers для проекта prog

stdafx.obj – файл

предварительно скомпилированных типов

prog1.cpp func1.cpp stdafx1.cpp получены в результате работы препроцессора, хранятся временно, только при компиляции

Слайд 8

Многофайловая компиляция При создании нового проекта в Visual Studio с помощью

Многофайловая компиляция

При создании нового проекта в Visual Studio с помощью мастера

wizard (вэжэд) создаётся два файла: stdafx.h и stdafx.cpp и одновременно автоматически выставляются опции компиляции :
для всех *.cpp файлов включается «использование precompiled headers» : Project ? Properties ? Configuration Properties ? C/C++ ? «Precompiled Header»: «Use (/Yu)»;
для файла stdafx.cpp для параметра «Precompiled Header» выставляется значение «создание precompiled headers»: «Create (/Yc)»).

Для ускорения повторной компиляции в stdafx.h нужно включить заголовочные файлы, которые будут заранее препроцессироваться.
А во все файлы *.cpp следует добавить #include "stdafx.h" и удалить из них заголовки, которые уже включаются с помощью stdafx.h.
В файле stdafx.cpp содержится одна единственная строка: #include "stdafx.h". После компиляции stdafx.cpp возникает файл *.pch, который уже содержит precompiled headers, а имя файла обычно совпадает с названием проекта.

Заголовочный файл «stdafx.h» должен включаться в *.cpp файл самым первым! Иначе возникнут ошибки компиляции.
Все файлы, включающие «stdafx.h», зависят от его содержимого. Изменение в одном файле, включенном в «stdafx.h», может повлечь полную перекомпиляцию всего проекта.

Слайд 9

6.3. ***Выполнить задание с использованием шаблонов функций и динамических массивов Для

6.3. ***Выполнить задание с использованием шаблонов функций и динамических массивов

Для

заданного k (целого и вещественного типов) получить квадратную матрицу заданного порядка n:
Слайд 10

6.3. ***Выполнить задание с использованием шаблонов функций и динамических массивов template

6.3. ***Выполнить задание с использованием шаблонов функций и динамических массивов

template

< class T>
T ** mem_ar (size_t n , size_t m); // шаблон выделения памяти матрице
template < class T , size_t n , size_t m>
void zapol (T**, T k); // шаблон заполнения матрицы, k – значение для заполнения
template < class T , size_t n, size_t m >
void vyvod_ar (T**); // шаблон вывода матрицы

int main()
{
const size_t n=5;
cout << "1" << endl;
int k = n;
int** mas = mem_ar(n, n);
zapol(mas, k);
vyvod_ar(mas);

cout << "2" << endl;
double k1 = n;
double** mas1 = mem_ar(n, n);
zapol(mas1, k1);
vyvod_ar(mas1);
system ("pause");
return 0;
}

1-ый способ задания параметров шаблона

2-ой способ задания параметров шаблона

Слайд 11

int **ar int *ar[n] int ar[n] [m] template T ** mem_ar

int **ar int *ar[n] int ar[n] [m]
template
T

** mem_ar ( size_t n, size_t m )
{
T** ar = new T*[n]; //выделяется память под массив указателей
if (ar == NULL)
{ cout << "ar == 0 " << endl; _getch(); exit(-1); } //проверка!!! выделения памяти
// Функция exit (code) завершает работу программы
//аргумент code указывает статус завершения
// «неуспешное» завершение – отличное от нуля значение или EXIT_FAILURE
for ( size_t i = 0; i < n; i++)
{
ar[i] = new T [m]; // цикл выделения памяти под строку массива
if (ar[i] == NULL)
{ cout << "ar[i]==0" << endl; _getch(); exit (-2); }
//обратить внимание на проверку выделения памяти!!!
}
return ar;
}
Слайд 12

template void zapol(T** mas, T k) { for (size_t i =

template < class T, size_t n, size_t m >
void zapol(T**

mas, T k)
{
for (size_t i = 0; i < n; i++)
for (size_t j = 0; j < m; j++)
if ( i != j ) mas[i][j] = 0;
else mas[i][j] = (k-i)/n;
}

template
void vyvod_ar(T **mas)
{
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < m; j++)
cout << setw(7) << mas[i][j];
cout << endl;
}
}

Слайд 13

template T ** mem_ar ( ) { T** ar = new

template
T ** mem_ar

( )
{
T** ar = new T*[n]; //выделяется память под массив указателей на строки
if (ar == NULL)
{ cout << "ar == 0 " << endl; _getch(); exit(-1); } //проверка!!! выделения памяти
// Функция exit (code), завершает работу программы
//аргумент code указывает статус завершения
//аварийное завершение – отличное от нуля значение или EXIT_FAILURE
for ( size_t i = 0; i < n; i++)
{
ar[i] = new T [m]; // цикл выделения памяти под строку массива
if (ar[i] == NULL) { cout << "ar[i]==0" << endl; _getch(); exit (-2); }
//обратить внимание на проверку выделения памяти!!!
}
return ar;
}

template
T ** mem_ar ( );

int** mas = mem_ar();

2-ой способ задания параметров шаблона

Слайд 14

template void mem_ar1 (T**& ar, size_t n, size_t m ) {

template
void mem_ar1 (T**& ar, size_t n, size_t

m )
{
ar = new T*[n]; //выделяется память под массив указателей на строки
if (ar == NULL)
{ cout << "ar == 0 " << endl; _getch(); exit(-1); } //проверка!!! выделения памяти
// Функция exit (code), завершает работу программы
//аргумент code указывает статус завершения
//аварийное завершение – отличное от нуля значение или EXIT_FAILURE
for ( size_t i = 0; i < n; i++)
{
ar[i] = new T [m]; // цикл выделения памяти под строку массива
if (ar[i] == NULL) { cout << "ar[i]==0" << endl; _getch(); exit (-2); }
//обратить внимание на проверку выделения памяти!!!
}
return ar;
}

template < class T >
void mem_ar1 (T**&, size_t n, size_t m );

int** mas;
mem_ar1(mas, n, n);

Функция выделения памяти матрице, 2-ой способ