Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Этапы решения инженерных задач с помощью ЭВМ.



Введение

Конспект посвящен второму разделу дисциплины " Информатика" - " Основы алгоритмизации и программирование". Он написан на основе курса лекций, прочитанных в МГТУ " СТАНКИН" в течение последних 5 лет для студентов 2 семестра обучения.

Конспект рассчитан на 7 лекций и соответствует рабочим программам по дисциплине " Информатика" для направлений обучения 651400 - Машиностроительные технологии и оборудование; 062000 - Механика и робототехника; 657800 - Конструкторско-технологическое обеспечение машиностроительных производств; 657900 - Автоматизированные технологии и производства, 653700 - Приборостроение, 653800 - Стандартизация, сертификация и метрология.

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

При изложении материала предполагается, что студентами освоена программа I семестра в части принципов работы ЭВМ и представления в памяти ПК чисел, символов и команд. Также считается, что студенты владеют сведениями о программном обеспечении ПК и функционировании операционных систем в объеме программы I семестра.

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

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

Рекомендуемая литература

а) основная литература

1. Керниган, Д. Ритчи. Язык программирования Си (пер. с англ.). — М.: Финансы и статистика, 1992.

2. Березин Б.И., Березин С.Б. Начальный курс С и С++ Диалог МИФИ 1996

3. Дейтел Х., Дейтел П. Как программировать на С++: Пер. с англ. – М.: ЗАО «Издательство БИНОМ», 1998 г. – 1024 с.: ил.

4. Луис Дерк. Справочник С и С++. М., Бином, 1997

 

б) дополнительная литература:

1. Паппас К., Мюррей У. Программирование на C и C++. Библиотека студента. BHV 2000.

2. Культин Н.Б. С/С++ в задачах и примерах. – Спб.: БХВ-Петербург, 2001.-288 с.: ил.

3. Крячков А.В. и др. Программирование на С и С++. Практикум. М.: Радио и связь. 1997.

4. Подбельский В.В. Язык С++. М.: Финансы и статистика, 1996.

5. Ишкова Э.А. С++. Начала программирования – М.: ЗАО «Издательство БИНОМ», 2000. – 304 с.: ил.

 

Алгоритмы решения задач.

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

Понятие алгоритма, его свойства.

Понятие алгоритма обсуждалось в прошлом семестре. Рассмотрим его более полно.

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

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

Свойства алгоритма

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

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

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

4. Универсальность (массовость). Решение однотипных задач с раз­личными исходными данными можно осуществлять по одному и тому же алгоритму, что дает возможность создавать типовые программы для решения задач при различных вариантах задания значений исходных данных.

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

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

Основные блочные символы.

Таблица 1.

Название Внешний вид Пример Назначение
Линии передачи управления (потока информации) Соединяют различные блоки между собой, показывают последовательность выполнения блоков алгоритма.
Соединение линий потока информации Служит для соединения нескольких линий в одну. Стрелки ставятся при направлении линии справа налево и снизу вверх.
Начало алгоритма Внутри указывается назначение или название алгоритма. Вход может быть только один.
Конец алгоритма Внутри можно указать вычисляемое в алгоритме данное. Выходов из алгоритма может быть несколько.
Блок обработки данных (последо­вательное действие или процесс) Применяется для обозначения одного или последовательности действий, изменяющих значение, форму представления или размещение данных. Для улучшения наглядности схемы несколько отдельных блоков обработки можно объединить в один блок.
Ветвление (развилка) Используется для обозначения переходов управления в зависимости от выполнения условия. Если условие истинно, управление передается по стрелке да, в противном случае - по стрелке нет.
Ввод данных (с клавиатуры) Используется для обозначения операций ввода информации. Пример: ввести значения переменных a и b с клавиатуры.
Вывод результатов на бумагу Используется для обозначения операций вывода информации. Пример: вывести значения переменных x и y.
Ввод или вывод данных (без указания устройства) Используется для обозначения операций ввода или вывода информации без указания устройства. Пример: ввести значения переменных a и b.
Предопределенный процесс (вызов модуля) Используется для указания обращения к алгоритму, описанному в другом месте. При этом должна существовать блок-схема, имеющая указанное название. Такой блок помогает структурировать алгоритм и облегчает понимание его работы в целом.
Разрыв линии передачи управления и ее продолжение Используется для разрыва линии передачи управления и продолжения алгоритма на том же листе, когда нужно избежать излишних пересечений линий переходов.
Перенос алгоритма на следующую страницу Используется для разрыва алгоритма, когда его схема не умещается на одном листе, и продолжения схемы алгоритма на указанном в блоке листе.
Текстовые пояснения Используется для дополнения схемы алгоритма текстовыми пояснениями.

