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

Группа операторов которые решают логически самостоятельную часть задачи называется

  • автор:

✅ Технологии программирования 70 вопросов СИНЕРГИЯ МТИ 2022 (Решение → 20104)

Плавающие регистры содержат …Языки, формирующие в процессе трансляции окончательный выполнимый код называются . языкамиРегистрами процессора называют. Языки программирования можно разделить на языки . уровняСинтаксис языка определяет. Выражение — это . Чтобы компиляция одной

  1. Плавающие регистры содержат …
  2. Языки, формирующие в процессе трансляции окончательный выполнимый код называются . языками
  3. Регистрами процессора называют.
  4. Языки программирования можно разделить на языки . уровня
  5. Синтаксис языка определяет.
  6. Выражение — это .
  7. Чтобы компиляция одной и той же программы различными компиляторами всегда давала одинаковый результат, разрабатываются .
  8. Операторы бывают .
  9. Команды процессора состоят из.
  10. Группа операторов, которые решают логически самостоятельную часть задачи, называется .
  11. — это программа, переводящая текст инструкций для компьютера с какого-либо языка программирования на машинный язык
  12. Элементарной единицей памяти современных компьютеров является .
  13. Неисполняемые операторы — это операторы, .
  14. Оператор — это .
  15. Исполняемые операторы — это операторы, .
  16. В процессе трансляции, на этапе лексического анализа выполняется .
  17. Аппаратный стек реализуется .
  18. Языки, представляющие собой последовательность выполняемых операторов, называют .
  19. Машинно-ориентированный язык программирования — .
  20. Первым разработанным языком программирования высокого уровня является
  21. Общие регистры содержат .
  22. Величина, принимающая в процессе выполнения приложения различные значения, называется .
  23. Система программирования — это .
  24. Система правил для конструирования программ, состоящих из групп чисел, букв, знаков препинания и других символов, с помощью которых можно сообщать компьютеру набор команд — .
  25. Языки, основанные на построении объектов, объединяющих данные и операции над ними, называют .
  26. Язык машинных команд состоит из .
  27. Единица текста программы, которая при компиляции воспринимается, как единое целое и по смыслу не может быть разделена на более мелкие элементы, называется .
  28. Графическое изображение логической структуры алгоритма, в котором каждый этап процесса переработки данных представляется в виде геометрических фигур(блоков), имеющих определенную конфигурацию в зависимости от характера выполняемых операций, – это … форма записи алгоритмов
  29. Оператор присваивания в языке С/С++ обозначается …
  30. Циклический алгоритм – это алгоритм, в котором …
  31. Упорядоченная совокупность однотипных переменных, обладающих одинаковыми свойствами, называется …
  32. Неформальный алгоритмический язык, максимально приближенный к естественному, называется …
  33. К нейтральным или выполнимым формулам логики относятся выражения, принимающие значение …
  34. Наглядное графическое изображение алгоритма называется —
  35. Описание последовательности действий, которые необходимо выполнить для решения задачи, называется …
  36. Структура представляющая собой последовательное размещение блоков и групп блоков, называется
  37. Последовательность действий, которая выполняется многократно, называется …
  38. Запись алгоритма на формальном языке называется …
  39. Массив – это …
  40. К тождественно ложным формулам логики относятся выражения, принимающие значение …
  41. Структура – это …
  42. Такое свойство алгоритма, как организация, предполагает …
  43. К тождественно истинным формулам логики относятся выражения, принимающие значение …
  44. Такое свойство алгоритма, как определенность, предполагает …
  45. Такое свойство алгоритма, как дискретность, предполагает …
  46. Такое свойство алгоритма, как массовость, предполагает …
  47. Разветвляющийся алгоритм – это алгоритм, в котором …
  48. Такое свойство алгоритма, как результативность, предполагает …
  49. Если некоторая часть программы (группа блоков) выполняется многократно и после проверки некоторого условия в какой-то момент осуществляется выход из нее, то такую часть называют …
  50. Чему равно значение величин А, В и С после выполнения приведенных операций присваивания, если до начала этих действий А=100, В=200, С=300. А = 1000; С = 50; В = А/С; С = В; В = А/С; С =А;
  51. Если «А» имеет значение «истина», а «В» – «ложь»: С = А || В, то величине «С» будет присвоено значение …
  52. Значение величин А и В после выполнения операций присваивания (А = А – В; В =7; А = А + В) если до начала этих действий А=15, В=1, равно …
  53. Линейный алгоритм — это алгоритм, в котором .
  54. Значение величин А и В после выполнения операций присваивания (А = А – В; В = A/8; А = В; В = A*B; А = В + 4), если до начала этих действий А=80, В=32, равно …
  55. Дизъюнкцией называется выражение, составленное из …
  56. Если «А» и «В» имеют значение «истина»: С = А && В, то величине «С» будет присвоено значение …
  57. Операцией отрицания называется выражение, составленное из …
  58. Переменные целочисленного типа используется для хранения … значений
  59. Конъюнкцией называется выражение, составленное из …
  60. Текстовые строки в компьютере представляются …
  61. Конструкция «Цикл пока» выполняется, пока …
  62. . — это запоминающее устройство, из которого элементы извлекаются в порядке, обратном их помещению в запоминающее устройство.
  63. Для чего используется переменные целочисленного типа:
  64. Какой из перечисленных языков программирования является машинно- ориентированным?
  65. Группа операторов, которые решают логически самостоятельную часть задачи называется:
  66. Единица текста программы, которая при компиляции воспринимается, как единое целое и по смыслу не может быть разделена на более мелкие элементы, называется:
  67. — это запоминающее устройство, из которого элементы извлекаются в порядке, обратном их помещению в запоминающее устройство.
  68. Определите значение, которое будет присвоено величине С в, если «А» имеет значение «истина», а «В» — «ложь»: С = А||В.
  69. Чему равно значение величин А и В после выполнения приведенных операций присваивания, если до начала этих действий А=80. В=32. А = А — В; В = А/8; А = В; В = А-В; А = В + 4;
  70. Определите значение, которое будет присвоено величине С в, если А и В имеют значение истина: С = А ||B.

 Описание Ответы на 70 вопросов Оглавление Плавающие регистры содержат …Языки, формирующие в процессе трансляции окончательный выполнимый код называются . языкамиРегистрами процессора называют. Языки программирования можно разделить на языки . уровняСинтаксис языка определяет. Выражение - это . Чтобы компиляция одной и той же программы различными компиляторами всегда давала одинаковый результат, разрабатываются . Операторы бывают . Команды процессора состоят из. Группа операторов, которые решают логически самостоятельную часть задачи, называется . - это программа, переводящая текст инструкций для компьютера с какого-либо языка программирования на машинный языкЭлементарной единицей памяти современных компьютеров является . Неисполняемые операторы - это операторы, . Оператор - это . Исполняемые операторы - это операторы, . В процессе трансляции, на этапе лексического анализа выполняется . Аппаратный стек реализуется . Языки, представляющие собой последовательность выполняемых операторов, называют . Машинно-ориентированный язык программирования - . Первым разработанным языком программирования высокого уровня являетсяОбщие регистры содержат . Величина, принимающая в процессе выполнения приложения различные значения, называется . Система программирования - это . Система правил для конструирования программ, состоящих из групп чисел, букв, знаков препинания и других символов, с помощью которых можно сообщать компьютеру набор команд - . Языки, основанные на построении объектов, объединяющих данные и операции над ними, называют . Язык машинных команд состоит из . Единица текста программы, которая при компиляции воспринимается, как единое целое и по смыслу не может быть разделена на более мелкие элементы, называется . Графическое изображение логической структуры алгоритма, в котором каждый этап процесса переработки данных представляется в виде геометрических фигур(блоков), имеющих определенную конфигурацию в зависимости от характера выполняемых операций, – это … форма записи алгоритмовОператор присваивания в языке С/С++ обозначается …Циклический алгоритм – это алгоритм, в котором …Упорядоченная совокупность однотипных переменных, обладающих одинаковыми свойствами, называется …Неформальный алгоритмический язык, максимально приближенный к естественному, называется …К нейтральным или выполнимым формулам логики относятся выражения, принимающие значение …Наглядное графическое изображение алгоритма называется -Описание последовательности действий, которые необходимо выполнить для решения задачи, называется …Структура представляющая собой последовательное размещение блоков и групп блоков, называетсяПоследовательность действий, которая выполняется многократно, называется …Запись алгоритма на формальном языке называется …Массив – это …К тождественно ложным формулам логики относятся выражения, принимающие значение …Структура – это …Такое свойство алгоритма, как организация, предполагает …К тождественно истинным формулам логики относятся выражения, принимающие значение …Такое свойство алгоритма, как определенность, предполагает …Такое свойство алгоритма, как дискретность, предполагает …Такое свойство алгоритма, как массовость, предполагает …Разветвляющийся алгоритм – это алгоритм, в котором …Такое свойство алгоритма, как результативность, предполагает …Если некоторая часть программы (группа блоков) выполняется многократно и после проверки некоторого условия в какой-то момент осуществляется выход из нее, то такую часть называют …Чему равно значение величин А, В и С после выполнения приведенных операций присваивания, если до начала этих действий А=100, В=200, С=300. А = 1000; С = 50; В = А/С; С = В; В = А/С; С =А;Если «А» имеет значение «истина», а «В» – «ложь»: С = А || В, то величине «С» будет присвоено значение …Значение величин А и В после выполнения операций присваивания (А = А – В; В =7; А = А + В) если до начала этих действий А=15, В=1, равно …Линейный алгоритм - это алгоритм, в котором . Значение величин А и В после выполнения операций присваивания (А = А – В; В = A/8; А = В; В = A*B; А = В + 4), если до начала этих действий А=80, В=32, равно …Дизъюнкцией называется выражение, составленное из …Если «А» и «В» имеют значение «истина»: С = А && В, то величине «С» будет присвоено значение …Операцией отрицания называется выражение, составленное из …Переменные целочисленного типа используется для хранения … значенийКонъюнкцией называется выражение, составленное из …Текстовые строки в компьютере представляются …Конструкция «Цикл пока» выполняется, пока …. - это запоминающее устройство, из которого элементы извлекаются в порядке, обратном их помещению в запоминающее устройство.Для чего используется переменные целочисленного типа:Какой из перечисленных языков программирования является машинно- ориентированным?Группа операторов, которые решают логически самостоятельную часть задачи называется:Единица текста программы, которая при компиляции воспринимается, как единое целое и по смыслу не может быть разделена на более мелкие элементы, называется:- это запоминающее устройство, из которого элементы извлекаются в порядке, обратном их помещению в запоминающее устройство. Определите значение, которое будет присвоено величине С в, если «А» имеет значение «истина», а «В» - «ложь»: С = А||В.Чему равно значение величин А и В после выполнения приведенных операций присваивания, если до начала этих действий А=80. В=32. А = А - В; В = А/8; А = В; В = А-В; А = В + 4; Определите значение, которое будет присвоено величине С в, если А и В имеют значение истина: С = А ||B. ✅ Технологии программирования 70 вопросов СИНЕРГИЯ МТИ 2022Технологии программирования ДГТУТехнологии программирования тест ответы на вопросы Синергия 3 семестр⭐ Технологии психологического консультирования в образовании > Итоговый тест (ответы на тест Синергия / МТИ / МосАП, январь 2023)Технологии самоорганизации и самообразования (Вариант №10, КазанГЭУ)Технологии самоорганизации и саморазвития личностиТехнологии самоорганизации и саморазвития личности ТЕСТ ТулГУТехнологии неорганических веществ 1Технологии обработки информации. Теория: ХД и ВД; наука о данных. Итоговое тестирование с ответами. 73%Технологии обработки информации тест ответы на вопросы СинергияТехнологии обработки информации тест ответы на вопросы Синергия 3 семестрТехнологии оценки развития социально-экономических системТехнологии преподавания предмета Физическая культура в общеобразовательной школе 2 сдо росдистантТехнологии приемки, хранения, подготовки к продаже, размещения и выкладки товаров

