л_15_Массивы_алгоритмы.ppt
- Количество слайдов: 37
Стрикелева Л. В. Программирование Лекция 15 Базовые алгоритмы работы с массивами
Базовые структуры данных. Алгоритмы работы с матрицами • Построчная обработка матрицы • Обработка матрицы по столбцам • Обработка всей матрицы • Обработка части матрицы • Преобразование матрицы: перестановка строк перестановка столбцов удаление строки вставка строки построение матриц: с элементами, зависящими от своих же индексов с использованием числа с использованием одномерных массивов с использованием одной или нескольких определенных ранее матриц Л. В. Стрикелева Программирование 2
Базовые структуры данных. Алгоритмы работы с матрицами Построчная обработка Для каждой строки матрицы а размерности n x n найти некоторый параметр (сумму, количество элементов строки с некоторым условием, наибольший (наименьший) элементы, определенный элемент (например, 0) и т. д. S 0 или max 0 или min 0 S 1 ……… S 2 ……… S 3 S 4 a[i][j] i-я строка j-ый столбец Решение: • внешний цикл строится по номеру строки, • в одном или нескольких внутренних циклах обрабатывается строка как одномерный массив. • полученные характеристики строк можно запоминать в одномерном массиве размерности n или выводить сразу по мере получения. Л. В. Стрикелева Программирование 3
Базовые структуры данных. Алгоритмы работы с матрицами Построчная обработка Пример: задана матрица A[n][m], в которой Аij – оценка i-го студента на j-м экзамене. Найти средний балл каждого студента S[n]: const int n=10; const int m=5; int A[n][m], Sum; double S[n]; for (int i=0; i<n; i++) { Sum =0; for (int j=0; j<m; ) Sum += A[i][j++] ; S[i] = Sum/m; } Замечания: Массив S и переменная Sum должны объявляться с типом double или: int Sum; double S[n]; …S[i] = double (Sum)/m; или S[i] = (Sum+0. 0)/m; Массив S имеет размерность n (количество строк матрицы) и индекс его элемента совпадает с номером строки (i), а не столбца (j). Оператор Sum =0; должен располагаться между операторами for, так как для каждой строки суммирование необходимо начинать с первого столбца. Оператор S[i] = Sum/m; должен располагаться внутри внешнего, но вне внутреннего цикла. 4 , Л. В. Стрикелева Программирование
Базовые структуры данных. Алгоритмы работы с матрицами Обработка матрицы по столбцам Вычисления можно выполнять не только для строк, но и для столбцов. Продолжим рассмотрение предыдущей задачи : найдем и выведем (не используя массив) количество k плохих оценок по каждому предмету, т. е. проанализируем элементы каждого столбца: Л. В. Стрикелева Программирование 5
Базовые структуры данных. Алгоритмы работы с матрицами Обработка матрицы по столбцам int k=0; for (int j=0; j<m; j++) // цикл по столбцам-предметам j {for (int i=0; i<n; i++) // цикл по строкам-студентам i if (A[i][j] <=3) k++; cout << j << " " << k << endl; } Замечания: • внешний цикл строим по номеру столбца • во внутреннем цикле, изменяя первый «левый» индекс, обрабатываем столбец как одномерный массив • как и в предыдущем случае, важно место оператора обнуления счетчика k=0; и оператора вывода результата. Л. В. Стрикелева Программирование 6
Базовые структуры данных. Алгоритмы работы с матрицами Обработка всей матрицы В таких алгоритмах матрицу можно обрабатывать как по строкам, так и по столбцам. Но более правильно – организовать внешний цикл по номеру строки, а внутренний – по номеру столбца (т. к. элементы матрицы располагаются по строкам). Пример: найдем наибольший элемент в матрице и номер строки и столбца, на пересечении которых он находится: i j Л. В. Стрикелева Программирование 7
Базовые структуры данных. Алгоритмы работы с матрицами Обработка всей матрицы Фрагмент программы: const int n=10, m=5; int A[n][m]; int My. Max, Imax, Jmax; //…. . My. Max=A[0][0]; Imax = Jmax = 0; for (int i=0; i< n; i++) for(int j=0; j< m; j++) if (A[i][j] > My. Max) {My. Max=A[i][j]; Imax=i; Jmax=j; } cout << My. Max << " " << Imax <<" "<< Jmax; Вопросы: Если наибольший элемент повторяется несколько раз, индексы какого из них мы найдем? Как получить координаты «первого» ( «последнего» ) из нескольких одинаковых максимальных значений? Что надо изменить, чтобы наибольший элемент и его номер находились для каждой строки и выводились по мере получения? Л. В. Стрикелева Программирование 8
Базовые структуры данных. Алгоритмы работы с массивами Обход матрицы «по спирали» : int main() { const int N = 6; static int arr[N][N] = { 1, 2, 3, 4, 5, 6, 20, 21, 22, 23, 24, 7, 19, 32, 33, 34, 25, 8, 18, 31, 36, 35, 26, 9, 17, 30, 29, 28, 27, 10, 16, 15, 14, 13, 12, 11}; for (p=0; p<N/2; p++) //количество витков спирали {for (j=p; j<=N-p-1; j++) cout << setw(4) << arr[p][j]; //верхняя строка витка p спирали for (i=p+1; i<N-p; i++) cout << setw (4)<< arr[i][N-p-1]; //правый столбец витка p for (j=N-p-2; j>=p; j--) cout << setw (4)<< arr[N-p-1][j]; //нижняя строка витка p for (i=N-p-2; i>=p+1; i--) cout << setw (4)<< arr[i][p]; //левый столбец витка p } } j = N-i-1 Л. В. Стрикелева Программирование 9
Базовые структуры данных. Алгоритмы работы с матрицами Обработка части матрицы К такому типу отнесем задачи, в которых выполняется обработка элементов главной или побочной диагоналей квадратной матрицы. Л. В. Стрикелева Программирование 10
Базовые структуры данных. Алгоритмы работы с матрицами Обработка части матрицы Пример: найти среднее значение элементов главной диагонали. Можно записать два вложенных цикла: const int n=10; double Sum=0, A[n][n]; for (int i=0; i<n; i++) for(int j=0; j<n; j++) if (i==j) Sum +=A[i][j]; Sum /=n; //лучше так не делать!!!!! Так как для элементов главной диагонали оба индекса одинаковы, то лучше выполнить : const int n=10; double Sum=0, A[n][n]; for (int i=0; i<n; i++) //да, один цикл !!!!! Sum +=A[i][i]; Sum /=n; Л. В. Стрикелева Программирование 11
Базовые структуры данных. Алгоритмы работы с матрицами Обработка части матрицы Для нахождения среднего значения элементов побочной диагонали необходимо найти зависимость второго индекса от первого: i+j = n-1. Поэтому j = n-1 -i: const int n=10; double Sum=0, A[n][n]; for (int i=0; i<n; i++) Sum +=A[i][n-1 -i]; Sum /=n; Л. В. Стрикелева Программирование 12
Базовые структуры данных. Алгоритмы работы с матрицами Обработка части матрицы Верхний треугольник квадратной матрицы относительно главной диагонали – это те элементы, у которых i<j, если главная диагональ не включается, или i <= j, если включается. Для обработки таких треугольников необходимо определить, как изменяются индексы. В произвольной i-ой строке индекс j изменяется от i до n-1. Пример: подсчет количества нулевых элементов верхнего треугольника, включая и главную диагональ. j==i const int n=10; double A[n][n]; int K 0=0; for (int i=0; i<n; i++) for (int j=i; j<n; j++) if (A[i][j] ==0) K 0++; Л. В. Стрикелева Программирование Если саму главную диагональ анализировать не надо, то заголовок внутреннего цикла будет выглядеть так: for (int j=i+1; j<n; j++) 13
Базовые структуры данных. Алгоритмы работы с матрицами Обработка части матрицы Аналогично определяется нижний треугольник, относительно главной диагонали и треугольники относительно побочной диагонали. Подсчет количества нулевых элементов нижнего треугольника относительно побочной диагонали выглядит так: const int n=10; double A[n][n]; int K 0=0; for (int i=0; i<n; i++) for (int j=n-i-1; j<n; j++) if (!A[i][j]) Л. В. Стрикелева Программирование K 0++; 14
Базовые структуры данных. Алгоритмы работы с матрицами Преобразование матрицы. Перестановка строк. Перестановка двух строк, номера которых n 1 и n 2 заданы, выполняется следующим образом: const int n=10; const int m=5; double A[n][m]; int n 1, n 2; cin >> n 1>> n 2; int R; for (int j=0; j<m; j++) //цикл по столбцам {R=A[n 1][j]; A[n 1][j]= A[n 2][j]; A[n 2][j]=R; n 1 } R n n 2 m Л. В. Стрикелева Программирование 15
Базовые структуры данных. Алгоритмы работы с матрицами Преобразование матрицы. Перестановка столбцов Перестановка двух столбцов, номера которых m 1 и m 2 заданы, выполняется следующим образом: const int n=10; const int m=5; double A[n][m]; int m 1, m 2, R; cin >> m 1>> m 2; for (int i=0; i<n; i++) //цикл по строкам {R=A[i][m 1]; A[i][m 1]= A[i][m 2]; A[i][m 2]=R; } n Л. В. Стрикелева Программирование 16 m R
Базовые структуры данных. Алгоритмы работы с матрицами Преобразование матрицы. Удаление строки Удаление k-ой строки (k известно) выполняется так. Строки до k-ой сохраняются, затем – перемещение k (все строки, начиная с (k+1)-ой, «поднимаем на одну вверх» ): const int n=10; const int m=5; на место k-ой строки помещаем (k+1)-ю строку, на место (k+1)-й – (k+2)-ю и т. д. double A[n][m]; int k; cin >> k; for (int i=k; i<n-1; i++) //уменьшается на 1 количество обрабатываемых строк for (int j=0; j<m; j++) //последняя строка в обработке не должна участвовать. A[i][j] =A[i+1][j]; Физически мы ни одну строку из памяти не удалили (объем зарезервированной для матрицы памяти не изменяется). Л. В. Стрикелева Программирование 17
Базовые структуры данных. Алгоритмы работы с матрицами Преобразование матрицы. Вставка строки При объявлении матрицы необходимо объявить массив int A[n][m] с увеличенным на 1 количеством строк. Для вставки строки после k-й необходимо сначала строки от предпоследней до k-й переместить вниз на одну: for (int i=n-1; i>k+1; i--) for (int j=0; j<m; j++) A[i][j] =A[i-1][j]; Затем на место (k+1)-й строки надо поместить вставляемую строку (например, одномерный массив В такой же размерности m, что и строка матрицы): for (int j=0; j<m; j++) A[k+1][j] =B[j]; Л. В. Стрикелева Программирование 18
Базовые структуры данных. Алгоритмы работы с матрицами Построение матриц Элементы матрицы можно задать по некоторому специальному правилу в зависимости от ее индексов. Например: for (int i=0; i<n; i++) for (int j=0; j<m; j++) A[i][j] =(i+1)*(j+1); 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 5 10 15 20 25 30 6 12 18 24 30 36 Л. В. Стрикелева Программирование 19
Базовые структуры данных. Алгоритмы работы с матрицами Построение матриц При построении матрицы можно использовать одно число. Например, построим матрицу А для заданных значений x и n: Алгоритм : очередной элемент «периметра матрицы» получаем так: умножаем предыдущий элемент на х и помещаем его в первую и последнюю строки, в первый и последний столбцы. Для этого достаточно одного цикла. Все «центральные» элементы обнуляем. Л. В. Стрикелева Программирование 20
Базовые структуры данных. Алгоритмы работы с матрицами Фрагмент программы выглядит так: Построение матриц const n=5; double x, A[n][n], T; cin >> x; A[0][0] = A[n-1] =1; T=1; for (int i=1; i<n; i++) {T *=x; A[0][ i ] = //элементы 0 -й строки A[ i ][0] = //элементы 0 -го столбца A[n-1][n-1 -i] = //элементы последней строки A[n-1 -i][n-1] = T; //элементы последнего столбца } for (int i=1; i<n-1; i++) for (int j=1; j<n-1; j++) A[ i ][ j ] =0; Л. В. Стрикелева Программирование 1 2 4 8 16 2 0 0 0 8 4 0 0 0 4 8 0 0 0 2 16 8 4 2 1 21
Базовые структуры данных. Алгоритмы работы с матрицами Построение матриц Матрицу можно построить, используя один или несколько одномерных массивов. Например, задано b[n]. Сформировать матрицу по следующему правилу: В таких задачах необходимо установить, от чего и как зависят индексы элементов матрицы и, возможно, значения ее элементов. В данном случае зависимость простая, поэтому получаем: for (int i=0; i<n; i++) for (int j=0; j<m; j++) A[i][j]=b[i]+j; Л. В. Стрикелева Программирование 22
Базовые структуры данных. Алгоритмы работы с матрицами Построение матриц Новую матрицу можно построить на основе одной или нескольких ранее определенных матриц. Например, на основе матрицы C[n][n] получим новую матрицу A[n][n] такой же размерности по следующему правилу: положительные числа исходной матрицы увеличим в 10 раз, а отрицательные уменьшим во столько же раз: for (int i=0; i<n; i++) for (int j=0; j<m; j++) { t=C[i][j]; A[i][j] = t>0 ? t*10 : t/10 ; } Заметим, что старая матрица C сохранилась без изменения, а построенная разместилась на новом месте. Л. В. Стрикелева Программирование 23
Базовые структуры данных. Алгоритмы работы с массивами Построение элементов одномерного массива в соответствии с некоторой закономерностью const int n=10; По заданному массиву символов С получить массив В логических значений по правилу: int main () элементу B[i] присвоить true, если C[i] – цифра, и { false – в противном случае char C[n], i; bool B[n]; cout << "input X[i]n"; for (i=0; i<n; i++) cin >> C[i]; //ввод массива for (i=0; i<n; i++) cout << C[i] << " "; //вывод массива cout << endl; for (i=0; i<n; i++) {B[i] = (C[i] >'0') && (C[i] < '9'); cout << B[i]; } cout << endl; _getch(); return 0; } Л. В. Стрикелева Программирование 24
Базовые структуры данных. Алгоритмы работы с массивами нахождение количества положительных элементов одномерного массива, расположенных между максимальным и минимальным его элементами int main() { const int n = 10; int a[n] = {1, 3, -5, 1, -2, 1, -1, 3, 8, 4}; int i, imax, imin, count; for (i = imax = imin =0; i<n; i++) { if (a[i] > a[imax]) imax = i; if (a[i] < a[imin]) imin = i; } int ibeg = imax < imin ? imax : imin; int iend = imax < imin ? imin : imax; for (count=0, i = ibeg+1; i<iend; i++) if (a[i] >0) count++; cout << "n >0: " << count << endl; _getch(); return 0; } Л. В. Стрикелева Программирование 25
Базовые структуры данных. Алгоритмы работы с массивами нахождение суммы элементов одномерного массива, расположенных правее последнего отрицательного элемента int main() {int n, i; cout << "input nn"; cin >> n; double sum, *a = new double [n]; cout << "input a[i]n"; for (i = 0; i<n; i++) cin >> a[i]; for (i = 0; i<n; i++) cout << a[i] << " "; int ineg = -1; for (i = 0; i<n; i++) if (a[i] < 0) ineg = i; if (ineg != -1) { for (sum = 0, i= ineg+1; i < n; i++) sum += a[i]; cout << "n S=" << sum <<endl; } else cout << "n<0: 0n" << endl; delete [] a; _getch(); return 0; } Л. В. Стрикелева Программирование //улучшенный вариант !!! int main() { int i, n; cout << "input nn"; cin >> n; double *a = new double [n]; cout << "input a[i] : n "; for (i = 0; i<n; i++) cin >> a[i]; bool flag_neg = false; double sum = 0; for (i = n-1; i>=0; i--) { if (a[i] < 0) {flag_neg = true; break; } sum +=a[i]; } if (flag_neg ) cout << "n S=" << sum << endl; else cout << "n<0: 0"; delete [] a; _getch(); return 0; } каждый элемент массива анализируется не более одного раза, а ненужные элементы не просматриваются вообще 26
Базовые структуры данных. Алгоритмы работы с массивами Сортировка массива Сортировка – это процесс упорядочения некоторой последовательности нумерованных объектов в соответствии с заданным признаком. Цель сортировки – облегчить последующий поиск элементов в отсортированной последовательности. Требование при этом – минимального использования дополнительной памяти, т. е. в частности, недопустимость применения дополнительных массивов. Для оценки быстродействия алгоритмов используют два показателя: количество присваиваний и количество сравнений. Методы сортировки Прямые : • сортировка обменом ( «пузырьковая» ); • сортировка вставкой (включением); • сортировка выбором (выделением). Улучшенные: сортировка с разделением (быстрая сортировка). Прямые методы имеют относительно низкое быстродействие. Однако в некоторых случаях (при небольшой длине массива и/или особом исходном расположении элементов) могут даже превзойти улучшенные методы. В то же время они хорошо показывают суть основанных на них улучшенных методов. Л. В. Стрикелева Программирование 27
Базовые структуры данных. Алгоритмы работы с массивами Сортировка обменом Это один из простейших методов сортировки последовательные перемещения соседних элементов 1 -й проход 5 11 3 3 7 11 7 исходный массив 1 4 2 9 максимальный элемент за один просмотр будет стоять на последней позиции ( «всплыл» первый «пузырек» ). 11 1 11 4 11 Для массива размерности n требуется (n-1) проход. 2 11 9 2 -й проход 5 3 3 7 5 1 1 4 3 5 1 1 5 4 4 11 4 -й проход 3 1 4 2 7 2 7 1 9 5 -й проход 11 1 3 5 7 9 11 2 3 4 2 4 5 7 9 11 2 5 2 Л. В. Стрикелева Программирование 9 7 4 3 -й проход 2 11 6 -й проход 3 1 2 3 4 5 7 9 11 5 7 -й проход 1 2 3 28
Базовые структуры данных. Алгоритмы работы с массивами Сортировка обменом массив : X[0] X[1] X[2] X[3] X[4] ……. X[n-1] Алгоритм : последовательно сравниваем каждую пару соседних чисел и в зависимости от результата сравнения их переставляем или оставляем на месте. За один просмотр наибольшее число переместится в конец, но результата не достигнем, поэтому повторяем процесс. Алгоритм реализуется с помощью двух вложенных циклов. В первом, плохом, варианте и внутренний, и внешний циклы можно повторить (n -1) раз, где n – размерность массива. for (int i=1; i<n; i++) for (int j=0; j<n-1; j++) if (x[j] > x[j+1]) {r=x[j]; x[j]=x[j+1]; x[j+1]=r; } Улучшаем внутренний цикл. Так как наибольшее число находится уже в конце, то цикл можно завершать ранее: на каждом последующем шаге количество сравнений уменьшать на 1: for (int j=0; j<n-i; j++) …. . Л. В. Стрикелева Программирование 29
Базовые структуры данных. Алгоритмы работы с массивами Сортировка обменом Оптимизация внешнего цикла. Не для всех массивов необходим (n-1) просмотр. «Хороший» массив может быть отсортирован за меньшее количество просмотров. Поэтому условимся: просмотр и анализ массива будем продолжать, если на предыдущем этапе была хотя бы одна перестановка. Если окажется, что ни одну пару не переставляли, то массив отсортирован и можно выйти из внешнего цикла. Это реализуется с помощью переменной flag. Сначала она равна 0. Если перестановка была, то переменная flag изменит свое значение с 0 на 1. void bsort (int* x, int n) { int flag = 1, k=n; while (flag) { k--; flag=0; for (int j=0; j<k; j++) if (x[j] > x[j+1]) {int r=x[j]; x[j]=x[j+1]; x[j+1]=r; flag=1; } //end if }//end while }//end bsort Л. В. Стрикелева Программирование 30
Базовые структуры данных. Алгоритмы работы с массивами Сортировка массива Сортировка одномерного целочисленного массива Х[n] по некоторому «признаку» (например, по возрастанию последней цифры значения элемента) методом обмена: 1. строим массив признаков(массив D[n] последних цифр). 2. сравниваем не сами элементы, а признаки. И если они равны, только тогда сравниваем сами числа. 3. переставляем не только сами числа, но и признаки, чтобы они соответствовали тем же числам, что и до сортировки. for ( i=0; i<n; i++) D[i] =x[i] %10; //заполнение массива D последних цифр int flag = 1, k=n; while (flag) //сортировка массива «пузырьком» { k--; flag=0; for ( j=0; j<k; j++) if ( (D[j]>D[j+1]) || (D[j]==D[j+1] && x[j]>x[j+1]) ) {int r=x[j]; int r 1=D[j]; x[j]=x[j+1]; D[j]=D[j+1]; x[j+1]=r; D[j+1] = r 1; flag=1; } //end if } //end while Л. В. Стрикелева Программирование 31
Базовые структуры данных. Алгоритмы работы с массивами Сортировка вставкой Массив разделяется на две части: отсортированную и неотсортированную (n – размерность массива). Элементы из неотсортированной части поочередно выбираются и вставляются в отсортированную часть так, чтобы не нарушить в ней упорядоченность элементов. В начале работы алгоритма в качестве отсортированной части массива принимают только один первый элемент, а в качестве неотсортированной – все остальные элементы. Алгоритм состоит из (n-1)-го прохода каждый из которых включает четыре действия: • взятие очередного i-го неотсортированного элемента и сохранение его в дополнительной переменной; • поиск позиции j в отсортированной части массива, в которой присутствие взятого элемента не нарушит упорядоченности элементов; • сдвиг элементов массива от (i-1)-го до j-го вправо, чтобы освободить найденную позицию вставки; • вставка взятого элемента в найденную позицию. Основная часть программы for (i=1; i< n; i++) //считаем, что до i элементы отсортированы { temp = x[i]; //берем очередной элемент j = i-1; while ((temp < x[j]) && (j>=0)) // цикл поиска позиции вставки { x[j+1] = x[j]; //сдвиг элементов j--; } x[j+1] = temp; //вставка взятого элемента } Л. В. Стрикелева Программирование 32
Базовые структуры данных. Алгоритмы работы с массивами Сортировка выбором Выбираем (находим) в массиве элемент с минимальным значением от первого (0 -го) элемента до последнего ( (n-1)-го) и меняем его местами с первым элементом. На втором шаге находим элемент с минимальным значением на интервале от 2 -го до последнего элемента и меняем его местами со вторым элементом. И так далее для всех элементов до (n-1)-го. Основная часть программы for (i=0; i<n-1; i++) {int min = x[i]; int i_min = i ; //выбор минимального элемента //запоминание его номера // поиск минимального элемента в оставшейся части массива for (j=i+1; j< n; j++) if (x[j] < min) { min = x[j]; i_min = j; } x[i_min] = x[i]; x[i] = min; //замена элементов } Л. В. Стрикелева Программирование 33
Базовые структуры данных. Алгоритмы работы с массивами Поиск – это просмотр некоторого набора однотипных данных с целью нахождения элементов, обладающих определенным свойством, или установления факта отсутствия таковых элементов. Все методы поиска подразделяются на две группы: поиск в неупорядоченном наборе; поиск в упорядоченном наборе. Поиск в массиве Наиболее эффективные методы поиска работают только на упорядоченных наборах данных. Для поиска в большом наборе, его необходимо предварительно отсортировать. Метод бинарного поиска. Исходный массив делится пополам и для сравнения выбирается средний элемент. Если он совпадает с искомым, то поиск заканчивается. Если же средний элемент меньше искомого, то все элементы левее его также будут меньше искомого. Следовательно, их можно исключить из зоны дальнейшего поиска, оставив только правую часть массива. Аналогично, если средний элемент больше искомого, то отбрасывается правая часть, а остается левая. На втором этапе выполняются аналогичные действия над оставшейся половиной массива. В результате после второго этапа остается ¼ часть массива. И так далее, пока или элемент будет найден, или длина зоны поиска станет равной нулю. В последнем случае искомый элемент найден не будет. Алгоритм: left right int a[n]; mid • Положить left=0, right=n; • Пока left < right выполнять: найти индекс среднего элемента в массиве mid = (left+right)/2; если для элемента массива с индексом mid значение ключа > искомого, положить right =mid-1, иначе если значение ключа < искомого, положить left = mid+1, иначе выйти из цикла (элемент с индексом mid найден); • Если значение ключа элемента с индексом mid совпадает с заданным, поиск 34 Л. В. Стрикелева успешен, иначе – искомого элемента в массиве нет. Программирование
Базовые структуры данных. Алгоритмы работы с массивами Бинарный поиск Основная часть программы int left = 0, right = n-1, mid = 0; while (left <= right) {mid = (left+right+1)/2; if ( s[mid] > find) right = mid-1; else if ( s[mid] < find) left = mid+1; else break; } if (s[mid] == find) cout << "nelement nomer " << mid; else cout << "nno element"; Л. В. Стрикелева Программирование 35
Хорошие мысли для снятия стресса при изучении программирования: Нахождение глубинной простоты в запутанном клубке сущности – это и есть творчество в программировании (Х. Д. Милс) Каждому программисту компьютер выдает то, что он заслуживает (поговорка) Кто как программирует, тот так и ест (поговорка) В жизни слабым сейчас не место. Только сильным везет в судьбе. Из крутого ты сделан теста, Так удачи во все тебе!!! (из газеты “Белорусский университет”) Л. В, Стрикелева Программирование 36
На сегодня все. До свидания До следующей встречи
л_15_Массивы_алгоритмы.ppt