Алгоритм обработки массива.

При решении задач с массивами чисел или символов чаще всего используется один и тот же алгоритм единообразной поочередной обработки каждого элемента массива в отдель­ности. Для этого обычно применяется цикли­ческий алгоритм с параметром, рассмотренный справа. Массив a из n элементов будем обозначать {a}n, а элемент массива с номером i - ai. Сначала вводится количество n элементов массива a и сам массив (блок 1). Затем проводятся подготовительные операции (блок 2), содержание которых зависит от решаемой задачи. Обычно здесь задаются начальные значения вспомогательным переменным. Блоки 3, 4 и 6 являются обязательными, именно они реа­лизуют цикл и позволяют поочередно обработать каждый элемент массива. Блок 3 задает но­мер начального элемента обрабатываемого мас­сива, блок 4 позволяет закончить обработку и выйти из цикла после превышения номером текущего элемента значения n, а блок 6 позволяет после обработки текущего элемента перей­ти к следующему, увеличив номер элемента на 1.
При обработке i-го элемента массива в некоторых случаях возможен досрочный выход из цикла, тогда в блок-схеме появляется блок 9, на который передается управление прямо от блока 5. После окончания обработки производят вывод исходного массива для контроля правильности его ввода (блок 7), а затем анализируют и печатают результаты обработки (блок 8).

Системы программирования.

Состав.

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

В состав системы программирования обычно входят:

¨ описание применяемого языка программирования;

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

¨ программы-трансляторы, переводящие исходный текст программы в машинный код;

¨ развитую библиотеку стандартных подпрограмм;

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

Реализация языка.

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

Имеются два основных вида средств реализации языка: компиляторы и интерпретаторы.

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

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

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

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

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

Машинно-ориентированные.

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

Ассемблеры.

В настоящее время широкое применение из машинно-ориентирован­ных языков нашел язык ассемблера. Как правило, в языке ассемблера существует четыре типа операторов:

1) мнемоническая команда - соответствует одной машинной команде, в ней вместо машинных кодов операций используются мнемонические обозначения;

2) псевдокоманда - служит для передачи информации программе-транслятору и не порождает команд на машинном языке;

3) макрокоманда - соответствует нескольким машинным командам;

4) условная команда ассемблера - используется для управления процессом трансляции.

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

Машинно-независимые.

Машинно-независимые системы программирования строятся на основе процедурно-ориентированных и проблемно-ориентированных языков.

Процедурно-ориентированные.

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

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

Проблемно-ориентированные.

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

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

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

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

Табл.3

Смысл объекта Вид представления Место хранения Язык Имя хранения Название объекта   Алгоритм Блок-схема в тетради Язык -графический Имя алгоритма блок-схема задачи   Программа текст в тетради на языке Си Имя программы текст программы
         
Программа Файл на диске на языке машкод имя.exe загрузочный модуль   Программа Файл на диске на языке машкод имя.obj объектный модуль   Программа Файл на диске на языке Си имя.cpp исходный модуль
         
Результаты Числа и текст на экране или в файле На русском языке   Исходные данные Числа и текст Ввод с клавиатуры или из файла На русском языке   Стандарт-е функции Объектный модуль на диске на языке машкод .lib, .obj Библ.станд.функций

 

2. Основные понятия языка Си++.

История создания.

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

Самым первым в ряду предшественников Си следует считать язык Алгол-60, разработанный в 1960 г. Международным комитетом. В Алголе впервые большое внимание было уделено модульной структуре программы. На базе Алгола в 1963 году возник язык CPL (Conbined Programing Language - комбинированный язык программирования) - совместная разработка Кембриджского и Лондонского университетов.

Язык BCPL, созданный Мартином Ричардом в 1967 г., был получен выделением из CPL его основных свойств. Ещё большее упрощение представлял собой язык В (1970 г Кен Томпсон, Bell Laboratories). Но экономия средств языков BCPL и В привела к тому, что они стали ограниченными, пригодными только для узкого круга задач.