© Библиотека Ирины Эланс

Библиотека Ирины Эланс, основана как общедоступная библиотека в интернете. Онлайн-библиотеке академических ресурсов от Ирины Эланс доверяют студенты со всей России.

Библиотека Ирины Эланс

Полное или частичное копирование материалов разрешается только с указанием активной ссылки на сайт:

Тема 3. Общее понятие алгоритма. Управляющие конструкции алгоритмического языка.

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

Запись алгоритма на формальном языке называется программой. Иногда само понятие алгоритма отождествляется с его записью, так что слова "алгоритм" и "программа" — почти синонимы. Небольшое различие заключается в том, что при упоминании алгоритма, как правило, имеют в виду основную идею его построения, общую для всех алгоритмических языков. Программа же всегда связана с записью алгоритма на конкретном формальном языке.

В математике рассматриваются различные виды алгоритмов – программы для машин Тьюринга, алгоритмы Маркова (нормальные алгоритмы), частично рекурсивные функции и т.п. Знаменитый тезис Чёрча утверждает, что все виды алгоритмов эквивалентны друг другу, т.е. классы задач, решаемых разными типами алгоритмов, всегда совпадают. Тезис этот недоказуем (можно лишь доказать совпадение для двух конкретных типов алгоритмов, например, машин Тьюринга и нормальных алгоритмов), но никто в его верности не сомневается. Так что все языки программирования эквивалентны друг другу и различаются лишь тем, насколько они удобны для решения конкретных классов задач. Например, объектно-ориентированные языки оптимальны для программирования в оконных средах, а язык Фортран успешно применяется в научных и инженерных расчетах.

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

Псевдокод объединяет существенные черты множества алгоритмических языков. Для записи алгоритмов в данном курсе будет использоваться как псевдокод, так и конкретные языки: Си, C++.

3.2. Управляющие конструкции алгоритмического языка

Большинство алгоритмических языков относится к так называемым процедурным языкам, в которых основной единицей является оператор. Оператор представляет собой команду на выполнение некоторого действия. Язык, таким образом, состоит в основном из фраз в повелительном наклонении. Альтернативой операторам являются описания, определяющие объекты или типы объектов и их взаимосвязи. Считается, что чем больший процент составляют описания, тем более совершенным является язык. Существуют алгоритмические языки, состоящие в основном из описаний (функциональные языки), однако, данный курс ограничивается процедурными языками.

Всякий алгоритм предназначен исполнителю, который однозначно понимает команды алгоритма. Пример: опишем алгоритм проезда от Аэровокзала в Москве до аэропорта Домодедово.

алгоритм Проезд от Аэровокзала до Домодедово через МКАД

| Дано: находимся у Аэровокзала

| Надо: оказаться в аэропорту Домодедово

| повернуть направо на центральный проезд

| Ленинградского проспекта в сторону центра;

| проехать до второго светофора;

| выполнить разворот на перекрестке

| проехать по Ленинградскому проспекту из центра

| до пересечения с Московской кольцевой дорогой;

| переехать мост над кольцевой дорогой и

| повернуть направо на внешнюю часть кольцевой дороги;

| двигаться по кольцевой дороге в направлении против

| часовой стрелки до Каширского шоссе;

| повернуть направо на Каширское шоссе в сторону из города;

| двигаться, никуда не сворачивая, до

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

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

алгоритм Оптимальный путь от Аэровокзала до Домодедово

| Дано: находимся у Аэровокзала

| Надо: оказаться в аэропорту Домодедово

| если нет пробки на Ленинградском проспекте

| | в направлении из центра

| | // . выполняем предыдущий алгоритм.

| | Проезд от Аэровокзала до Домодедово через МКАД

| | повернуть направо на боковой проезд

| | Ленинградского проспекта в сторону центра;

| | доехать до пересечения с Беговой улицей;

| | повернуть направо на Третье транспортное кольцо;

| | ехать по Третьему транспортному кольцу против

| | часовой стрелки до пересечения с Варшавским шоссе;

| | повернуть направо на Варшавское шоссе

| | в сторону из центра;

| | ехать прямо до развилки с Каширским шоссе;

| | на развилке с Каширским шоссе проехать прямо в сторону

| | Каширского шоссе; // Варшавское уходит направо

| | двигаться, никуда не сворачивая, до

Здесь исполнитель алгоритма сначала должен проверить условие

Нет ли пробки на Ленинградском проспекте в направлении из центра

Если это условие истинно, то выполняется первый алгоритм "Проезд от Аэровокзала до Домодедово через МКАД"; если ложно — часть алгоритма между строками " иначе " и " конец если ".

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

Для иллюстрации конструкции " цикл пока " можно привести следующую модификацию алгоритма проезда.

алгоритм Добраться из Аэровокзала до Домодедово

| Дано: находимся у Аэровокзала

| Надо: оказаться в аэропорту Домодедово

| цикл пока пробка на Ленинградском проспекте

| | выпить чашку кофе в кафе Аэровокзала

| Проезд от аэровокзала до Домодедово через МКАД

Здесь снова использован определенный ранее алгоритм "Проезд от аэровокзала до Домодедово". Условие продолжения цикла проверяется перед выполнением тела цикла, но не в процессе его выполнения! Так, если пробка рассосалась после чашки кофе, то все равно нужно ждать полчаса.

Теперь можно подвести итоги.

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

| последовательность действий 1

| последовательность действий 2

Последовательность действий 1 выполняется, когда условие истинно; в противном случае выполняется последовательность действий 2 . Ключевое слово "иначе" и последовательность действий 2 могут отсутствовать; в этом случае, когда условие ложно, исполнитель ничего не делает.

Цикл " пока ", или цикл с предусловием выглядит следующим образом:

цикл пока условие

