Вычислительная техника и компьютерное моделирование в физике

Содержание

Слайд 2

Потоковые классы Поток — это абстрактное понятие, относящееся к любому переносу

Потоковые классы

Поток — это абстрактное понятие, относящееся к любому переносу

данных от источника к приемнику.
Потоки С++, в отличие от функций ввода/вывода в стиле С, обеспечивают надежную работу как со стандартными, так и с определенными пользователем типами данных, а также единообразный и понятный синтаксис.

©Павловская Т.А. (СПбГУ ИТМО)

Слайд 3

Чтение данных из потока называется извлечением, вывод в поток — помещением,

Чтение данных из потока называется извлечением, вывод в поток — помещением,

или включением.
Поток определяется как последовательность байтов и не зависит от конкретного устройства, с которым производится обмен (оперативная память, файл на диске, клавиатура или принтер).
Слайд 4

Обмен с потоком для увеличения скорости передачи данных производится, как правило,

Обмен с потоком для увеличения скорости передачи данных производится, как правило,

через специальную область оперативной памяти — буфер.
Фактическая передача данных выполняется при выводе после заполнения буфера, а при вводе — если буфер исчерпан

©Павловская Т.А. (СПбГУ ИТМО)

Слайд 5

По направлению обмена потоки можно разделить на входные (данные вводятся в

По направлению обмена потоки можно разделить на входные (данные вводятся в

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

Для поддержки потоков библиотека С++ содержит иерархию классов, построенную на основе

Для поддержки потоков библиотека С++ содержит иерархию классов, построенную на основе

класса — ios.
Класс ios содержит общие для ввода и вывода поля и методы. От этого класса наследуется класс istream для входных потоков и ostream — для выходных.
Два последних класса являются базовыми для класса iostream, реализующего двунаправленные потоки.
Слайд 7

Слайд 8

Основным преимуществом потоков по сравнению с функциями ввода/вывода, унаследованными из библиотеки

Основным преимуществом потоков по сравнению с функциями ввода/вывода, унаследованными из библиотеки

С, является контроль типов, а также расширяемость, то есть возможность работать с типами, определенными пользователем. Для этого требуется переопределить операции потоков.
К недостаткам потоков можно отнести снижение быстродействия программы, которое в зависимости от реализации компилятора может быть весьма значительным.
Слайд 9

Стандартные потоки Заголовочный файл содержит, кроме описания классов для ввода/вывода, четыре предопределенных объекта:

Стандартные потоки

Заголовочный файл содержит, кроме описания классов для ввода/вывода, четыре

предопределенных объекта:
Слайд 10

В классах istream и ostream операции извлечения из потока >> и

В классах istream и ostream операции извлечения из потока >> и

помещения в поток << определены путем перегрузки операций сдвига.
Пример:
#include
int main(){
int i;
cin >> i;
cout << "Вы ввели " << i;
return 0;
}
Слайд 11

Как и для других перегруженных операций, для вставки и извлечения невозможно

Как и для других перегруженных операций, для вставки и извлечения невозможно

изменить приоритеты, поэтому в необходимых случаях используются скобки:
// Скобки не требуются — приоритет сложения больше, чем << :
cout << i + j;
// Скобки необходимы — приоритет операции отношения меньше, чем << :
cout << (i < j);
cout << (i << j); // Правая операция << означает сдвиг
Слайд 12

Величины при вводе должны разделяться пробельными символами (пробелами, знаками табуляции или

Величины при вводе должны разделяться пробельными символами (пробелами, знаками табуляции или

перевода строки). Извлечение прекращается, если очередной символ оказался недопустимым.
Операции << и >> перегружены для всех встроенных типов данных, что позволяет автоматически выполнять ввод и вывод в соответствии с типом величин.
Слайд 13

Например: #include int main(){ int i = 0xD; double d; //

Например:

#include
int main(){
int i = 0xD;
double d;
// Символы из потока ввода

преобразуются в //double:
cin >> d;
// int и double преобразуются в строку //символов:
cout << i << ' ' << d;
return 0;
}
Слайд 14

Форматирование данных В потоковых классах форматирование выполняется тремя способами — с

Форматирование данных

В потоковых классах форматирование выполняется тремя способами — с помощью

флагов, манипуляторов и форматирующих методов.
Слайд 15

Слайд 16

Слайд 17

Слайд 18

Флаги (left, right и internal), (dec, oct и hex), а также

Флаги (left, right и internal), (dec, oct и hex), а также

(scientific и fixed) взаимно исключают друг друга, то есть в каждый момент может быть установлен только один флаг из каждой группы
Слайд 19

Слайд 20

Все функции возвращают прежние флаги потока. Кроме флагов, для форматирования используются следующие поля класса ios:

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

поля класса ios:
Слайд 21

Слайд 22

Перед установкой некоторых флагов требуется сбросить флаги, которые не могут быть

Перед установкой некоторых флагов требуется сбросить флаги, которые не могут быть

установлены одновременно с ними.
Для этого удобно использовать вторым параметром метода setf перечисленные ниже статические константы класса ios:
adjustfield (left | right | internal)
basefield (dec | oct | hex)
floatfield (scientific | fixed)
Слайд 23

#include int main(){ long a = 1000, b = 077; cout.width(7);

#include
int main(){
long a = 1000, b = 077;
cout.width(7);
cout.setf(ios::hex |

ios::showbase | ios::uppercase);
cout << a;
cout.width(7);
cout << b << endl;
double d = 0.12, c = 1.3e-4;
cout.setf(ios::left);
cout << d << endl;
cout << c;
return 0;
}
Слайд 24

В результате работы программы в первой строке будут прописными буквами выведены

В результате работы программы в первой строке будут прописными буквами выведены

переменные a и b в шестнадцатеричном представлении, под каждую из них отводится по 7 позиций (функция width действует только на одно выводимое значение, поэтому ее вызов требуется повторить дважды). Значения переменных c и d прижаты к левому краю поля:
0X3E8 0X3F
0.12
0.00013
Слайд 25

Манипуляторы Манипуляторами называются функции, которые можно включать в цепочку операций помещения

Манипуляторы

Манипуляторами называются функции, которые можно включать в цепочку операций помещения и

извлечения для форматирования данных. Манипуляторы делятся на простые, не требующие указания аргументов, и параметризованные.
Слайд 26

Слайд 27

Слайд 28

Пример 1: cout Пример 2: #include #include int main(){ double d[]

Пример 1:
cout << 13 << hex << ' ' << 13

<< oct << ' ' << 13 << endl;
Пример 2:
#include
#include
int main(){
double d[] = {1.234, -12.34567, 123.456789,
-1.234, 0.00001};
cout << setfill('.') << setprecision(4)
<< setiosflags(ios::showpoint | ios::fixed);
for (int i = 0; i < 5; i++)
cout << setw(12) << d[i] << endl;
return 0;
}
Слайд 29

Методы обмена с потоками В потоковых классах наряду с операциями извлечения

Методы обмена с потоками

В потоковых классах наряду с операциями извлечения >>

и включения << определены методы для неформатированного чтения и записи в поток
функции чтения, определенные в классе istream
Слайд 30

Слайд 31

ios::beg (от начала файла), ios::cur (от текущей позиции) ios::end (от конца

ios::beg (от начала файла),
ios::cur (от текущей позиции)
ios::end (от

конца файла);

В классе ostream определены аналогичные функции для неформатированного вывода:

Слайд 32

Слайд 33

Пример 1. Программа считывает строки из входного потока в символьный массив.

Пример 1. Программа считывает строки из входного потока в символьный массив.
#include

"iostream.h"
int main(){
const int N = 20, Len = 100;
char str[Len][N];
int i = 0;
while (cin.getline(str[i], Len, '\n') && i // …
i++;
}
return 0;
}
Слайд 34

Файловые потоки Под файлом обычно подразумевается именованная информация на внешнем носителе,

Файловые потоки

Под файлом обычно подразумевается именованная информация на внешнем носителе, например,

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

Стандартная библиотека содержит три класса для работы с файлами Эти классы

Стандартная библиотека содержит три класса для работы с файлами

Эти классы

являются производными от классов istream, ostream и iostream соответственно, поэтому они наследуют перегруженные операции << и >>, флаги форматирования, манипуляторы, методы, состояние потоков и т. д.
Слайд 36

Использование файлов в программе предполагает следующие операции: создание потока; открытие потока

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

его с файлом;
обмен (ввод/вывод);
уничтожение потока;
закрытие файла.
Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами.
Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом:
ifstream();
ofstream();
fstream();
Слайд 37

Конструкторы c параметрами создают объект соответствующего класса, открывают файл с указанным

Конструкторы c параметрами создают объект соответствующего класса, открывают файл с указанным

именем и связывают файл с объектом:
ifstream(const char *name, int mode = ios::in);
ofstream(const char *name, int mode = ios::out | ios::trunc);
fstream(const char *name, int mode = ios::in | ios::out);
Слайд 38

Вторым параметром конструктора является режим открытия файла.

Вторым параметром конструктора является режим открытия файла.

Слайд 39

Открыть файл в программе можно с использованием либо конструкторов, либо метода

Открыть файл в программе можно с использованием либо конструкторов, либо метода

open, имеющего такие же параметры, как и в соответствующем конструкторе, например:
ifstream inpf ("input.txt"); // Использование конструктора
if (!inpf){
cout << "Невозможно открыть файл для чтения"; return 1;
}
ostream f;
f.open("output.txt", ios::out); // Использование метода open
if (!f){
cout << "Невозможно открыть файл для записи";
return 1;
}
Слайд 40

#include int main(){ char text[81], buf[81]; cout cin >> text; ifstream

#include
int main(){
char text[81], buf[81];
cout << "Введите имя файла:";
cin >> text;
ifstream

f(text);
if (!f){
cout << "Ошибка открытия файла";
return 1;
}
Слайд 41

while (!f.eof()){ f.getline(buf, 81); cout } return 0; } Для закрытия

while (!f.eof()){
f.getline(buf, 81);
cout << buf << endl;
}
return 0;
}
Для закрытия потока определен

метод close(), но поскольку он неявно выполняется деструктором, явный вызов необходим только тогда, когда требуется закрыть поток раньше конца его области видимости.
Слайд 42

Структуры (struct) В отличие от массива, все элементы которого однотипны, структура

Структуры (struct)

В отличие от массива, все элементы которого однотипны, структура

может содержать элементы разных типов.
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него.
Слайд 43

struct [ имя_типа ] { тип_1 элемент_1; тип_2 элемент_2; тип_n элемент_n; } [ список_описателей ];

struct [ имя_типа ] {
тип_1 элемент_1;
тип_2 элемент_2;
тип_n элемент_n;
} [ список_описателей ];

Слайд 44

Определение массива структур и указателя на структуру: struct { char fio[30];

Определение массива структур и указателя на структуру:
struct {
char fio[30];
int date, code;
double

salary;
}stuff[100], *ps;
Слайд 45

Если список отсутствует, описание структуры определяет новый тип, имя которого можно

Если список отсутствует, описание структуры определяет новый тип, имя которого можно

использовать в дальнейшем наряду со стандартными типами, например:
struct Worker{ // описание нового типа char fio[30];
int date, code;
double salary;
}; // описание заканчивается точкой с запятой
Слайд 46

Имя структуры можно использовать сразу после его объявления (определение можно дать

Имя структуры можно использовать сразу после его объявления (определение можно дать

позднее) в тех случаях, когда компилятору не требуется знать размер структуры, например:
struct List; // объявление структуры List;
struct Link{
List *p;
Link *prev, *succ;
};
struct List { /* определение структуры List */};
Это позволяет создавать связные списки структур.
Слайд 47

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в

порядке их описания:
struct{
char fio[30];
int age, code;
double salary;
}worker = {“Иванов", 31, 512, 1234.56};
Слайд 48

При инициализации массивов структур следует заключать в фигурные скобки каждый элемент

При инициализации массивов структур следует заключать в фигурные скобки каждый элемент

массива
(учитывая, что многомерный массив — это массив массивов):
struct complex{
float real, im;
} compl [2][3] = {
{{1, 1}, {1, 1}, {1, 1}}, // строка 1, то есть массив compl[0]
{{2, 2}, {2, 2}, {2, 2}} // строка 2, то есть
массив compl[1]
};
Слайд 49

Для переменных одного и того же структурного типа определена операция присваивания,

Для переменных одного и того же структурного типа определена операция присваивания,

при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции.
Размер структуры не обязательно равен сумме размеров ее элементов, поскольку они могут быть выровнены по границам слова.
Слайд 50

Доступ к полям структуры выполняется с помощью операций выбора . (точка)

Доступ к полям структуры выполняется с помощью операций выбора . (точка)

при обращении к полю через имя структуры и
-> при обращении через указатель, например:
Worker stuff[100], *ps, worker;
worker.age = 25;
stuff[8].code = 215;
ps->salary = 0.12;
Слайд 51

Если элементом структуры является другая структура, то доступ к ее элементам

Если элементом структуры является другая структура, то доступ к ее элементам

выполняется через две операции выбора:
struct A {int a; double x;};
struct B {A a; double x;} x[2];
x[0].a.a = 1;
x[1].х = 0.1;