4 Архитектура фон Неймана, массивы.pptx
- Количество слайдов: 20
Занятие 4 Курс "Основы программирования"
План занятия 1. Архитектура фон Неймана 2. Недостатки архитектуры 3. Массивы, индексация 4. int _ [N] / var _ = [ ]
Основные принципы • Данные и инструкции в одной памяти • Адресность памяти • Программное управление • Двоичное кодирование
Общая схема Память Устройство управления Арифметико-логическое устройство Накопитель Ввод Вывод
Адресность памяти • Память состоит из пронумерованных ячеек. Адрес Содержимое 0 … 1 … • В произвольный момент доступна любая ячейка. 2 … 3 … … … 1 073 741 820 … 1 073 741 821 … 1 073 741 822 … 1 073 741 823 … • Для доступа используются номера соответствующих ячеек – адреса. 1 Гбайт
Программное управление • Программа – последовательность команд. • Команды хранятся в ячейках одна за другой и выполняются по порядку. • При необходимости можно изменить порядок выполнения команд – специальной командой. Адрес Содержимое 0 Команда 1 1 Команда 2 2 Команда 3 3 Команда 4 … … 1 073 741 820 … 1 073 741 821 … 1 073 741 822 … 1 073 741 823 …
Данные и инструкции 0 +0 +1 +2 +3 +4 0 jmp 10 3 5 2 5 ? – – 10 mov_ax* 2 add_ax* 3 mul_ax 15 6 sub_ax* 4 mov 2_ax 5 20 printc ‘x’ printc ‘=’ printi* 25 5 – – jmp – переход к инструкции в ячейке, номер которой указан mov_ax – скопировать в накопитель указанное число * – взятие содержимого ячейки по её номеру add_ax – увеличить содержимое накопителя на указанное число sub_ax – уменьшить содержимое накопителя на указанное число mul_ax – домножить содержимое накопителя на указанное число mov 2_ax – скопировать из накопителя в указанную ячейку printc – вывести букву на экран printi – вывести указанное число на экран
Двоичное кодирование 0 +0 +1 +2 +3 +4 0 jmp 10 3 5 2 5 ? – – 10 mov_ax* 2 add_ax* 3 mul_ax 15 6 sub_ax* 4 mov 2_ax 5 20 printc ‘x’ printc ‘=’ printi* 25 5 – – 0 +0 +1 +2 +3 +4 0 00000001010 00000011 00000101 00000010 5 00000000 0000 10 00000010 00000011 00000100 15 00000110 00000101 00000100 00000110 00000101 20 00000111 00100001 00000111 00100100 00001000 25 00000101 00000000
Реальный пример
Недостатки архитектуры • Ограниченная пропускная способность между процессором и памятью • Скорость работы памяти существенно ограничивают скорость работы процессора • Совершенствование систем кэширования порождает множество новых проблем
Массив Несколько переменных под одним именем. • Array – англ. «массив, множество» 12 Обычная переменная: int x = 12; / var x = 12; X Массив: int a[] = {5, 18, 31, 2}; / var a = [5, 18, 31, 2]; 5 0 a 18 1 31 2 2 3
Зачем нужны массивы? Векторные типы данных: • 2/3/4 D векторы, матрицы, кватернионы и т. д. function vec 3_length(v 3) { return v 3[0]*v 3[0]+ v 3[1]*v 3[1]+ v 3[2]*v 3[2]; } var vector 3 = [3, 16, 7]; var length = vec 3_length(vector 3); Хранение множеств • Набор строк с именами студентов, список покупок и т. д. var students = [‘Олег’, ‘Маша’, ‘Павел’, ‘Света’]; students. push(‘Андрей’);
Статические и динамические • Статические: размер обязательно задаётся при создании, а затем не может меняться. Характерно для С. • Динамические: размер определяется количеством элементов, складываемых в массив в процессе работы. Размер меняется автоматически, либо по требованию. Характерно для JS.
Запись в коде С int a[4]; // массив а имеет 4 ячейки int b[] = {3, 1}; // 2 ячейки int c[]; // ошибка! размер не указан int d; scanf(“%i”, &d); int e[d]; // ошибка! размер не const int f = 7; int g[f]; // ок, 7 ячеек
Запись в коде JS var a; a = []; // теперь а – пустой массив a = [2, 6, 1]; // три ячейки a. push(4); // [2, 6, 1, 4] a. splice(1, 2); // [2, 4] a. splice(1, 0, 3); // [2, 3, 4]
Индексация массива Номер элемента указывается в квадратных скобках после имени массива. По смыслу соответствует субскрипту вне программирования: a[0] <-> a 0 var a = [2, 6, 1]; console. log(a[0]+“ ”+a[2]); // “ 2 1” int a[] = {2, 6, 1}; printf(“%i %i”, a[0], a[2]); // “ 2 1”
Связь с циклами Массив можно индексировать переменной – как в JS так и в С. Переменная может быть счётчиком цикла. Так организуется обработка N элементов: var a=[2, 6, 1, 3]; / int a[]={2, 6, 1, 3}; var i = 4; / int i = 4; while( --i / 2 ) { a[i] += a[3 -i]; a[3 -i] = a[i] - a[3 -i]; a[i] += a[i] - a[3 -i]; // обмен : D } // [3, 1, 6, 2]
Сортировка массива чисел 1. Пишем программу сортировки массива пузырьковым методом по убыванию. Понадобится: • условный оператор ( if( ){} ) • цикл-в-цикле ( for( ){ } } ) • массив: [1, 7, 2, 5, 6, 0, 8, 4, 3, 9] Результат: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Псевдокод а = массив для i = 0, i<10, i++ для j = 0, j<9 -i, j++ если a[j] < a[j+1] обменять a[j], a[j+1] Ответ в a.
Домашнее задание 1. Повторить задание, сделанное в классе с использованием любого другого алгоритма сортировки на свой выбор. 2. Организовать заполнение массива случайными числами диапазона [0; 100]. Программа выводит индекс первого элемента превышающего значение 90, если такой существует в массиве.