Сначала проверяется условие в заголовке цикла. Если оно истинно, то выполняется последовательность действий, составляющая тело цикла. Это повторяется неограниченное число раз, пока условие истинно. Цикл заканчивается, когда условие при очередной проверке оказывается ложным. Важно отметить, что условие проверяется перед каждым выполнением тела цикла, но не в процессе его выполнения.

Помимо элементарных действий, в записи алгоритма можно использовать другие алгоритмы. Также в записи алгоритма могут присутствовать комментарии, которые игнорируются исполнителем алгоритма. Для отделения комментария будут использоваться знаки // (двойная косая черта) для строчного комментария или /* …. */ для блока в соответствии с синтаксисом языка C++.

3.3. Язык схем

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

Несмотря на все многообразие решаемых на ЭВМ задач, можно выделить несколько «типичных» действий (этапов), которые в различной последовательности выполняются при решении задач:

1. Присваивание является основной операцией, при помощи которой осуществляется обработка данных.

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

3. Ввод данных и вывод результата.

4. Начало и конец вычислительного процесса.

Конкретные операции указаны внутри фигур в качестве примеров. Рассмотрим выполнение этих действий, а также функции других элементов схем, приведенных на рис.4.1.

Рис. 4.1. основные элементы схем

Присваивание. При выполнении операции присваивания переменной присваивается значение (переменная – некоторая величина, которая может изменяться, принимая в процессе этого изменения различные значения). Переменная обозначается при помощи имени. Именами обозначаются также различные функции (например, SIN ). Функции имеют, в языках программирования, закрепленные за ними имена. Как Вы уже знаете, имя переменной обозначает символический адрес той ячейки памяти, в которой записано числовое значение соответствующей переменной или функции (после ее вычисления). Следовательно, термины "переменная" или "функция" только условно соответствуют общепринятым математическим понятиям. Числа, используемые, например, в операторах присваивания для задания значений переменных, называются константами. Константы обозначают сами числа, а не фактические адреса ячеек памяти.

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

Операции, указанные справа от символа "=", выполняются над записанными в выражении константами (константа— величина, значение которой не изменяется в период ее существования) и теми числами, которые хранятся в ячейках памяти, обозначенных встречающимися именами. Результат помешается в ту ячейку памяти, символический адрес которой указан слева от символа "=". Говорят, что переменной присваивается значение посредством оператора присваивания. Следовательно, используемый здесь символ "=" (присвоить) имеет смысл, отличный от принятого в математике.

Примеры операторов присваивания

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

К=1 В ячейку памяти с символическим адресом К помещается 1. (переменной К присваивается значение 1)

L=K В ячейку памяти с символическим адресом L пересылается содержимое ячейки с символическим адресом К (переменной L присваивается значение К). При этом К не изменяется.

К=К+1 К содержимому ячейки с символическим адресом К прибавляется 1, результат помещается в ту же ячейку К. При этом старое значение К пропадает (стирается).

Y = SIN ( X ) Вычисляется sin угла (выраженного в радианах), величина которого находится в ячейке X , и результат помещается в ячейку Y .

X = SIN ( X ) Правая часть вычисляется аналогично. Значение функции записывается в ту же ячейку, в которой раньше находилось значение угла. Перед присваиванием старое значение пропадает (стирается).

Замечания:

1. Перед выполнением присваивания старое значение переменной стирается.

2. При пересылке значение переменной копируется. Значение копируемой переменной не изменяется.

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

4. Если переменной не присвоено значение, то ее значение не определено.

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

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

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

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

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

Комментарии можно записывать около любого блока.

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

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

3.4. Основные структуры алгоритмов

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

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

К основным структурам относятся (см. рис. 4.2):

· следование а;

· две разновидности цикла б, в;

· три разновидности разветвления г, д, е.

Рис.4.2. Основные структуры алгоритмов.

Отметим вначале особенности трех основных типов структур.

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

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

Если после проверки некоторого условия выбирается один из двух (или более) путей вычислительного процесса и после выполнения любого из них вычислительный процесс опять сводится в одно русло, то возникает разветвление.

Теперь рассмотрим особенности каждого вида цикла и разветвления.

Цикл До. Применяется при необходимости выполнить какие-либо вычисления нескольких раз до выполнения некоторого условия (блок 3). Особенность этого цикла в том, что он всегда выполняется хотя бы один раз, так как первая проверка условия выхода из цикла происходит после того, как тело цикла выполнено. Тело цикла (блок 2) – это последовательность действий, которая выполняется многократно (в цикле). Начальные присвоения (блок 1) задание начальных значений тем переменным, которые используются в теле цикла. Цикл такого типа называют также итеративным циклом в том случае, когда количество повторений неизвестно до начала выполнения цикла.

Цикл Пока. Отличается от цикла До тем, что проверка условия (блок 3) производится до выполнения тела цикла (блок 2), и, если при первой проверке условие выхода из цикла выполняется, то тело цикла не выполняется ни разу. Цикл такого типа называется также циклом по условию.

Замечание. В некоторых случаях проверка условия осуществляется внутри тела цикла, т.е. тело цикла разбивается на две последовательности операторов: одна выполняется до проверки условия, вторая – после.

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

Обход – частный случай разветвления, когда одна ветвь не содержит никаких действий. Множественный выбор является обобщением разветвления, когда в зависимости от значения переменной ( i ) выполняется одно из нескольких действий. При i = 1 выполняется действие S 1, при i = 2 – действие S 2 и т. д.

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

Обычно при составлении схемы блоки размещаются друг под другом в порядке их выполнения. Возврат назад осуществляется только на циклах. Это дает простую и наглядную структуру алгоритма, по которой далее легко составлять программу.

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

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

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

Такая сумма называется накапливающейся.

Для вычисления накапливающейся суммы полезно знать следующее:

S = 0 – т.е. начальное значение суммы обнуляется;

S = S + i – текущее значение суммы считается через предыдущее, т.е. новое значение равно предыдущему значению суммы плюс текущее значение переменной ( i ), в которой лежит текущее слагаемое.

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

Решение этой задачи можно представить как последовательное выполнение следующих простых шагов (рис 4.3):

1. Ввести значение переменной N (блок 1).

2. Проверить выполнение условия, наложенного на значение переменной N. Для этого сравнить введенное число с 1 (блок 2). Если условие N>1 не выполняется, то возврат за новым значением N, предварительно распечатав на экране дисплея сообщение (блок 3), т.к. введенное N не удовлетворяет требованиям задачи. Если условие N>1верно, перейти к блоку 4.

3. Присвоить S значение 0 (блок 4).

4. Присвоить i значение 1 (блок 5).

5. Далее выполнять операцию S=S+ i2 (блок 6), увеличивая значение i после очередного её выполнения на 1 — i = i + l (блок 7).

6. Чтобы обеспечить сложение точно N чисел, после каждого изменения i на 1 будем проверять условие i<=N (блок 8). Если условие выполняется, то не все N сложений выполнены, и необходимо повторить действия, начиная с операции, помеченной (6).

7. Блоки 6-8 выполняются многократно и образуют цикл.

Рис. 4.3. Алгоритм вычисления суммы квадратов чисел от 1 до N

3.5. Понятие переменной

Алгоритм состоит из команд исполнителю. Исполнитель может, в свою очередь, командовать другими исполнителями. Компьютер можно рассматривать как универсальный исполнитель, который управляет другими исполнителями. Рассмотрим, к примеру, автомобиль с инжекторным двигателем. В нем работой двигателя управляет компьютер (его иногда называют микропроцессорный блок). Компьютер получает данные от разнообразных датчиков (датчики положения коленчатого вала и дроссельной заслонки, температуры охлаждающей жидкости, скорости, детонации, кислорода и др.) и отдает приказания исполняющим системам двигателя — модулю зажигания, бензонасосу, форсункам двигателя, регулятору холостого хода, системе продувки адсорбера и т.д. Таким образом, и датчики, и исполняющие системы двигателя управляются компьютером, который выступает в роли универсального исполнителя.

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

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

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

Значение каждого параметра хранится в определенном участке памяти компьютера и может меняться в процессе выполнения алгоритма. Такой участок памяти компьютера называется переменной. Понятие переменной — важнейшее понятие алгоритмического языка. Переменные встроены в конструкцию универсального исполнителя.

Каждой переменной присваивается имя. В рассмотренном примере используются переменные " скорость ", " обороты двигателя ", " передача ", " нагрузка ", " температура ", " обогащенность смеси ", " угол опережения зажигания " и другие. С каждой переменной связан ее тип, т.е. множество значений, которое она может принимать. Например, " передача " принимает целые значения от 1 до 5 (обратная и первая передачи не различаются), тогда как " скорость ", а также " обогащенность смеси " принимают вещественные значения (скорость измеряется в м/сек, обогащенность смеси может измеряться либо соотношением кислорода и паров бензина в единице объема, либо в процентах относительно стехиометрической смеси 14/1, соответствующей полному сгоранию паров бензина).

С переменной можно выполнять два действия:

1. прочитать текущее значение переменной;

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

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

