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

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

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

Рассмотрим следующую реализацию функции 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?

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

Варианты ответа
Правильно, поскольку деление на ноль невозможно, следовательно, выполнение программы должно быть прекращено.
Неправильно, поскольку прекращение выполнения программы при невыполнении утверждения должно происходить в результате ошибки в программе, а не из-за некорректных входных данных. (Верный ответ)
Похожие вопросы
Рассмотрим следующую реализацию функции 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?
Прототип функции, которая ищет вхождение строки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);        . . .    }
Прототип функции, которая вычисляет сумму элементов массива aдлины n, выглядит следующим образом:
    double sum(const double *a, int n);
Можно ли в описании этой функции и ее прототипа опустить слово const?(Могут ли при этом в корректной программе возникнутьошибки или предупреждения на стадии компиляции?)
Пусть описан тип 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;
Рассмотрим следующий фрагмент программы:
утверждение: A(x)цикл пока B(x)| инвариант: A(x)| x := T(x)конец цикла
Здесь через A(x) и B(x)обозначены условия, зависящие от переменной x.Какое условие выполняется по окончании цикла?
Рассмотрим два способа представления матрицы размера4×4. В первом случае используется массив из четырехэлементов типа «указатель на double»:
    double *a[4];
при этом элемент a[i] содержит адресначала i-й строки матрицы.Во втором случае используется линейный массив из шестнадцатиэлементов:
    double a[16];
В первом случае обращение к элементу матрицы с индексамиi, j осуществляется с помощью выражения
    a[i][j],
во втором — с помощью выражения
    a[4*i + j].
Есть ли существенная разница в эффективности программыв первом и втором случаях при использовании оптимизирующегокомпилятора?
Рассмотрим два способа представления матрицы размера4×4. В первом случае используется массив из четырехэлементов типа «массив из четырех элементов»:
    double a[4][4];
Во втором случае используется массив из четырехэлементов типа «указатель на double»:
    double *a[4];
при этом элемент a[i] содержит адресначала i-й строки матрицы.В обоих случаях обращение к элементу матрицы с индексамиi, j осуществляется с помощью выражения
    a[i][j].
Есть ли существенная разница в эффективности программыв первом и втором случаях при использовании оптимизирующегокомпилятора?
Пусть описан тип 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?
Пусть x и y — вещественныепеременные типа double.Может ли произойти прерывание из-за деления на нольпри вычислении логического выражения
y > 0.1  и  x / y >= 1.0?