Язык Си был создан в 1972 г Денисом Ритчи (Bell Laboratories) как инструментальное средство операционной системы UNIX. Достижением при разработке языка Си было восстановление потерянной общности за счёт удачной системы типов данных, но без потери простоты, что и было целью разработки языка CPL.

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

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

2.2

Алфавит.

Предложения любого языка пишутся на основе некоторого алфавита, т.е. набора символов, используемых для записи инструкций языка, которые компилятор переводит в машинный код. В С++ к алфавиту относятся все буквы латинского алфавита, цифры от 0 до 9, символы кириллицы и специальные символы, а именно все, которые есть на клавиатуре ЭВМ, в частности: ., ; : ' " ? / * + - _! @ & { } ( ) [ ] и др. Необходимо отметить, что компилятор языка С++ отличает большие и маленькие буквы латинского алфавита.

Структура программы.

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

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

¨ // в любом месте строки, действителен до конца строки

¨ /* в начале комментария и */ в конце, действителен в любом месте текста

Операторы языка делятся на исполняемые и неисполняемые. Неисполняемые содержат дополнительные инструкции компилятору для перевода текста в машинный код. Эти инструкции отсутствуют в exe-модуле. Исполняемые операторы непосредственно переводятся в машинный код.

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

Основными видами операторов, определяющих структуру программы, являются:

¨ директивы препроцессора;

¨ объявления функций;

¨ описания переменных - (для хранения данных);

¨ описания (определения) функций - (описывают вычисления);

 

Сразу напишем пример программы.

Пример 1. Программа, вычисляющая площадь треугольника:

#include < iostream.h> // Директива препроцессора

float pl(float a, float b); //Объявление (прототип) функции pl()

// Описание функции main

имя
void main() // Заголовок описания функции main

{

float katet1, katet2; // описание переменных

cout < < " Введите катеты (в см): "; // Инструкции,

cin > > a, b; // описывающие

cout < < " Площадь треугольника =" // действия

< < Pl(katet1, katet2) < < " см*см\n";

}

// Описание функции pl()

/**** Расчет площади прямоугольного треугольника ***********

****по его катетам a и b. Возвращает площадь ********/

Список пар-ров
float pl(float a, float b) // Заголовок описания функции pl()

{

Тело функции pl()

float s; // объявление переменной s

s=a*b/2; // Инструкции,

return s; // описывающие

} // действия

Рассмотрим указанные выше типы операторов.

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

Описания (или определения, definition ) функций следуют одно за другим в произвольном порядке и имеют вид (синтаксис)

 

Тип имя ( [список параметров] ) -заголовок

{

Тело функции

описания переменных (переменные хранят значения)

исполняемые операторы (инструкции,

описывающие действия)

}

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

Имя (идентификатор) - последовательность латинских букв и цифр, начинающихся с буквы, символ " _" - тоже буква. Строчные и прописные буквы различаются. Длина имени - не больше 32 символов.

Имена функциям дает программист, однако одна из них должна иметь имя main(), поскольку именно с нее всегда начинается выполнение программы. В примере описаны 2 функции - main() и pl(). Выполнение начинается с функции main(), из которой вызывается функция pl().

Тип указывает на тип вычисляемого (возвращаемого) функцией значения. Если функция ничего не возвращает, то в качестве типа пишется слово void.

Любая функция должна быть описана до обращения к ней (до вызова), чтобы компилятор мог понять, правильно ли это обращение. Если описание указано после обращения, в начале программы (до функции main() ) должен быть указано объявление этой функции (прототип, declaration ) в виде ее заголовка с "; " в конце.

Для стандартных функций прототипы уже имеются в специальных header-файлах, которые поставляются вместе с другими файлами пакета Си++ и имеют расширение ".h". Чтобы не указывать самостоятельно прототипы используемых стандартных функций, можно с помощью директивы препроцессора #include включить этот файл в текст программы. Например, прототипы стандартных потоков ввода и вывода cin и cout находятся в файле iostream.h. При выполнении директивы

#include < iostream.h>

препроцессор вставит на место этой строки содержимое файла iostream.h, не изменяя нумерацию строк в тексте. Таким образом соответствующие прототипы появятся в тексте программы.

Выражения в языке Си.

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

Операторы состоят из ключевых слов и выражений. Выражения, в свою очередь, состоят из операндов, знаков операций и скобок, задающих порядок вычисления. Операнд выражения - это константа, переменная или обращение к функции. Примеры выражений: a+b/2,
c-sin(a+1) > 3.0.