имя переменной = выражение;

Знак = читается как присвоить значение.

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

скорость = число импульсов от датчика скорости);

// (6 * интервал времени);

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

скорость = скорость * 3600 / 1000;

Здесь переменная " скорость " входит как в правую, так и в левую части оператора присваивания. В правой части используется старое значение этой переменной, вычисленное в м/сек. Поскольку час содержит 3600 секунд, то при домножении на 3600 получается расстояние в метрах, проходимое за 1 час; после деления на 1000 получается расстояние в километрах. Вычисленное значение затем присваивается переменной " скорость ".

Суммируем сказанное выше:

1. универсальный исполнитель, или компьютер, — это исполнитель, который может управлять другими исполнителями. Запись алгоритма для универсального исполнителя может включать команды, которые он должен передать подчиненным исполнителям, и команды, изменяющие внутреннее состояние самого универсального исполнителя;

2. внутреннее состояние универсального исполнителя определяется состоянием его памяти. Память — это материальный носитель (лента машины Тьюринга, ламповая или ферритовая память первых компьютеров, полупроводниковая память современных компьютеров), который хранит информацию. Эту информацию можно читать и перезаписывать;

3. переменная — это область памяти универсального исполнителя, хранящая порцию информации. Любая переменная имеет имя и тип. Тип переменной определяется множеством всех значений, которые она может принимать. Память универсального исполнителя можно рассматривать как набор переменных;

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

имя переменной = выражение;

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

Тема 4. Типы переменных. Целые и вещественные переменные, представление целых и вещественных чисел в компьютере

Содержание темы:

типы переменных, целочисленные и вещественные переменные, символьные переменные, логические переменные и выражения, массивы, текстовые строки

Цели и задачи изучения темы:

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

Изучая тему, необходимо акцентировать внимание на следующих понятиях:

· тип переменной – определяется множеством значений, которое она может принимать;

· целочисленная переменная – может хранить числа от нуля до 2 в 32-й степени минус 1;

· вещественная переменная – представляется в компьютере в так называемой экспоненциальной, или плавающей, форме;

· символьная переменная – представляется целочисленным кодом в некоторой фиксированной кодировке;

· логические или условные выражения – используются в качестве условия в конструкциях ветвления;

· массив переменных – объединение определенного числа однотипных данных, называемых элементами массива;

· текстовая строка – представляется массивами символов

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

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

4.2. Целочисленные переменные

Тип целое число является основным для любого алгоритмического языка. Связано это с тем, что содержимое ячейки памяти или регистра процессора можно рассматривать как целое число. Адреса элементов памяти также представляют собой целые числа, с их помощью записываются машинные команды и т.д. Символы представляются в компьютере целыми числами — их кодами в некоторой кодировке. Изображения также задаются массивами целых чисел: для каждой точки цветного изображения хранятся интенсивности ее красной, зеленой и синей составляющей (в большинстве случаев — в диапазоне от 0 до 255 ). Как говорят математики, целые числа даны свыше, все остальное сконструировал из них человек.

Общепринятый в программировании термин целое число или целочисленная переменная, строго говоря, не вполне корректен. Целых чисел бесконечно много, десятичная или двоичная запись целого числа может быть сколь угодно длинной и не помещаться в области памяти, отведенной под одну переменную. Целая переменная в компьютере может хранить лишь ограниченное множество целых чисел в некотором интервале. В современных компьютерах под целую переменную отводится 4 байта, т.е. 32 двоичных разряда. Она может хранить числа от нуля до 2 в 32-й степени минус 1. Таким образом, максимальное целое число, которое может храниться в целочисленной переменной, равно

2 32 — 1 = 4294967295

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

(a+b) + c = a+(b+c), (ab)c = a(bc)

a ( b + c ) = ab + ac

В языке Си целым числам соответствуют типы int , char и bool .

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

Целочисленное значение типа integer (целое) может иметь в памяти компьютера следующее представление:

Рис. 4.1. Битовая структура типа integer

4.3. Вещественные переменные

Вещественные числа представляются в компьютере в так называемой экспоненциальной, или плавающей, форме. Вещественное число r имеет вид

Представление числа состоит из трех элементов:

1. знак числа — плюс или минус. Под знак числа отводится один бит в двоичном представлении, он располагается в старшем, т.е. знаковом разряде. Единица соответствует знаку минус, т.е. отрицательному числу, ноль — знаку плюс. У нуля знаковый разряд также нулевой;

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

3. мантисса m представляет собой фиксированное количество разрядов двоичной записи вещественного числа в диапазоне от 1 до 2 :

Следует подчеркнуть, что левое неравенство нестрогое — мантисса может равняться единице, а правое — строгое, мантисса всегда меньше двух. Разряды мантиссы включают один разряд целой части, который ввиду приведенного неравенства всегда равен единице, и фиксированное количество разрядов дробной части. Поскольку старший двоичный разряд мантиссы всегда равен единице, хранить его необязательно, и в двоичном коде он отсутствует. Фактически двоичный код хранит только разряды дробной части мантиссы.

В языке Си вещественным числам соответствуют типы float и double . Элемент типа float занимает 4 байта, в которых один бит отводится под знак, восемь — под порядок, остальные 23 — под мантиссу (на самом деле, в мантиссе 24 разряда, но старший разряд всегда равен единице, поэтому хранить его не нужно). Тип double занимает 8 байтов, в них один разряд отводится под знак, 11 — под порядок, остальные 52 — под мантиссу. На самом деле в мантиссе 53 разряда, но старший всегда равен единице и поэтому не хранится. Поскольку порядок может быть положительным и отрицательным, в двоичном коде он хранится в смещенном виде: к нему прибавляется константа, равная абсолютной величине максимального по модулю отрицательного порядка. В случае типа float она равна 127 , в случае double — 1023 . Таким образом, максимальный по модулю отрицательный порядок представляется нулевым кодом.

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

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

a + b = a при b ≠ 0

Более того, для сложения не выполняется закон ассоциативности:

a +( b + c ) ≠ ( a + b )+ c

Приблизительно точность вычислений вещественных чисел типа double составляет 16 десятичных цифр.

В случае четырехбайтовых плавающих чисел (тип float языка Си) точность вычислений составляет примерно 7 десятичных цифр. Это очень мало, поэтому тип float чрезвычайно редко применяется на практике. К тому же процессор сконструирован для работы с восьмибайтовыми вещественными числами, а при работе с четырехбайтовыми он все равно сначала приводит их к восьмибайтовому типу. В программировании следует избегать типа float и всегда пользоваться типом double .

Кроме потери точности, при операциях с вещественными числами могут происходить и другие неприятности:

1. переполнение — когда порядок результата больше максимально возможного значения. Эта ошибка часто возникает при умножении больших чисел;

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

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

Запись вещественных констант

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

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

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

1.5e+6 константа эквивалентна 1500000.0

1e-4 константа эквивалентна 0.0001

-.75E3 константа эквивалентна -750.0

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

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

Рис.4.2. Битовая структура типа float

Для представления вещественных чисел с плавающей точкой и вещественных чисел двойной точности с плавающей точкой стандартом IEEE 754 определены 32- и 64-битовые представления соответственно.

В разряды мантиссы записываются значащие цифры, а в разряды экспоненты заносится показатель степени. Положительные значения содержат в знаковом бите числа — 0, а отрицательные значения — 1.

При обозначении чисел с плавающей точкой приняты следующие соглашения: знаковый разряд обозначается буквой s, экспонента — e, а мантисса — m.

4.4. Символьные переменные

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

Конечно, в памяти компьютера никаких символов не содержится. Символы представляются их целочисленными кодами в некоторой фиксированной кодировке. Кодировка определяется тремя параметрами:

1. диапазоном значений кодов. Например, самая распространенная в мире кодировка ASCII (от слов American Standard Code of Information Interchange — Американский стандартный код обмена информацией) имеет диапазон значений кодов от 0 до 127 , т.е. требует семь бит на символ. Большинство современных кодировок имеют диапазон кодов от 0 до 255 , т.е. один байт на символ. Наконец, сейчас во всем мире осуществляется переход на кодировку Unicode, которая использует коды в диапазоне от 0 до 65535 , т.е. 2 байта на символ;

2. множеством изображаемых символов. Например, кодировка ASCII содержит буквы латинского алфавита, в западноевропейской кодировке к символам ASCII добавлены дополнительные знаки препинания, в частности, испанские перевернутые вопросительные и восклицательные знаки, и другие символы европейских языков, основанных на латинской графике. Любая из русских кодировок содержит кириллицу;

3. отображением множества кодов на множество символов. Например, русские кодировки КОИ-8 (Код обмена информацией восьмибитовый) и "Windows CP-1251", традиционно используемые в операционных системах Unix и MS Windows, имеют один и тот же диапазон кодов и один и тот же набор символов, но отображения их различны (одни и те же символы имеют разные коды в кодировках КОИ-8 и Windows).

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

