Слайд 1Основы,
программирования
Fortran, C++, D
Санкт-Петербургский
государственный университет
фак. Прикладной математики – процессов управления
гр.
103 – прикладная математика и информатика
2013.10.05. Процедуры и
функции. Занятие № 5
Храмушин Василий Николаевич – V.Khramushin@SPBU.ru
каф. компьютерного моделирования и многопроцессорных систем
Слайд 2Занятие 5, операторы и Windows
Процедуры, функции и операторы
– функции –
основные процедурные блоки
при алгоритмическом программировании,
на языке Си++
– правила
записи, вызова и согласованного использования различных параметров
Имена функций
Необязательные аргументы функций
Вызов функций
Рекурсия
Слайд 3гр.103 – Прикладная математика и информатика
1. Власов Александр Александрович
+ + + +
2. Данилов Артем Дмитриевич + + + +
3. Каюмова Диана Шамильевна
+ --- + +
4. Колесова Александра Александровна + + + +
5. Лапин Егор Дмитриевич + + + +
6. Леганькова Дарья Андреевна + + + +
7. Минаева Ульяна Сергеевна + + + +
8. Мозин Виталий Романович + + + +
9. Пенкрат Андрей Олегович + + --- +
10. Глотова Екатерина Андреевна + +
11. Пономарева Юлия Константиновна + + + +
12. Сатина Алена Юрьевна + + + +
13. Сафронов Вадим Викторович + --- --- ---
14. Симанков Сергей Сергеевич + + + +
15. Смирнова Дарья Сергеевна + + ---
16. Фатькина Анна Игоревна + + + +
17. Федосеев Георгий Александрович + + + +
Слайд 4Вопросы от 28 сентября:
Структура типовой программы на алгоритмическом языке программирования
(операторы описания данных и выполняемые команды);
Типовое построение среды компиляции и
сборки программ на алгоритмических языках программирования
(структура библиотек на примере проекта GCC.GNU)
Реализация простейшей интерактивной графики в среде GLFW и Glut для OpenGL
(особенности исполнения программы, управляемой внешними прерываниями).
… и то уже не просто …
Слайд 5Реализация вычислений на
объектно-ориентированном языке
1. Функциональное программирование (LISP, Planner):
– потоки
информации управляют ходом вычислений
= искусственный интеллект режим интерпретации
2. Декларативное
программирование (FORTRAN, Algol, С):
– трансформация данных по заданным алгоритмам
= наиболее эффективные расчеты на современных
арифметико-логических устройствах
2+Объектно-ориентированное программирование (C++,D):
– на этапах компиляции множатся алгоритмы для всех
числовых объектов с контролем допустимости операций
= сохраняется линейность расчетов + накладные расходы
Слайд 6Процедуры, функции и операторы
Процедуры служат оптимизации программ по объёму занимаемой
памяти – исключая повторение идентичных блоков с помощью структуризации кода,
в том числе для удобства понимания и сопровождения.
Функции, операторы и замкнутые процедуры логически выделяют целостную подзадачу и расширяют функциональность типовых алгоритмов для широкого круга прикладных задач.
Даже если в именованных процедурах определяется однократно используемые числовые объекты и переопределенные операции с ними, их использование оправдано расширенными возможностями отладки программы в целом, и перспективами будущего совершенствования алгоритмов или унификации построения сложных программных комплексов...
Слайд 7Функциональное и алгоритмическое (декларативное/императивное/) программирование
Компиляция – построение эффективной программы непосредственно
в кодах процессора.
Интерпретация – построение контекстно-зависимых описаний и непосредственное исполнение
операций на языке программирования.
ЭВМ Эльбрус (asm – отсутствует), язык — автокод Эль-76 (класса Алгол), с динамическим связыванием типов на уровне аппаратной поддержки.
При компиляции программа переводится в безоперандные команды стековой архитектуры, выбор нужного варианта операции и контроль типов операндов происходит на этапе выполнения.
Эльбрус-2С+, 2011.
Слайд 8Функциональное и алгоритмическое (декларативное/императивное/и др.)
МФТИ + Московский центр Sparc
технологий
Процессор Эльбрус-8С с архитектурой "Эльбрус" для вычислительно-интенсивных задач и создания многопроцессорных и
многомашинных систем терафлопного класса
(ОС «Эльбрус» на базе Linux 2.6.33.):
Микропроцессор совместим с разрабатываемым южным мостом КПИ-2.
Ожидаемый год завершения работы: 2015
Слайд 9 "Эльбрус"
МФТИ + Московский центр Sparc технологий
Зеленоград
Эльбрус-3
Железо ЭВМ
Слайд 10Функциональное и алгоритмическое (декларативное/императивное/) программирование
PASCAL
Реентерабельность – повторновходимость рекурсия;
параллельное выполнение
независимых процедур;
режим аппаратных прерываний, в том числе одновременных;
все данные инициируются
только во временных сегментах памяти, в стеке и по стеку в общей глобальной памяти;
копии исполняемого кода свободно размножаются по процессам
FORTRAN
Неперемещаемость резидентные драйверы;
прямой доступ к общим адресным и индексным полям данных;
контроль событий и очередей на исполнение запросов;
все данные хранятся в статической памяти и модифицируются по алгоритмам последовательной записи, и с разрешением одномоментного считывания только по готовности данных;
Такие процедуры управляются только противными
(ортогональными или независимыми) типами функций.
Слайд 11Определение процедур и функций
FORTRAN
C определение данных (по необходимости)
C исполняемый
код без начала и условностей
A = FUNC( 3.1415, VR )
call PROC( 2.71 )
stop
end
function FUNC( E )
FUNC = log( E )
return
end
subroutine PROC( PI, RES )
RES = sin( PI )
return
end
Слайд 12Определение процедур и функций
С
// Здесь уже строго соблюдаются правила
// видимости, сначала определение, лишь
// затем возможно обращение по именам
static
float Func(
float E ){ return ln( E ); }
static void Proc( float Pi, float& Res )
{ Res = sin( PI );
}
external int main( int c, chat ** a )
{ float Vr,Wr,A = Func( 3.1415, Vr );
Proc( 2.71,Wr );
return( 0 );
}
float ExtVar = Func( 1.0 ); // до начала!
Слайд 13Виды процедур-функций в C++, D
Функция — это процедура специального вида,
которая, кроме получения параметров, исполнения операций и выдачи результатов работы
через параметры, имеет возможность — возвращать один числовой объект в качестве члена арифметического выражения. Функция используется в любых выражениях времени исполнения (и константных – до исполнения).
Процедура — это именованный вариант функции, которая не планируется для использования в составе арифметических выражений (void – имеет смысл использования в адресных выражениях).
Оператор – функция с особым синтаксисом
Методы - процедуры, функции и операторы в составе структур – членов объекта - класса.
Слайд 14Параметры процедур-функций в C++, D
Формальные имена и фактические параметры –
в описании и при вызове функций – фактические параметры становятся
значениями формальных.
Передача по копии – по формальному имени обычной локальной переменной с начальной инициализацией, при этом внешний фактический параметр может быть выражением времени исполнения (может быть адрес: type *var).
int fun1(int x){ fun2(++x); return x; }
Передача по ссылке. Формальный параметр является ссылкой на внешний объект, и должен в точности ему соответствовать.
void func2(int &x) { x--; }
Передача по имени – параметр-функция, значение вычисляется только при обращении – в С нет.
Передача через стек – также отсутствует.
Слайд 15Cи – ключевые слова
Имена, начинающиеся с двойного подчёркивания (__), или
с подчёркивания и _Заглавной буквы, не должны использоваться в качестве
идентификаторов программных переменных.
Все имена, начинающиеся с _подчёркивания, зарезервированы
для использования в качестве производных имён компоновщика;
--- такие имена могут использоваться в локальных переменных,
в именах членов структуры и т.д.
Слайд 16Вопросы:
Алгоритмическое и функциональное программирование
(реентерабельность, рекурсия, демоны и драйверы….);
Виды процедур
функций в алгоритмических языках программирования, особенности реализации (процедуры, функции, операторы)
Соглашения
о связях – правила передачи параметров в процедурных блоках программы … (по адресу, по значению?).
… начало элементарного программирования …
Слайд 17Практика, 5 октября, 2-3 пара
Персональные компьютеры
CB\codeblocks.exe – интегрированная среда
разработки
MinGW – компиляторы Fortran, C, C++, (D)
MinGW\bin – исполняемые модули
(*.exe, *.dll)
MinGW\include – прототипы стандартных пакетов (*.h)
MinGW\lib – библиотеки программ Win32 и Сlib (*.а)
Классный компьютер
login: student101e, password: student101e
\\ws101-operator\Shared folder\Khram\GL
Слайд 18Вычислительные объекты
физической теории поля
(прикладной математики)
1) Скаляр – числовая величина, не
зависящая от системы отсчета, являющаяся либо инвариантом пространственно-временных преобразований, либо
физической (эмпирической) константой. Используется в операциях произведения с любыми объектами;
2) Вектор – сложный пространственно-ориентированный числовой объект, заданный в собственной системой отсчета (СК). Допустимо сложение с определенными векторами в той же СК. Произведение – только с векторами из дуального (связанного) базиса, и с тензорами – для перехода к другому опорному базису;
3) Тензор II ранга – образует линейный пространственный базис (ЛСК); моделирует напряжения и конвективные потоки или внутреннюю энергию (живые силы) в механике и физике. Участвуют в произведениях свертки с векторами и тензорами; в анализе и конструировании полей и реологических свойств среды.
Слайд 19Координатные системы отсчета
( компьютерное представление )
typedef struct { char s;
int d } integer; // для индексов,
typedef struct { char
s; double d } real; // для чисел,
typedef struct { char s; double X,Y,Z } Point;
// координатная точка в общей системе отсчета
typedef struct { char s; double x,y,z } point;
// координатный отсчет внутри локального базиса
Уровень языка С
(как макроассемблера)
Слайд 20Распределение памяти ЭВМ
для числовых рядов и полей
1. Статическая память распределяется
в сегменте программного кода и может изменяться только при компиляции
программы.
2. Стековая память распределяется в прологе выполняемых программ и существует только во время жизни конкретной процедуры.
3. Память типа «куча» динамически выделяется при выполнении программ и может иметь произвольный объем и любую структуру:
– существуют проблемы сборки мусора
Слайд 21Allocate.h – распределение памяти
#ifndef __Allocate__
//
Ver 3.1 /1991.01.19 - 2008.11.09/
//
// Малый пакет наиболее употребительных программ
//
// При распределении памяти резервируется одно слово
// для хранения длины массива в байтах, а для матриц
// здесь сохраняется количество строк, соответственно.
// Если длина указывается нулевой,
// то происходит освобождение существующего массива
// Если адрес нулевой - выделяется новый массив,
// иначе происходит перераспределения памяти, при котором
// начальный фрагмент сохраняется, добавленный - очищается
// Если при распределении двумерного массива в качестве длины строк
// указывается 0, то реальное распределение и памяти и управление
// типом и длиной строк производится в вызывающей программе.
// ~~~~~~~~~~~~~~~~~~~~~~
#include // На выходе из запроса длина массива в байтах
size_t Allocate( void* A ); // или - количество строк матрицы
void *Allocate( size_t s, void *A=NULL ); // Линейный массив в байтах
void **Allocate( size_t y, size_t s, void *A=NULL ); // Массив массивов
//
// y - количество строк в матрице (фиксированном списке)
// y=0 - второй параметр не анализируется, а сама матрица удаляется
// s - длина строки в байтах
// s=0 - новые строки не выделяются, а старые не изменяются
//
#define __Allocate__
#endif
Слайд 22Allocate.h – распределение памяти
Для обеспечения эффективного доступа к числовым данным
в программном коде используются операции низкого уровня для прямой переадресации
внутренних предикатов
#define AWord 4u //
#define Align (sizeof(size_t)*AWord) // выравнивание на границу 4 слов
static //
inline void* ALset( size_t *A, size_t L )
{ *A++ = 0; *A++ = 0; *A++ = 0; *A++ = L; return A;
} //
size_t Allocate( void* A ) // На выходе длина в байтах
{ if( A )return ((size_t*)A)[-1]; else return 0; // или количество
} // строк матрицы
void *Allocate( size_t s, void *A ) // Линейный массив
{ size_t S=0; // -- в байтах
if( s!=0 || A!=NULL ) // 4 слова для выравнивания
{ if( !s ) //
{ free( ((size_t*)A)-AWord ); A=NULL; } else // Новый массив или
{ if( A==NULL )A=malloc( s+Align ); else // перераспределение
{ S = ((size_t*)A)[-1]; // изначально заданная длина массива
A = ((size_t*)A)-AWord; // реальный адрес для всего массива
A = realloc( A,s+Align ); // перераспределение без замены метки
}
if( A==NULL ){ printf( "\n\7 No memory %d",s ); exit( 1 ); } else
{ A=ALset((size_t*)A,s); // расчистка метки, запись длины массива
if( s>S )memset( ((char*)A)+S,0,s-S ); // и расчистка хвоста
} } } return A;
}
Слайд 23Allocate.h – распределение памяти
Массив массивов моделирует двумерные (плоские) регуляризованные сетки
для числовых полей
или последовательные списки с прямой индексацией
//
// y
- количество строк в матрице (списке)
// y=0 - второй параметр не анализируется, а сама матрица удаляется
// s - длина строки в байтах
// s=0 - новые строки не выделяются, а старые не изменяются
//
void **Allocate( size_t y, size_t s, void *A )
{ size_t Y=0; //
if( y!=0 || A!=NULL ) // Для двумерной матрицы или списка
{ if( A!=NULL ) // -- если массив уже есть, то
{ Y=((size_t*)A)[-1]; // -- его размер в префиксном слове
while( Y>y )Allocate(0,((void**)A)[--Y]); // освобождение пустых
if( !Y ){ free( ((size_t*)A)-AWord ); A=NULL; } // строк и полное
} //освобождение
if( y!=0 ) //
{ if(A!=NULL)((size_t*)A)[-1]*=sizeof(A); // Приведение к линейному
((size_t*)( A=Allocate( y*sizeof( A ),A ) ))[-1]=y; // и
} // перераспределение
if( s!=0 )
for( Y=0; Y } return (void**)A;
}
Слайд 24Шестое занятие 12 октября …
Встроенные типы данных
Все типы языка Си++:
целые числа разной разрядности, вещественные числа, логические величины, перечисляемые значения,
символы и их кодировка.
Общая информация
Целые числа
Вещественные числа
Логические величины
Символы и байты
Кодировка, многобайтовые символы
Наборы перечисляемых значений
== Вычислительная математика:
++ комплексные числа и арифметика,
++ векторы и тензоры аналитической геометрии и базовые операции с синтезированными вычислительными объектами
Слайд 25Вопросы
14 сентября
Концепция построения и особенности реализации языков программирования на примерах
Fortran(57), Algol(58), В(69), C(72), C++(83), D(2001) и др;
Машинно-зависимые типы данных
(стек, статика, куча), особенности их использования, скорость доступа и эффективность выполнения операций на линейном процессоре.
Компиляция и интерпретация, достоинства в использовании и проблемы реализации формализованных и специальных языков программирования (декларативные алгоритмы и функциональные языки искусственного интеллекта)
21 сентября
Ключевые слова и зарезервированные идентификаторы языков программирования (объявление данных и исполняемые операторы – Алгол – Фортран, С, С++, Ди);
Математические и логические операции исторических языков программирования (математические и программные выражения)
Приоритеты и последовательность константных и исполняемых выражений (литералы времени компиляции и интерпретация выражений на этапах сборки и исполнения программы).
… только суть – что и зачем?
Слайд 26Вопросы
28 сентября
Структура типовой программы на алгоритмическом языке программирования (операторы описания
данных и выполняемые команды);
Типовое построение среды компиляции и сборки программ
на алгоритмических языках программирования (структура библиотек на примере проекта GCC.GNU)
Реализация простейшей интерактивной графики в среде GLFW и Glut для OpenGL (особенности исполнения программы, управляемой внешними прерываниями).
… и то уже не просто …
5 октября
Слайд 27Квалификационное задание
(к зачету)
Оформить научную публикацию …
Выполнить конвертацию исходных…
Подготовить презентацию
…
Дополнительно:
Выполнить систематизацию, обработку и анализ результатов вычислительного эксперимента и (или)
данных полевых наблюдений.
Представить результаты анализа в пространственной сцене или на картографической основе с помощью векторных/растровых графических редакторов.