Выпуск 03: Переменные

 
     

Архив рассылки

Доброго времени суток!

Уже совсем скоро мы перейдём к программированию графики, но перед этим надо ещё чуть-чуть потрудиться. :) И рассылка пока выходит так часто только потому, что ещё нечего изучать. :)

Итак, продолжим нашу тему.

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

Теперь гляньте на следущий пример:

begin
 WriteLn('Skolko budet 2x2?');
 Write('2x2 budet ');
 Write(2*2);
 ReadLn;
end.

Закустите такую программу. Будет написанно 2x2 budet 4. Но почему 2*2 не между апострофами? Потому что это не строка! Это уже арифметическое действие. Если 2*2 поставить между апострофами, т.е. превратить в строку, то на экране пояаится 2x2 budet 2*2. Понятно почему? Теперь посмотрим такой пример:

begin
 WriteLn('Skolko budet (2+2)*2?');
 Write('2x2 budet ');
 Write(2+2*2);
 ReadLn;
end.

(2+2)*2 - математическая запись. Но как в программировании? Запустите такую программу. Какой результат? Из результата можно судить, что в программировании точно также как и в математике. Везде нужны скобки! Первое будет выполнятся действие, которое находится между скобками. Я не думаю, что здесь нужны подробные примеры и практика. Если вы прошли курс второго или третьего класа, скобки вам не препядствие! :)

На дом :) Задание #2. Зделайте программу - "тупой калькулятор" :) Т.е. калькулятор, который будет работать с двумя цифрами и сразу показывая на экране результат деления, умножения, вычитания и сложения этих цифр. Пример ответа:

Цифры: 15 и 3

15 / 3 = 5
15 * 3 = 45
15 + 3 = 18
15 - 3 = 12

Первая строка состоит из 4 команд вывода (Write/WriteLn). Вторая строка является пустой. Третья строка - текст (15/3= ) и результат арифметического действия (5). Остальные строки такие-же.

Задание очень легкое :) Думаю быстро с ним справитесь, а если что - спрашивайте!

Переменные

Переменные - одно из самых главных понятий в программировании. Без переменных не будет работать ни одна "нормальная" (не то, что мы делали) программа!

Великий грех всех программ перед программистами - они делают то, что программист написал, а не то, что он имел в виду.

Без переменных даже калькулятора не сделать!

Вспомните математику :) Вот задача:

x = 5
y = x+2

Чему равняется y? Конечно 7! :) x и y - переменные. В х хранится значение 5. В строке y = x+2 из переменной x "вытаскивается" записанное значение и складывается с двумя. Если изменить значение х, то результат тоже изменится.

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

Hовая акция в нашем магазине: "Купите у нас 1000 мегабайт оперативной памяти - и 24 мегабайта вы получите абсолютно бесплатно!"

В математике переменные хранятся на листе бумаги :) А где они хранятся в программировании? Ведь это не пустое место.

Переменные тоже где-то надо хранить. Но точнее будет не в программировании, а в компьютере! Каждая переменная занимает сколько-то опервтивной памяти в компьютере. Эта память считается байтами. Чем больше переменная - тем больше байтов она занимает в памяти. Но она не может занимать, например, половину байта!

В математике все переменные одинаковые. Все они хранят числа. Но в программировании нет такого понятия, как просто "число". Там или "дробное число", или "целое число". В программировании переменные также могут хранить буквы и строки! Все эти переменные разного типа: одни дробные, другие строковые и т.д. Они не могут быть перемешаны, т.е. в дробную переменную нельзя записать строку. А также в целочисленую переменную не записать дробного значения, потому что пропадёт информация. Например:

a=5
b=3,14
a=b

a - целочисленная переменная, b - дробная. Сколько будет a? Вроде должно быть 8.14, но поскольку целочисленная переменная не может хранить дробного числа результат будет 8. Всё, что было после запятой уплыло в космос :) Тем не менее так делать можно:

a=3,14
b=5
a=b

a теперь будет 5, потому что в дробном числе есть и целая часть.

Все эти записи были математическими. В компьютере вместо запятой для дробного числа надо ставить точку. И в программировании нельзя взять переменную "из воздуха". Её надо создать, т.е. уделить ей места в оперативной памяти, или на харде :)

