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

Программирование с нуля - это совсем просто! 14) От калькулятора к компьютеру


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

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

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

14) От калькулятора к компьютеру

Пока изученные нами возможности Delphi практически не отличаются от возможностей среднего калькулятора. Компьютер просто выполняет различные арифметические расчеты. Причем расчеты ведутся над числами, которые закладываются программистом в исходные тексты - следовательно, их значения будут однозначно заданы и в исполнимом коде. Такие жестко заданные в тексте программы значения называются константы. Значение их на всем протяжении работы приложения не меняется.

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

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

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

Связывание названий переменных с конкретным местом в памяти выполняет компилятор, поэтому прикладному программисту можно не беспокоиться о том, как это происходит.

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

Создание переменных

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

Объявление переменных может выполнятся в разных местах программы, но лучше это делать где-нибудь в начале текста, чтобы потом не отыскивать нужное место. Некоторые языки программирования вообще разрешают объявлять переменные только в начале различных блоков, модулей текста.

Создание переменной в программе на Паскале происходит с помощью команды var (variable), за которой следует одно или несколько названий переменных, перечисленные через запятую. Все эти названия не должны совпадать друг с другом, с определенным набором слов Delphi, которые уже применяются для других целей в самом языке (например, begin и end; такие слова называют служебными, ключевыми или зарезервированными; они, кстати, в редакторах подсвечиваются другим цветом), а также и с различными стандартными названиями функций, которые подключаются из библиотек.

Отметим различие между понятием "команда" программы и "оператор" программы. Команда - понятие универсальное и представляет собой произвольную инструкцию компьютеру (а нередко - и компилятору) на выполнение некоторых действий.

А оператор - это команда, которая отдается с помощью ключевых слов и некоторых символов конкретного языка программирования. Например, в Паскале команда вывода WriteLn() считается оператором языка, а вот в Си команда cprintf() не входит в список служебных команд языка, а считается функцией, вызываемой из библиотеки. Но операторы обычно предназначены прежде всего для управления логикой выполнения программы, а не для выполнения конкретных операций, поэтому подход Си более корректный.

В некоторых языках все команды считаются операторами. В других есть разделение между операторами, командами описания и т. д. Так, var в Паскале, строго говоря, это не оператор, потому что резервирование места в памяти выполняет компилятор, и при выполнении программы команда var уже вообще не существует - все связи между переменными подготовлены заранее. То есть команда var на самом деле в готовой программе не выполняется. Нужна она для удобства нас с вами - чтобы явно видеть, какие переменные мы решили использовать.

Но это тонкости, не очень важные. Главное, знать, что перед использованием переменных их надо объявить с помощью соответствующей команды языка программирования. А как, кем и когда она будет реализовываться, прикладному программисту знать не так важно.

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

Privet
i
Agent007
Delphi_1234567

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

ADD
Add
aDd

После идентификатора - названия переменной - в команде var ставится двоеточие, после чего указывается вид (обычно называемый тип) данных, которые записываются и хранятся в этой переменной. В заключение ставится, как обычно, точка с запятой.

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

Каждому типу данных соответствует свое ключевое слово Delphi. Так, целому типу соответствует название Integer, дробному - Real, строке - String.

А вот примеры их определений:

Var Privet: Integer;

Var i: Real;

Var Agent007, Delphi_1234567: String;

В последнем случае обе переменные Agent007 и Delphi_1234567 считаются имеющие тип "строка" (предназначены для хранения строк).

После того, как переменная в программе определена, ее можно использовать - но только в тех командах, которые будут следовать после Var. Условно можно считать, что как только компилятор встретит команду

Var Privet: Integer;

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

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

Одно из важнейших предназначений переменных - хранение данных, полученных от пользователя. В дальнейшем эти данные можно обрабатывать в программе самыми разными способами.

Способы занесения данных в переменные и считывания в следующем занятии.

Вот как могут быть определены переменные в программе на Delphi:

{$APPTYPE CONSOLE}

Var Privet: Integer;

Var i: Real;

Var Agent007, Delphi_1234567: String;

begin

Write(2 + 2);

ReadLn;

end.

В Delphi-программах команда описания переменных var должна располагаться вне пары ключевых слов begin / end ! Тем самым подчеркивается ее не-выполняемость, инструктивность, пассивность.

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

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

Это сообщения компилятора, который обнаружил, что в исходном тексте не все так гладко, как было раньше. Компилятор вообще - инструмент очень интеллектуальный, он выявляет такие вещи и неточности в исходных текстах, которые человеку часто очень сложно заметить. Поэтому к его подсказкам всегда имеет смысл прислушиваться. Кстати, перед запуском программы можно предварительно скомпилировать исходный текст без выполнения - для этого надо нажать комбинацию клавиш Ctrl + F9. Это полезно, чтобы убедиться, нет ли в тексте каких-либо неточностей.

В нашем случае серьезных ошибок не обнаружено. Все сообщения компилятора начинаются со слова hint - подсказка. Это значит, что программа работоспособна, только ее работа может отличаться от того, что программист задумал. Тексты всех подсказок практически одинаковы. Например: Variable Privet is declared but never used. Оно гласит: переменная Privet объявлена, но нигде не используется. То же и в отношении других переменных. Видите, какой умный компилятор!

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

Например, если в одной из команд var пропустить двоеточие

Var i Real;

то появится точное сообщение об ошибке: ", or : expected" - символ запятой или двоеточия пропущен! И т. д. Поэкспериментируйте с программой, позадавайте ей различные неверные варианты текста, два раза переменную объявите там, убедитесь, как метко компилятор находит ошибки.

В идеале хороший код не должен содержать ни одного, как говорят программисты, хинта, не говоря уже о варнингах :)


В Бейсике вместо слова var выбрано слово Dim. Вместо двоеточия после названия переменной ставится ключевое слово As. Целое так же Integer будет, строка - String. Только для дробных вместо Real надо указывать Double.

Module Module1

Sub Main()

Dim i, Privet As Integer
Dim s As String
Dim Real As Double

Console.WriteLine("Hi. I am.")
Console.Write(2 + 2)
Console.ReadLine()

End Sub

End Module

Команду компиляции (без запуска на выполнение) можно выполнить в Visual Studio .NET комбинацей клавиш Ctrl + Shift + B.


В Си++ чуть-чуть посложнее. Здесь сначала указывается тип переменной, потом - она сама (список идентификаторов через запятую), и точка с запятой в конце. И никаких Var и Dim! Си вообще очень краткий. Кроме того, в нем делается разница между записью маленькими и большими буквами - переменные i и I считаются разными! Часто начинающие с этим путаются. Вроде переменная есть, а программа ее не понимает :)

Целое обозначается ключевым словом int, дробное - float.

#include "stdafx.h"

int i, Privet;
float X;

int main() {

}

Со строками посложнее.

Типы данных, которые имеются в языке и не требуют подключения внешних библиотек для их использования, называются базовые. В Паскале Integer и String базовые типы, в Бейсике - тоже (по-моему :). А в Си++ базовые int и float, а вот строки - нет. Для работы со строками надо внешние библиотеки подключать.

Например, есть в Си++ такой тип CString, для его использования нужна библиотека atlstr.h. Тогда программа, в которой можно создавать переменные, хранящие строковые данные (точнее, данные типа CString), так запишется:

#include "stdafx.h"

#include "atlstr.h"

CString s;

int main()
{

}

Здесь s - переменная типа CString.


Что-то интернет не работает, вся работа парализована :) Никак не сделаю выпуск с заданиями и решениями. В следующий раз - точно! :)


(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
Отписаться

В избранное