Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 12) Вспоминаем арифметику


Информационный Канал Subscribe.Ru

 
Школа программирования

Программирование с нуля - это совсем просто!

12) Вспоминаем арифметику

Delphi позволяет использовать в программе четыре арифметических оператора, составляя из них общепринятым способом различные выражения. Так, чтобы показать на экране сумму двух чисел 2 и 2, можно записать такую команду:

WriteLn(2 + 2);

Ранее мы использовали для вывода на экран строки, которые брались в кавычки (с представлением которых я до сих пор в рассылке мучаюсь :). А числа представляются как есть. То есть будет разница в программе между числом 2 и строкой '2'. В чем разница? В том, что число - это число, а строка - это строка :)

Два числа 2 и 2 будут сложены автоматически перед выполнением команды вывода на экран. Сложит их процессор во время работы программы (а нередко бывает и так, что такие вычисления выполняет компилятор еще в момент анализа текста, а в программу сразу записывает готовый результат 4, процессору даже напрягаться не придется; но программистам до этого дела нету). То есть к моменту выполнения эта команда будет условно выглядеть так:

WriteLn(4);

Для обозначения умножения используется символ *, для обозначения деления - символ /. В других языках обычно имеются небольшие отличия, но как правило базовые арифметические символы одинаковы.

Запись арифметических выражений происходит с учетом общепринятых в арифметике приоритетов операций. Например, следующая команда выведет на экран число 5:

WriteLn(1 + 2 * 3 - 8 / 4);

Ведь сначала выполняется умножение и деление, а потом сложение и вычитание. Правда, выведет она его с дробной частью. Почему, будет далее рассказано.

В силу различных конструктивных особенностей процессор значительно быстрее выполняет арифметические операции с целыми числами. Расчеты с дробными числами происходят гораздо медленнее. Поэтому, в частности, компьютеры снабжались так называемым арифметическим сопроцессором (как сейчас, не знаю даже :), который берет на себя ускоренное выполнение команд, связанных с дробными числами. По этой же причине в языках программирования достаточно четко различаются целые и дробные числа. По умолчанию считается, что числа, указанные в выражении - целые, если в них не содержится знак-разделитель "." (символ дробной запятой). Практически во всех языках программирования таким символом служит точка, а дробные числа принято называть числами с плавающей запятой. Мы тоже будем придерживаться этой терминологии.

Вот так может быть записано число пи в обозначениях Delphi:

3.1415927

А следующая команда покажет на экране значение 8,3:

WriteLn(1.1 + 2.2 * 3.5 - 4 / 8);

Только оно будет как-то так выглядеть в консоли: 8,300000000000000000000. Это потому, что дробный результат по умолчанию именно таким видом представляется в Delphi. В дальнейшем мы узнаем, как его в нормальный вид переводить.

Как принято, первыми выполняются операции умножения и деления, затем - сложения и вычитания. Если порядок вычислений надо изменить, можно воспользоваться круглыми скобками:

2 * (3 + 4) (1.1 + 2.2) * ((3.5 - 4) / 8 + 0.6)

При этом значение, выводимое на экран, представляются уже не в виде, принятом в конкретной среде программирования и используемом только программистом, а в виде, "удобном" конечному пользователю программы. Удобном по мнению программы :) Поэтому так много нулей для нашего удобства и выводится :)

Это, в частности, относится к десятичному разделителю. Для русскоязычной версии Windows и в зависимости от региональных настроек в качестве такого символа выступает символ-запятая ",". Но это только при отображении результатов! В самом программном коде практически во всех языках программирования для отделения целой и дробной частей точка применяется.

Не следует указывать слишком большое количество разрядов после десятичного разделителя. Ведь возможности компьютера ограничены и он не может работать со слишком длинными числами, вне зависимости от того, имеется ли в них запятая разделителя или нет (хотя и показывает кучу нулей :). В абсолютном большинстве практических и прикладных задач 6-7 знаков после запятой более чем достаточно.


Большие значения чисел с плавающей запятой
Значения результатов вычислений могут быть очень большими. Так, максимальным в некоторых случаях может быть число, у которого насчитывается более трехсот знаков. Вместе с тем хранить его точно компьютер не может. Поэтому такие числа представляются в особом формате с плавающей запятой. Он состоит из дробного числа - одного разряда целого в диапазоне от 0 до 9, и набора чисел после запятой. При необходимости можно указать и вторую часть такого числа. Она сразу следует за последним знаком дробной части, начинается с буквы e или E (от английского exponent, показатель степени) и продолжается показателем степени - числом со знаком, состоящим из 2-3 разрядов. Вторая часть фактически представляет собой обозначение числа 10, возведенного в степень, заданную этим показателем. Если знак показателя отрицательный, что считается, что 10 возводится в отрицательную степень.

