- •1. Понятие информации и алгоритма. Формы представления алгоритма.
- •2. Блок-схемы разветвляющихся алгоритмов.
- •3. Блок-схемы циклических алгоритмов.
- •5. Определение переменных. Переменные и константы.
- •6. Операции присваивания. Особенности выполнения.
- •8. Потоковый и форматированный ввод-вывод.
- •9. Использование манипуляторов при вводе и выводе данных.
- •10. Строковый и символьный ввод-вывод информации.
- •12. Особенности синтаксиса и выполнения операторов перехода continue, break.
- •13. Оператор перехода goto. Оператор return.
- •17. Пространство имен. Ключевое слово using как директива.
- •18. Средства отладки программ в ms vs.
- •19. Выполнение приложения с использованием средств интерактивной отладки.
- •20. Выполнение приложения с использованием средств планируемой отладки.
- •21. Создание исполняемого файла.
- •24. Алгоритм метода дихотомии для решения уравнений.
- •27. Побитовые логические операции (конъюнкция, дизъюнкция, сдвиги, инвертирование).
- •28. Символы, строки (объявление, инициализация).
- •Void main()
- •Void main()
- •29. Алгоритмы работы со строками (подсчет дины строки, объединение строк, удаление заданного символа).
- •30. Стандартные функции работы со строками.
- •31. Логические переменные и примеры их использования в программах.
- •32. Понятие указателя.
- •33. Операции над указателями.
- •34. Массивы и указатели. Понятие индекса. Инициализация. Доступ к компонентам.
- •35. Указатели и строки. Примеры работы (объединение строк, поиск заданного символа).
- •36. Матрицы. Инициализация, ввод, вывод.
- •Void main()
- •Int b[nstr][nstb];
- •37. Связь между указателями и элементами матриц. Алгоритмы поиска минимума и суммы элементов матрицы (через указатели).
- •38. Указатели на указатели.
- •39. Динамические переменные. Функции и операторы работы с динамическими переменными. Основ-ные свойства.
- •40. Динамические массивы. Понятие статического и динамического объекта, массива.
37. Связь между указателями и элементами матриц. Алгоритмы поиска минимума и суммы элементов матрицы (через указатели).
При работе с многомерными массивами используются массивы указателей.
При объявлении двумерного массива int A[4][3] в памяти выделяется участок для хранения значения переменной A, которая является указателем на массив из четырех указателей. Каждый из этих четырех указателей содержит адрес начального элемента массива из трех элементов типа int.
A
|
| |||
| ||||
A[0] |
|
A[0][0] |
A[0][1] |
A[0][2] |
A[1] |
|
A[1][0] |
A[1][1] |
A[1][2] |
A[2] |
|
A[2][0] |
A[2][1] |
A[2][2] |
A[3] |
|
A[3][0] |
A[3][1] |
A[3][2] |
Таким образом, объявление A[4][3] порождает в программе три разных объекта: указатель с идентификатором А, безымянный массив из четырех указателей и безымянный массив из двенадцати чисел типа int.
Доступ к элементам массива указателей осуществляется с указанием одного индексного выражения в форме А[2] или *(А+2). Для доступа к элементам двумерного массива чисел типа int используются два индексных выражения в форме А[1][2] или эквивалентных *(*(А+1)+2) *(А[1]+2) (*(A+1))[2]. Указатель А и указатели А[0], А[1], А[2], А[3] являются константами и их значения нельзя изменять во время выполнения программы.
Пример. Напишите программу, которая принимает с клавиатуры число N, создает матрицу размера N на N, заполненную случайными числами, и выводит ее на экран. Затем найдите сумму всех элементов этой матрицы.
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int n = 0;
int sum = 0;
cin >> n; // Считываем с клавиатуры n
int **a = new int* [n]; // Создаем массив указателей
for (int i = 0; i < n; i++)
{
a[i] = new int [n]; // Создаем элементы
}
// А дальше работа как с обычным массивом.
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = rand() % 10;
cout << a[i][j] << " "; // Вывести элементы на консоль
sum+= a[i][j];
}
cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли
}
cout << "sum =" << sum << endl;
// Удаление массива
for (int i = 0; i < n; i++)
{
delete[]a[i]; // Удаляем каждый элемент
}
delete [] a; // А потом массив
return 0;
}
Пример. Найти минимальный элемент массива
min = a[0][0];// берем самый первый элемент массива и считаем, что он минимальный.
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (a[i][j] < min) min = a[i][j];
}
}
cout << "min = " << min << endl
38. Указатели на указатели.
Указатель на указатель является формой многочисленного перенаправления или цепочки указателей. Рассмотрим рис.
В случае обычных указателей, указатель содержит адрес некоторого участка памяти, содержащего некоторое значение. В случае указателя на указатель, первый указатель содержит адрес второго, который в свою очередь содержит адрес участка памяти, содержащего некоторое значение.
Переменная, являющаяся указателем на указателе должна быть описана следующим образом. Это выполняется путем помещения двух звездочек перед именем. Например, следующее объявление сообщается компилятору, что newbalance - это указатель на указатель типа float: float **newbalance; Важно понимать, что newbalance - это не указатель на число с плавающей точкой, а указатель на указатель на вещественное число. Для получения доступа к целевому значению, косвенно указываемому указателем на указатель, следует применить оператор * два раза, как показано в следующем примере: #include <stdio.h> int main(void) { int x, *p, **q; x = 10; p = &x; q = &p; printf ("%d", **q) ; /* вывод значения x */ return 0; } Здесь p объявляется как указатель на целое, a q - это указатель на указатель на целое. Вызов printf() выводит число 10 на экран.