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

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

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

Рассмотрим реализацию матрицы вещественных чисел,размеры которой определяютсяв процессе работы программы, через массив указателей на началастрок, захватываемый в динамической памяти. Каждая строкатакже представляет собой отдельный массив вдинамической памяти:
    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уже находятся в регистрах процессора)?

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

Варианты ответа
3 обращения
2 обращения (Верный ответ)
одно обращение
Похожие вопросы
Рассмотрим реализацию матрицы вещественных чисел,размеры которой определяютсяв процессе работы программы, через массив указателей на началастрок, захватываемый в динамической памяти. Каждая строкатакже представляет собой отдельный массив вдинамической памяти:
    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-разрядной архитектуре(без учета памяти, используемой под описатели фрагментов кучи)?
Рассмотрим реализацию матрицы целых чисел,размеры которой определяютсяв процессе работы программы, через массив указателей на началострок, захватываемый в динамической памяти. Каждая строкатакже представляет собой отдельный массив вдинамической памяти:
    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)?
Рассмотрим реализацию матрицы вещественных чиселразмера 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-го столбца
Пусть функция с прототипом
void transp(double* a, int m, int n);
реализует транспонированиематрицы, при выполнении которого строки матрицы становятсястолбцами, столбцы - строками, а матрица размераm на nпревращается в матрицу размераn на mПусть эта функция применяется к прямоугольной матрице,содержащей 2 строки и 4 столбца, элементы которой хранятсяв линейном массиве 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;            }        }    }}
Функция с прототипом
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);
Функция ln(z) (натуральный логарифм z) представляетсяв виде степенного ряда следующим образом:
    ln(1+x) = x - x2/2 + x3/3 - x4/4 + ...
(мы обозначили z=1+x).Рассмотрим реализованную на C/C++ функцию myLog(z),вычисляющую значение логарифма с точностью до одной миллионной:
static const double EPS = 1e-6;double myLog(double z) {    double x = z - 1.;    double s = 0.;    double p = x;    double n = 1.;    double a = x;    while (fabs(a) > EPS) {        s += a;        p = (-p*x);        n += 1.;        a = p/n;    }    return s;}
Для каких значений z ее можно применять так,чтобы функция завершала работу за разумное время иошибка вычисления результата была бы не более 0.0001?Укажите все правильные ответы из числа перечисленных ниже.
Функция с прототипом
double root(double a, double b, double eps);
находит корень фиксированной функции
double f(double x);
на отрезке [a, b] методом деления отрезка пополамс точностью eps.Пусть функция f(x) определена следующимобразом:
double f(double x) {    return sin(x);}
Каким будет приблизительное значение переменной xв результате выполнения следующего фрагмента программы:
    double x = root(-1., 9., 0.000001);
Следующий фрагмент программы для последовательностивещественных чисел вычисляет количество n элементов,строго меньших предыдущего, причем самый первый элемент такжеучитывается (считается меньше предыдущего).Например, для последовательности{2, 1, 3, 5, 4} ответ n=3(элементы 2, 1 и 4).
n = 0x0 = ...цикл пока в последовательности есть непрочитанные элементы|выполнять|  прочесть очередной элемент посл-ти в <вых: x>|  если x < x0|  | то n = n + 1|  конец если|  x0 = xконец цикла
Каким значением надо инициализировать переменнуюx0, чтобы программа работала правильно?
Можно ли сохранить целое число типа int(4 байта) в переменной типа double без потериточности? То есть, если мы имеем целочисленнуюпеременную n типа int,то она не изменит своего значения в результе выполненияследующего фрагмента программы:
    int n;    . . .    double x = (double) n;    n = (int) x;