Так, величину 30000 (3 * 10000 , 10 в четвертой степени) можно записать следующим образом:

3E+4

А величину 0,031 (3,1 * 0,01 , 10 в степени -2) - так:

3.1e-2

Нередко и результаты показываются схожим образом, с буковой E.


Если надо вывести на экран несколько значений в строчку, можно воспользоваться командой

Write( список-значений );

Она отличается от команды WriteLn() только тем, что после вывода значения на экран не происходит перехода на новую строчку. Таким образом, в одной строке можно показывать сразу несколько значений. Только для их отделения друг от друга понадобится указывать команды вывода пробелов, иначе выводимые числа будут следовать друг за другом непрерывно, без разделителей.

Следующая последовательность команд

{$APPTYPE CONSOLE}

begin

Write('Sum 2+2 = ');

Write(2 + 2);

Write(' ; 2.5 + 2.5 = ');

WriteLn(2.5 + 2.5);

ReadLn;

end.

покажет на экране примерно такую строчку:

Sum 2+2 = 4 ; 2.5 + 2.5 = 5,0000000000000


В Бейсике вывод значений арифметических выражений схож. Вместо Console.WriteLine можно использовать Console.Write:

Module Module1
Sub Main()
Console.Write("Sum 2+2 = ")
Console.Write(2 + 2)
Console.Write(" ; 2.5 + 2.5 = ")
Console.WriteLine(2.5 + 2.5)
Console.ReadLine()
End Sub
End Module


А вот в Си++ (C++Builder, Visual C++) уже посложнее. Существуют на самом деле достаточно простые возможности вывода данных (не строк) на экран, но они ориентированы именно на консольные приложения (работу с так называемым стандартным вводом и стандартным выводом, по умолчанию которые суть клавиатура и текстовый экран монитора). Нам же нужны более гибкие и, главное, рассчитанные на перспективу средства вывода. Поэтому придется немного попотеть :)

Вот какой жуткой командой вывода значения арифметического выражения мы сейчас воспользуемся:

cprintf("%d", 2+2 );

На самом деле нам пока разбираться в ее структуре необязательно. Просто запомним для последующей практики такую схему команды вывода целых значений:

cprintf("%d", формула-расчета );

Вместо формулы расчета подставляем, как в вышеприведенных примерах, конкретное выражение, и получаем нужный результат при выводе. Для вывода дробных значений подойдет такая форма команды:

cprintf("%2.2f", формула-расчета );

Разница, как мы видим, только внутри записи строки в кавычках.

Для желающих сразу :) разобраться, поясню. Команда cprintf() расшифровывается как console print (консольная печать). Первая строка в скобках ("%d" например), задает формат вывода последующего выражения на экран. Так, буковка d (decimal, десятичное) указывает, что выводимое число надо трактовать как целое. А буковка f (float, с плавающей запятой) указывает на дробное значение. Вот и все.

#include <conio.h>

int main()
{
cputs("Sum 2+2 =");
cprintf("%d", 2+2 );
cputs("; 2.5+2.5 =");
cprintf("%f", 2.5+2.5 );
getch();
}

Задание. Посчитайте с помощью выбранной среды разработки, используя ее фактически как калькулятор, следующие формулы:

http://russianenterprisesolutions.com/sbo/im/26.gif

Я сразу и решение там сказал. Зачем его скрывать-то? Самого себя обманывать смысла нету, очевидно.
Только не забывайте, что вместо десятичной запятой надо точку использовать в тексте программы. И про представление с буквой E в числе тоже.


В прошлом выпуске опять кусочек текста пропал, между одинарными кавычками. Пытаюсь что-то придумать (к сожалению, авторские копии приходят нормальными, поэтому даже проверить не могу нормально), но если в тексте встречаются какие-то явные пропуски и нестыковки, то посмотрите последний выпуск на сайте, вот тут:

http://russianenterprisesolutions.com/sbo/base.htm

Так что не обессудьте, если рассылка пару раз к вам придет.

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


(c) 2004 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
http://russianenterprisesolutions.com/sbo/

Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/base.htm

 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull
Отписаться

В избранное