Выражения можно условно разделить на арифметические и логические.

Операция присваивания.

Операция присваивания имеет вид (синтаксис):

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

Семантика: сначала вычисляется выражение, затем результат заносится в переменную, при этом тип результата преобразуется к типу переменной (конечно, если это возможно, например, тип float нельзя перевести в int, если число > 32767). Результатом операции и его типом являются значение и тип переменной.

Если в выражении несколько операций " =", то они выполняются справа налево. Приоритет этой операции ниже приоритета всех остальных операций, кроме операции " запятая", которая рассмотрена ниже.

Пример 1:

float a=2.5, b; int c; char d;

Результатом выражения

Выражение Значение b Значение с Значение d Знач-е выр-я
c=a+1    
b=c=a+1 3.0   3.0
c=b=a+1 3.5  
d=c='A'+4   'E' 'E'
(c=a+1)+2> 5    

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

Условная операция.

Условная операция имеет 3 операнда (т.е. является тернарной) и выглядит так (синтаксис)

условие? выражение1: выражение2

Семантика: если условие истинно, то результатом операции является значение выражения1, если ложно, то значение выражения2.

Пример 2.

Значением выражения x> y? x: y будет большее из x и y. Значением выражения x< 0? -x: x является модуль x.

Стандартные функции.

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

Правила записи.

Обращение к функции имеет вид (синтаксис):

имя(список аргументов)

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

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

2. Аргументы перечисляются через “, ”;

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

Пример 4. y=sin(x)+pow(cos(2.*x), 3.0)

Оператор-выражение.

Оператор-выражение имеет вид (синтаксис):

выражение;

Например, x = y + 3.0; my_funct(x); i=i+1;

max= x> y? (y=0, x): (x=0, y);

Составной оператор.

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

{ Например: {
оператор1 a = 1;
оператор2 b += sin(a);
···················· c *= b;
} }

Такой оператор называется составным или блоком. После символа " }" символ "; " указывать не надо.

Операторы управления.

Операторы в программе выполняются последовательно один за другим. Операторы управления предназначены для изменения последовательности выполнения операторов. Блок-схемы этих операторов приведены в разделе 1.2.3.

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

Условные операторы.

3.1.1 Оператор if - else.

Условный оператор if - else предназначен для изменения последовательности выполнения операторов программы в зависимости от выполнения условия (т.е. для принятия решений) и имеет вид (синтаксис):

if (условие) Например: if (x> y)
оператор1   {max=x; y=0; }
[else   else
оператор2]   {max=y; x=0; }

Оператор if выполняется следующим образом (семантика):

1. Вычисляется условие. 2. Если оно истинно (¹ 0), то выполняется оператор1. Иначе Если есть else-часть выполняется оператор2. Иначе переход к следующему после if оператору    

В примере в переменную max заносится большее из x и y, а меньшее обнуляется (см.2.4.3.3). Скобки {}, образующие блоки, здесь существенны, поскольку по синтаксису после if и else должен стоять только один оператор.

Операторы, входящие в if, сами могут содержать оператор if (т.е. оператор if может быть вложенным). Если у вложенного if нет своей else-части, то можно неоднозначно толковать, куда относится else-часть - ко внешнему или внутреннему if. В Си else всегда относят к ближайшему if, у которого нет своего else. Для изменения этого порядка используют блоки.

Пример 7. Сравним для иллюстрации два оператора if:

if (a> b)   if (a> b)
if(c< 0)   { if(c< 0)
x += 3;   x += 3;
else   }
x += 2;   else
    x += 2;

 

В первом операторе else относится к внутреннему if, а во втором - к внешнему. Совет: всегда заключайте внутренний if в скобки.

3.1.2 Оператор else - if.

Для многоступенчатого принятия решений используют конструкцию else-if (синтаксис):

if (условие1)

оператор1

else if (условие2)

оператор2

else if (условие3)

оператор3

·························

[else оператор]

Семантика: условия операторов “ if” проверяются сверху вниз. Как только встречается истина, выполняется соответствующий оператор и последовательность проверок прекращается. Последняя else-часть срабатывает, если все предыдущие условия ложны. Эта часть может отсутствовать.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 2869; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.125 с.)
Главная | Случайная страница | Обратная связь