Учебник Информатика. Базовый курс. Симонович С.В.. С. В. Симоновичаинформатикабазовый курс2е издание
Скачать 17.96 Mb.
|
1 операнд true true false false 2 операнд true false true false И true false false false true true true false исключающее false true true false (только первый операнд) false false true true В следующей таблице приведен синтаксис записи логических операций. Приоритеты всех логических операций ниже, чем приоритеты операций сравне- ния, поэтому сравнения всегда выполняются первыми. А логические операции вычисляются в следующем порядке: сначала НЕ, потом И, потом ИЛИ. При необ- ходимости этот порядок может быть изменен с помощью скобок. Примеры логических выражений: 1 && xl <= 10 (R > 3.14) and (R < 3.149) (Value < Oldvalue) OR (Value <> 0) 20.3. Алгоритмическое (модульное) программирование 5 8 7 Логический тип Бейсик Базового типа нет. Используется числовой тип INTEGER Паскаль boolean Си++ Строчные выражения Строки в языках программирования всегда заключаются в кавычки. В Си++ и Бей- сике для этого используются двойные кавычки, в Паскале — одинарные. "это строка Бейсика или Си++" строка Паскаля' Строка может быть пустой — не содержать ни одного символа. Например: Как правило, строки можно сравнивать друг с другом на эквивалентность (равно и не равно). В некоторых языках программирования допускаются также сравнения типа «больше» или «меньше» — при этом происходит последовательное сравне- ние значений символов (каждый символ представляется в компьютере конкрет- ным Кроме того, часто допускается также операция сцепления строк, записываемая с помощью символа «+». Например: "123" + "4567" - получится "абв " + "abc " + " эюя" — получится "абв abc эюя" Тип «строка» Бейсик STRING Паскаль string Си++ Базового типа «строка» нет Указатели Некоторые языки программирования допускают в явном виде работу с указателями — адресами физической памяти. При этом в них имеется специальная операция полу- чения адреса конкретной переменной, что позволяет работать с памятью напрямую, примерно так, как это происходит в языках ассемблера. Такая возможность позво- ляет добиваться высокой эффективности работы программы, но часто приводит к ошибкам, если указатель вдруг получает неверное значение и при его использова- нии начинает портиться область памяти, предназначенная совсем для других целей. Сложные данные Структуры. До сих пор рассматривались базовые типы данных: числа, строки, логи- ческие величины — и операции над базовыми данными. Однако для повышения производительности труда программистов и повышения качества их работы необ- ходимо, чтобы язык программирования имел средства, позволяющие описывать данные в виде, максимально приближенном к их реальным аналогам. Например, 5 8 8 Глава 20. Основы программирования чтобы организовать обработку данных по студентам, в программе удобно не про- сто описать десяток различных переменных, а объединить их в структуру (или запись) «студент», состоящую из полей разного типа «имя», «пол», «год рожде- ния», «группа» и т. д. Современные языки программирования позволяют применять такие сложные типы данных, составляющиеся из базовых и определенных ранее сложных типов. В ре- зультате удается организовывать структуры данных произвольной сложности: списки, деревья и т. п. При этом структура объединяет группу разных данных под одним названием. Получить доступ к отдельным составляющим (полям) этой структуры их именам. В рассматриваемых языках программирования такой доступ осуще- ствляется указанием имени структуры и имени поля через точку. Если подобным способом происходит обращение к полю, которое само является структурой, то выделение нужного поля продолжается приписыванием справа имени вложенного поля через точку. Синтаксис описания структуры 20.3. Алгоритмическое (модульное) программирование 5 8 9 Доступ к содержимому структуры: 1980; Массивы. Доступ к элементам структуры осуществляется по имени ее составляю- щих. В одних случаях это значительно повышает наглядность исходных текстов и упрощает процесс программирования, но имеется немало ситуаций, когда надо организовать обработку больших объемов данных одного типа, при этом создавать структуры с сотнями и тысячами полей неразумно. Поэтому в дополнение к струк- турам в языки программирования введено массива, сложного типа данных, доступ к элементам которого происходит по их положению, по номеру или индексу. Например, можно описать массив, состоящий из тысячи элементов численного типа, и затем обратиться к десятому или сотому элементу по его номеру. При описании массива обычно указывается размер (число элементов) или верх- няя и нижняя границы — диапазон, в рамках которого можно обращаться к элемен- там массива. Синтаксис описания массива В Бейсике нижней границей считается 1, в Си++ — 0, в Паскале она указывается Вот примеры описания массивов. Бейсик: DIM AS INTEGER Паскаль: of i n t e g e r Си++: i n t Доступ к элементу массива осуществляется по его номеру. Этот номер указывается в круглых (Бейсик) или квадратных (Паскаль, Си++) скобках сразу за именем массива (такое действие называется индексированием): 12 ) ] Массивы, границы которых явно заданы в команде описания, называются стати- ческими. Их размер известен заранее и не меняется на всем протяжении работы программы. В последних версиях компилируемых языков программирования реализуются так называемые динамические массивы, размер которых может меняться во время выполнения программы. В ряде случаев это весьма удобно, так позволяет эко- номно расходовать память, захватывая ее по мере необходимости. Недостаток дина- мических массивов в том, что организовать эффективную работу с ними, исполь- 5 9 0 Глава 20. Основы программирования зуя компиляторы, сложно. Приходится выполнять множество проверок, связан- ных с расходованием памяти компьютера, что понижает общую эффективность приложения. Динамические массивы в Паскале начали поддерживаться совсем недавно, с активным распространением новых мощных ПК, а в интерпретируемых языках типа Бейсика это было сделано довольно давно. Во многих языках программирования строки рассматриваются как массивы сим- волов. Их допускается индексировать как обычные массивы. Правила работы со сложными типами Отличие базовых типов от сложных в том, что в базовых типах нельзя выделить составные части. При этом поле структуры или элемент массива считаются обыч- ными переменными, и их использование в любых операторах ничем не отличается от использования переменных базовых типов. В развитых языках программирования допускаются массивы, состоящие из струк- тур, и структуры, состоящие из массивов. При этом достаточно слож- ные формы записи, например: Массив а состоит из структур, в описании которых есть поле Items, являющееся тоже структурой, имеющей поле Strings, которое, в свою очередь, представляет собой массив структур, имеющих поле value. Описание переменных Чтобы переменную можно было использовать в программе, ее надо предварительно описать, указав ее тип. Пока переменная не описана, к ней нельзя (хотя в некоторых языках, например в Бейсике и Фортране, считается, что все перемен- ные, не объявленные явно, имеют числовой тип). После того как переменная опи- сана, к ней можно обращаться, но она обычно исходно имеет неопределенное значе- ние, поэтому ее надо предварительно инициализировать — присвоить ей начальное значение. Синтаксис команд описания данных Бейсик DIM имя AS тип Паскаль var имя: тип; Си++ тип имя; Вот примеры описания переменных. Бейсик: DIM X AS DOUBLE Паскаль: var x: real; var Str: record integer; S: string; end; 20.3. Алгоритмическое (модульное) программирование 591 Си++: float int При описании переменных одного типа в Паскале и Си++ их можно указывать через запятую. Паскаль: var хх, i n t e g e r ; Си++: i n t z2; Новые типы данных При определении нескольких переменных со сложной структурой удобно описы- вать каждую переменную, многократно используя одну и ту же запись структуры. Если, например, в нее потребуется внести изменение (добавить новое поле, изме- нить тип существующего и т. д.), то придется делать это несколько раз, рискуя ошибиться и пропустить одно из описаний, особенно они сделаны в разных местах программы. Чтобы избежать этой проблемы и позволить программистам активно применять нужные структуры данных, в современных языках программирования разрешено определять собственные типы данных, которые допускается использовать в коман- дах описания наравне с базовыми типами. Синтаксис описания нового типа Бейсик Аналогичен описанию структуры, которое уже является описанием нового типа Паскаль type имя = описание; Си++ struct имя-структуры { поля-структуры; } имя; Имя структуры надо указывать только из-за требований синтаксиса. Реально оно нигде не применяется Название нового типа можно использовать во всех последующих командах описа- ния переменных. Паскаль: type = array[0..99] of integer; type TMyRecord = record integer; Item2: string; end; var TMyArray; var R: TMyRecord; 5 9 2 Глава 20. Основы программирования Си++: typedef struct { int float } TNewStruct; NewStruct; Разделение операторов Если записать подряд несколько операторов и не указать, где кончается один и начинается другой, то в процессе компиляции возникнет множество проблем с выделением отдельных операторов. Поэтому операторы в и Си++ отде- ляются друг от друга точкой с запятой «;» (каждый оператор в этих языках должен заканчиваться таким символом), а в Бейсике — двоеточием «:» или переходом на новую строку. Блок операторов Часто в программе возникает необходимость выполнить группу операторов (напри- мер, в зависимости от какого-либо условия). Такая группа объединяется в блок с помощью специальных скобок начала и конца блока, логическими скоб- ками. В Бейсике явного понятия «блок операторов» нет, в Паскале для этого использу- ются ключевые слова begin и end, а в Си++ — фигурные скобки «{» и «}». Область действия переменных Команды описания переменных могут встречаться в разных местах программы. При этом считается, что объявленные в них переменные являются локальными и их область действия — текущий блок, в котором они описаны. Как только встреча- ется логическая скобка, закрывающая блок (например,«}»), соответствующая пере- менная перестает существовать, а выделенная для нее память освобождается. Некоторые переменные описываются вне блоков и доступны из любого места про- граммы. Оператор присваивания Оператор присваивания позволяет изменять текущее значение переменной. Син- таксис его очень простой. В левой части оператора присваивания указывается имя переменной, значение которой изменяется, а справа — выражение, значение кото- рого будет записано в переменную. При этом старое значение, хранившееся в ней, безвозвратно пропадет. Сам оператор присваивания записывается знаком «=» в Бейсике и Си++ и комби- нацией двух знаков «:=» в Паскале (пробел между ними не Например: R e s u l t 20.3. Алгоритмическое (модульное) программирование 5 9 3 В переменную Result запишется число 5. Знак «=» означает именно присваивание, а не сравнение, которое может использоваться только в логических выражениях. Другой пример: X X + 1 Сначала вычисляется значение выражения и затем оно заносится в перемен- ную X, Допустима и такая запись: X X X Прежде всего выполняется сравнение в правой части (X = X), его значение всегда будет true, и значением переменной X, соответственно, тоже станет true. Для повы- шения наглядности оператора присваивания в Паскале принята специальная форма его записи: X X X; Примеры. Бейсик: а23 а 2 2 ( 1 2 ) + Ы Ы - Паскаль: а := + с; d ( е [ 8 ] - f ) * 2 . 2 ; Си++: х [ 5 ] у / 3 . 3 3 ; у = z [ 0 ] - 0 . 0 0 1 ; Комментарии При составлении программы очень полезно комментировать различные участки кода, чтобы потом, обратившись к ним, сразу понять, что конкретно выполняется в том или ином месте программы. Забыть смысл того, что было сделано совсем недавно, можно очень быстро — за недель, а в больших и за несколько дней. Эта проблема становится особенно актуальной, когда группой специалистов раз- рабатывается объемное приложение, и разобраться в сотнях тысяч строк своего и чужого исходного текста очень сложно. Языки программирования допускают использование комментариев — частей исход- ных текстов, выделяемых с помощью специальных обозначений и пропускаемых компилятором при анализе текста программы. Комментарии могут начинаться и заканчиваться особыми символами и охваты- вать несколько строк кода, а могут записываться только в конце строки — при этом считается, что весь остаток строки является комментарием. Для обозначения комментариев в одном и том же языке программирования могут использоваться разные символы, поэтому возможно возникновение вложенных комментариев. Допустимость такого вложения задается, как правило, в настройках компилятора. 594 Глава 20. Основы программирования Синтаксис комментария это комментарий языка Паскаль (* а это вложенный комментарий *) } Условный оператор (условные вычисления) С помощью одного оператора присваивания можно создавать достаточно сложные расчетные программы, однако реализовать абсолютное большинство алгоритмов, просто последовательно выполняя операторы присваивания, невозможно. Посто- янно приходится изменять порядок выполнения последовательности вычислений в зависимости от Эти условия записываются в виде логиче- ских выражений и всегда принимают одно из двух значений — или false (истинно или ложно). При этом разветвление программы — выполнение в даль- нейшем может продолжиться с разных операторов. Синтаксис условного оператора примерно одинаков во всех языках программиро- вания — он представляет собой конструкцию: если условие истинно то выполнить иначе выполнить оператор-2 После ключевого слова (если) следует условие, если оно истинно, то выполня- ется оператор или блок операторов, следующих за ключевым словом THEN (то); если же оно ложно, то выполняется оператор или блок операторов, следующих за ключевым словом ELSE (иначе). Синтаксис условного оператора Бейсик условие THEN ELSE оператор-2 Паскаль if условие then else оператор-2; Си++ if( условие ) else оператор-2; 20.3. Алгоритмическое (модульное) программирование 5 9 5 Примеры. Бейсик: IF А О 0 THEN А = 0 ELSE А = -1 END IF Паскаль: if а о 0 then a := e l s e a := - 1 ; Си++: if{ а о 0 ) а 0 e l s e a = - 1 ; Вторую часть условного оператора, выполняющуюся в случае, если условие ложно, всегда можно опускать. Бейсик: IF х < 0 THEN У х / 2 х = 1 END IF Паскаль: if х < 0 then begin у := х / 2; х 1; end Си++: i f ( x < 0 ) { . у x / 2 ; х = 1 ; } ; Повторяющиеся вычисления (операторы цикла) С помощью условных операторов и операторов присваивания теоретически можно реализовать сколь угодно сложный алгоритм. Однако на практике при необходимо- сти организовать обработку тысяч элементов массива (например, присвоить каж- 596 Глава 20. Основы программирования дому элементу начальное значение) вручную набирать тысячу операторов присва- ивания крайне тяжело. Поэтому в языках программирования имеются средства для организации повтор- ных вычислений, называемые операторами цикла. Они бывают двух видов: с фик- сированным числом повторений и условные операторы цикла. Каждый оператор цикла состоит из заголовка цикла, определяющего число повто- рений, и тела цикла — повторяемого оператора или блока операторов. Первый вид оператора цикла При решении задачи примерно в половине случаев заранее известно, сколько раз понадобится выполнить тело цикла. Так бывает, как правило, при обработке мас- сивов, размер которых всегда или известен заранее, или легко определяется. Заголовок такого оператора состоит из трех частей — инициализации переменной- счетчика или параметра цикла (присваивания ей начального значения), опреде- ления конечного значения счетчика, по достижении которого тело цикла надо выпол- нить в последний раз, и приращения счетчика, определяющего, на сколько будет меняться значение счетчика после каждого выполнения тела цикла. Синтаксис оператора цикла Бейсик FOR счетчик = началы-юе_значение ТО конечное_значение STEP приращение тело_цикла группа_операторов NEXT Если приращение не указывать, то считается, что оно равно 1 Паскаль for счетчик := начальное_значение to конечное_значение do оператор или блок операторов; Приращение всегда равно 1 Си++ for( счетчик = начальное_значение; счетчик = счетчик + приращение) оператор или блок операторов; 20.3. Алгоритмическое (модульное) программирование 5 9 7 В последнем примере счетчик будет принимать значения от 0 до 999, потому что нумерация элементов массива Си++ начинается с нуля. Второй вид оператора цикла Не менее часто встречаются ситуации, когда число повторений заранее неизвестно — надо выполнять цикл, пока не произойдет некоторое событие (пользователь нажмет на кнопку, точность вычислений уложится в заданный порог и т. д.). В таких ситуа- циях заголовок цикла упрощается. В нем указывается только условие (логическое выражение) — пока его значение равно true, цикл будет выполняться. |