Сообщение об ошибке Windows, которое я видел своими глазами.
"Невозможно завершить операцию потому что занят Неизвестный"


При работе с переменными могут часто появлятся разные ошибки, так что теперь в два раза чаще проверяйте свой код. И, если что-то не так, Дельфи поможет! :)

Создаём переменные

Этот процесс также можно называть декларированием или описанием.

Переменные декларируются перед началом самой программы, т.е. перед командными скобками. Для создания переменных используется ключевое слово var (сокращение от variable, переменная). В конце точка с запятой не ставится. После этого слова указывается имя переменной и потом, после двоеточия, её тип. Имя переменной не может совпадать с ключевыми словами! Ключевые слова в Дельфи выделяются жирным шрифтом. begin и end тоже ключевые слова. Имя переменной также не может совпадать с названием разных команд, например ReadLn. Пример создания переменной:

var moja_peremennaja: Integer;
begin
...
end.

moja_peremennaja - имя переменной, а integer - её тип. Созданная переменная является целочисленной. Это указывает слово Integer.

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

var
  myInteger, myInteger2: Integer;
  mYrEaL, myReal2: Real;
  my_String, myString2: String;
  my25Char: Char;
  _15ppp: Boolean;
  12картошкаMX##: Integer;

begin
...
end.

Последняя переменная явно не правильная. Также надо знать, что язык дельфи не чувствителен к регистрам букв, т.е. myVar и MYvar это одно и тоже самое.

Типы переменных

В предыдущем примере я создал несколько переменных разного типа:

Integer - целое число
Real - дробное число
String - строка
Char - символ
Boolean - тип для сравнений, который может иметь всего 2 значения: True (или 1) - да/истина, False (или 0) - нет/ложь.

Строка - последовательность разных символов, записывается между апострофами. Символ - число (от 0 до 255, или от -128 до 127) или одна буква/знак. Символ занимает всего один байт в памяти и по этому может иметь всего 256 вариантов значений. В одном байте 8 бит и каждый бит может иметь 2 значения. Чуть-чуть о байтах.

Оди байт выглядит так: 0000 0000. Здесь 8 битов. Каждый может принять значение равно 1 или 0. 0000 0000 равно нулю. Единица будет 0000 0001, двойка 0000 0010, тройка 0000 0011, четвёрка 0000 0100, пятёрка 0000 0101, шестёрка 0000 0110, семёрка 0000 0111, восмёрка 0000 1000 и т.д. Всего 256 вариантов. Поняли как всё дейвствует? Символов тоже 256 (a..z, A..Z и т.д.). Каждый символ имеет свой код, т.е. своё число. Так что это самый лучшый тип для хранения символа. Тип Boolean может иметь значение 0000 0000 (False, 0, ложь) и 0000 0001 (True, 1, истина). Об этом типе ещё поговорим потом. Если тип Cha (для той-же цели тип может быть Byte, разницы нету) занимает всего 1 байт, то Integer в зависимосьти от компилятора занимает 2 или 4 байта. В Дельфи он занимает 4 байта, соответственно этот тип может иметь несколько миллионов значений. Чтобы узнать сколько места занимает какой-либо тип существует функция sizeof(тип), например после компиляции следущего кода:

begin
 WriteLn(SizeOf(Real));
 ReadLn;
end.

можно узнать сколько места занимает одна переменная типа Real. 8 байтов! Конечно это очень большое значение. Для дробных чисел также можно использовать тип Double. Типов на самом деле на много больше, и мы с некоторыми из них познакомимся потом.

Значения нужных типов вы можете найти в справке Дельфи.

Константы

Константа - постоянная величена. Например "пи" - константа, корая имеет значение 3.1415... Этого значения изменить нельзя, как и у других констант. Вы всё это уже должны знать из школы :)

Как и переменные, константы определяются перед командными (логическими) скобками, только уже после слова const (как и в математике). Константе не надо пределять тип. Зато сразу надо присвоить значение! Значение присваевается с помощью оператора сравнения (а в математике это был бы оператор присваивания). Пример:

