Слайд 1Основы,
программирования
Fortran, C++, D
Санкт-Петербургский
государственный университет
фак. Прикладной математики – процессов управления
гр.
103 – прикладная математика и информатика
2013.10.26. Числовые объекты –
классы. Занятие № 8
Храмушин Василий Николаевич – V.Khramushin@SPBU.ru
каф. компьютерного моделирования и многопроцессорных систем
Слайд 2Восьмое занятие 26 октября …
Производные типы данных
Создание и использование массивов,
структур, объединений, указателей. Адресная арифметика. Строки и литералы.
Массивы
Структуры
Битовые поля
Объединения
Указатели
Адресная арифметика
Связь
между массивами и указателями
Безтиповый (нетипизированный) указатель
Нулевой указатель
Строки и литералы
== Вычислительная математика:
++ векторы и тензоры аналитической геометрии и базовые операции с синтезированными вычислительными объектами
Слайд 3гр.103 – Прикладная математика и информатика
. Смирнова
Дарья Сергеевна 709 1409 2109 2809 0510 1210 1910 2610
1. Власов Александр Александрович + + + + + + +
2. Данилов
Артем Дмитриевич + + + + – + +
3. Каюмова Диана Шамильевна + -- + + + + +
4. Колесова Александра Александровна + + + + -- + +
5. Лапин Егор Дмитриевич + + + + + + +
6. Леганькова Дарья Андреевна + + + + + + --
7. Минаева Ульяна Сергеевна + + + + -- + +
8. Мозин Виталий Романович + + + + -- + +
9. Пенкрат Андрей Олегович + + -- + -- -- --
10. Глотова Екатерина Андреевна + + -- + +
11. Пономарева Юлия Константиновна + + + + + + +
12. Сатина Алена Юрьевна + + + + + + +
13. Сафронов Вадим Викторович + -- -- -- -- -- +
14. Симанков Сергей Сергеевич + + + + + + --
15. Фатькина Анна Игоревна + + + + + + +
16. Федосеев Георгий Александрович + + + + -- + +
Слайд 4Вопросы на 19 октября. Объекты:
Сложные числовые объекты – структуры данных
и методы их представления и практического использования в языках Fortran,
C, C++.
(Свойства и методы, или элементы и функции-члены класса, формат объявления и практического использования, «.», «::» и «->» );
Модификаторы доступа к элементам класса, начальная инициализация, время жизни или автоматическое свертывание динамически распределяемых объектов (Модификаторы доступа к элементам класса, конструкторы и деструкторы)
Управление элементами класса, преобразование типов, статические данные, «дружеские» структуры и функции, формирование операторов и функций (методов), начальная инициализация параметров (варианты практического использования данных, операторов, функций и их перегрузка).
… практическое программирование начинается с построения числовых объектов и операций …
Слайд 5Массивы
векторы, поля и последовательности
Fortran:
C – в любых объявлениях данных могут
быть скобки с числами:
dimension FIL( 6,2 )
! это ( x1,y2 ) - сначала левый
character*80 STR ! в фортране-77
C – – – – – – – – – – – – – – – – –
C – пример использования массивов в фортране
dimension A(2,3), V(10)
call SUBR(A,2,V)
. . .
subroutine SUBR(MATRIX,ROWS,VECTOR)
real MATRIX,VECTOR
integer ROWS
dimension MATRIX(ROWS,*),VECTOR(10),
+ LOCAL(2,4,8) ! – максимум 7 индексов
MATRIX(1,1) = VECTOR(5)
. . .
end
Слайд 6Массивы
векторы, поля и последовательности
C, C++:
typedef float[nx] vector;
// простой массив чисел
typedef float[ny][nx] field; // двумерная
поверхность
typedef float[nz][ny][nx] space; // 3-мерное пространство
// nx=6, ny=3, nz – константные выражения
field F = { { 11,12,13,14,15,16 } // дислокация числовых
, { 21,22,23,24,25,26 } // последовательностей
, { 31,32,33,34,35,36 } };
// то же, но без объявления типа агрегатных данных
float Fld[ny][] = { { 1,2 }
, { 1,2,3,4 }
, { 1,2,3,4,5,6,7 } };
// оптимальное построение списка из текстовых строк (!)
char *text[] = { "строка-1", "другая строка", "и",
"тому подобное", "произвольной длины" };
Слайд 7Массивы
векторы, поля и последовательности
C, C++:
// Язык С – самые широкие
возможности управления памятью
typedef *float vector; // последовательность - вектор
чисел
typedef **float field; // вектор адресов – поле данных
typedef ***float space; // адресное поле – 3d пространство
// обращение к ОS на этапе выполнения программы
space Sp=NULL; // или: float ***Sp - такой агрегат
for( int k=0; k{ *(Sp[k])=(float**)malloc( ny*sizeof( float* ) );
for( int j=0; j} ... // освобождение памяти
for( int k=0; k{ for( int j=0; j free( Sp[k] );
} Sp=NULL;
double ****World = NULL; // пространство - время
Слайд 8Массивы языка D
ассоциативные массивы
и строки
1. Динамические массивы.
1.1. Длина.
1.2. Проверка границ.
1.3. Срезы
1.4. Копирование
1.5. Проверка
на равенство
1.6. Конкатенация
1.7. Поэлементные операции
1.8. Сужение
1.9. Расширение
1.10. Присваивание значения свойству
.length
2. Фиксированные массивы
2.1. Длина
2.2. Проверка границ
2.3. Получение срезов
2.4. Копирование и неявные преобразования
2.5. Проверка на равенство
2.6. Конкатенация
2.7. Поэлементные операции
3. Многомерные массивы
4. Ассоциативные массивы
4.1. Длина
4.2. Чтение и запись ячеек
4.3. Копирование
4.4. Проверка на равенство
4.5. Удаление элементов
4.6. Перебор элементов
4.7. Пользовательские типы
5. Строки
5.1. Кодовые точки
5.2. Кодировки
5.3. Знаковые типы
5.4. Массивы знаков + бонусы = строки
6. Собрат - указатель
// полный контроль массивов
int[] vector new int[nx];
auto vector new int[nx];
auto copy = vector.dup;
// ссылка на сегмент массива
auto segm = vector[2..$-2];
// срез массива с его заменой
vector = vector[$/2 .. $];
// расширение массива конкатенацией
vector ~= [42.0, 12.0];
// ассоциативные массивы - списки
int[string] ls=["key":1, "line":0];
auto sl = [1:"ass", 5:"ags", 6:"xyz"];
// непосредственное изменение длины
vector.length += nx/2;
// и многое, многое другое
Слайд 9Структуры
Составные числовые объекты
Fortran:
C - учетом выравнивания все должно получаться:
common /SNAME/
VAR1, VAR2
// Язык С – классика в структуризации данных
typedef
struct{ double x,y; }POINT; // тип данных
POINT Geo={ 60,30 },*xGeo=&Geo;
// -- то же самое в стиле а-ля С++
struct POINT { double x,y; POINT *next; }
Geo={ 60,30,NULL }, *xGeo=&Geo;
// -- рекурсивное указание на структуру в чистом С
struct node { int data; struct node *next; };
// в С++ инициализация данных только в конструкторах
Слайд 10Битовые поля
Регистры устройств и маски состояния программы
// Язык С –
единственный и неповторимый
struct TimeAndDate
{ unsigned hours :5; // часы от
0 до 24
unsigned mins :6; // минуты
unsigned secs :6; // секунды от 0 до 60
unsigned weekDay :3; // день недели
unsigned monthDay :5; // день месяца от 1 до 31
unsigned month :4; // месяц от 1 до 12
unsigned year :7; // год от 0 до 100
};
// Структура TimeAndDate требует 36 бит,
// т.е. 5 байт и 4 запасных бита (байт = 8 бит).
Слайд 11Объединения
и архитектурные особенности
C, C++:
// перебор байт в целых числах
union number //
big endian – весь мир
{ unsigned char io[4]; // little
endian – Intel-x86
unsigned int IO;
};
// объединение индексов для ускорения поиска
union place //
{ struct { int x,y }; // анонимные структуры !!
long long xy; // все на 8 байт = 64 бит
};
// интеллектуальный типаж – во всех «бочках» - «затычка»
struct unidata32
{ enum { _void, _int, _real, _string } _tag; // это слово и
union{ void *v; int i; real r; string s; };// еще 4 байта
};
Слайд 12Указатели
прямые ссылки и адресные последовательности
// - базовый тип – адрес
числового объекта или функции
// работа с адресами досталась C++
в наследство от С
// - определена переменная типа int:
int x;
// "указатель" на целое число:
int* xptr;
// присвоить xptr адрес x:
xptr = &x;
// указатель на функцию для косвенного обращения:
int foo(long x), bar(long x),
(*functptr)(long x);
functptr = &foo; (*functptr)(2);
functptr = &bar; (*functptr)(4);
D содержит все адресные операции из С, как плохой стиль, заменяемый более естественными функциями для сложных структур данных
Слайд 13Адресная арифметика
векторы и последовательности
C, C++:
int x=10,
y=10;
int *xptr = &x,
*yptr = &y;
// сравниваем указатели
if(xptr==yptr){ cout<<"Указатели равны"<< endl;}
else { cout<<"Указатели не равны"<< endl; }
// сравниваем значения, на которые указывают указатели
if(*xptr==*yptr){ cout<<"Значения равны"<
else { cout<< "Значения не равны" <//
// использование указателей для работы с массивами
int array[100],
sum = 0,
*ptr=NULL;
for( ptr=array; ptr
Слайд 14Безтиповый указатель
векторы и последовательности
C, C++:
//
// описатель void – признак процедуры,
не возращающей данных
// адресная ссылка void* – без указания типа
данных
// на этапе компиляции
//
void printbytes( void* ptr, int nbytes )
{ if (nbytes == 1)
{ char* cptr=(char*)ptr; cout<<*cptr; } else
if (nbytes == 2)
{ short* sptr=(short*)ptr; cout<<*sptr; }else
if (nbytes == 4)
{ long* lptr=(long*)ptr; cout<<*lptr; } else
{ cout << "Неверное значение аргумента"; }
}
Слайд 15Строки и литералы
векторы и последовательности
Fortran:
C – cтроковые операции не развиты,
литералов нет – есть форматы ввода/вывода
character NAME*8 /’слово678’/
C, C++:
#include
char
string[8] = "слово67”;
/* memchr memcmp memcpy memmove memset strcat strchr strcmp strcoll strcpy
strcspn strerror strlen strncat strncmp strncpy strpbrk strrchr strspn strstr strtok */
#include
int count = 0; // подсчет количества цифр в строке
while(*str != 0) // признак конца строки – ноль
{ if (isdigit(*str++)) // проверить байт в str,
count++; // и сдвинуть указатель на следующий байт
}
D:
Import std.utf, std.string;
wstring Msg="Русское слово”; // здесь есть все и с избытком
Слайд 16Вопросы 26 октября. Типы данных:
Построение массивов в алгоритмических языках Fortran,
C, C++, D. Ключевые проблемы управления оперативной памятью и совершенствования
подходов к использованию больших агрегатов в процессе развития языков программирования (Статические и динамические массивы, числовые поля и последовательности адресных ссылок);
Структуры, битовые поля и объединения, как средства низкоуровневого программирования с использованием новейших средств структуризации алгоритмов (числовые объекты и оптимизация вычислительных процессов);
Указатели, адресная арифметика и пакеты программ для работы с текстами и нетипизированными объектами (особенности построения строковых пакетов, достоинства и недостатки прямого управления массивами и структурами данных ).
… реальное программирование начинается с определения методов интерактивной визуализации и контроля состояния числовых объектов и вычислительных процессов…
Слайд 17Девятое занятие 2 ноября …
Распределение памяти
Проблемы при явном распределении
памяти в C++, способы их решения. Ссылки и указатели. Распределение
памяти под переменные, управление памятью с помощью переопределения операторов new и delete..
Автоматические переменные
Статические переменные
Динамическое выделение памяти
Выделение памяти под строки
Рекомендации по использованию указателей и динамического распределения памяти
Ссылки
Распределение памяти при передаче аргументов функции
Рекомендации по передаче аргументов
== Вычислительная математика:
++ векторы и тензоры аналити-ческой геометрии и базовые операции с синтезированными вычислительными объектами
Слайд 18Самостоятельное программирование
1. Построение графической сцены на экране компьютера, определение сценария
интерактивной визуализации (openGL, GLFW, Window-Place).
2. Построение одного сложного или нескольких
геометрических объектов (кривые и поверхности, пространственные объекты);
3. Реализация программного комплекса с сопутствующей документаций и предметными комментариями в исходном тексте программы (Fortran, C, C++, D).
Слайд 19Проектирование и построение программы
1. Формализация информационных структур и связанных с
ними операций для эффективной реализации вычислительных процессов с прозрачной системой
отладки и контроля качества результатов (конвертация, структуризация и нормализация числовых структур );
2. Поиск канонических/простейших математических и алгоритмических моделей для достижения адекватных численных решений при всех вариантах контекстного окружения (предельно краткие и функционально связанные процедуры предметной области);
3. Построение системы транзакций для анализа всех этапов моделирования и представления обоснованных (ожидаемых) и наглядных результатов
(расширяемый интерактивный графический комплекс).
Слайд 20Window-Place
(интерактивная графика в Windows)
http://ShipDesign.ru/SoftWare/2010615850.html
Контекстно-зависимая среда построения трехмерной графики OpenGL
с использованием виртуальных процедур C++ и многооконного интерфейса Windows со
стековым наложением графических и текстовых фрагментов.
Слайд 21Screen – Basis - Tensor
интерактивное графическое представление вычислений
//
//
Определение графического окна
//
struct Screen: Basis
{ Screen(): Basis(), inDraw( NULL ){}
// конструктор с полем [-1:1,-1:1,-1:1]
Screen( Real Size ): Basis( Size ), inDraw( NULL ){}
void line( const Vector& a, const Vector& b, const GLubyte *color=NULL );
void cubic( Basis& Model, bool painting ); // QUADS:LINE_STRIP
void arrow( const Vector& a, const Vector& b, Real l=0.1, const GLubyte *color=NULL );
void axis( Real L );
//
// и т.д. всякие прочие прямые и обратные - графические и текстовые операции
//
void Lighting(); // начальная настройка контекста OpenGL с подключением мышки
bool(*inDraw)(); // это для мышки, дабы зря не разгонять процессор по таймеру
};
Слайд 22Содержание документа
ГОСТ 7.32-2001 «Отчет о НИР», Минск, 2001
Структурными элементами
отчета о НИР являются:
- титульный лист;
- список исполнителей;
- реферат;
- содержание;
-
нормативные ссылки;
- определения;
- обозначения и сокращения;
- введение;
- основная часть;
- заключение;
- список источников;
- приложения.
Общепринятая форма научного творчества:
1 стр. Титульный лист;
2 стр. Расширенное название,
аннотация (1 абзац),
ключевые слова
3 стр. Реферат, список обозначений.
4 стр. Введение, постановка задачи
5 стр. Основная часть 3-4 с.
Последняя стр. Заключение,
список использованных
источников, приложения.
Не печатать!
Выслать на V.Khramushin@SPBU.ru
Слайд 23К самостоятельной работе
0. Аннотация/реферат: 1 абзац. Расширенное название с техническими
предложениями по сути работы, заключение о пользе и предназначении документа.
1.
Введение: Постановка проблемы и целей исследования, краткий обзор или упоминание известных аналогов с предложениями об авторском подходе к достижению результата.
2. Названное изложение (сути и путей решения) : Собственно описание основной идеи, новых теорем и законов в избранной теоретической области, с подробным и точным представлением методов достижения изначально объявленных целей.
3. Заключение (изложение сути и путей решения) : Обоснование пионерских путей развития начатого исследования, либо пенсионерское хвастовство/сетование на абсолютное решение и заклинание всяких интересов к проблеме.
Слайд 24Вычислительная математика
Рекомендуемые материалы:
1. http://algolist.manual.ru/ – алгоритмы, исходные тексты программ.
2. http://alglib.sources.ru/
– //alglib.net – алгоритмы и документация.
3. http://num-anal.srcc.msu.ru/lib_na/libnal.htm/ – НИВЦ МГУ
4.
http://www.gnu.org/software/gsl GNU Scientific Library/ Edition 1.16 July 2013
5. Math Graphics Library / Ver.2.1.3.1, May-8, 2013 г. http://mathgl.sf.net
6. GLFW is an Open Source, multi-platform library for creating windows with OpenGL contexts and managing input and events. http://www.GLFW.org/
7. Контекстно-зависимая среда построения трехмерной графики OpenGL с использованием виртуальных процедур C++ и многооконного интерфейса Windows со стековым наложением графических и текстовых фрагментов http://shipdesign.ru/SoftWare/2010615850.html
Книги:
8. Майкл Ласло. Вычислительная геометрия и компьютерная графика на С++, М.: «Издательство Бином», 1997. 301с.
9. В.Н.Храмушин. Трехмерная тензорная математика вычислительных экспериментов в гидромеханике. ДВО РАН. 2005. – 212 с. http://shipdesign.ru/Khram/Tensor.html
Слайд 25Практика, 26 октября, 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
Слайд 26Вопросы
14 сентября. «Основы»:
Концепция построения и особенности реализации языков программирования на
примерах Fortran(57), Algol(58), В(69), C(72), C++(83), D(2001) и др;
Машинно-зависимые типы
данных (стек, статика, куча), особенности их использования, скорость доступа и эффективность выполнения операций на линейном процессоре.
Компиляция и интерпретация, достоинства в использовании и проблемы реализации формализованных и специальных языков программирования (декларативные алгоритмы и функциональные языки искусственного интеллекта)
21 сентября. «Операции»:
Ключевые слова и зарезервированные идентификаторы языков программирования (объявление данных и исполняемые операторы – Алгол – Фортран, С, С++, Ди);
Математические и логические операции исторических языков программирования (математические и программные выражения)
Приоритеты и последовательность константных и исполняемых выражений (литералы времени компиляции и интерпретация выражений на этапах сборки и исполнения программы).
… только суть – что и зачем?
Слайд 27Вопросы
28 сентября. Операторы:
Структура типовой программы на алгоритмическом языке программирования (операторы
описания данных и выполняемые команды);
Типовое построение среды компиляции и сборки
программ на алгоритмических языках программирования (структура библиотек на примере проекта GCC.GNU)
Реализация простейшей интерактивной графики в среде GLFW и Glut для OpenGL (особенности исполнения программы, управляемой внешними прерываниями). … и то уже не просто …
5 октября. Функции:
Алгоритмическое и функциональное программирование
(реентерабельность, рекурсия, демоны и драйверы….);
Виды процедур функций в алгоритмических языках программирования, особенности реализации (процедуры, функции, операторы)
Соглашения о связях – правила передачи параметров в процедурных блоках программы … (по адресу, по значению?).
… начало элементарного программирования …
Слайд 28Вопросы
12 октября. «Данные»:
Особенности реализации числовых данных для типовой архитектуры арифметико-логического
устройства и организации памяти компьютера (логические, целые, беззнаковые, плавающие, х16-32-64
числа);
Форма записи числовых констант с вариантами уточнения их аппаратного представления (восьмеричные, десятичные, шестнадцатеричные целые, битовые поля или плавающие числа с фиксированной точкой и экспонентой)
Алфавит, символьные кодировки и варианты именованных перечислений и макроопределений (шрифты Dos, Win и UTF, последовательности и макроопределения). … далее объектно-ориентированное программирование …
19 октября. «Объекты»:
Сложные числовые объекты – структуры данных и методы их представления и практического использования в языках Fortran, C, C++.
(Свойства и методы, или элементы и функции-члены класса, формат объявления и практического использования, «.», «::» и «->» );
Модификаторы доступа к элементам класса, начальная инициализация, время жизни или автоматическое свертывание динамически распределяемых объектов (Модификаторы доступа к элементам класса, конструкторы и деструкторы)
Управление элементами класса, преобразование типов, статические данные, «дружеские» структуры и функции, формирование операторов и классных функций (методов), начальная инициализация параметров (варианты практического использования данных, операторов, функций и их перегрузка).
… практическое программирование начинается с построения числовых объектов и операций …
Слайд 29Оформление письменного задания
(титульный лист)
Правительство Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Санкт-Петербургский государственный университет»
Каюмова Диана Шамильевна
Компиляция и интерпретация
(достоинства
в использовании и проблемы реализации
формализованных и специальных языков программирования )
Самостоятельная работа по курсу
«Основы программирования»
Специальность: 010501.65 «Прикладная математика и информатика»
Научный руководитель:
к.т.н. Храмушин В. Н. ___________
Студентка гр. 103.
Каюмова Д. Ш. ___________
Санкт-Петербург
2013