Консультация № 184597
28.11.2011, 14:09
65.00 руб.
28.11.2011, 14:23
0 1 1
Здравствуйте! У меня возникли сложности с таким вопросом:
1. Указать, чему будет равно значение переменной n в результате выполнения следующего фрагмента программы:
int n = 3, k = 5;
while (n != k) {
n = (n * 2) % 11;
k = (k * 7) % 11;
}

Значение n равно 2.
Значение n равно 3.
Значение n равно 4.
Значение n равно 10.

2. Пусть описана структура
struct List {
struct List *next;
void *value;
};
и переменые
struct List e, *p;
int m;
Укажите все корректные выражения языка Си среди перечисленных ниже:
e = *p
m = *(int*) p->next->value
m = e->value
m = *(e.value)11


3. Пусть описана структура
struct Tree {
struct Tree *left;
struct Tree *right;
void *value;
};
и переменые
struct Tree *t1, *t2;
int m;
Укажите все корректные выражения языка Си среди перечисленных ниже:
t1 = t2
*t1 = *t2
t1 = t2->left
*t1 = t2->right
m = *(int*) t1->left->right->value

4. Пусть описана структура
struct Line {
int len;
char *str;
};
и переменые
struct Line s1, *s2;
int n; char c;
Укажите все корректные выражения языка Си среди перечисленных ниже:
s1 == *s2
s1 = *s2
n = s1.len
c = s2->str[2]

5. Пусть описан тип 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;

Значение s приблизительно равно 0.5.
Значение s приблизительно равно -0.5.
Значение s приблизительно равно 0.866 (корню из трех пополам).
Значение s приблизительно равно -0.866 (минус корню из трех пополам).


6. Пусть описан тип 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 извлекает квадратный корень из вещественного числа).
Значение s приблизительно равно 1.
Значение s приблизительно равно 0.5.
Значение s приблизительно равно 1.41421 (корню из двух).
Значение s приблизительно равно 0.866 (корню из трех пополам).

Обсуждение

давно
Старший Модератор
312929
1973
28.11.2011, 16:14
общий
это ответ
Здравствуйте, Заречнева Вера Михайловна!

1. Переменные n, k будут пробегать следующие значения:

[table]
[row][col]n[/col][col]k[/col][/row]
[row][col]3[/col][col]5[/col][/row]
[row][col]6[/col][col]2[/col][/row]
[row][col]1[/col][col]3[/col][/row]
[row][col]2[/col][col]10[/col][/row]
[row][col]4[/col][col]4[/col][/row]
[/table]

В последнем случае n=k, что является условием выхода из цикла. Правильный ответ - Значение n равно 4.

2. Первые два выражения являются корректными. В третьем e содержит объект типа List, а не указатель на него, поэтому правильное обращение к элементу структуры - e.value. И в третьем, и в четвёртом выражении e.value является указателем на тип void, поэтому перед разыменовыванием для последующего присвоения переменной типа int необходимо преобразование к типу int*.

3. Корректны все выражения, кроме предпоследнего (*t1 = t2->right), в котором делается попытка занесения в переменную типа Tree (разыменованный указатель t1) значения типа Tree* (неразыменованный указатель t2->right).

4. Корректны все выражения, кроме первого (s1 == *s2), в котором делается попытка сравнения двух переменных типа Line, для которого не переопределён оператор сравнения ==.

5. Вектор w получается из u вращением на 90[$186$] против часовой стрелки. Следовательно, s - скалярное произведение двух векторов единичной длины, угол между которыми равен 120[$186$]. Так как скалярное произведение векторов равно произведению их длин, умноженному на косинус угла между ними, а cos 120[$186$] = -1/2, то независимо от выбора вектора u правильным будет второй вариант ответа - Значение s приблизительно равно -0.5.

6. Аналогично предыдущему заданию, вектор v получается из u вращением на 90[$186$] против часовой стрелки, то есть всегда u[$8869$]v. Вектор w, очевидно, является суммой векторов u и v, и, в соответствии с правилом параллелограмма, он будет диагональю параллелограмма, построенного на векторах u и v. Так как эти вектора перепендикулрны и имеют единичную длину, то данный параллелограмм будет квадратом со стороной, равной единице, а его диагональ (вектор w) будет иметь длину [$8730$]2. Переменной s как раз присваивается значение длины вектора w, поэтому правильным будет третий вариант ответа - Значение s приблизительно равно 1.41421 (корню из двух).
5
Спасибо за пояснения.
Форма ответа