const
  pi = 3.1415;
  myChar = 'F';
  digit = 3564654;
  line = 'Hello, World!';
  sum = pi + digit;

var
...

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

Гляньте на следущий пример:

{$APPTYPE CONSOLE}

const
  pi = 3.1415;
  d = 10;

begin
 Write('Plosiad kruga, kogda d=10 budet ravna: ');
 WriteLn(pi*((d/2)*(d/2)));
 ReadLn;
end.

Вы знаете (может только не помните :), что площадь круга находится по формуле s=pi*r*r. Пи умножен на r в квадрате, когда r=d/2. Эта программа ищет площадь круга. Главное не запутаться в скобках. Всегда считайте сколько открытых и закрытых скобок! В программе сначала два раза d делится на 2, так получаем две переменные r, потом их умножаем между собой, получая r в квадрате. Потом умножаем на пи.

Можно делать и так:

const
  pi = 3.1415;
  d = 10;
  s = pi*((d/2)*(d/2));

begin
 Write('Plosiad kruga, kogda d=10 budet ravna: ');
 WriteLn(s);
 ReadLn;
end.

Всё очень просто. :)

Оператор присваивания

Значение переменных им присваиваются между командными скобками begin и end, потому что эти значения можно в любой момент изменить. Для присвоения значений нужен оператор присваивания. При работе с константами мы использовали оператор сравнения (хоть там он делал другую работу, т.е. не сравнивал, а присваивал). Этот оператор выглядит так: :=, и записывается переменная:= значение;. Сразу приведу пример:

var i: Integer;
begin
 i:= 1;
 Write('i1 = ');
 WriteLn(i);
 i:= 110;
 Write('i2 = ');
 WriteLn(i);
 ReadLn;
end.

Думаю, здесь нечего объяснять. :) Программа два раза на экран выводит значение переменной i. Обратите внимание каким образом программа показывает значение переменной (и константы, см. предыдущий пример). Между скобками указывается переменная. Она не должна быть между апострофами, иначе на экране появится просто буква.

Считываем данные с клавиатуры

Программы были бы почти безсмысленными, если пользователь не мог в нужных местах вводить свои значения. Word небыл бы Word'ом, если там нельзя было бы печатать. :) А все эти данные хранятся в переменных, т.е. записываются туда при вводе нужных значений в нужные поля. Нам уже знакомая процедура ReadLn и созданна для того, чтобы считывать данные с клавиатуры.

Чтобы эти данные записать в переменную, в скобках ReadLn надо просто указать имя переменной. Также есть функция Read. Одна из них после получения данных сразу начинает новую строку, а другая - нет. Вот примерчик:

var i, f: Integer;
begin
 Write('Vvedite pervoje cislo -> ');
 ReadLn(i);
 Write('Vvedite vtoroje cislo -> ');
 ReadLn(f);
 Write('Summa etix cisel ravna ');
 WriteLn(i+f);
 WriteLn('Nazmyte ENTER dlia vyxoda...');
 ReadLn;
end.

Поняли как всё действует? После введения числа надо нажать на Enter. Можно также ввести сразу два (или больше) числа. Для этого в команде ReadLn надо указать две переменные, отделяя их запятой.

var i, f: Integer;
begin
 Write('Vvedite 2 cisla -> ');
 ReadLn(i, f);
 Write('Summa etix cisel ravna ');
 WriteLn(i+f);
 WriteLn('Nazmyte ENTER dlia vyxoda...');
 ReadLn;
end.

Это очень легко! :)

В программе, когда вводите два числа надо их отделять пробелами, или после каждого ввода нажимать Enter.

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

var a, b: Integer;
begin
 Write ('Vvedite dve storony kvadrata -> ');
 ReadLn(a, b);
 Write('Plosiad'' kvadrata ravna ');
 WriteLn(a*b);
 ReadLn;
end.

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

На сегодня хватит. :)
 

2005-10-02

Автор, ведущий и дизайнер рассылки: Евгений Нарышкин (spider3d@yandex.ru)

OpenGL для начинающих (under construction): http://spider3d.narod.ru/

Хостинг от uCoz