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

Основы программирования

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

Прототип функции, которая вычисляет сумму элементов массива aдлины n, выглядит следующим образом:
    double sum(const double *a, int n);
Можно ли в описании этой функции и ее прототипа опустить слово const?(Могут ли при этом в корректной программе возникнутьошибки или предупреждения на стадии компиляции?)

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

Варианты ответа
Можно (ошибки компиляции или предупреждения при таком изменении в корректной программе не возникнут).
Нельзя (могут возникнуть ошибки компиляции или предупреждения в корректной программе). (Верный ответ)
Похожие вопросы
Прототип функции, вычисляющей степень n числа a,выглядит следующим образом:
    double power(const double a, const double n);
Можно ли в описании этой функции и ее прототипа опустить слова const?(Могут ли при этом в корректной программе возникнутьошибки или предупреждения на стадии компиляции?)
Прототип функции, которая ищет вхождение строкиs2 в строку s1,выглядит следующим образом:
    int find(char *s1, char *s2);
функция возвращает смещение подстрокиs2 относительно начала строки s1в случае успеха или (-1) в случае неудачи.Можно ли воспользоваться функцией find в приведенном нижефрагменте программы(будут ли выданы сообщения об ошибках или предупрежденияпри компиляции этого фрагмента)?
    void f(char s[1024], const char p[64]) {        int pos = find(s, p);        . . .    }
Пусть описан тип R2Vector, представляющий векторна плоскости с вещественными координатами,
    typedef struct {        double x;        double y;    } R2Vector;
также описаны три переменныеu, v и w типа вектори вещественная переменная s:
    R2Vector u, v, w;    double s;
при этом переменная u содержат конкретный векторединичной длины, а вектор v получается изu вращением на 30 градусов по часовойстрелке. Указать, чему будет приблизительно равнозначение вещественной переменной s в результатевыполнения следующего фрагмента программы:
    w.x = (-u.y); w.y = u.x;    s = v.x * w.x + v.y * w.y;
Пусть описан тип R2Vector, представляющий векторна плоскости с вещественными координатами:
    typedef struct {        double x;        double y;    } R2Vector;
также описаны три переменные u, v иw типа вектор и вещественная переменная s:
    R2Vector u, v, w;    double s;
при этом известно, что переменные u и vсодержат два конкретныхвектора единичной длины.Пусть в результате выполнения следующего фрагмента программызначение переменной s приблизительно равно 0.7071,т.е. корню из двух, деленному пополам:
    w.x = (-u.y); w.y = u.x;    s = v.x * w.x + v.y * w.y;    // s == 0.7071
На какой угол надо повернуть вектор u,чтобы получить вектор v?
Пусть описан тип R2Vector, представляющий векторна плоскости с вещественными координатами:
    typedef struct {        double x;        double y;    } R2Vector;
также описаны три переменные u, v и wтипа вектор и вещественная переменная s:
    R2Vector u, v, w;    double s;
при этом переменная u содержат конкретный векторединичной длины. Указать, чему будетприблизительно равно значение переменной s врезультате выполнения следующего фрагмента программы:
    v.x = (-u.y);    v.y = u.x;    w.x = u.x + v.x;    w.y = u.y + v.y;    s = sqrt(w.x * w.x + w.y * w.y);
(функция sqrt извлекает квадратный корень из вещественногочисла).
Рассмотрим два способа представления матрицы размера4×4. В первом случае используется массив из четырехэлементов типа «массив из четырех элементов»:
    double a[4][4];
Во втором случае используется массив из четырехэлементов типа «указатель на double»:
    double *a[4];
при этом элемент a[i] содержит адресначала i-й строки матрицы.В обоих случаях обращение к элементу матрицы с индексамиi, j осуществляется с помощью выражения
    a[i][j].
Есть ли существенная разница в эффективности программыв первом и втором случаях при использовании оптимизирующегокомпилятора?
Рассмотрим два способа представления матрицы размера4×4. В первом случае используется массив из четырехэлементов типа «указатель на double»:
    double *a[4];
при этом элемент a[i] содержит адресначала i-й строки матрицы.Во втором случае используется линейный массив из шестнадцатиэлементов:
    double a[16];
В первом случае обращение к элементу матрицы с индексамиi, j осуществляется с помощью выражения
    a[i][j],
во втором — с помощью выражения
    a[4*i + j].
Есть ли существенная разница в эффективности программыв первом и втором случаях при использовании оптимизирующегокомпилятора?
Рассмотрим следующую реализацию функции onMul,которая исполняет команду умножения в проекте«Стековый калькулятор»:
static void onMul() {    double y, x;    assert(st_size() >= 2); // утв: глубина стека                            //      не меньше двух    y = st_pop();    x = st_pop();    st_push(x * y);    display();}
Правильно ли здесь используется конструкция «утверждение»,которая в Си реализуется функцией assert?
Рассмотрим следующую реализацию функции onSqrt,которая исполняет команду извлечения квадратного корня в проекте«Стековый калькулятор»:
static void onSqrt() {    double x;    if (st_empty()) {        printf("Stack empty.\n");        return;    }    x = st_pop();    assert(x >= 0.0); // утв: x неотрицательно    st_push(sqrt(x));    display();}
Правильно ли здесь используется конструкция «утверждение»,которая в Си реализуется функцией assert?
Рассмотрим следующую реализацию функции onDiv,которая исполняет команду деления в проекте«Стековый калькулятор»:
static void onDiv() {    double y, x;    if (st_size() < 2) {        printf("Stack depth < 2.\n");        return;    }    y = st_pop();    x = st_pop();    assert(y != 0.0); // утв: y отлично от нуля    st_push(x / y);    display();}
Правильно ли здесь используется конструкция «утверждение»,которая в Си реализуется функцией assert?