1. кодировка КОИ-8 (это наиболее старый стандарт, принятый еще в конце 70-х годов XX века). КОИ-8 в основном используется в системе Unix и до недавнего времени была стандартом де-факто для русскоязычной электронной почты. Последнее время, однако, все чаще в электронной почте используют кодировку Windows;

2. так называемая альтернативная кодировка CP-866, которая используется в системе MS DOS. Она не удовлетворяет некоторым требованиям международных стандартов — например, ряд русских букв совпадает с кодами символов, используемых для управления передачей по линии. Альтернативная кодировка постепенно уходит в прошлое вместе с системой DOS;

3. кодировка Windows CP-1251, которая появилась значительно позже кодировки КОИ-8, но создатели русской версии Windows не захотели воспользоваться КОИ-8 (по-видимому, из-за того, что коды русских букв в КОИ-8 не упорядочены в соответствии с алфавитом; в CP-1251 коды русских букв упорядочены, за исключением буквы е). В связи с распространением операционной системы Windows, кодировка Windows получает все большее распространение;

4. кодировка, используемая в компьютерах Apple Macintosh.

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

С повсеместным переходом на кодировку Unicode все проблемы такого рода должны исчезнуть. Кодировка Unicode включает символы алфавитов всех европейских стран и кириллицу. К сожалению, большинство существующих компьютерных программ приспособлено к представлению одного символа в виде одного байта. Поэтому в настоящее время часто используется промежуточное решение: компьютерные программы работают с внутренним представлением символов в кодировке Unicode (такое решение принято в языках Java и C#). При записи в файл символы Unicode приводятся к однобайтовой кодировке в соответствии с текущей языковой установкой.

В языке Си символам соответствует тип char представляющий значение символа, реализуемое одним байтом. Для использования символов в кодировке Unicode язык C++ предоставляет тип wchar_t , в котором под каждый символ отводятся два байта.

4.5. Логические переменные и выражения

В языке С++ определен логический тип данных bool , реализуемый одним байтом. Логические переменные принимают два значения: истина и ложь. Логические, или условные, выражения используются в качестве условия в конструкциях ветвления "если . то . иначе . конец если" и цикла "пока". В первом случае в зависимости от истинности условия выполняется либо ветвь программы после ключевого слова "то", либо после "иначе"; во втором случае цикл выполняется до тех пор, пока условие продолжает оставаться истинным.

В качестве элементарных условных выражений используются операции сравнения: можно проверить равенство двух выражений или определить, какое из них больше. Любая операция сравнения имеет два аргумента и вырабатывает логическое значение " истина " или " ложь " (true и false в языке C++). Мы будем обозначать операции сравнения так, как это принято в языке Си:

· операция проверки равенства двух выражений обозначается двойным знаком равенства = = (мы не используем обычный знак равенства, поскольку знак равенства применяется для обозначения операции присваивания);

· неравенство обозначается != (в Си восклицательный знак используется для отрицания);

· для сравнения величин выражений применяются четыре операции больше > , больше или равно >= , меньше < , меньше или равно <= .

Несколько примеров логических выражений:

x == 0 — выражение истинно, если значение переменной x равно нулю, и ложно в противном случае;

0!= 0 — выражение ложно;

3>= 2 — выражение истинно.

Из элементарных логических выражений и логических переменных можно составлять более сложные выражения, используя три логические операции " и ", " или ", " не ":

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

истинно, когда значение переменной x принадлежит отрезку [0, 1] . Логическую операцию " и " называют также логическим умножением или конъюнкцией; в языке Си логическое умножение обозначается двойным амперсандом && ;

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

ложно в том и только том случае, когда значения обеих переменных x и y равны нулю. Логическую операцию "или" называют также логическим сложением или дизъюнкцией; в Си логическое сложение обозначается двойной вертикальной чертой || ;

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

истинно, когда значение переменной x отлично от нуля. Логическая операция " не " называется логическим отрицанием (иногда негацией); в Си логическое отрицание обозначается восклицательным знаком " ! ".

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

Обратим внимание на чрезвычайно важную особенность операций реализации логического сложения и умножения — так называемое сокращенное вычисление результата. А именно, в случае логического умножения всегда сначала вычисляется значение первого аргумента. Если оно ложно, то значение выражения полагается ложным, а второй аргумент не вычисляется вообще! Благодаря этой особенности можно корректно использовать выражения вроде

При вычислении значения этого выражения сначала вычисляется первый аргумент конъюнкции " x != 0 ". Если значение переменной x равно нулю, то первый аргумент ложен и значение второго аргумента " y/x > 1 " уже не вычисляется. Это очень хорошо, поскольку при попытке его вычислить произошло бы аппаратное прерывание из-за деления на ноль.

То же самое относится и к логическому сложению. Сначала всегда вычисляется первый аргумент логической операции "или". Если он истинен, то значение выражения полагается истинным, а второй аргумент не вычисляется вообще. Таким образом, операции логического сложения и умножения, строго говоря, не коммутативны. Может так случиться, что выражение " a и b " корректно, а выражение " b и a " — нет. Программисты очень часто сознательно используют эту особенность реализации логических операций.

4.6. Массивы

Кроме базовых типов данных, в большинстве алгоритмических языков присутствует конструкция массив. Иногда массив называют также таблицей или вектором. Массив позволяет объединить множество элементов одного типа в единую переменную.

Массив переменных или объектов состоит из определенного числа однотипных данных, называемых элементами массива. Все элементы массива индексируются последовательно, начиная с нуля.

Размещение элементов массива в памяти выполняется последовательно.

Количество элементов в массиве определяет размер массива и является константным выражением.

Имя массива определяет адрес первого элемента массива.

Все элементы массива имеют один и тот же тип. Элементы массива обычно нумеруются индексами от 0 до n-1 , где n — число элементов массива. В некоторых языках можно задавать границы изменения индексов, в других нижняя граница значения индекса равна единице, а не нулю. Мы, тем не менее, будем придерживаться языка Си (а также C++, Java, C#), в котором нижней границей индекса всегда является ноль. Это очень удобно, т.к. индекс элемента массива в этом случае равен его смещению относительно начала массива. Длина массива задается при его описании и не может быть изменена в процессе работы программы.

При описании массива указывается тип и число его элементов. Тип записывается перед именем массива, размер массива указывается в квадратных скобках после его имени. Примеры:

целый a[100]; описан массив целых чисел размера 100 (индекс меняется от 0 до 99)

вещественный r[1000]; описан вещ-й массив из 1000 элементов.

В языке Си соответствующие описания выглядят следующим образом:

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

a[3] = 0; элементу массива a с индексом 3 присваивается значение 0;

a[10] = a[10]*2; элемент массива a с индексом 10 удваивается.

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

При создании массива память под все его элементы выделяется последовательно для каждого элемента в зависимости от типа массива. Для многомерных массивов в первую очередь изменяются значения самого правого индекса.

Например, для массива char a[2][4] будет выделено восемь байтов памяти, в которых в следующем порядке будут размещены элементы массива:

элемент a [0][0] a [0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3]

N байта 1 2 3 4 5 6 7 8

Двухмерные массивы можно рассматривать как матрицу, в которой первый индекс определяет строку, а второй индекс — столбец. Порядок расположения элементов матрицы в памяти — по строкам.

4.7. Текстовые строки

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

1. строка заканчивается символом с нулевым кодом, т.е. либо нулевым байтом в случае однобайтового представления символов, либо двумя нулевыми байтами в случае двухбайтового представления. Такой способ принят в языке Си. Отметим, что нулевой байт — это вовсе не символ ‘0’! Символ ‘0’ имеет код 48 в кодировках ASCII и UNICODE, а изображаемых символов с нулевым кодом не существует;

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

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

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

Операторы.

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

Основная часть программы представляет собой последовательность операторов. Разделителем операторов служит « ; ». Все операторы ТП можно разделить на 2 группы: простые и структурные.

Простые операторы.

Простые операторы — это операторы, которые не содержат никаких других операторов (оператор присваивания). Оператор безусловного перехода go to <метка>:

Go to применяется в случаях, когда после выполнения оператора надо выполнить не следующий по порядку оператор, а какой-нибудь другой, отмеченный меткой.

Метка объявляется в разделе описания меток, может содержать цифры и символы.

Оператор вызова процедуры служит для активизации определенной процедуры пользователя или стандартной процедуры (clrscr).

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

Он присваивает идентификатору стоящему в левой части выражения значения из правой части.

writeln(a:5:2, b:6:4, c:7:3);

Структурные операторы.

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

Все структурные операторы можно разделить на 3 части:

Представляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой и ограниченную операторными скобками (begin…end;)

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

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

If <условие> then <оператор> else <оператор>;

Система проверяет условие, если условие выполняется, выполняется оператор после then, если не выполняется, то выполняется оператор после else.

If <условие> then <оператор>;

Если else отсутствует, то в случае невыполнения условия, управление передается оператору, следующему за if.

Условия типа if могут быть вложенными. Пред else никогда не ставится « ; »

Оператор выбора CASE.

Если один оператор if может обеспечить выбор из двух альтернатив, то оператор case позволяет сделать выбор из произвольного числа имеющихся вариантов.

Оператор case состоит из выражения селектора и списка параметров, каждому из которых предшествует список констант выбора (список может состоять из 1 константы)

Case <выражение-селектор> of

Оператор case работает следующим образом:

Сначала вычисляется выражение-селектор, затем обеспечивается реализация того оператора, константа которого равна текущему значению селектора.

Если ни одна из констант не равна текущему значению селектора, то выполняется оператор, стоящий за словом else. Если else отсутствует, то активизируется оператор, стоящий за словом end. То есть первый оператор за границей case.

Селектор должен относиться к одному из целочисленных типов (находящихся в диапазоне от –32768 до +32767) или литературному или пользовательскому.

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

writeln(‘введи x и a’);

Оператор повтора WHILE.

В ТП существует 3 оператора повтора:

while часто этот оператор называют оператором с пред условием.

Условие продолжения цикла

While <условие продолжения повтора> do <оператор>;

Результат условия — булевское выражение. Если условие выполняется, то управление передается оператору, если условие не выполняется, то переходим к оператору, следующему за while.

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

Оператор while повторяется до тех пор, пока не будет выполняться условие.

else writeln(‘нет решения’);

Оператор повтора REPEAT.

Его также называют оператором повтора с пост условием.

until <условие окончания цикла>;

оператор repeat имеет следующие отличия от оператор while:

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

критерием прекращения повторения цикла является равенство выражения константе.

Таким образом, если цикл while мы можем назвать циклом «пока», то цикл repeat until – «до». Условие, записанное после until является условием выхода.

else writeln(‘нет решения’);

Оператор повтора FOR.

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

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

Если управляющая переменная изменяется от меньшего выражения к большему, используется to.

Если изменяется от большего к меньшему, то используется downto.

For <переменная>:= <выражение> to <выражение> do <оператор>;

For <переменная>:= <выражение> downto <выражение> do <оператор>;

Ограничения для операторов for:

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

управляющая переменная должна иметь дискретный (целый) путь.

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

в теле цикла запрещается явное изменение управляющей переменной.

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

k [-10;10] ш. 1

writeln(‘введи c и d’);

for k:=-10 to 10 do

else writeln(‘нет решения’);

В ТП есть возможность осуществлять вывод окнами и изменять цвет фона и шрифта. Следует помнить, что установленный цвет фона, цвет текста, также размер окна являются активными по умолчанию, то есть если не произвести переназначение, то эти параметры будут действительны до конца сеанса ТП и DOS.

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

Окно: записывается командой и задается координатами

X1,Y1 – левая верхняя точка окна.

X2,Y2 – правая нижняя точка.

Х изменяется от 1 до 80

Y изменяется от 1 до 25

Цвет текста Textcolor (<цвет>);

Цвет фона Textbackground (<цвет>);

Цвет фона изменяется от 0 до 6

Цвет текста изменяется от 0 до 16

В том и другом случае цвет может задаваться английским наименованием цвета или цифрой, соответствующей этому наименованию.

13 (light magenta)

16 (blink) — мерцающий

Включение мерцающего режима задается комбинацией цифр со знаком «+»

Цвет + режим мерцания.

Textcolor (14+16); writeln(a);

В ТП для модуля crt существует функция READKEY, которая приостанавливает выполнение программы. Запуск программы – любая клавиша.

Написать программу возведения числа в любую степень (a n ), n – целое число, может быть отрицательным « — ». Интерфейс программы вводимое окно положительных значений прямоугольник (15,4). Окно вывода представляет собой прямоугольник (20,3). Информация посередине. Выводимое окно для положительных и отрицательных значений имеют разные цвета.

writeln(‘введи число и степень’);

Процедуры и функции.

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

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

Структурное программирование – программирование без go to, то есть не исполняются операторы перехода без особой надобности. В связи с этим фрагменты программы представляют собой некоторые логические (управляющие) структуры, которые определяют порядок выполнения содержащихся в них правил о проверке данных. Любая программа получается построенной из стандартных логических структур, число типов которых невелико.

Основные логические структуры:

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

Ветвление – управляющая структура, которая в зависимости от выполнения заданного условия определяет выбор для исполнения одного из двух или более заданных в этой структуре групп операторов.

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

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

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

Решение отдельного фрагмента сложной задачи представляет собой самостоятельный программный блок, называемый подпрограммой.

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

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

Подпрограммы в ТП.

За наличие подпрограмм, как средство структурирования программ в языке ТП этот язык называют процедурно-ориентированным. Подпрограммы в ТП реализованы посредством процедур и функций.

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

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

Структура процедуры повторяет структуру программы. Процедура не может выступать как операнд в выражении. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и ее вызову.

Функция аналогична процедуре, но имеет 2 отличия:

функция передает в точку вызова скалярное (числовое) значение и имя функции может входить в выражение как операнд.

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

Все процедуры и функции в ТП делятся не 2 группы:

Первые входят в состав языка и вызываются для выполнения под строго фиксированным именем.

Вторые разрабатываются и именуются самим пользователем.

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

SYSTEM – среда ТП (основа), содержащиеся в нем подпрограммы обеспечивают работу всех остальных модулей.

CRT – содержит средства управления монитором.

DOS – включает средства позволяющие реализовать различные функции дисковой операционной системой.

GRAPH 3 – поддерживает использование стандартных графических подпрограмм версий ТП 3.0

OVERLAY – содержит средства оверлейных программ.

PRINTER – обеспечивает быстрый доступ к печатающему устройству.

TURBO 3 – обеспечивает максимальную совместимость с версией ТП 3.0.

TURBOVISION – библиотека объектно-ориентированных программ для разработки пользовательских интерфейсов.

Интерфейс – устройство или программа для обеспечения согласованной или эффективной работы устройств.

Встроенные процедуры и функции.

Модуль SYSTEM подключается к программе автоматически, поэтому программе становятся доступны все встроенные процедуры и функции.

ABS(X) может быть real и integer

PI ,то есть Пи= 3,1415926535897932384626433832795

RANDOM – генерирует значение случайного числа в диапазоне от 0 до 0,99

RANDOM(i) I – тип word (0…65535) генерирует в диапазоне от 0 до I

EXIT – процедура прерывания. Выход из выполняемого блока в окружающую среду.

Пользовательские процедуры и функции.

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

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

Параметром называется переменная, которой присваивается некоторое значение в рамках указанного применения.

Различают формальные параметры – параметры, определенные в заголовке подпрограммы, и фактические параметры – выражение, задающие конкретное значение при обращении к подпрограмме.

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

Заголовок процедуры отличается от заголовка функции.

Список формальных параметров

Список формальных параметров

Процедуры и функции записываются после раздела описания, перед началом программы.

Procedure <имя> (формальный параметр);

type …; раздел описания.

f unction <имя> (формальный параметр):<тип результата>;

type …; раздел описания

Функция, определенная пользователем, состоит из заголовка и тела функции.

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

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

Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальному параметру, указанному в заголовке и иметь тот же тип.

Механизм передачи параметров.

Название «формальный» эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения данных и результатов работы процедуры, а при вызове подпрограммы на их место будут подставлены конкретные значения. Этот список указывается после имени подпрограммы и заключается в круглые скобки.

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

Параметры-процедуры, перед которыми должно стоять слово procedure, параметры-функции, перед которыми должно стоять слово function и после которых указывается тип значения, возвращаемого функцией в основную программу.

Не типизированные параметры, перед которыми – var и отсутствует указание типа.

В списке должны быть перечислены имена формальных параметров и их тип.

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

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

Каждому формальному параметру, объявленному как параметр-переменная должен соответствовать фактический параметр в виде переменной соответствующего типа.

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

Name already in use

OAP / articles / t2l2.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Основными технологиями разработки программного обеспечения являются

  • Императивное программирование
  • Структурное программирование
  • Модульное программирование
  • Объектно-ориентированное программирование

Императивное программирование — это исторически первая методология программирования, которой пользовался каждый программист, программирующий на любом из «массовых» языков программирования – Basic, Pascal, C.

Она ориентирована на классическую фон Неймановскую модель, остававшуюся долгое время единственной аппаратной архитектурой. Методология императивного программирования характеризуется принципом последовательного изменения состояния вычислителя пошаговым образом. При этом управление изменениями полностью определено и полностью контролируемо.

Методы и концепции.

  • Метод изменения состояний — заключается в последовательном изменении состояний. Метод поддерживается концепцией алгоритма.
  • Метод управления потоком исполнения — заключается в пошаговом контроле управления. Метод поддерживается концепцией потока исполнения.

Вычислительная модель. Если под вычислителем понимать современный компьютер, то его состоянием будут значения всех ячеек памяти, состояние процессора (в том числе — указатель текущей команды) и всех сопряженных устройств. Единственная структура данных — последовательность ячеек (пар «адрес» — «значение») с линейно упорядоченными адресами.

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

Синтаксис и семантика. Языки, поддерживающие данную вычислительную модель, являются как бы средством описания функции переходов между состояниями вычислителя. Основным их синтаксическим понятием является оператор. Первая группа — простые операторы, у которых никакая их часть не является самостоятельным оператором (например, оператор присваивания, оператор безусловного перехода, вызова процедуры и т. п.). Вторая группа — структурные операторы, объединяющие другие операторы в новый, более крупный оператор (например, составной оператор, операторы выбора, цикла и т. п.).

Традиционное средство структурирования — подпрограмма (процедура или функция). Подпрограммы имеют параметры и локальные определения и могут быть вызваны рекурсивно. Функции возвращают значения как результат своей работы.

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

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

Считается, что первым алгоритмическим языком программирования был язык Plankalkuel (от plan calculus), разработанный в 1945—1946 годах Конрадом Цузе (Konrad Zuse).

Большинствои из наиболее известных и распространенных императивных языков программирования было создано в конце 50-х — середине 70-х годов XX века. Это период 80-х и 90-х годов соответствует увлечениям новыми парадигмами, и императивных языков в это время практически не появлялось.

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

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

Структурное программирование (СП) возникло как вариант решения проблемы уменьшения СЛОЖНОСТИ разработки программного обеспечения.

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

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

Таким образом, цель структурного программирования — повышение надежности программ, обеспечение сопровождения и модификации, облегчение и ускорение разработки.

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

Подход базируется на двух основных принципах:

  • Последовательная декомпозиция алгоритма решения задачи сверху вниз.
  • Использование структурного кодирования.

Напомним, что данная методология является важнейшим развитием императивной методологии.

Происхождение, история и эволюция. Создателем структурного подхода считается Эдсгер Дейкстра. Ему также принадлежит попытка (к сожалению, совершенно неприменимая для массового программирования) соединить структурное программирование с методами доказательства правильности создаваемых программ. В его разработке участвовали такие известные ученые как Х. Милс, Д.Э. Кнут, С. Хоор.

Методы и концепции, лежащие в основе структурного программирования. Их три

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

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

[Пратт Т., 1979] «Важным для программиста свойством синтаксиса является возможность отразить в структуре программы структуру лежащего в ее основе алгоритма. При использовании для построения программы метода, известного под названием структурное программирование, программа конструируется иерархически — сверху вниз (от главной программы к подпрограммам самого нижнего уровня), с употреблением на каждом уровне только ограниченного набора управляющих структур: простых последовательностей инструкций, циклов и некоторых видов условных разветвлений. При последовательном проведении этого метода структуру результирующих алгоритмов легко понимать, отлаживать и модифицировать. В идеале у нас должна появиться возможность перевести построенную таким образом схему программы прямо в соответствующие программные инструкции, отражающие структуру алгоритма.»

Теорема о структурировании (Бёма-Джакопини (Boem-Jacopini)): Всякую правильную программу (т.е. программу с одним входом и одним выходом без зацикливаний и недостижимых веток) можно записать с использованием следующих логических структур — последовательность, выбора и повторение цикла

Следствие 1: Всякую программу можно привести к форме без оператора goto.

Следствие 2: Любой алгоритм можно реализовать в языке, основанном на трех управляющих конструкциях -последовательность, цикл, повторение.

Следствие 3: Сложность структурированных программ ограничена, даже в случае их неограниченного размера.

Структурное программирование- это не самоцель. Его основное назначение- это получение хорошей («правильной») программы, однако даже в самой хорошей программе операторы перехода goto иногда нужны: например — выход из множества вложенных циклов.

Практически на всех языках, поддерживающих императивную методологию, можно разрабатывать программы и по данной методологии. В ряде языков введены специальные заменители оператора goto, позволяющие облегчить управление циклами (например, Break и Continue в языке C).

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

Модульное программирование — это такой способ программирования, при котором вся программа разбивается на группу компонентов, называемых модулями, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. Единственная альтернатива модульности — монолитная программа, что, конечно, неудобно. Таким образом, наиболее интересный вопрос при изучении модульности — определение критерия разбиения на модули.

Концепции модульного программирования.

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

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

Аксиома модульности Коуэна. Модуль — независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:

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

Сборочное программирование Цейтина. Модули — это программные кирпичи, из которых строится программа. Существуют три основные предпосылки к модульному программированию:

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

Определения модуля и его примеры. Приведем несколько дополнительных определений модуля.

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

Функциональная спецификация модуля должна включать:

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

Разновидности модулей. Существуют три основные разновидности модулей:

«Маленькие» (функциональные) модули, реализующие, как правило, одну какую-либо определенную функцию. Основным и простейшим модулем практически во всех языках программирования является процедура или функция.

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

  • задачи в языке программирования Ada;
  • кластер в языке программирования CLU;
  • классы в языках программирования C++ и Java.

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

  • модуль в языке программирования Modula-2;
  • пакеты в языках программирования Ada и Java.

Набор характеристик модуля предложен Майерсом [Майерс 1980]. Он состоит из следующих конструктивных характеристик:

В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оперативном буфере памяти человека. Символьные образы в человеческом мозгу объединяются в «чанки» — наборы фактов и связей между ними, запоминаемые и извлекаемые как единое целое. В каждый момент времени человек может обрабатывать не более 7 чанков.

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

прочности (связности) модуля;

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

Связность (прочность) модуля — мера независимости его частей. Чем выше связность модуля — тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Можно выделить типы связности, приведенные ниже.

Функциональная связность. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же типами связностей.

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

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

Обратим внимание на то, что средства для задания информационно прочных модулей отсутствовали в ранних языках программирования (например, FORTRAN и даже в оригинальной версии языка Pascal). И только позже, в языке программирования Ada, появился пакет — средство задания информационно прочного модуля.

сцепления модуля с другими модулями;

Сцепление — мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим различные типы сцепления.

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

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

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

рутинности (идемпотентность, независимость от предыдущих обращений) модуля.

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

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

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

Метод объектно-ориентированного программирования (ООП).

Метод структурного программирования оказался эффективен при написании программ «ограниченной сложности». Однако с возрастанием сложности реализуемых программных проектов и, соответственно, объема кода создаваемых программ, возможности метода структурного программирования оказались недостаточными.

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

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

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

Методология ООП использует метод объектной декомпозиции, согласно которому структура системы (статическая составляющая) описывается в терминах объектов и связей между ними, а поведение системы (динамическая составляющая) — в терминах обмена сообщениями между объектами. Сообщения могут быть как реакцией на события, вызываемые как внешними факторами, так и порождаемые самими объектами.

Объектно-ориентированные программы называют «программами, управляемыми от событий»,в отличие от традиционных программ, называемых «программам, управляемыми от данных».

Основные методы и концепции ООП

  • Метод объектно-ориентированной декомпозиции – заключается в выделении объектов и связей между ними. Метод поддерживается концепциями инкапсуляции, наследования и полиморфизма.
  • Метод абстрактных типов данных – метод, лежащий в основе инкапсуляции. Поддерживается концепцией абстрактных типов данных.
  • Метод пересылки сообщений – заключается в описании поведения системы в терминах обмена сообщениями между объектами. Поддерживается концепцией сообщения.

Вычислительная модель чистого ООП поддерживает только одну операцию – посылку сообщения объекту. Сообщения могут иметь параметры, являющиеся объектами. Само сообщение тоже является объектом.

Объект имеет набор обработчиков сообщений (набор методов). У объекта есть поля – персональные переменные данного объекта, значениями которых являются ссылки на другие объекты. В одном из полей объекта хранится ссылка на объект-предок, которому переадресуются все сообщения, не обработанные данным объектом. Структуры, описывающие обработку и переадресацию сообщений, обычно выделяются в отдельный объект, называемый классом данного объекта. Сам объект называется экземпляром указанного класса.

Синтаксис и семантика

В синтаксисе чистых объектно-ориентированных языков все может быть записано в форме посылки сообщений объектам. Класс в объектно-ориентированных языках описывает структуру и функционирование множества объектов с подобными характеристиками, атрибутами и поведением. Объект принадлежит к некоторому классу и обладает своим собственным внутренним состоянием. Методы — функциональные свойства, которые можно активизировать.

В объектно-ориентированном программировании определяют три основных свойства:

Инкапсуляция. Это сокрытие информации и комбинирование данных и функций (методов) внутри объекта.

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

Большинство окружающих нас объектов относится к категориям, рассмотренным в книге [Шлеер, Меллор 1993]:

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

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

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

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

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

Для поддержки концепции ООП были разработаны специальные объектно-ориентированные языки программирования. Все языки OOП можно разделить на три группы.

  • Чистые языки, в наиболее классическом виде поддерживающие объектно-ориентированную методологию. Такие языки содержат небольшую языковую часть и существенную библиотеку, а также набор средств поддержки времени выполнения.
  • Гибридные языки, которые появились в результате внедрения объектно-ориентированных конструкций в популярные императивные языки программирования.
  • Урезанные языки, которые появились в результате удаления из гибридных языков наиболее опасных и ненужных с позиций ООП конструкций.

Общие принципы разработки программного обеспечения

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

Частотный принцип. Основан на выделении в алгоритмах и в обрабатываемых структурах групп действий и данных по частоте использования. Для действий, которые чаще встречаются при работе ПО, обеспечиваются условия их наиболее быстрого выполнения. К данным, к которым происходит частое обращение, обеспечивается наиболее быстрый доступ. «Частые» операции стараются делать более короткими.

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

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

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

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

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

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

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

Жизненный цикл программного обеспечения

Понятие «жизненный цикл» предполагает нечто рождаю­щееся, развивающееся и умирающее. Подобно живому организму программные изделия создаются, эксплуатируются и развиваются во времени.

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

Можно выделить несколько фаз существования программного изделия в течение его жизненного цикла. Общепринятых названий для этих фаз и их числа пока еще нет. Но и особых разногласий по этому вопросу нет. Поэтому существует несколько вариантов разбиения жизненного цикла программного обеспечения на этапы. Вопрос о том, лучше ли данное конкретное разбиение, чем другие, не является основным. Главное, необходимо пра­вильно организовать разработку программного обеспечения с их учетом.

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

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

Их жизненный цикл состоит из длительного интервала сис­темного анализа и формализации проблемы, значительного этапа проектирования программ и относительно небольшого времени эксплуатации и получения результатов. Требования, предъяв­ляемые к функциональным и конструктивным характеристикам, как правило, не формализуются, отсутствуют оформленные испытания программ. Показатели их качества контролируются только разработчиками в соответствии с их неформальными представлениями.

Сопровождение и модификация таких программ не обязатель­ны, и их жизненный цикл завершается после получения резуль­татов вычислений. Основные затраты в жизненном цикле таких программ приходятся на этапы системного анализа и проектирования, которые продолжаются от месяца до 2 лет, в результате чего жизненный цикл программного изделия редко превышает 3 года.

Программные изделия с большой длительностью эксплуатации создаются для регулярной обработки информации и управления. Структура таких программ сложная. Их размеры могут изменяться в широких пределах, однако все они обладают свойствами познаваемости и возможности модифи­кации в процессе длительного сопровождения и использования различными специалистами. Программные изделия этого класса допускают тиражирование, они сопровождаются документацией как промышленные изделия и представляют собой отчуждаемые от разработчика программные продукты.

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

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

Обобщенная модель жизненного цикла программного изделия может выглядеть так:

  • исследования;
  • анализ осуществимости:
    • эксплуатационной;
    • экономической;
    • коммерческой.

    Проектирование программного обеспечения:

    • конструирование:
      • функциональная декомпозиция системы, ее архитектура;
      • внешнее проектирование программного обеспечения;
      • проектирование базы данных;
      • архитектура программного обеспечения;
      • внутреннее проектирование программного обеспечения;
      • внешнее проектирование программных модулей;
      • внутреннее проектирование программных модулей;
      • кодирование;
      • отладка программ;
      • компоновка программ;

      Оценка (испытания) программного обеспечения.

      Использование программного обеспечения:

      • эксплуатация;
      • сопровождение.

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

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

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

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

      Исследования заканчиваются тогда, когда требования сформи­рованы в таком виде, что становятся обозримыми и при необ­ходимости могут быть модифицированы и одобрены ответствен­ным руководителем.

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

      Работа заключается в исследовании предполагаемого прог­раммного изделия с целью получения практической оценки возможности реализации проекта, в частности определяются:

      • осуществимость эксплуатационная, будет ли изделие доста­точно удобно для практического использования?
      • осуществимость экономическая, приемлема ли стоимость разрабатываемого изделия? Какова эта стоимость? Будет ли изделие экономически эффективным инструментом в руках пользователя?
      • осуществимость коммерческая,будет ли изделие привлека­тельным, пользоваться спросом, легко устанавливаемым, прис­пособленным к обслуживанию, простым в освоении?

      Эти и другие вопросы необходимо решать главным образом при рассмотрении указанных выше требований.

      Анализ осуществимости заканчивается, когда все требования собраны и одобрены.

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

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

      Часто в период системного анализа принимается решение о прекращении дальнейшей разработки программного обеспе­чения.

      Проектирование программного обеспечения. Проектиро­вание является основной и решающей фазой жизненного цикла программного обеспечения, во время которого создается и на 90% приобретает свою окончательную форму программное из­делие.

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

      Конструирование программного обеспечения обычно начи­нается ещё в фазе анализа осуществимости, как только оказы­ваются зафиксированными на бумаге некоторые предварительные цели и требования к нему.

      К моменту утверждения требований работа в фазе конст­руирования будет в самом разгаре.

      На этом отрезке жизни программного обеспечения осу­ществляют:

      • функциональную декомпозицию решаемой задачи, на основе которой определяется архитектура системы этой задачи;
      • внешнее проектирование программного обеспечения, вы­ражающееся в форме внешнего взаимодействия его с поль­зователем;
      • проектирование базы данных, если это необходимо;
      • проектирование архитектуры программного обеспечения — определение объектов, модулей и их сопряжения.

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

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

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

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

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

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

      Фаза оценки начинается, как только все компоненты (мо­дули) собраны вместе и испытаны, т.е. после полной отладки готового программного продукта. Она заканчивается после полу­чения подтверждения, что программное изделие прошло все испытания и готово к эксплуатации.

      Она продолжается так же долго, как и программирование.

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

      Такое сравнение уместно ввиду того, что во время исполь­зования программного изделия исправляются ошибки, вкрав­шиеся в процессе его проектирования.

      Фаза использования программного изделия начинается тогда, когда изделие передается в систему распределения.

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

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

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

      Использование программного продукта определяется его эксплуатацией и сопровождением.

      Эксплуатация программного изделия заключается в испол­нении, функционировании его на ЭВМ для обработки инфор­мации и в получении результатов, являющихся целью его соз­дания, а также, в обеспечении достоверности и надежности выдаваемых данных.

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

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

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

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

      Возможны и обычно желательны перекрытия между разными фазами жизненного цикла программного изделия. Однако не должно быть никакого перекрытия между несмежными про­цессами.

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

      Традиционно приложения делят на две большие группы (по способу взаимодействия с пользователем):

      консольные, ввод и вывод информации в которых производится при помощи стандартных потоков ввода (stdin), поток вывода (stdout) и поток ошибок (stderr).

      Стандартные потоки открываются автоматически при запуске программы и связаны по умолчанию с монитором. Хотя вывод может быть перенаправлен в файл (или из файла) средствами операционной системы (>>, <<, >, <).

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

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

      Широкое развитие консольные программы получили в UNIX-подобных операционных системах, где консольные инструменты развиваются и совершенствуются до сих пор.

      оконные приложения позволяют выводить информацию посредством растровых изображений с интенсивным использованием событийной модели.

      Историческая справка — Xerox, Apple (Lisa, Macintosh), Microsoft (Windows), UNIX (X Window System).

      В настоящий момент используется два типа графических операционных систем: клиент-серверная (X Window) — приложение использует запрос к серверу X Window нарисовать что-то в определённой области и графическое ядро (Windows) — программа взаимодействует с операционной системой посредством Windows API, выступая по сути частью операционной системы.

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

      Разработка при помощи Windows API требует определённых усилий и выполнения рутинных операций, поэтому было разработано несколько библиотек-обёрток, облегчающих построение Windows-приложений. Среди них следует отметить разработку Microsoft — MFC (очень сильно перекликается с API) и разработку Borland — VCL — более удобная, но менее гибкая система построения оконных приложений.

      Достаточно популярность платформа .NET (изначально написна для Windows, но есть и реализация под Linux — Mono), в которой построением приложений занимается интерпретатор байт-кода — это позволяет ещё быстрее строить оконные приложения (недостаток — несовместимость и необходимость установки среды исполнения .NET-приложений).

      QT (кьют) — кросс-платформенный фреймфорк, изначально разработан для С++, но есть привязки и ко многим другим языкам программирования, в частности для питона есть модуль PyQT.

      • Standalone-приложение («Stand» и «Alone», что на русский дословно переводится как «остаться одному») — это такое программное обеспечение, которое не нуждается в каких-либо дополнительных программах и зависимостях для его установки и функционирования.
      • Клиент-серверное приложение, программа состоит из двух и более частей, у клиента на компьютере тонкий клиент, обеспечивающий только взаимодействие с пользователем и локальной периферией, а вся бизнес-логика вынесена на отдельный сервер.
      • WEB-приложение (в принципе это частный случай клиент-серверного приложения, в котором клиенской части просто нет, вместо нее выступает браузер)

      Теория по консольным приложениям выше уже была, посмотрим как консольное приложение выглядит на C#:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *