База ответов ИНТУИТ

Программирование

<<- Назад к вопросам

Рассмотрим реализацию матрицы вещественных чисел,размеры которой определяютсяв процессе работы программы, через массив указателей на началастрок, захватываемый в динамической памяти. Каждая строкатакже представляет собой отдельный массив вдинамической памяти:
    typedef double* doubleptr;    int m, n; // Размеры матрицы: число строк, столбцов    . . .    doubleptr* a = new doubleptr[m];    for (int i = 0; i < m; ++i) {        a[i] = new double[n];    }    // a[i][j] -- элемент i-й строки и j-го столбца
Сколько памяти требуется для хранения прямоугольнойматрицы размером в 10 строк и 20 столбцовв 32-разрядной архитектуре(без учета памяти, используемой под описатели фрагментов кучи)?

(Отметьте один правильный вариант ответа.)

Варианты ответа
1600 байтов
1640 байтов (Верный ответ)
1760 байтов
1680 байтов
Похожие вопросы
Рассмотрим реализацию матрицы целых чисел,размеры которой определяютсяв процессе работы программы, через массив указателей на началострок, захватываемый в динамической памяти. Каждая строкатакже представляет собой отдельный массив вдинамической памяти:
    typedef int* intptr;    int m, n; // Размеры матрицы: число строк, столбцов    . . .    intptr* a = new intptr[m];    for (int i = 0; i < m; ++i) {        a[i] = new int[n];    }    // a[i][j] -- элемент i-й строки и j-го столбца
Сколько памяти требуется для хранения прямоугольнойматрицы размером в 10 строк и 20 столбцовв 64-разрядной архитектуре(без учета памяти, используемой под описатели фрагментов кучи;предполагаем, что размер элемента типа int равен 4)?
Рассмотрим реализацию матрицы вещественных чисел,размеры которой определяютсяв процессе работы программы, через массив указателей на началастрок, захватываемый в динамической памяти. Каждая строкатакже представляет собой отдельный массив вдинамической памяти:
    typedef double* doubleptr;    int m, n; // Размеры матрицы: число строк, столбцов    . . .    doubleptr* a = new doubleptr[m];    for (int i = 0; i < m; ++i) {        a[i] = new double[n];    }    // a[i][j] -- элемент i-й строки и j-го столбца
Сколько обращений к памяти необходимо сделать,чтобы прочесть элемент матрицы вi-й строке и j-м столбце(считая, что значения i и jуже находятся в регистрах процессора)?
Рассмотрим реализацию матрицы вещественных чиселразмера m строк на n столбцовпри помощи линейного массива,в котором хранятся сначала элементы нулевой строки матрицы,затем первой и т.д., в конце - элементы (m-1)-й строки:
    int m, n; // Размеры матрицы: число строк, столбцов    . . .    double* a = new double[m*n];    // a[i*n + j] -- элемент i-й строки и j-го столбца
Пусть функция с прототипом
void transp(double* a, int m, int n);
реализует транспонированиематрицы, при выполнении которого строки матрицы становятсястолбцами, столбцы - строками, а матрица размераm на nпревращается в матрицу размераn на mПусть эта функция применяется к прямоугольной матрице,содержащей 3 строки и 5 столбцов, элементы которой хранятсяв линейном массиве a. Сколько элементов массиваa при этом останутся на своем месте?
Рассмотрим реализацию матрицы вещественных чиселразмера m строк на n столбцовпри помощи линейного массива,в котором хранятся сначала элементы нулевой строки матрицы,затем первой, второй и т.д., в конце - элементы (m-1)-й строки:
    int m, n; // Размеры матрицы: число строк, столбцов    . . .    double* a = new double[m*n];    // a[i*n + j] -- элемент i-й строки и j-го столбца
Правильно ли работает следующая функция транспонированияматрицы, при выполнении которой строки матрицы должны статьстолбцами, столбцы - строками, а матрица размераm на nпревратиться в матрицу размераn на m?
void transp(double* a, int m, int n) {    for (int i = 0; i < m; ++i) {        for (int j = 0; j < n; ++j) {            int idx0 = i*n + j;            int idx1 = j*m + i;            if (idx0 < idx1) {                // Меняем местами 2 элемента                double tmp = a[idx0];                a[idx0] = a[idx1];                a[idx1] = tmp;            }        }    }}
Рассмотрим реализацию матрицы вещественных чиселразмера m строк на n столбцовпри помощи линейного массива,в котором хранятся сначала элементы нулевой строки матрицы,затем первой, второй и т.д., в конце - элементы (m-1)-й строки:
    int m, n; // Размеры матрицы: число строк, столбцов    . . .    double* a = new double[m*n];    // a[i*n + j] -- элемент i-й строки и j-го столбца
Пусть функция с прототипом
void transp(double* a, int m, int n);
реализует транспонированиематрицы, при выполнении которого строки матрицы становятсястолбцами, столбцы - строками, а матрица размераm на nпревращается в матрицу размераn на mПусть эта функция применяется к прямоугольной матрице,содержащей 2 строки и 4 столбца, элементы которой хранятсяв линейном массиве a Сколько элементов массиваa при этом останутся на своем месте?
Функция с прототипом
double root(double a, double b, double eps);
находит корень фиксированной функции
double f(double x);
на отрезке [a, b] методом деления отрезка пополамс точностью eps.Пусть функция f(x) определена следующимобразом:
double f(double x) {    double p = 1.;    double r = 1.;    while (r < 5.5) {        p *= (x - r);        r += 1.;    }    return p;}
Каким будет приблизительное значение переменной xв результате выполнения следующего фрагмента программы:
    double x = root(0., 5.9, 0.000001);
Какие объекты языка C/C++ располагаются вдинамической памяти?
Оценить сверху время работы (т.е. количествовыполнений тела цикла) алгоритмаприблизительного вычисления логарифма:
double myLog(double x, double a, double eps) {    // дано: x > 0, a > 1, eps > 0    // надо: вычислить log_a x с точностью eps    double y = 0.0, z = x, t = 1.0;    while (        fabs(t) > eps ||        x <= 1.0/a ||        z >= a    ) {        // Invariant: a^y * z^t == x        if (z >= a) {            z /= a; y += t;        } else if (z <= 1.0/a) {            z *= a; y -= t;        } else {            z *= z; t /= 2.0;        }    }    return y;}
Рассмотрим следующий фрагмент программы на С++:
    static double *a = new double[10];    a[0] = 3.7;
Где хранится значение выражения "a[0]" (т.е.число 3.7)?
Рассмотрим следующий фрагмент программы на С++:
    static double *p = 0;    . . .    p = new double[100];    *p = 1.5;
Где хранится значение выражения "*p" (т.е.число 1.5)?