Similar presentations:
Память. Регистровая память. Внешняя память. Файлы. Оперативная память. Разделы оперативной памяти. Лекция 10
1.
Основы алгоритмизации и программированиеФИСТ УлГТУ 1 курс
Власенко Олег Федосович
SimbirSoft
Лекция 10
Память.
Регистровая память.
Внешняя память. Файлы.
Оперативная память. Разделы оперативной памяти.
Динамическая память.
ЛР 18. Работа с файлами.
ЛР 19. Динамические массивы
2.
Термины и базовые понятия3.
Структура компьютераhttps://www.zaurtl.ru/UkVT/UKVT3.html
4.
Память: «процессорная», оперативная, внешняяОтличия разных видов памяти:
1a. Регистровая – чрезвычайно быстрая,
очень-очень мало (≈10 шт.), очень дорого за
единицу. Энергозависима
1b. Кэш процессора – очень быстрая, мало
(≈1Mb), очень дорого за единицу.
Энергозависима
2. Оперативная – быстрая, много (≈1Gb),
дорого за единицу. Энергозависима
3. Внешняя – медленная, очень много
(≈1Tb), дешево за единицу.
Энергонезависима.
“Зачем процессорам нужен кэш и чем отличаются уровни L1, L2, L3”
https://habr.com/ru/company/vdsina/blog/515660/
5.
Память: «процессорная», оперативная, внешняя6.
Регистровая память7.
Работа с регистрами в Сиdouble get_average_even(int arr[NUM]) {
register int s = 0;
register int cnt_even = 0;
register int i = 0;
while (i < NUM) {
if (arr[i] % 2 == 0) {
s += arr[i];
cnt_even++;
}
i++;
}
return s / cnt_even; // Здесь ошибка. Какая?
}
8.
Работа с регистрами в Сиdouble get_average_even(int arr[NUM]) {
register int s = 0;
register int cnt_even = 0;
register int i = 0;
while (i < NUM) {
if (arr[i] % 2 == 0) {
s += arr[i];
cnt_even++;
}
i++;
}
return s / (double) cnt_even; // Здесь ошибка. Какая?
}
9.
Ключевое слово registerКогда язык C был только изобретён, спецификатор register можно было
использовать лишь для локальных целых или символьных переменных,
поскольку он заставлял компилятор пытаться сохранить эту переменную в
регистре центрального процессора вместо того, чтобы её просто
разместить в памяти. В таком случае все ссылки на переменную работали
исключительно быстро. С тех пор определение спецификатора
расширилось. Теперь любую переменную можно определить
как register и тем самым возложить заботу об оптимизации доступа к ней
на компилятор. Для символов и целых это по прежнему означает их
хранение в регистре процессора, но для других типов данных, это может
означать, например, использование кеш-памяти. Следует иметь в виду,
что использование спецификатора register — это всего лишь заявка,
которая может быть и не удовлетворена. Компилятор волен её
проигнорировать. Причина этого состоит в том, что только ограниченное
число переменных можно оптимизировать ради ускорения обработки
данных. При превышении этого предела компилятор будет просто
игнорировать дальнейшие register-"заявки".
http://mycpp.ru/cpp/scpp/cppd_qualifier.htm
10.
11.
Внешняя память12.
Внешняя памятьhttp://book.kbsu.ru/theory/chapter2/1_2_10.html
Внешняя память (ВЗУ) предназначена для длительного хранения программ и
данных, и целостность её содержимого не зависит от того, включен или
выключен компьютер. В отличие от оперативной памяти, внешняя память не
имеет прямой связи с процессором. Информация от ВЗУ к процессору и
наоборот циркулирует примерно по следующей цепочке:
В состав внешней памяти компьютера входят:
•накопители на жёстких магнитных дисках;
•накопители на гибких магнитных дисках;
•накопители на компакт-дисках;
•накопители на магнито-оптических компакт-дисках;
•накопители на магнитной ленте (стримеры) и др.
13.
Внешняя память – работа в СиЗадача: из входного файла прочитать 2 целых числа.
В выходной файл записать сумму этих чисел.
// Чтение из входного файла
FILE *fin;
int a, b, s;
fin = fopen(“d:\\Temp\\Files\\in1.txt", "rt");
if (fin == NULL) {
printf("File in1.txt is not found");
return;
}
fscanf(fin, "%d%d", &a, &b);
fclose(fin);
// Обработка
s = a + b;
// Запись в выходной файл
FILE *fout = fopen(“d:\\Temp\\Files\\out1.txt", "wt");
if (fout == NULL) {
printf("File out1.txt cannot be created");
return;
}
fprintf(fout, "%d", s);
fclose(fout);
14.
Работа с файлами «вручную»15.
ФайлФайл - именованная область данных на носителе
информации, используемая как базовый объект
взаимодействия с данными в операционных системах.
https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB
16.
Проводник17.
Имя файлаИмя файл = “IMG_2476.JPG”
18.
Путь к файлуПуть к файлу = “C:\Photos\2022_04_23_дрЛеси”
19.
Полное имя файлаПолное имя файла
= “C:\Photos\2022_04_23_дрЛеси\IMG_2476.JPG”
20.
Содержимое файлаПолное имя файла
= “C:\Photos\2022_04_23_дрЛеси\IMG_2476.JPG”
21.
Пользовательские операции над файламиОткрыть
Создать
Скопировать
Перенести (вырезать)
Переименовать
Удалить
И др.
22.
Создание текстовых файлов «вручную»Проводник Нужная папка Правая кнопка мыши
23.
Создание текстовых файлов «вручную»• Открыть файл в редакторе.
• Набрать нужный текст
• Сохранить
24.
Создание папок «вручную»Открыть родительскую папку
Нажать Правую кнопку мыши
Создать
Папку
Введите имя папки
25.
26.
Работа с файлами «программно»27.
Работа с файлом – общий алгоритм1) Открыть файл
2) Работать с файлом
3) Закрыть файл
28.
ЗадачаПрочитать из файла 2 целых числа, подсчитать их
сумму, сумму вывести в другой файл
Входной файл:
3 12
Выходной файл:
15
29.
Работа с входным файлом – общий алгоритм0) Создать входной файл
1) Открыть входной файл (на чтение)
2) Читать информацию из входного файла
3) Закрыть входной файл
30.
Задача (1)// Чтение из входного файла
FILE *fin;
int a, b, s;
fin = fopen(“d:\\Temp\\Files\\in1.txt", "rt");
if (fin == NULL) {
printf("File in1.txt is not found");
return;
}
fscanf(fin, "%d%d", &a, &b);
fclose(fin);
31.
Задача (2)// Обработка
s = a + b;
32.
Работа с выходным файлом – общий алгоритм1) Открыть выходной файл (на запись)
2) Писать информацию в выходной файл
3) Закрыть выходной файл
33.
Задача (3)// Запись в выходной файл
FILE *fout;
fout = fopen(“d:\\Temp\\Files\\out1.txt", "wt");
if (fout == NULL) {
printf("File out1.txt cannot be created");
return;
}
fprintf(fout, "s = %d", s);
fclose(fout);
34.
35.
Несколько сценариев работы сфайлами
36.
Сценарий 1. Входные и выходные данные - вфайлах
ФАЙЛ_ВХОДНОЙ Программа ФАЙЛ_ВЫХОДНОЙ
Входные данные готовятся в виде (входных) файлов.
Программа загружает данные из входных файлов.
Программа выполняет всю необходимую работу.
Программа сохраняет результаты в (выходные) файлы.
Этапы:
1) Подготовить входные файлы (вручную, либо используя
какую-то программу)
2) Запустить программу обработки файлов, которая
прочитает входные файлы и создаст выходной файл
3) Работать с выходным файлов (вручную или при помощи
еще какой-то программы)
37.
Сценарий 1. Входные и выходные данные - вфайлах
ФАЙЛ_ВХОДНОЙ Программа ФАЙЛ_ВЫХОДНОЙ
Примеры:
• Конверсия файлов (PPTX PDF)
• Сжать файл ( ZIP, RAR, и т.д.)
• Сжать фотографии
• Компилятор (javac Class1.java Class1.class)
38.
Сценарий 2. Файл для сохранения состоянияПрограмма ФАЙЛ_СОСТОЯНИЯ Программа
Программа работает и доходит до какого-то состояния.
При необходимости пользователь выполняет сохранение
состояния программы. При этом создается файл, хранящий
все необходимые данные программы.
При необходимости пользователь решает вернуться к
сохраненному состоянию. Для этого все данные загружаются
из файла состояния.
39.
Сценарий 2. Файл для сохранения состоянияПрограмма ФАЙЛ_СОСТОЯНИЯ Программа
Примеры:
• Сохранение состояния в игре
• *Редактирование документа (PPTX, XLS, и мн. др.)
40.
41.
Оперативная память42.
Оперативная памятьhttps://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%
D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1
%82%D1%8C
Операти́ вная па́мять (англ. Random Access Memory, RAM — память с
произвольным доступом) — в большинстве случаев энергозависимая часть
системы компьютерной памяти, в которой во время работы компьютера
хранится выполняемый машинный код (программы), а также входные,
выходные и промежуточные данные, обрабатываемые процессором.
43.
Оперативная память во время работы компьютера44.
Оперативная память доступная программе45.
Оперативная память доступная программе46.
Структура памяти программы во времявыполнения (Разделы памяти)
47.
Разделы памяти: автоматическая, статическая,динамическая память
«Размещение объектов в оперативной памяти. Понятие указателя»
https://rsdn.org/article/cpp/ObjectsAndPointers.xml?print
Статическая память — это область памяти, выделяемая при запуске
программы до вызова функции main из свободной оперативной памяти
для размещения глобальных и статических объектов, а также объектов,
определённых в пространствах имён.
Автоматическая память — это специальный регион памяти,
резервируемый при запуске программы до вызова функции main из
свободной оперативной памяти и используемый в дальнейшем для
размещения локальных объектов: объектов, определяемых в теле
функций и получаемых функциями через параметры в момент вызова.
Автоматическую память часто называют стеком.
Динамическая память — это совокупность блоков памяти, выделяемых
из доступной свободной оперативной памяти непосредственно во время
выполнения программы под размещение конкретных объектов.
48.
Разделы памяти – машинный код49.
Машинный кодhttps://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%B
D%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
Маши́нный код (платфо́рменно-ориенти́рованный код), маши́нный язы́к —
система команд (набор кодов операций) конкретной вычислительной машины,
которая интерпретируется непосредственно процессором или
микропрограммами этой вычислительной машины.[1]
Компьютерная программа, записанная на машинном языке, состоит из машинных инструкций,
каждая из которых представлена в машинном коде в виде т. н. опкода — двоичного кода отдельной
операции из системы команд машины. Для удобства программирования вместо числовых опкодов,
которые только и понимает процессор, обычно используют их условные буквенные мнемоники.
Набор таких мнемоник, вместе с некоторыми дополнительными возможностями (например,
некоторыми макрокомандами, директивами), называется языком ассемблера.
Каждая модель процессора имеет собственный набор команд, хотя во многих моделях эти наборы
команд сильно перекрываются. Говорят, что процессор A совместим с процессором B, если
процессор A полностью «понимает» машинный код процессора B. Если процессоры A и B имеют
некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они
одной «архитектуры» (имеют одинаковую архитектуру набора команд).
50.
Язык ассемблераhttps://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%B0%D1%
81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0
Язы́к ассе́мблера (англ. assembly language) — машинно-ориентированный язык
программирования низкого уровня. Представляет собой систему обозначений,
используемую для представления в удобно читаемой форме программ,
записанных в машинном коде. Его команды прямо соответствуют отдельным
командам машины или их последовательностям. Является существенно
платформо-зависимым: языки ассемблера для различных аппаратных
платформ несовместимы, хотя могут быть в целом подобны.
51.
Трансляция программыhttps://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BB
%D1%8F%D1%82%D0%BE%D1%80
Трансля́тор — программа или техническое средство, выполняющее
трансляцию программы[1][2].
Трансля́ция програ́ммы — преобразование программы, представленной на
одном из языков программирования, в программу на другом языке. Транслятор
обычно выполняет также диагностику ошибок, формирует словари
идентификаторов, выдаёт для печати текст программы и т. д.[1]
Язык, на котором представлена входная программа, называется исходным
языком, а сама программа — исходным кодом. Выходной язык называется
целевым языком.
52.
Компиляцияhttps://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB
%D1%8F%D1%82%D0%BE%D1%80
Компилят́ ор — программа, переводящая текст, написанный на языке
программирования, в набор машинных кодов
Трансляция программы как неотъемлемая составляющая компиляции включает в себя:
1.Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется
в последовательность лексем.
2.Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в древо
разбора.
3.Семантический анализ. На этой фазе древо разбора обрабатывается с целью установления его
семантики (смысла) — например, привязка идентификаторов к их объявлениям, типам данных,
проверка совместимости, определение типов выражений и т. д. Результат обычно называется
«промежуточным представлением/кодом», и может быть дополненным древом разбора, новым
деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
4.Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его
смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным
кодом или над конечным машинным кодом.
5.Генерация кода. Из промежуточного представления порождается код на целевом машинноориентированном языке.
53.
Процесс компиляции (Си/С++)«Процесс компиляции программ на C++» - https://habr.com/ru/post/478124/
1) Препроцессинг (#define , #include, etc подстановка в Си код)
Препроцессор — это макро процессор, который преобразовывает вашу программу для
дальнейшего компилирования. На данной стадии происходит происходит работа с
препроцессорными директивами. Например, препроцессор добавляет хэдеры в код (#include),
убирает комментирования, заменяет макросы (#define) их значениями, выбирает нужные куски
кода в соответствии с условиями #if, #ifdef и #ifndef.
2) Компиляция (Си код ASM)
На данном шаге компилятор выполняет свою главную задачу — компилирует, то есть
преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это
промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
3) Ассемблирование (ASM OBJ)
Так как процессоры исполняют команды на бинарном коде, необходимо перевести
ассемблерный код в машинный с помощью ассемблера. Ассемблер преобразовывает
ассемблерный код в машинный код, сохраняя его в объектном файле.
4) Компоновка (OBJ EXE)
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый
исполняемый файл, который мы и сможем запустить в дальнейшем.
54.
Ассемблер и машинный код.Трансляция программы из Си в ассемблер
http://ru.stackoverflow.com/questions/250673/%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE%D0%BB%D0%B8-%D0%B2-vs-2012%D0%BF%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D1%82%D1%8C%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%BD%D1%8
B%D0%B9-%D0%BA%D0%BE%D0%B4
>> Добрый день! Скажите, пожалуйста, можно ли в
VS 2012 pro посмотреть ассемблерный код
написанной программки? …
> Project Properties > Configuration Properties >
C/C++ > Output Files > Assembler output
55.
Изучаем машинный код (1)> Project Properties > Configuration Properties > C/C++ > Output Files > Assembler output
56.
Изучаем машинный код (2)> Project Properties > Configuration Properties > C/C++ > Output Files > Assembler output
57.
Изучаем машинный код (3)> Project Properties > Configuration Properties > C/C++ > Output Files > Assembler output
58.
Изучаем машинный код (4)> Project Properties > Configuration Properties > C/C++ > Output Files > Assembler output
59.
Изучаем машинный код (5)> Project Properties > Configuration Properties > C/C++ > Output Files > Assembler output
60.
Изучаем машинный код (6)61.
Где хранятся файлы проекта? (1)62.
Где хранятся файлы проекта? (2)63.
Где хранятся файлы проекта? (3)В этой папке хранятся исходные файлы проекта:
64.
Где хранятся файлы проекта? (4)А в этой папке хранятся производные файлы проекта (OBJ
и др.):
65.
Где хранятся файлы проекта? (5)Скопируйте путь к папке Debug и работайте с файлами из этой папки
любым удобным для вас способом.
У меня это путь: C:\Users\Oleg\source\repos\Lection5_2022\Lections14\Debug
66.
машинный код “Hello”67.
68.
Пример кода “Вывести 1 2 3 … 10”#include <stdio.h>
void main() {
printf("Hello! It is main()!\n");
int k = 1;
do {
printf("%d ", k);
++k;
} while (k <= 10);
}
69.
машинный код “1 2 3 … 10” (1)70.
машинный код “1 2 3 … 10” (2)71.
машинный код “++k”72.
73.
Структура памяти программы во времявыполнения
74.
Разделы памяти: автоматическая, статическая,динамическая память
«Размещение объектов в оперативной памяти. Понятие указателя»
https://rsdn.org/article/cpp/ObjectsAndPointers.xml?print
Статическая память — это область памяти, выделяемая при запуске
программы до вызова функции main из свободной оперативной памяти
для размещения глобальных и статических объектов, а также объектов,
определённых в пространствах имён.
Автоматическая память — это специальный регион памяти,
резервируемый при запуске программы до вызова функции main из
свободной оперативной памяти и используемый в дальнейшем для
размещения локальных объектов: объектов, определяемых в теле
функций и получаемых функциями через параметры в момент вызова.
Автоматическую память часто называют стеком.
Динамическая память — это совокупность блоков памяти, выделяемых
из доступной свободной оперативной памяти непосредственно во время
выполнения программы под размещение конкретных объектов.
75.
Локальные переменныеhttp://www.c-cpp.ru/books/lokalnye-peremennye
Переменные, объявляемые внутри функций, называются локальными
переменными.
С локальными переменными могут работать только операторы,
находящиеся в блоке, где данные переменные объявлены. Вне этого
блока локальные переменные неизвестны. Следует помнить, что блок
кода начинается открытием фигурной скобки и заканчивается закрытием
фигурной скобки.
Наиболее важно понять то, что локальные переменные существуют
только в блоке кода, в котором они объявлены. Таким образом,
локальные переменные создаются при входе в блок и уничтожаются при
выходе из него.
76.
Формальные параметрыhttp://www.c-cpp.ru/books/formalnye-parametry
Если функция использует аргументы, то в ней должны объявляться
переменные, которые будут принимать значения аргументов. Данные
переменные называются формальными параметрами функции. Они
ведут себя, как любые другие локальные переменные в функции.
77.
Переменные: локальные, глобальные, формальныепараметры
#include <stdio.h>
#include <Windows.h>
#define NUM_ELEMENTS 10
void main() {
printElements();
int k = 1;
int arr[NUM_ELEMENTS];
int n = 0;
void printElements() {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
void insertElement(int insIndex, int value) {
for (int i = n; i > insIndex; i--) {
arr[i] = arr[i - 1];
}
n++;
arr[insIndex] = value;
}
while (k <= 5) {
insertElement(0, k);
k++;
}
printElements();
}
78.
Область видимости и время жизни#include <stdio.h>
#include <Windows.h>
#define NUM_ELEMENTS 10
void main() {
printElements();
int k = 1;
int arr[NUM_ELEMENTS];
int n = 0;
void printElements() {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
void insertElement(int insIndex, int value) {
for (int i = n; i > insIndex; i--) {
arr[i] = arr[i - 1];
}
n++;
arr[insIndex] = value;
}
while (k <= 5) {
insertElement(0, k);
k++;
}
printElements();
}
79.
Как работает стек80.
Стек вызовов81.
82.
Структура памяти программы во времявыполнения
83.
Разделы памяти: автоматическая, статическая,динамическая память
«Размещение объектов в оперативной памяти. Понятие указателя»
https://rsdn.org/article/cpp/ObjectsAndPointers.xml?print
Статическая память — это область памяти, выделяемая при запуске
программы до вызова функции main из свободной оперативной памяти
для размещения глобальных и статических объектов, а также объектов,
определённых в пространствах имён.
Автоматическая память — это специальный регион памяти,
резервируемый при запуске программы до вызова функции main из
свободной оперативной памяти и используемый в дальнейшем для
размещения локальных объектов: объектов, определяемых в теле
функций и получаемых функциями через параметры в момент вызова.
Автоматическую память часто называют стеком.
Динамическая память — это совокупность блоков памяти, выделяемых
из доступной свободной оперативной памяти непосредственно во время
выполнения программы под размещение конкретных объектов.
84.
Глобальные переменныеhttp://www.c-cpp.ru/books/globalnye-peremennye
В противоположность локальным переменным глобальные переменные
видны всей программе и могут использоваться любым участком кода.
Они хранят свои значения на протяжении всей работы программы.
Глобальные переменные создаются путем объявления вне функции. К
ним можно получить доступ в любом выражении, независимо от того, в
какой функции находится данное выражение.
85.
Переменные: локальные, глобальные, формальныепараметры
#include <stdio.h>
#include <Windows.h>
#define NUM_ELEMENTS 10
void main() {
printElements();
int k = 1;
int arr[NUM_ELEMENTS];
int n = 0;
void printElements() {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
void insertElement(int insIndex, int value) {
for (int i = n; i > insIndex; i--) {
arr[i] = arr[i - 1];
}
n++;
arr[insIndex] = value;
}
while (k <= 5) {
insertElement(0, k);
k++;
}
printElements();
}
86.
Область видимости и время жизни#include <stdio.h>
#include <Windows.h>
#define NUM_ELEMENTS 10
void main() {
printElements();
int k = 1;
int arr[NUM_ELEMENTS];
int n = 0;
void printElements() {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
void insertElement(int insIndex, int value) {
for (int i = n; i > insIndex; i--) {
arr[i] = arr[i - 1];
}
n++;
arr[insIndex] = value;
}
while (k <= 5) {
insertElement(0, k);
k++;
}
printElements();
}
87.
88.
Структура памяти программы во времявыполнения
89.
Разделы памяти: автоматическая, статическая,динамическая память
«Размещение объектов в оперативной памяти. Понятие указателя»
https://rsdn.org/article/cpp/ObjectsAndPointers.xml?print
Статическая память — это область памяти, выделяемая при запуске
программы до вызова функции main из свободной оперативной памяти
для размещения глобальных и статических объектов, а также объектов,
определённых в пространствах имён.
Автоматическая память — это специальный регион памяти,
резервируемый при запуске программы до вызова функции main из
свободной оперативной памяти и используемый в дальнейшем для
размещения локальных объектов: объектов, определяемых в теле
функций и получаемых функциями через параметры в момент вызова.
Автоматическую память часто называют стеком.
Динамическая память — это совокупность блоков памяти, выделяемых
из доступной свободной оперативной памяти непосредственно во время
выполнения программы под размещение конкретных объектов.
90.
Выделение и освобождение динамической памятиhttp://learnc.info/c/memory_allocation.html
Для выделения памяти на куче в си используется функция malloc
(memory allocation)
void * malloc(size_t size);
После того, как мы поработали с памятью, необходимо освободить
память функцией free.
void free(void * ptr);
91.
Указатель void *https://prog-cpp.ru/void/
void * - объявление указателя на неопределенный тип:
Такому указателю может быть присвоен указатель на любой тип, но не
наоборот
void * ptr; // Указатель на void
int i;
// Целая переменная
int * ptri; // Указатель на int
ptr = &i;
ptri = &i;
ptr = ptri;
ptri =(int *)ptr;
//ptri = ptr;
// Допустимо
// Допустимо
// Допустимо
// Допустимо
// Недопустимо
Для последней операции необходимо явное приведение типа.
Над указателем неопределенного типа нельзя выполнять операцию
разыменования без явного приведения типа.
92.
Пример использования динамической памяти (1)#include <stdio.h>
void printArray(int a[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
93.
Пример использования динамической памяти (2)void main() {
int arr1[5] = {3, 2, 4, 5, 6};
printArray(arr1, 5);
int arr2[10];
int n2 = 5;
arr2[0] = 3;
arr2[1] = 2;
arr2[2] = 4;
arr2[3] = 5;
arr2[4] = 6;
printArray(arr2, n2);
94.
Пример использования динамической памяти (3)int num = 5;
int* arr3;
arr3 = (int*)malloc(sizeof(int) * num);
arr3[0] = 3;
arr3[1] = 2;
arr3[2] = 4;
arr3[3] = 5;
arr3[4] = 6;
printArray(arr3, num);
free(arr3);
}
95.
Разделы памяти: автоматическая, статическая,динамическая память
«Размещение объектов в оперативной памяти. Понятие указателя»
https://rsdn.org/article/cpp/ObjectsAndPointers.xml?print
Статическая память — это область памяти, выделяемая при запуске
программы до вызова функции main из свободной оперативной памяти
для размещения глобальных и статических объектов, а также объектов,
определённых в пространствах имён.
Автоматическая память — это специальный регион памяти,
резервируемый при запуске программы до вызова функции main из
свободной оперативной памяти и используемый в дальнейшем для
размещения локальных объектов: объектов, определяемых в теле
функций и получаемых функциями через параметры в момент вызова.
Автоматическую память часто называют стеком.
Динамическая память — это совокупность блоков памяти, выделяемых
из доступной свободной оперативной памяти непосредственно во время
выполнения программы под размещение конкретных объектов.
96.
97.
Лабораторная работа №18Знакомство с файлами
98.
Работа с файлами – «совсем» общий алгоритм1) Подготовить входные файлы (вручную, либо используя
какую то программу)
2) Запустить программу обработки файлов, которая
прочитает входные файлы и создаст выходной файл
3) Работать с выходным файлов (вручную или при помощи
еще какой-то программы)
99.
Обработка файла – общий алгоритм1) Открыть файл
2) Работать с файлом
3) Закрыть файл
100.
Задача 1С клавиатуры вводятся 3 целых числа.
Их произведение выводится на экран.
Все этапы обработки нужно логировать (выводом в консоль).
Пример входа:
158
Пример выхода:
40
101.
Задача 1 (2)С клавиатуры вводятся 3 целых числа.
Их произведение выводится на экран.
Все этапы обработки нужно логировать (выводом в консоль).
Пример входа:
158
Пример выхода:
40
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Власенко Олег\n");
printf("Задача 1\n");
// Числа, читаемые из входного файла
int a, b, c;
// Произведение, выводимое в выходной файл
int p;
scanf("%d%d%d", &a, &b, &c);
printf("ввели: %d, %d, %d\n", a, b, c);
// Обработка
p = a * b * c;
printf("p = %d\n", p);
}
102.
Задача 2Из входного файла берутся 3 целых числа.
Их произведение сохраняется в выходной файл.
Имя входного файла in2.txt
Имя выходного файла out2.txt
Место хранения файлов – на ваш выбор.
Все этапы обработки нужно логировать в консоль.
Пример входа:
158
Пример выхода:
40
103.
Задача 2 (2)Из входного файла берутся 3 целых числа.
Их произведение сохраняется в выходной файл.
Имя входного файла in2.txt
Имя выходного файла out2.txt
Место хранения файлов – на ваш выбор.
Все этапы обработки нужно логировать в консоль.
Пример входа:
145
Пример выхода:
20
104.
Задача 2.1 Подготовить входной файл in2.txtИмя входного файла in2.txt
Место хранения файлов – на ваш
выбор.
Пример входа:
145
105.
Задача 2.2 Реализация (1)#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Власенко Олег\n");
printf("Задача 2\n");
// Чтение из входного файла
// Числа, читаемые из входного файла
int a, b, c;
// Произведение, выводимое в выходной файл
int p;
// Входной файл
FILE* fin = fopen("c:\\Temp\\Lection12\\in2.txt", "rt");
if (fin == NULL) {
printf("Входной файл не найден");
return;
}
fscanf(fin, "%d%d%d", &a, &b, &c);
fclose(fin);
106.
Задача 2.2 Реализация (2)// логирование ввода
printf("ввели: %d, %d, %d\n", a, b, c);
// Обработка
p = a * b * c;
// логирование вывода
printf("p = %d\n", p);
// Запись в выходной файл
// Выходной файл
FILE* fout;
fout = fopen("c:\\Temp\\Lection12\\out2.txt", "wt");
if (fout == NULL) {
printf("Выходной файл не создался");
return;
}
fprintf(fout, "%d", p);
fclose(fout);
}
107.
Задача 3С клавиатуры вводятся 5 целых числа.
Их сумма выводится на экран.
Все этапы обработки нужно логировать (выводом в консоль).
Пример входа:
12592
Пример выхода:
19
108.
Задача 4Из файла in4.txt вводятся 5 целых числа.
Их сумма сохраняется в выходной файл out4.txt.
Все этапы обработки нужно логировать (выводом в консоль).
Пример входа:
12592
Пример выхода:
19
109.
Задача 5 Обработка одномерного массиваИз входного файла берется одномерный массив целых
чисел.
Все элементы большее среднего арифметического нужно
увеличить в 10 раз.
Получившийся массив нужно сохранить в выходном файле.
Формат входного и выходного файла:
n
a[0] a[1] a[2] a[3] … a[n-1]
n <= 10
Пример входа (Файл in5.txt):
4
1234
Пример выхода (Файл out5.txt):
4
1 2 30 40
110.
Задача 5 Обработка одномерного массива (2)Из входного файла берется одномерный массив целых чисел.
Все элементы большее среднего арифметического нужно
увеличить в 10 раз.
Получившийся массив нужно сохранить в выходном файле.
Формат входного и выходного файла:
n
a[0] a[1] a[2] a[3] … a[n-1]
n <= 10
Пример входа (Файл in5.txt):
4
1234
Пример выхода (Файл out5.txt):
4
1 2 30 40
111.
Задача 5 Обработка одномерного массива (3)112.
Задача 5 Обработка одномерного массива (4)113.
Задача 5 Обработка одномерного массива (5)114.
Задача 6 Обработка одномерного массива 2Из входного файла берется одномерный массив целых
чисел.
Все четные элементы меньшие чем среднее арифметическое
нужно уменьшить в 2 раза.
Получившийся массив нужно сохранить в выходном файле.
Формат входного и выходного файла:
n
a[0] a[1] a[2] a[3] … a[n-1]
n <= 10
Пример входа (Файл in6.txt):
4
1234
Пример выхода (Файл out6.txt):
4
1134
115.
Домашнее задание1. Доделать задачи 1-6, которые не успели сделать в классе.
2. Задача 7. К предыдущей лабораторной работе (№17) добавить
возможность сохранять в файл состояние массива.
3. Задача 8. К предыдущей лабораторной работе (№17) добавить
возможность загружать состояние массива из файла.
4. Задача 9***. Добавить в сквозной проект возможность сохранения и
загрузки состояния игры.
116.
ИТОГО по лабораторной работе 181.
2.
3.
4.
5.
6.
Попробовали создавать текстовые файлы вручную
Попробовали работать с файлами программно
Научились загружать входные данные из файлов
Научились сохранять выходные данные в файл
Научились сохранять состояние в файл.
Научились восстанавливать состояние программы, загружая
его из файла.
7. *** Добавили сохранение/восстановление состояния игры к
сквозному проекту
117.
118.
119.
Лабораторная работа №19Динамические массивы
120.
Задача 1В файле in1.txt хранится информация об оценках одного
ученика в формате
N
Оценка1 Оценка2 … ОценкаN
Где N <= 1000
Нужно создать файл out1.txt в котором собрать все оценки,
выше средней. Формат выхода совпадает с форматом входа.
Пример входа (in1.txt):
6
3 2 4 2 2 5
Среднее = (3 + 2 + 4 + 2 + 2 + 5) / 6.0 = 3.0
Пример выхода (out1.txt):
2
4 5
121.
Задача 1 Реализация через массив (1)#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
int a[1000]; //массив. 1000 - максимально допустимое количество
элементов
int n; // Реальное количество элементов в массиве
122.
Задача 1 Реализация через массив (2)void Load() {
// Открытие входного файла
FILE* fin = fopen("c:\\Temp\\Lection14\\in1.txt", "rt");
if (fin == NULL) {
printf("Входной файл не найден\n");
return;
}
// Загрузка массива из входного файла
fscanf(fin, "%d", &n);
for (int i = 0; i < n; i++) {
fscanf(fin, "%d", &a[i]);
}
// Закрытие входного файла
fclose(fin);
}
123.
Задача 1 Реализация через массив (3)void SaveResult() {
// Вычисление среднего арифметического
float sa = 0;
float s = 0;
for (int i = 0; i < n; i++) {
s += a[i];
}
sa = s / n;
// Выяснение, сколько элементов больше ср арифметического
int m = 0;
for (int i = 0; i < n; i++) {
if (a[i] > sa) {
m++;
}
}
124.
Задача 1 Реализация через массив (4)// Открытие выходного файла
FILE* fout = fopen("c:\\Temp\\Lection14\\out1.txt", "wt");
if (fout == NULL) {
printf("Выходной файл не найден\n");
return;
}
// Сохранение элементов больших ср арифметического
fprintf(fout, "%d\n", m);
for (int i = 0; i < n; i++) {
if (a[i] > sa) {
fprintf(fout, "%d ", a[i]);
}
}
// Закрытие файла
fclose(fout);
}
125.
Задача 1 Реализация через массив (5)void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Hello! It is Task1!\n");
Load();
SaveResult();
}
126.
127.
Задача 2В файле in1.txt хранится информация об оценках одного
ученика в формате
N
Оценка1 Оценка2 … ОценкаN
Где N <= 1000
Нужно создать файл out1.txt в котором собрать все оценки,
выше средней. Формат выхода совпадает с форматом входа.
Реализовать задачу через динамический массив.
Пример входа (in1.txt):
6
3 2 4 2 2 5
Среднее = (3 + 2 + 4 + 2 + 2 + 5) / 6.0 = 3.0
Пример выхода (out1.txt):
2
4 5
128.
Задача 2 Реализация через динамический массив (1)#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
int *pa; //Указатель на массив.
int n; // Реальное количество элементов в массиве
129.
Задача 2 Реализация через динамический массив (2)void Load() {
// Открытие входного файла
FILE* fin = fopen("c:\\Temp\\Lection14\\in1.txt", "rt");
if (fin == NULL) {
printf("Входной файл не найден\n");
return;
}
// Загрузка массива из входного файла
fscanf(fin, "%d", &n);
// Выделение памяти под динамический массив
pa = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
fscanf(fin, "%d", &pa[i]);
}
// Закрытие входного файла
fclose(fin);
}
130.
Задача 2 Реализация через динамический массив (3)void SaveResult() {
// Вычисление среднего арифметического
float sa = 0;
float s = 0;
for (int i = 0; i < n; i++) {
s += pa[i];
}
sa = s / n;
// Выяснение, сколько элементов больше ср арифметического
int m = 0;
for (int i = 0; i < n; i++) {
if (pa[i] > sa) {
m++;
}
}
131.
Задача 2 Реализация через динамический массив (4)// Открытие выходного файла
FILE* fout = fopen("c:\\Temp\\Lection14\\out1.txt", "wt");
if (fout == NULL) {
printf("Выходной файл не найден\n");
return;
}
// Сохранение элементов больших ср арифметического
fprintf(fout, "%d\n", m);
for (int i = 0; i < n; i++) {
if (pa[i] > sa) {
fprintf(fout, "%d ", pa[i]);
}
}
// Закрытие файла
fclose(fout);
}
132.
Задача 2 Реализация через динамический массив (5)void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Hello! It is Task1!\n");
Load();
SaveResult();
free(pa);
}
133.
134.
Задача 3В файле in3.txt хранится информация о температуре в
формате (N <= 1000):
N
T1 T2 … TN
Нужно создать файл out3.txt в котором собрать все записи о
температуре, значения которых выше нуля, но ниже средней
арифметической за весь период. Формат выхода совпадает с
форматом входа.
Реализовать задачу через динамический массив.
Пример входа (in2.txt):
6
-10 -5 -1 2 6 25
Среднее = ((-10) + (-5) + (-1) + 2 + 6 + 25) / 6.0 = 2.83
Пример выхода (out2.txt):
1
2
135.
136.
Домашнее задание1. Доделать задачи 1-3.
2. Задача 4. В файле in4.txt хранится информация о доходах. Нужно создать выходной файл
out4.txt, в котором собрать все высокие доходы. Высокими доходами будем считать те,
которые не меньше чем 2/3 от максимального дохода. Формат входа и выхода аналогичен
файлам из задач 1-3. При обработке массива использовать динамическую память.
Пример входа (in5.txt):
8
10000 20000 35000 20000 50000 60000 18000 45000
Выход (out5.txt):
3
50000 60000 45000
3. Задача 5*. В файле in5.txt хранится N целых положительных чисел. Все числа в файле in5.txt
разные.
Нужно создать выходной файл out5.txt, в который вывести все числа из входного файла,
переупорядочив их следующим образом.
Сначала в выходном файле должны идти все четные числа, расставленные по
возрастанию. Затем должны идти все нечетные числа, расставленные по убыванию. При
обработке массива использовать динамическую память.
Пример входа (in5.txt):
10
13 16 5 7 8 9 11 1 2 4
Выход (out5.txt):
10
2 4 8 16 13 11 9 7 5 1
137.
ИТОГО по лабораторной работе 191. Попробовали работать с динамическими массивами
2. Закрепили работу с файлами
138.
139.
Что почитать?1. Динамическое выделение памятиhttp://learnc.info/c/memory_allocation.html
2. Организация памяти. Доступ к нелокальным данным.
Управление кучейhttps://wiki.livid.pp.ru/students/sp/lectures/f.html
140.
141.
ИТОГО по лекции 101.
2.
3.
4.
Систематизировали знания про память в Си.
Познакомились с динамической памятью.
Познакомились с динамическими массивами.
Познакомились/вспомнили работу с файлами.