Консультация № 183991
08.09.2011, 14:18
65.00 руб.
0 9 1
Здравствуйте! У меня возникли сложности с таким вопросом прошу ответить с небольшими пояснениями:
1. Пусть x — вещественная переменная типа double. Может ли произойти прерывание из-за переполнения при вычислении логического выражения
1.0 <= x и x <= 1.0e+30 и x*x < 1000.0?
2. Пусть x и y — вещественные переменные типа double. Может ли произойти прерывание из-за деления на ноль при вычислении логического выражения
x / y >= 1.0 и y > 0.1?
3. Указать, что произойдет с элементами массива a в результате выполнения следующего фрагмента программы:
вещ a[100]; вещ t; цел i;
. . .
i := 0;
цикл пока i < 50
| t := a[i];
| a[i] := a[99 - i]; a[99 - i] := t;
| i := i+1;
конец цикла

4. Указать, что произойдет с элементами массива a в результате выполнения следующего фрагмента программы:
вещ a[100]; вещ t; цел i;
a[0] = 0;
. . .
a[99] = 99;
i := 0;
t := a[0];
цикл пока i < 99
| a[i] := a[i+1];
| i := i+1;
конец цикла
a[99] := t;

5. В каком алгоритмическом языке — в Паскале или в Си — операция конкатенации (соединения) строк реализуется более эффективно?

Обсуждение

давно
Профессор
230118
3054
08.09.2011, 14:31
общий
это ответ
Здравствуйте, Заречнева Вера Михайловна!

1. Числа двойной точности с плавающей точкой обеспечивают о масштабы в диапазоне от 10^-308 до примерно 10^308
При вычислении условия "И" сначала вычисляется левый операнд. Если он равен истине, то x*x <10^60, то есть переполнения не произойдет.
2. Если y=0, то произойдет прерывание из-за деления на ноль
3. На первом шаге цикла элемент 0 меняется местами с элементом 99, потом элемент 1 меняется местами с элементом 98 и так далее. В результате массив будет записан в обратном порядке от 99 до 0.
4.
Вначале массив равен 0 1...99
Произойдет циклический сдвиг массива на один элемент. Он будет выглядеть как 1...99 0
5. В Паскале строки представляются массивом символов; при этом размер массива хранится в отдельной (служебной) области. При этом программа в каждый момент времени «знает» о размере строки, и операции добавления символов в конец, копирования и получения размера строки выполняются достаточно быстро.
В Си используются строки с завершающим нулевым символом, и строка хранится как последовательность байтов от начала до конца.
При этом конкатенация происходит медленно, во время нее каждый символ копируется отдельно.
5
спасибо.
давно
Академик
20764
1861
08.09.2011, 14:55
общий
Адресаты:
5. В Паскале строки представляются массивом символов; при этом размер массива хранится в отдельной (служебной) области. При этом программа в каждый момент времени «знает» о размере строки, и операции добавления символов в конец, копирования и получения размера строки выполняются достаточно быстро.
В Си используются строки с завершающим нулевым символом, и строка хранится как последовательность байтов от начала до конца.
При этом конкатенация происходит медленно, во время нее каждый символ копируется отдельно.

особенно, если вспомнить, что в C вообще нет символьных строк. А там, где они есть (например в классе std::string языка C++) , основное время жрёт работа с динамической памятью.
А насчёт того, как лучше хранить символьные строки - с указанием длины или признаком конца - это такой же бесконечный спор, как и про порядок байт в слове. На самом деле разницы нет.
давно
Профессор
230118
3054
08.09.2011, 14:58
общий
Адресаты:
Типа нет, а сами строки есть.
давно
Академик
20764
1861
08.09.2011, 15:32
общий
Адресаты:
Нету!
Есть тип char (который на самом деле байт), wchar_t (это даже не встроенный тип - определяется где-то в заголовках через typedef) и указатели. Со всем остальным предлагается разбираться самостоятельно, правда, для облегчения работы имеется набор стандартных библиотечных функций.
В C++ есть классы std::string и std::wstring, и те в язык тоже не встроены. Единственное, что встроено в язык - это работа с динамической памятью.
Неизвестный
09.09.2011, 00:48
общий
В моем случае в пятом вопросе оказался ответ: в Паскале. Хотя почему то думала что разницы нет. Всем спасибо.
давно
Академик
20764
1861
09.09.2011, 08:26
общий
Адресаты:

Строковые литералы есть, а строк - нет. И часто встречающиеся у начинающих попытки считать char * строками - самодостаточными объектами приводят к тяжёлым последствиям. Впрочем, что говорить об учениках, если у учителей в голове каша.

Заглянул в "святцы": ISO/IEC 9899:201x
Вот всё что там есть про строки:

6.4.5 String literals
Syntax
1
(...)
Description
2
(...)
Semantics
4
In translation phase 6, the multibyte character sequences specified by any sequence of
adjacent character and wide string literal tokens are concatenated into a single multibyte
character sequence. If any of the tokens are wide string literal tokens, the resulting
multibyte character sequence is treated as a wide string literal; otherwise, it is treated as a
character string literal.
5
In translation phase 7, a byte or code of value zero is appended to each multibyte
character sequence that results from a string literal or literals.68) The multibyte character
sequence is then used to initialize an array of static storage duration and length just
sufficient to contain the sequence. For character string literals, the array elements have
type char, and are initialized with the individual bytes of the multibyte character
sequence; for wide string literals, the array elements have type wchar_t, and are
initialized with the sequence of wide characters corresponding to the multibyte character
sequence, as defined by the mbstowcs function with an implementation-defined current
locale. The value of a string literal containing a multibyte character or escape sequence
not represented in the execution character set is implementation-defined.
6
It is unspecified whether these arrays are distinct provided their elements have the
appropriate values. If the program attempts to modify such an array, the behavior is
undefined.
7
EXAMPLE
(...)


и - про библиотеки:

7. Library
7.1 Introduction
7.1.1 Definitions of terms
1
A string is a contiguous sequence of characters terminated by and including the first null
character. The term multibyte string is sometimes used instead to emphasize special
processing given to multibyte characters contained in the string or to avoid confusion
with a wide string. A pointer to a string is a pointer to its initial (lowest addressed)
character. The length of a string is the number of bytes preceding the null character and
the value of a string is the sequence of the values of the contained characters, in order.


А также описания стандартных библиотечных функций типа strcat()
давно
Профессор
230118
3054
09.09.2011, 20:29
общий
09.09.2011, 20:33
Адресаты:
Не занимайтесь схоластикой.
Вопрос звучит так
В каком алгоритмическом языке — в Паскале или в Си — операция конкатенации (соединения) строк реализуется более эффективно?

Если в СИ нет строк, то вопрос бессмысленный. Объясните это тому, кто задал этот вопрос.
Мне из спрашиваемого понятно, что речь идет о массивах символов, заканчивающихся на \0.
давно
Профессор
230118
3054
09.09.2011, 20:30
общий
Да, в Паскале. А почему, написано в ответе.
давно
Академик
20764
1861
09.09.2011, 20:59
общий
Адресаты:
Схоластикой занимаетесь вы. А я работаю над большими проектами. Не один, а в группе. То, что молодые коллеги криворукие - это нормально - научатся. Хуже то, что они не просто не знают самых элементарных вещей, но их ещё и переучивать приходится. А всё потому, что их учили такие кривоголовые преподаватели, да ещё и с упором на мёртвые языки.
Форма ответа