В учебнике ошибка или я не понимаю? Помогите пожалуйста. - страница 2

 

Да там же, в хелпе:

double MathCeil ( double x)
Функция возвращает числовое значение, представляющую наименьшее целое число, которое больше или равно x.

 

Извините, что вмешиваюсь в дискуссию, но в учебнике есть еще одно место, которое заставило меня напрячься (не имея пока достаточно заний и опыта приходится все прокручивать в голове и придираться ко всему). Я вроде уже все выяснил, но для других, кто только начинает осваивать азы, возможно не лишним будет пояснение.

Дело в следующем:

Раздел "Операции и выражения" Вот что я там увидел:

1. Вычисление выражения производится слева направо, причём каждый промежуточный результат вычисляется по правилам приведения типов и вычисления значений и уже в таком виде участвует в дальнейших вычислениях.
2. Задача 6. Вычислить значения выражений А/В*С и А*С/В для целых чисел А, В и С.
int A = 3; // Значение целого типа
int B = 5; // Значение целого типа
int C = 6; // Значение целого типа
int Res_1 = A/B*C; // Результат 0 (ноль)
int Res_2 = A*C/B; // Результат 3 (три)

С этим все понятно - по правилам.

3. Фрагмент из рабочей программы, написанной для обучения, по расчету гипотенузы:

int A = 3; // Первый катет
int B = 4; // Второй катет
int C_2 = A*A + B*B; // Сумма квадратов катетов
int C = MathSqrt( C_2); // Вычисление гипотенузы

Вот здесь стало не понятно.

Так как в самом начале раздела отмечаются различия между языком программы и некоторыми математическими алгоритмами, фраза "по правилам приведения типов и вычисления значений", была понята мною так:

по правилам приведения типов - речь об иерархии типов: string - double - все остальные

по правилам вычисления значений - речь идет о правилах округления целых чисел типа int

Таким образом, Согласно п. 1 получаем:
int C_2 = A*A + B*B = 3*3+4*4 = 9+4*4 = 13*4 = 52

Может стоит добавить в правило что-то вроде "при этом операции выполняются в математической последовательности".

 
В учебнике (справочнике) должно быть:


double MathCeil ( double x)
Функция возвращает числовое значение, представляющую наименьшее целое число, которое больше или равно x.
Параметры:
x - Числовая величина.
Пример:
  double y;
y=MathCeil(2.8);
Print("наибольшее целое число для 2.8 есть ",y);
y=MathCeil(-2.8);
Print("наибольшее целое число для -2.8 есть ",y);
/*Вывод:
наибольшее целое число для 2.8 есть 3
наибольшее целое число для -2.8 есть -2*/
 

Andy_Kon, а вот эту фразу ты понимаешь?

double MathFloor ( double x)
Функция возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x.

 
Mathemat:

Andy_Kon, а вот эту фразу ты понимаешь?

double MathFloor ( double x)
Функция возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x.

>>эту фразу ты понимаешь...

1. Я не помню, чтобы мы вместе пили (не переходим на фамильярности).
2.
double MathFloor ( double x)
Округляет дробь в меньшую сторону.
Возвращает ближайшее меньшее целое от х.
 

ОК, на Вы. На самом деле это не фамильярность, но я спорить не собираюсь.

Возвращает ближайшее меньшее целое от х.

Ага, аналогично: это и есть максимальное из всех целых, которые не больше числа х. Эту фразу Вы тоже не понимаете?

P.S. Ну и ладно. Проехали.

 
Caresser:


Может стоит добавить в правило что-то вроде "при этом операции выполняются в математической последовательности".

Общий смысл замечания понятен.

Вообще-то, как само собой разумеющееся, нужно понимать, что приоритет математических операций в программировании сохраняется таким же, как и в простой арифметике. Разница состоит лишь в том, что в программировании, при вычислении промежуточных значений, работает правило отношения типов.

Поскольку возник вопрос, то придётся, видимо, изменить формулировку и дать небольшой пример с комментариями. Подумаю как лучше это сделать.

Спасибо, что обратили внимание.

 
Mathemat:

ОК, на Вы. На самом деле это не фамильярность, но я спорить не собираюсь.

Возвращает ближайшее меньшее целое от х.

Ага, аналогично: это и есть максимальное из всех целых, которые не больше числа х. Эту фразу Вы тоже не понимаете?

Не о том спор.
О способе написания.
Чтобы было всегда и всем понятно.

double MathFloor ( double x)
Функция возвращает числовое значение, ближайшее меньшее целое от x.
Округляет дробь в меньшую сторону.

double MathCeil ( double x)
Функция возвращает числовое значение, ближайшее большее целое от x.
Округляет дробь в большую сторону.

Вот и всё.
 

По ходу та же ошибка, про которую писал в первом посте.

На этот раз глава "Оператор continue":

{ // Начало тела внешн. цикла
//--------------------------------------------------------------
for ( day = 1 ; day <= 30 ; day ++ ) // Цикл по дням месяца
One_Farm = One_Farm * ( 1 + Perc_day 100 ) ; //Накопление на 1й ферме
//--------------------------------------------------------------
Mons ++; // Считаем месяцы
if ( One_Farm < One_Farm_max ) // Если меньше допустимого,.
continue ; // .. то овец не переводим
Two_Farm = Two_Farm + One_Farm * Perc_exit 100 ; //Количес. на 2 ферме
One_Farm = One_Farm * ( 1 - Perc_exit 100 ) ; // Остаток на 1 ферме
} // Конец тела внешнего цикла


Кажется везде (не только в этом моменте, - по ходу всей главы) вместо Perc_day100 и Perc_exit100 должно быть Perc_day/100 и Perc_exit/100

Я прав?

 
Caresser:

Кажется везде (не только в этом моменте, - по ходу всей главы) вместо Perc_day100 и Perc_exit100 должно быть Perc_day/100 и Perc_exit/100

Я прав?

Вы правы (скачал sheep.mq4, сверил, исправил). Спасибо!
Причина обращения: