Доброго времени суток! В этом уроке мы поговорим от том, как можно управлять ходом выполнения программы, написанной на языке C#, ведь во всех предыдущих примерах, операторы выполнялись строго один за другим. В реальной жизни, программы значительно сложнее, в них встречаются разветвления потока выполнения, зацикливания (многократные выполнения однотипных действий) и тому подобное. Сегодня мы рассмотрим условный оператор, операторы циклов, и попутно операторы сравнения.
Начнем с операторов циклов. Такие операторы нужны, чтобы выполнять однотипные операции несколько раз подряд. Для примера вспомним предыдущий урок, в котором мы изучали массивы.
Надеюсь, Вы уже поняли, что использовать один массив из большого количества элементов значительно удобнее, чем использовать такое же количество «одиночных» переменных, но после изучения циклов, Вы поймете, что использование массивов еще удобнее чем Вы думали…
Вот Вам пример, есть массив целых чисел из десяти элементов, и каждый элемент этого массива нужно обнулить. До сегодняшнего урока мы бы поступили примерно так:
ЯЗЫКИ ПРОГРАММИРОВАНИЯ. ЧТО НУЖНО ЗНАТЬ!
//Размер массива const int SIZE = 10; /* * Создание массива из десяти элементов * с инициализацией этих элементов */ int[] intArray = new int[SIZE] < 24, 51, 41, 54, 12, 24, 42, 35, 72, 11 >; //Обнуление всех элементов массива intArray[0] = 0; intArray[1] = 0; intArray[2] = 0; intArray[3] = 0; intArray[4] = 0; intArray[5] = 0; intArray[6] = 0; intArray[7] = 0; intArray[8] = 0; intArray[9] = 0;
А теперь, я покажу как работают циклы, в данном случае цикл с заранее известным количеством повторений, в языке C# такой цикл обозначается ключевым словом for. Вот как выглядит обнуление всех элементов того же массива при использовании цикла for:
//Обнуление элементов массива в цикле for (int i = 0; i < intArray.Length; i++) < intArray[i] = 0; >//Примечание: выражение i++ означает, что //значение переменной i увеличивается на единицу!
Согласитесь, что код получился значительно компактнее! Так как же пользоваться циклами?
После ключевого слова for следуют круглые скобки, внутри которых есть три секции, разделенные символом «;» (точка с запятой). Первая секция – это секция инициализации, в ней мы создали временную переменную с именем «i», и тут же присвоили ей начальное значение. Эта переменная «i» будет служить индексом элемента массива. Вторая секция – это секция проверки условия.
Вот тут мы и подошли к операциям сравнения. В данном случае, используется операция «меньше», работает она так же, как и в математике, если первый операнд (в нашем случае, переменная «i») меньше второго, свойства «Length» массива intArray, то операция сравнения считается успешной.
Внимание, цикл будет выполняться, т.е. действия буду повторяться снова и снова, пока условие во второй секции считается успешным.
И в третья секция, представляет собой секцию модификации, после каждого выполнения однотипного действия (итерации цикла), будет выполняться секция модификации. Как правило, в этой секции модифицируется значение переменной, объявленной в секции инициализации. Ну а после круглых скобок идет блок операторов (так называемое тело цикла), исполнение которых и будет производиться пока выполняется условие (во второй секции цикла).
Этапы компиляции на Си: предобработка, трансляция, компоновка
В нашем случае, тело цикла состоит из одного оператора. Элементу массива с индексом, который представлен значением переменной «i» присваивается значение «0». А значение переменной «i» с каждым повтором цикла увеличивается на единицу, и тело цикла будет выполняться до тех пор, пока это значение переменной «i» меньше 10 (т.е. длины нашего массива). Таким образом, в цикле перебираются все элементы массива с индексами от 0 до 9, т.е. абсолютно все элементы нашего массива.
А теперь, давайте рассмотрим так называемый оператор выбора. Скажу сразу, в C# есть два оператора выбора, сейчас мы рассмотрим простейший. Такой оператор может разделять ход выполнения программы на максимум на два пути. Обозначается этот оператор ключевым словом if, после которого идут круглые скобки с условием (например, каким-нибудь сравнением), и если условие выполняется, то программа «идет» одним путем, если условие не выполняется – другим.
Для примера, модифицируем условие предыдущей задачи, представим, что нужно обнулить те элементы массива, значение которых меньше 50, выглядеть это будет так:
//Перебор всех элементов массива for (int i = 0; i < intArray.Length; i++) < //Если элемент меньше 50 if (intArray[i] < 50) < intArray[i] = 0; //Тогда обнулить его >>
После оператора if с условием в круглых скобках идет блок операторов, который будет выполняться, только в том случае, если условие выполнилось. Но это только упрощенная форма, есть еще и полная, отличается она тем, что есть в ней есть еще и блок операторов, который будет выполняться, если условие не выполнилось.
Давайте еще раз модифицируем условие задачи! Представим, что те элементы массива значение которых меньше 50 нужно обнулить, а остальным присвоить значение 100. Это делается следующим образом:
//Перебор всех элементов массива for (int i = 0; i < intArray.Length; i++) < //Значение текущего элемента меньше 50? if (intArray[i] < 50) < //Если условие выполнилось intArray[i] = 0; >else < //Если условие не выполнилось intArray[i] = 100; >>
Как несложно заметить, после блока операторов, идущего за условием, добавилось ключевое слово else и еще один блок операторов, который и будет выполняться в случае, когда условие не выполнилось.
В результате, код метода Main будет выглядеть так:
static void Main(string[] args) < //Размер массива const int SIZE = 10; /* * Создание массива из десяти элементов * с инициализацией этих элементов */ int[] intArray = new int[SIZE] < 24, 51, 41, 54, 12, 24, 42, 35, 72, 11 >; //Перебор всех элементов массива for (int i = 0; i < intArray.Length; i++) < //Значение текущего элемента меньше 50? if (intArray[i] < 50) < //Если условие выполнилось intArray[i] = 0; >else < //Если условие не выполнилось intArray[i] = 100; >> >
В этом уроке мы кратко рассмотрели механизмы, позволяющие управлять ходом выполнения программы, т.е. строить не только линейные алгоритмы, но и алгоритмы с циклами и ветвлениями. В следующем уроке мы рассмотрим циклы, с заранее неизвестным количеством итераций (повторений).
Источник: plssite.ru
Этапы обработки программы на компьютере
Исходные модули (ИМ) – тексты программы на алгоритмическом языке.
Объектные модули (ОМ) – оттранслированные тексты программы на машинном языке в относительных адресах.
Загрузочный модуль (ЗМ) – единая готовая к выполнению программа, по-прежнему, в относительных адресах.
Рассмотрим более подробно каждый этап.
Трансляция
В целях снижения уровня сложности разработки большинство программ разбивается на отдельные части, выполняющие одну или более функций. Эти части называют модулями. Каждый модуль может транслироваться отдельно, независимо от других модулей программы. Это позволяет выполнять процесс разработки поэтапно.
Модуль до трансляции называют исходным, после трансляции – объектным. Каждый модуль может состоять из одной или более процедур. В любой программе существует процедура, в которой начинается выполнение и в которой в большинстве случаев работа программы заканчивается. Такую процедуру называют главной ( main ).
Замечание. В современных визуальных средах разработки в качестве главной может применяться специальный объект – форма.
Каждая процедура может передавать данные в другую процедуру и получать обратно результаты ее работы. Совокупность процедур и связей между ними составляют структуру программы. Вариант возможной структуры программы показан на рисунке.
На этапе трансляции выполняется синтаксический анализ текстов исходных модулей, т.е. проверка их соответствия правилам языка. Обычно перехода к следующему этапу обработки программы не происходит, пока не будут исправлены все синтаксические ошибки. Следует заметить, что при этом анализе редко выявляются все нарушения правил языка.
Для обозначения объектов программы на алгоритмическом языке используется понятие имя.
Пример. Возможные имена.
x matrix Height Copy1 Sum
Во время трансляции происходит распределение памяти, т.е. процесс выделения каждому именованному объекту программы области памяти необходимого размера. Выделенная область памяти характеризуется начальным адресом расположения объекта. Поэтому распределение памяти – это процесс установления взаимно однозначного соответствия между именем в исходном модуле и адресом в объектном модуле. Схематически это можно изобразить так.
Поскольку после трансляции программа представляет собой совокупность нескольких объектных модулей, то в качестве адреса объекта выступает смещение относительно начала модуля, в котором встречается его имя. Такие адреса называют относительными.
Наиболее распространенными языками программирования являются: FORTRAN ( Formula Translator – переводчик формул), PL/1 ( Programming Language/1 – язык программирования 1), C и C++, Pascal, BASIC ( Beginner’s All-purpose Symbolic Instruction Code – универсальный язык символического кодирования для начинающих).
Редактирование связей (компоновка)
На этом этапе основным является установление связей между всеми объектными модулями оттранслированной программы и объединение их в единый загрузочный модуль. Каждая среда разработки IDE включает несколько библиотек, содержащих процедуры для выполнения типовых операций, хранящихся в виде объектных модулей. Примерами таких процедур являются различные математические функции, функции работы с датами и т.п. Необходимые библиотечные процедуры также подключаются к загрузочному модулю на этапе компоновки.
После завершения этапа адреса объектов представляют собой смещения относительно начала единого загрузочного модуля, т.е. являются, по-прежнему, относительными.
Загрузка
Процесс загрузки программы был описан выше, поэтому отметим лишь основные функции данного этапа:
— определение и выделение необходимой памяти под программу и данные;
— загрузка программы в выделенную область с формированием абсолютных адресов; абсолютные адреса получаются суммированием относительных адресов загрузочного модуля с начальным адресом выделенной области;
— передача управления первой инструкции главной процедуры.
Выполнение
Источник: infopedia.su
Этапы подготовки программы к выполнению
При разработке программ, используется принцип модульности (разбиения программы на составные части), каждая из которых может подготавливаться отдельно. Модульность является основным инструментом структурирования программного изделия, облегчающим его разработку, отладку и сопровождение.
Программный модуль — программа или функционально завершенный фрагмент программы, предназначенный для хранения, трансляции, объединения с другими программными модулями и загрузки в оперативную память.
При выборе модульной структуры должны учитываться следующие основные соображения:
o Функциональность — модуль должен выполнять законченную функцию
o Несвязность — модуль должен иметь минимум связей с другими модулями, связь через глобальные переменные и области памяти нежелательна
o Специфицируемость — входные и выходные параметры модуля должны четко формулироваться.
От написания до выполнения программа проходит следующие этапы:
1. Обработка макропроцессором
3. Редактирование связей (компоновка)
На рисунке показаны перечисленные этапы и используемые для их выполнения системные обрабатывающие программы.
Рисунок 2-1- этапы подготовки и выполнения прикладной программы
Программа пишется в виде исходного модуля, на рисунке — файл ИМ.
Исходный модуль — программный модуль на исходном языке, обрабатываемый транслятором и представляемый для него как целое, достаточное для проведения трансляции.
Первым (не для всех языков программирования обязательным) этапом подготовки программы является обработка ее Макропроцессором (или Препроцессором). Макропроцессор обрабатывает текст программы и на выходе его получается новая редакция текста (на рис.2-1 – ИМ’). В большинстве систем программирования Макропроцессор совмещен с транслятором, и для программиста его работа и промежуточный ИМ’ «не видны». Следует иметь в виду, что Макропроцессор выполняет обработку текста, это означает, с одной стороны, что он «не понимает» операторов языка программирования и «не знает» переменных программы, с другой, что все операторы и переменные Макроязыка (тех выражений в программе, которые адресованы Макропроцессору) в промежуточном ИМ’ уже отсутствуют и для дальнейших этапов обработки «не видны». Так, если Макропроцессор заменил в программе некоторый текст A на текст B, то транслятор уже видит только текст B, и не знает, был этот текст написан программистом или подставлен Макропроцессором.
Следующим этапом является трансляция.
Трансляция — преобразование программы, представленной на одном языке программирования, в программу на другом языке программирования, в определенном смысле равносильную первой.
Как правило, выходным языком транслятора является машинный язык целевой вычислительной системы. (Целевая ВС — та ВС, на которой программа будет выполняться.)
Машинный язык — язык программирования, предназначенный для представления программы в форме, позволяющей выполнять ее непосредственно техническими средствами обработки информации.
Трансляторы — общее название для программ, осуществляющих трансляцию. Они подразделяются на Ассемблеры и Компиляторы — в зависимости от исходного языка программы, которую они обрабатывают.
Язык Ассемблера — язык программирования, который представляет собой символьную форму машинного языка с рядом возможностей, характерных для языка высокого уровня (обычно включает в себя макросредства).
Язык высокого уровня — язык программирования, понятия и структура которого удобны для восприятия человеком.
Объектный модуль — программный модуль, получаемый в результате трансляции исходного модуля.
Поскольку результатом трансляции является модуль на языке, близком к машинному, в нем уже не остается признаков того, на каком исходном языке был написан программный модуль. Это создает принципиальную возможность создавать программы из модулей, написанных на разных языках. Специфика исходного языка, однако, может сказываться на физическом представлении базовых типов данных, способах обращения к процедурам/функциям и т.п. Для совместимости разноязыковых модулей должны выдерживаться общие соглашения.
Большая часть объектного модуля — команды и данные машинного языка именно в той форме, в какой они будут существовать во время выполнения программы. Однако, программа в общем случае состоит из многих модулей.
Поскольку транслятор обрабатывает только один конкретный модуль, он не может должным образом обработать те части этого модуля, в которых запрограммированы обращения к данным или процедурам, определенным в другом модуле. Такие обращения называются внешними ссылками. Те места в объектном модуле, где содержатся внешние ссылки, транслируются в некоторую промежуточную форму, подлежащую дальнейшей обработке. Говорят, что объектный модуль представляет собой программу на машинном языке с неразрешенными внешними ссылками.
Разрешение внешних ссылок выполняется на следующем этапе подготовки, который обеспечивается Редактором Связей (Компоновщиком). Редактор Связей соединяет вместе все объектные модули, входящие в программу. Поскольку Редактор Связей «видит» уже все компоненты программы, он имеет возможность обработать те места в объектных модулях, которые содержат внешние ссылки. Результатом работы Редактора Связей является загрузочный модуль.
Загрузочный модуль — программный модуль, представленный в форме, пригодной для загрузки в оперативную память для выполнения.
Загрузочный модуль сохраняется в виде файла на внешней памяти. Для выполнения программа должна быть перенесена (загружена) в оперативную память. Иногда при этом требуется некоторая дополнительная обработка (например, настройка адресов в программе на ту область оперативной памяти, в которую программа загрузилась). Эта функция выполняется Загрузчиком, который обычно входит в состав операционной системы.
Возможен также вариант, в котором редактирование связей выполняется при каждом запуске программы на выполнение и совмещается с загрузкой. Это делает Связывающий Загрузчик, другое название – динамический загрузчик. Вариант связывания при запуске более расходный, т.к. затраты на связывание тиражируются при каждом запуске. Но он обеспечивает:
o большую гибкость в сопровождении, так как позволяет менять отдельные объектные модули программы, не меняя остальных модулей;
o экономию внешней памяти, так как объектные модули, используемые во многих программах не копируются в каждый загрузочный модуль, а хранятся в одном экземпляре.
Вариант интерпретации подразумевает прямое исполнение исходного модуля. Интерпретация — реализация смысла некоторого синтаксически законченного текста, представленного на конкретном языке.
Интерпретатор читает из исходного модуля очередное предложение программы, переводит его в машинный язык и выполняет. Все затраты на подготовку тиражируются при каждом выполнении, следовательно, интепретируемая программа принципиально менее эффективна, чем транслируемая. Однако, интерпретация обеспечивает удобство разработки, гибкость в сопровождении и переносимость.
Примеры интерпретаторов: языки процедур (sell, REXX), JVM.
Не обязательно подготовка программы должна вестись на той же вычислительной системе и в той же операционной среде, в которых программа будет выполняться. Системы, обеспечивающие подготовку программ в среде, отличной от целевой называются кросс-системами. В кросс-системе может выполняться вся подготовка или ее отдельные этапы:
Макрообработка и трансляция
Типовое применение кросс-систем — для тех случаев, когда целевая вычислительная среда просто не имеет ресурсов, необходимых для подготовки программ, например, встроенные системы.
Дата добавления: 2015-07-07 ; просмотров: 554 | Нарушение авторских прав
Читайте в этой же книге: Управление страничной памятью в ОС MS Windows | Стратегии подкачки и рабочие наборы страниц | Получение информации о состояниии виртуальной памяти | На рисунке 1 -28 показаны перечисленные этапы и используемые для их выполнения системные обрабатывающие программы. | Обмен данными между процессами | Тема 1.6 Структура MS Windows и драйверы режима ядра | WDM-драйверы | Структура драйвера | Эволюция файловых систем ЭВМ | Структуры данных FAT |
| | следующая страница ==> | |
Восстанавливаемость | | | Операнды команд |
mybiblioteka.su — 2015-2023 год. (0.017 сек.)
Источник: mybiblioteka.su