Первая программа на Си



Дата08.01.2018
Размер3.98 Mb.
ТипМетодические указания

Министерство образования и науки Российской Федерации
ПСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Ильин А. В.

ТЕОРИЯ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ

Методические указания

Для подготовки бакалавров направления 140400 «Электроэнергетика и электротехника» (профиль 10 «Электропривод и автоматика», профиль 16 «Электрооборудование и электрохозяйство предприятий, учреждений и организаций»).


Псков


Издательство ПсковГУ

2016


УДК

ББК


И

Рекомендовано к изданию научно-методическим советом


Псковского государственного университета

Рецензенты

Аннотация:

© Ильин А. В., 2008

© Псковский государственный
политехнический институт, 2008

© Псковский государственный


университет, 2011

СОДЕРЖАНИЕ





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

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

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

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

Команда ЎЄ приказ на выполнение действия из указанного набора, выраженный каким-либо заранее фиксированным способом.

Система команд ЎЄ совокупность всех допустимых команд.

Рисунок 0 ЎЄ Персональный компьютер

Большинство современных вычислительных машин (Рисунок 0) построены на основе общей шины, к которой подключены все необходимые для работы устройства: процессор, внутренняя память (оперативное запоминающее устройство или ОЗУ), внешняя память (жестки диски, устройства чтения и записи лазерных дисков, флэш-диски), устройства ввода (клавиатура, мышь, сканер), устройства вывода (монитор, принтер).

На структурной схеме (Рисунок 0) стрелочками изображены основные виды команд вычислительной машины: 1 ЎЄ вычисление выражение (данные из внутренней памяти поступают в процессор, производятся необходимые вычисления и результат сохраняется во внутренней памяти), 2 ЎЄ ввод данных (данные поступают с устройства ввода во внутреннюю память), 3 ЎЄ вывод данных (данные из внутренней памяти поступают на устройство вывода).

1

2

3



Рисунок 0 ЎЄ Структурная схема вычислительной машины

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

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

Пусть требуется найти произведение z двух натуральных чисел x и y.

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

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

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

Значение одной переменной можно переслать в другую переменную. Но это не меняет значения первой. Например, переслать значение x в переменную u, или присвоить переменной u значение x, означает: задать для u такое же значение, которое имеет переменная x, т.е. скопировать значение x. Если было, допустим, x = 5, то присвоение u значения x (записывается u = x) означает, что нужно посмотреть, сколько шаров лежит в ящике «x» и столько же шаров положить в ящик «u». Теперь будет u = 5, но при этом x сохранило значение (x = 5).

В программировании встречается такая операция присваивания, где слева и справа используется одна и та же переменная. Например, u = u + 1. Здесь перед выполнением собственно присваивания осуществляется операция сложения. Выполнение операции присваивания выполняется по шагам:

переслать содержимое ящика «u» в специальное место в процессоре, предназначенное для первого слагаемого;

переместить 1 на место второго слагаемого в процессоре;

выполнить операцию сложения;

переслать результат в ящик «u» (при этой пересылке старое значение u пропадает ЎЄ «стирается»).

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

В поставленной выше задаче требуется вычислить z = x · y, пользуясь операцией сложения:

z = x + x + ЎK + x


у раз.

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

Положить z = 0. Далее выполнить операцию «z = z + x» y раз. При этом после каждого выполнения указанной операции значение z увеличивается на x. В итоге в z получается результат решения задачи.

Чтобы повторить операцию сложения требуемое число раз, нужно считать, сколько раз она уже выполнена. Для этого нужно использовать вспомогательную переменную u, называемую счетчиком. Перед первым прибавлением к z значения x можно принять u = 1 и после очередного изменения z значение счетчика u будет изменяться на 1. Тогда программу можно записать так:

1 z = 0

2 u = 1


3 z = z + x

4 u = u + 1

5 Если u ЎЬ y идти к 3

Эта программа написана на обычном языке человеческого общения с использованием общепринятой математической символики. Команды 1 и 2 задают начальные значения переменных z и u. Команда 3 каждый раз увеличивает значение z на x. Команда 4 увеличивает значение счетчика на 1 после выполнения очередной операции сложения. Команда 5 проверяет условие u ЎЬ y: если оно выполняется, т.е. не все y сложений еще выполнены, то происходит возврат к команде 3 и ее повторное выполнение; если условие u ЎЬ y не выполняется, процесс вычислений заканчивается. Это произойдет, когда будет u > y, т.е. все нужные сложения выполнены.

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

Проследим выполнение программы при следующих исходных данных: x = 5, y = 3. Для каждой переменной, используемой в программе, заготовим по одному ящику и повесим на них ярлыки с именами переменных. Чтобы заготовить нужное число ящиков, нужно просмотреть программу с начала, и как только встретится новая переменная, взять новый ящик и повесить на него ярлык с именем. Итак, в программе используется четыре переменных: z, u, x, y (Рисунок 0).

Рисунок 0 ЎЄ Представление переменных

Зададимся значениями x = 5, y = 3 и начнем выполнение программы (Рисунок 0). То, что в ящике не обозначено его содержимое говорит о том, что значение соответствующей переменной не определено.

Рисунок 0 ЎЄ Исходные значения переменных

Ниже показано содержимое ящиков после выполнения команд 1, 2 (Рисунок 0) и после первого выполнения команд 3, 4 (Рисунок 0).


Рисунок 0 ЎЄ Состояние после выполнения команд 1 и 2

Рисунок 0 ЎЄ Состояние после первого выполнения команд 3 и 4

Команда 5 проверяет условие u ЎЬ y. Если оно удовлетворяется для входящих в него переменных, то имеет значение ДА, в противном случае ЎЄ НЕТ. Условие 2 ЎЬ 3 имеет значение ДА. Поэтому осуществляется переход к команде 3.

Выполнение программы повторяется, начиная с команды 3. После второго выполнения команд 3 и 4 содержимое ящиков будет следующим (Рисунок 0).

Рисунок 0 ЎЄ Состояние после второго выполнения команд 3 и 4

Далее опять выполняется команда 5. Так как условие 3 ЎЬ 3 имеет значение ДА, происходит возврат к команде 3. После третьего выполнения команд 3 и 4 содержимое ящиков будет следующим (Рисунок 0).

Рисунок 0 ЎЄ Конечные значения переменных

Далее выполняется команда 5. Так как условие 4 ЎЬ 3 имеет значение НЕТ, то переход к команде 3 не происходит. Вычисления закончены.

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

Процесс выполнения программы можно представить более компактно ЎЄ в виде трассировочной таблицы, в которой записываются все значения, последовательно принимаемые изменяемыми переменными программы (Таблица 0).
Таблица 0 ЎЄ Трассировочная таблица

zu0


5

10

151



2

3

4



Приведенная выше программа очень простая, но она имеет особенность, характерную для большинства программ, реализуемых для ЭВМ. После выполнения команды 5 (если условие выполняется) осуществляется возврат к команде 3 и повторное выполнение команд 3ЎЄ5. Многократно повторяющаяся при выполнении часть программы называется циклом. Цикл является типичной структурой, реализуемой в программах для ЭВМ, так как его использование позволяет записать действие (или последовательность действий) один раз, а выполнять многократно.

Понятие алгоритма. Алгоритмизация

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

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

вычислить µ §;

сравнить D с нулем; если D < 0, перейти к 3; в противном случае вычислить µ §, µ §;

прекратить вычисления.

Пусть a = 1, b = 3, c = 2. Оказывается, выполнение данной последовательности для указанных значений a, b и c, приведет к решению квадратного уравнения µ §.

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

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

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

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

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

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

Результативность (или конечность). Алгоритм должен приводить к решению задачи за конечное число шагов.

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

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

При разработке алгоритма его можно фиксировать несколькими способами:

запись на естественном языке (см. предыдущие примеры);

изображение в виде схемы;

запись на языке программирования.

Запись алгоритма на естественном языке

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

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

Команда обработки (вычисления):

v = выражение

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

Команда ввода-вывода:

Ввод x

Вывод y, z



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

Проверка условия:

Если «условие» идти к N

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

Конец вычислений:

Останов


Переход к команде с номером N:

Идти к N


Изображение алгоритма в виде схемы

Использование схем позволяет представить алгоритм в наглядной форме.

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

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

Начало и конец вычислительного процесса изображаются прямоугольником со скругленными углами (Рисунок 0, в). Внутри него записываются слова «Начало» или «Конец».

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

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

Комментарий (Рисунок 0, е) используется только в тех случаях, когда пояснение не помещается внутри блока. Но минимальное количество текста, необходимого для понимания функции блока, следует помещать внутри блока.

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

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

Внимание!

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

В качестве примера ниже представлена блок-схема алгоритма вычисления произведения двух натуральных чисел x и y с использованием операции сложения, записанного ранее на естественном языке с добавлением команд ввода-вывода (Рисунок 0). Схема позволяет наглядно представить структуру алгоритма. В частности, на ней хорошо видны циклы: это замкнутые участки, из конца которых осуществляется возврат в начало.

Рисунок 0 ЎЄ Блок-схема алгоритма вычисления произведения двух натуральных чисел с использованием операции сложения

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

Понятие о языках программирования

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

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

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

Структурный подход к разработке алгоритмов

Основные структуры алгоритмов ЎЄ это ограниченный набор стандартных способов соединения блоков (команд) алгоритма для выполнения типичных последовательностей действий. Структурный подход к разработке алгоритмов и программ предлагает использование только нескольких основных структур, комбинация которых дает все многообразие алгоритмов и программ. К основным структурам относятся:

следование;

цикл «До»;

цикл «Пока»;

разветвление;

обход.


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

Цикл «До» (Рисунок 0) ЎЄ применяется при необходимости выполнять какие-либо вычисления несколько раз до тех пор, пока выполняется некоторое условие. Особенность этого цикла состоит в том, что он всегда выполняется хотя бы один раз, так как первая проверка условия выхода из цикла происходит после того, как тело цикла выполнено. Тело цикла ЎЄ та последовательность действий, которая выполняется многократно (в цикле). Инициализация ЎЄ задание начальных значений тем переменным, которые используются в теле цикла.

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

На естественном языке циклу «До» соответствует алгоритм:

1 Инициализация

2 Тело цикла

3 Если условие идти к 2

Рисунок 0 ЎЄ Блок-схема цикла «До»Цикл «Пока» (Рисунок 0) отличается от цикла «До» тем, что здесь проверка условия проводится до выполнения цикла. Если при первой проверке условие не выполняется, то тело цикла также не выполнится ни разу.

На естественном языке циклу «Пока» соответствует алгоритм:

1 Инициализация

2 Если не условие идти к 5

3 Тело цикла

4 Идти к 2

5 ...


где 5 ЎЄ номер команды после цикла.

Рисунок 0 ЎЄ Блок-схема цикла «Пока»Разветвление (Рисунок 0, а) применяется, когда в зависимости от условия нужно выполнять либо одно, либо другое действие. «Действие 1» или «действие 2» может в свою очередь содержать несколько команд.

На естественном языке эта структура изображается алгоритмом:

1 Если условие идти к 4

2 Действия 2

3 Идти к 5

4 Действия 1

5 ...


где 5 ЎЄ номер первой команды общей части программы (после разветвления).
а)

б)

Рисунок 0 ЎЄ Блок-схемы «Разветвления» и «Обхода»



Обход (Рисунок 0, б) ЎЄ частный случай разветвления, когда одна ветвь не содержит никаких действий.

На естественном языке эта структура изображается алгоритмом:

1 Если не условие идти к 3

2 Действия

3 ...

где 3 ЎЄ номер первого оператора общей части программы.



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

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

Один из приемов разработки алгоритма решения более сложных задач ЎЄ метод пошаговой детализации, при котором первоначально продумывается и фиксируется общая структура алгоритма без детальной проработки отдельных его частей, но при этом также используются лишь основные структуры алгоритмов. Блоки, требующие дальнейшей детализации, обозначаются пунктирной линией. Далее прорабатываются (детализируются) отдельные блоки, не детализированные на предыдущем шаге. Таким образом, на каждом шаге разработки уточняется реализация фрагмента алгоритма (или программы), т.е. решается более простая задача. Полностью закончив детализацию всех блоков, получаем решение задачи в целом.
Пример 1. Разделить натуральное число x на натуральное число y, получить в качестве результата частное от деления q и остаток r, т.е. представить число x в виде x = qy + r, где q ЎЄ целое число; r < y. Операцию деления не использовать.

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

Ниже приводятся блок-схема алгоритма (Рисунок 0) и программа на естественном языке для решения этой задачи.

Исходные данные: x, y ЎЄ натуральные числа.

Результат: q, r.
1 r = x

2 q = 0


3 Если r < y идти к 7

4 r = r ЁC y

5 q = q + 1

6 Идти к 3

7 Останов

Рисунок 0 ЎЄ Блок-схема алгоритма примера 1Здесь условие выхода из цикла проверяется до входа в цикл (цикл «Пока») и при x < y, тело цикла не выполняется ни разу, т.е. остается r = x и q = 0.

Пример 2. Задано число x. Вычислить функцию знака числа

µ §


Далее приводится блок-схема алгоритма (Рисунок 0) и программа на естественном языке для решения этой задачи. Алгоритм представляет собой «разветвление», содержащее «разветвление» в одной из ветвей.

Исходные данные: x ЎЄ любое число.

Результат: S.

1 Если x < 0 идти к 7

2 Если x = 0 идти к 5

3 S = 1


4 Идти к 8

5 S = 0


6 Идти к 8

7 S = -1


8 Останов

Рисунок 0 ЎЄ Блок-схема алгоритма примера 2

Здесь команды 4 и 6 «идти к N» позволяют обойти одну из ветвей разветвления, если уже выполнена другая.

Пример 3. Выбрать максимальное из двух чисел x, y и присвоить его значение переменной u.

Решение. Просматривая числа по очереди, мы «видим» сначала только первое число x. Будем считать его максимальным и присвоим u значение x, т.е. u = x. Затем u сравним со вторым числом y, и если окажется, что старое значение u меньше y, то u присвоим новое значение, иначе u оставим без изменения.

Ниже приводится блок-схема алгоритма и программа на естественном языке.

Исходные данные: x, y ЎЄ любые числа.

Результат: u ЎЄ максимальное из x и y.


1 u = x

2 Если u ЎЭ y идти к 4

3 u = y

4 Останов



Рисунок 0 ЁC Блок-схема алгоритма примера 3Идея, лежащая в основе этого алгоритма, позволяет единообразными действиями найти максимальное значение из трех и более чисел.
Первая программа на Си

В листинге 0 ЎЄ Первая программа на Си приведена программа на языке Си, выводящая на экран строку текста «Это пример программы на Си».

Листинг 0 ЎЄ Первая программа на Си

/* hello.c - первая программа на Си. */


#include

#include

#include
int main()

{

setlocale(LC_ALL, “”);



printf(“Это пример программы на Си\n”);
getch();

return 0;

}

Первая строка программы



/* hello.c - первая программа на Си. */является комментарием и игнорируется компилятором языка Си. Комментарии начинаются с пары символов /* и заканчиваются парой символов */ и могут быть многострочными.

Три директивы #include (include ЎЄ включать в себя) в начале программы являются указанием компилятору подставить на их место текст из файлов stdio.h, locale.h и conio.h (standard input-output ЎЄ стандартный ввод-вывод; locale ЎЄ место действия, специфика; console input-output ЎЄ консольный ввод-вывод). Эти подставляемые файлы содержат описания функций и макросов, включенных в данные широко используемые библиотеки. В эти библиотеки включены функции и макросы, обеспечивающие выполнение стандартных действий по вводу-выводу. Как видно из приведенной программы, функции управления вводом-выводом вынесены из языка Си. Для осуществления операций ввода-вывода программист может использовать библиотеки, поставляемые фирмами-изготовителями программного обеспечения, либо создавать такие библиотеки самостоятельно и пользоваться ими.

Строка исходного текста

int main()описывает функцию main (main ЎЄ главный), возвращающую целочисленное значение (integer ЎЄ целое число). По требованиям Си функция main должна присутствовать в каждой программе и она всегда предваряет исполнительную часть первого блока текста программы. Код, задающий тело функции main, заключается в фигурные скобки { и } ЎЄ аналог ключевых слов begin и end в других языках программирования, например Паскале (begin ЎЄ начало, end ЁC конец).

Оператор

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

Оператор

printf(“Это пример программы на Си\n”);выводит строку «Это пример программы на Си» на экран (print ЎЄ печатать). Последовательность управляющих символов \n переводит курсор на экране дисплея на начало следующей строки. Чтобы использовать эту функцию в программе необходимо подключить заголовочный файл stdio.h. Более подробная информация о функции printf представлена в разделе .

Оператор

getch();осуществляет ожидание нажатия любой клавиши на клавиатуре и необходим для просмотра информации выводимой на экран в процессе выполнения программы перед закрытием окна. Чтобы использовать эту функцию в программе необходимо подключить заголовочный файл conio.h.

Оператор

return 0;завершает выполнение функции main, а вместе с ней и всей программы. Целочисленное значение ноль передается операционной системе в качестве результата выполнения программы.

Рисунок 0 ЎЄ Результат выполнения программы hello.c

Внимание!

В отличие от Паскаля все ключевые слова языка Си, а также имена переменных, функций и т.д. чувствительны к регистру символов. Например, слова: include, int, main, printf записаны правильно; Include, INT, Main, printF записаны неправильно и приведут к ошибкам в программе. При оформлении блок-схем также рекомендуется придерживаться этих правил.

Кроме этого, наиболее типичными ошибками при наборе текста программ являются пропуск или запись лишних:

символов комментария;

скобок (угловых, круглых, фигурных);

кавычек;

точек с запятой.

Поскольку программы на языке Си можно писать в свободном формате, то для обозначения конца каждого оператора требуется ставить специальный разделитель ЎЄ точку с запятой. Компилятор языка Си не разбирается в стилях написания программ. Способы оформления программы служат для облегчения понимания программы человеком, поскольку программы в большей степени ориентированы на человека, чем на компилятор. Хорошее оформление программы способствует ее легкому чтению и понимания. Ниже (Листинг 0) представлена та же самая программа, но при ее наборе не применялось форматирование. Компилятор легко понимает эту программу и результат ее выполнения такой же, как у исходного варианта, а вот чтение и понимание ее программистом вызывает значительные трудности.

Листинг 0 ЎЄ Пример текста программы на Си без форматирования

/* hello.c - первая программа на Си. */

#include

#include

#include

int main() {

setlocale(LC_ALL, “”);

printf(“Это пример программы на Си\n”);

getch();


return 0;}

Процесс создания программы

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

В задачи препроцессора (preprocess ЎЄ предварительно обрабатывать) входит подключение при необходимости к данной программе на Си внешних файлов, указываемых при помощи директивы #include (заголовочных файлов  h), и подстановку макросов #define (macro ЎЄ общий, macros ЎЄ макроопределение).

Компилятор (compile ЎЄ собирать) за несколько этапов транслирует (translate ЎЄ переводить) то, что вырабатывает препроцессор, в объектный файл (файл с расширением o или obj), содержащий оптимизированный машинный код, при условии, что не встретились синтаксические или семантические ошибки. Если в исходном файле с программой на Си обнаруживаются ошибки, то программисту выдается их список, в котором ошибки привязываются к номеру строки, в которой они появились. Программист циклически выполняет действия по редактированию и трансляции до тех пор, пока не будут устранены все ошибки в исходном файле.

Компоновщик связывает между собой объектный файл (o или obj), получаемый от компилятора, с программами из требуемых библиотек (lib). Компоновщик часто называют редактором связей или линковщиком (link ЎЄ соединять, связывать). В результате компоновки получается файл с расширением exe (exe файл), который может быть исполнен компьютером. Полученный exe файл может быть запущен на выполнение из командной строки.

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

Рисунок 0 ЎЄ Схема процесса создания программы на Си

Комментарии

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

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

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

Директива #include

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

#include

#include “file_2”

...

#include приводит к тому, что препроцессор подставляет в место директив тексты файлов file_1, file_2, ЎK, file_n соответственно.



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

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


Внимание!

Обычная ошибка ЎЄ добавление после директивы #include точки с запятой. В отличие от операторов языка Си директива #include не должна заканчиваться точкой с запятой.

Макросы (директива #define)

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

Обычно макросы используют для того, чтобы связать идентификатор (identifier ЎЄ опознаватель, имя) и значение. Как только препроцессор встречает идентификатор, он заменяет его на соответствующее значение. Например, директива

#define pi 3.14159265связывает идентификатор pi со значением 3,14159265. Таким способом в программе удобно задавать константы. Иногда вещественные константы удобнее записывать в экспоненциальной форме, например

#define ro 1.78e-8связывает идентификатор ro со значением 1,78·10-8.

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

Макросы могут иметь параметры. Например, макрос

#define sqr(x) ((x) * (x))задает замену символов sqr(аргумент) на значение ((аргумент) * (аргумент)) и позволяет записывать возведение выражений в квадрат в более короткой форме.


Внимание!

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

Студенту на заметку!

В блок-схеме макросу #define, используемому для связи идентификатора и значения, соответствует блок вычисления:


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

z = sqr(x) + sqr(y);

то в блок-схеме такому оператору соответствует блок вычисления:

Переменные и типы данных

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

При описании переменных применяется префиксная запись ЎЄ вначале указывается тип данных, а затем имя переменной:

type varname;При необходимости описать в одной строке несколько переменных их имена перечисляются через запятую.

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

int number_of_books, number_of_students;

float weight, height;

int exam_score;

char ch;В первом описании имеется список переменных, содержащий два имени (number_of_books и number_of_students). Обе переменные описываются как целые ЎЄ int. Переменная exam_score тоже целого типа и описана отдельно, хотя ее можно добавить к первому списку целых переменных.

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

Переменные можно инициализировать в месте их описания, например:

int height = 71;

float weight = 73.8, length = 15.23, time;Здесь переменным height, weight и length присваиваются начальные значения, а переменной time не присваивается.


Студенту на заметку!

В блок-схеме описанию переменной с одновременной инициализацией значения соответствует блок вычисления:


Описание переменной без инициализация ее значения в блок-схеме не отражается.

Правила именования идентификаторов

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

идентификатор может состоять из букв латинского алфавита aЎЄz и AЎЄZ, цифр 0ЎЄ9 и символа подчеркивания _;

первый символ имени не должен быть цифрой;

строчные и прописные буквы различаются (nameЃ‚NAME);

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

Типы данных

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

char однобайтовое целое число (также используется для представления символов)

short двухбайтовой целое число

int двухбайтовое или четырехбайтовое


целое число (зависит от разрядности системы)

long четырехбайтовое целое число

float четырехбайтовое вещественное число (одинарной точности)

double восьмибайтовое вещественное число (двойной точности)

(integer ЎЄ целый, long ЎЄ длинный, float ЎЄ плавающий, double ЎЄ двойной).

В таблице 0 ЎЄ Типы данных языка Си перечислены все скалярные типы данных языка Си, их размер в памяти компьютера и диапазон принимаемых значений. Квадратными скобочками выделена необязательная часть названия типа, которую можно не указывать при описании переменных. Размер типа int равен размеру типа short или типа long в зависимости от разрядности системы и используемого компилятора языка Си.

Таблица 0 ЎЄ Типы данных языка Си

ВидТип данныхРазмер, байтМинимальное значениеМаксимальное значениеЦело-численные[signed] char1ЁC128127unsigned char0255[signed] short [int]2ЁC32 76832 767unsigned short [int]065 535[signed] int2

или

4ЁC32 76832 767unsigned [int]065 535[signed] intЁC2 147 483 6482 147 483 647unsigned [int]04 294 967 296[signed] long [int]4ЁC2 147 483 6482 147 483 647unsigned long [int]04 294 967 296Вещест-



венныеfloat48,4„Є10ЁC373,4„Є10+38double82,2„Є10ЁC3081,9„Є10+308long double103,4„Є10ЁC49321,1„Є10+4932

Определение!

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

Объявление переменной может дополняться модификатором const:

const int size = 7;

const float x = 17.3;Объявление переменной с модификатором const указывает на то, что значение не будет изменяться, т.е. фактически это еще один способ задания констант в программе (см. раздел ).

Функция printf: вывод на экран

Одной из основных задач программирования является вывод в файл или на экран. Без вывода информации нет возможности узнать и проанализировать результаты работы программы. В Си весь вывод реализуется через внешние функции и макросы. Одной из наиболее универсальных и полезных функций вывода является printf. Для использования этой функции в программе необходимо подключить заголовочный файл stdio.h.

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

Типичный пример использования функции printf:

printf(“\nВозраст Васи - %d. Его рост - %.2f м.”,

age, height);Предполагается, что целой переменной age (возраст) и вещественной переменной height (рост) присвоены какие-то значения.

Последовательность символов \n переводит курсор на новую строку. Последовательность символов «Возраст Васи ЁC » будет выведена с начала новой строки. Символы %d ЎЄ это спецификация для целой переменной. Вместо %d подставляется значение переменной age. Следующая за спецификацией последовательность символов «. Его рост ЁC » выводится на экран сразу после значения переменной age. %.2f ЎЄ это спецификация для вещественного значения, а также указание формата для вывода только двух знаков после десятичной точки. На место спецификации %.2f подставляется значение переменной height. И окончательная последовательность символов « м.» выводится на экран после значения переменной height.
Студенту на заметку!

В блок-схеме оператору printf соответствует блок вывода:


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

Специальные символы

Кроме \n, существуют и другие последовательности для вывода специальных символов на экран. Наиболее часто используемые из них приведены в таблице 0 ЎЄ Типы данных языка Си.

Таблица 0 ЎЄ Наиболее часто используемые последовательности специальных символов

Спец. символНазначение\nперевод курсора в начало следующей строки (конец строки)\tгоризонтальная табуляции\vвертикальная табуляция\rперевод курсора в начало текущей строки (возврат каретки)\bвозврат курсора на один символ\\один обратный слеш «\»\"двойная кавычка\’апостроф\oooooo ЎЄ восьмеричный код выводимого символа\xhhhh ЎЄ шестнадцатеричный код выводимого символа\0нулевой символ (конец строки)Грамотное использование специальных символов позволяет делать выводимую на экран информацию более понятной и «читабельной».

Спецификация вывода

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

Более формально полную спецификацию вывода можно определить следующим образом (поля в квадратных скобочках ЎЄ необязательные):

%[флаги][ширина][.точность][l]символ_форматаЗначения флагов:

- выравнивание по левому краю

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

(пробел) для неотрицательных значений

вместо знака плюс печатать пробел

0 заполнение слева нулями вместо пробелов

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

Точность:

для целых чисел ЎЄ минимальное число выводимых цифр (если выводимое значение имеет меньше цифр, чем задано, то дополняется нулями слева);

для вещественных чисел ЎЄ число цифр после десятичного разделителя (по умолчанию 6 знаков);

для строк ЎЄ максимальное число выводимых символов.

Символ l ЎЄ используется для указания длинных типов данных (long при вводе и выводе, double при вводе).

Символ формата служит для указания типа выводимого значения:

с одиночный символ

s строка (массив символов)

d или i целое число в десятичном виде

o целое число в восьмеричном виде

u беззнаковое целое число в десятичном виде

x или X целое число в шестнадцатеричном виде
f вещественное число
в виде с фиксированной точкой (0.123456)

e вещественное число


в экспоненциальном виде (1.23456e+3)

g вещественное число


в наиболее коротком виде из f или e

Таблица 0 ЎЄ Простейшие спецификации ввода-вывода для основных типов данных языка Си

ТипСпецификацияint%dunsigned%ulong%ldunsigned long%lufloat%fdouble (вывод)%fdouble (ввод)%lf

Внимание!

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

Листинг 0 ЎЄ Пример использования оператора printf

/* printf.c ЁC пример использования оператора printf. */
#include

#include

#include
#define sqr(x) ((x) * (x))

#define pi 3.14159265


int main()

{

float x = 2.5;



int i = 11;

int j = 119;


setlocale(LC_ALL, “”);
printf(“Значение квадрата 2.5 = %10.4f\n”, sqr(x));

printf(“Число пи = %10.4f\n ”, pi);

printf(“Значение 2 * пи = %10.4f\n\n ”, 2.0 * pi);

printf(“Шестнадцатеричный вид числа 11 = %x\n ”, i);

printf(“Шестнадцатеричный вид числа 119 = %x\n ”, j);

printf(“Восьмеричный вид числа 119 = %o\n”, j);


getch();

return 0;

}

Рисунок 0 ЎЄ Результат выполнения программы printf.c


Функция scanf: ввод с клавиатуры

Оператор scanf (scan ЎЄ сканировать) является одной из  функций ввода, имеющихся во внешних библиотеках. Для ее использования в программе необходимо подключить заголовочный файл stdio.h.

Каждой вводимой переменной в строке функции scanf должна соответствовать спецификация. Формат спецификации ввода аналогичен спецификации вывода (см. оператор printf), но обычно используется простейшая форма с указанием только символа формата. Перед именами переменных следует ставить знак &, он означает операцию «взять адрес».

Ниже приведен пример (Листинг 0) использования оператора scanf.

Оператор

scanf(“%d”, &weight);ожидает ввода с клавиатуры целого числа в десятичном виде, о чем свидетельствует спецификация ввода %d. После нажатия клавиши ENTER введенное число помещается в память компьютера по адресу переменной weight.


Внимание!

В функции scanf, в отличие от printf, спецификация ввода для типа double ЎЄ %lf.

Студенту на заметку!

В блок-схеме оператору scanf соответствует блок ввода:


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

Листинг 0 ЎЄ Пример использования оператора scanf

/* scanf.c ЁC пример использования оператора scanf */
#include

#include

#include
int main()

{

int weight, /* вес */



height; /* рост */
setlocale(LC_ALL, “”);
printf(“Введите ваш вес: ”);

scanf(“%d”, &weight);

printf(“Введите ваш рост: ”);

scanf(“%d”, &height);


printf(“\n\nВес = %d, рост = %d\n”, weight, height);
getch();

return 0;

}

Рисунок 0 ЎЄ Результат выполнения программы scanf.c



Логическая организация программы на Си

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

Листинг 0 ЎЄ Типичная организация программы на Си

/* Заголовки и комментарии, описывающие программу */


/* Директивы include */

#include file_1

...

#include file_k


/* Макросы */

#define macros_1 value_1

...

#define macros_m value_m


/* Описание глобальных переменных */

type global_var_1;

...

type global_var_n;


/* Описания, обеспечивающие ссылку вперед на функции,

используемые в программе */

type function_1(formal parameters);

...


type function_p(formal parameters);
/* Функция main */

int main(formal parameters)

{

/* Описание локальных переменных */



type local_var_1;

...


type local_var_q;
/* Тело функции main */

...
return code;

}

Листинг 0 ЎЄ Продолжение



/* Функции, используемые в программе */

type function_1(formal parameters)

{

/* Описание локальных переменных */



type local_var_1;

...


type local_var_r;
/* Тело функции 1 */

...
return code_1;

}
...
return function_p(formal parameters)

{

/* Описание локальных переменных */



type local_var_1;

...


type local_var_s;
/* Тело функции p */

...
return code_p;

}Функция main

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

int main()

{

/* Код, реализующий main */



...

return code;

}

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


Внимание!

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

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

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

Глобальные переменные являются видимыми (т.е. доступными) во всем файле, в котором они описаны.

Локальные переменные являются видимыми только внутри той функции, в которой они описаны.

Листинг 0 ЎЄ Пример использования глобальных и локальных переменных

/* vars.c ЁC глобальные и локальные переменные */


#include

#include

#include
float a; /* глобальная переменная */
void output();
int main()

{

int b = 10; /* локальная переменная для main */


setlocale(LC_ALL, “”);
a = 1.2345;
output();
printf(“\nЗначение \”a\” в функции main %.3f”, a);

printf(“\nЗначение \”b\” в функции main %d”, b);


getch();

return 0;

}
void output()

{

int b = 100; /* локальная переменная для output */


printf(“\n\nЗначение \”a\” в функции output %.3f”, a);

printf(“\nЗначение \”b\” в функции output %d”, b);


a = 5.4321;

}

Рисунок 0 ЎЄ Результат выполнения программы vars.c



Операторы и операции

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

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

В операторе присваивания используется операция присваивания =, например:

c = a * b;Действие такого оператора можно описать следующими словами: «c присваивается значение a, умноженного на значение b». Значение, присваиваемое переменной c, равняется произведению текущих значений переменных a и b.

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

if ((c = cube(a * b)) > d)

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

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

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


Таблица 0 ЎЄ Приоритет и порядок выполнения операций

КатегорияОперацииОписаниеПорядок


выполнения1234Приоритетные()

[]
->

.Вызов функции

Выделение элемента массива

Выделения элемента структуры, адресуемой указателем

Выделение элемента структурыСлева

направоУнарные!

~

+



-

++

--



&

*

sizeof



Логическое отрицание

Побитовое отрицание

Унарный плюс

Унарный минус

Инкремент на 1

Декремент на 1

Определение адреса

Обращение по адресу

Определение размера в байтахСправа

налевоАрифметические*

/

%Умножение



Деление

Деление по модулю (остаток)Слева

направо+

-Сложение

ВычитаниеЁCЁC «» ЁCЁCСдвига

(битовые)<<

>>Сдвиг влево

Сдвиг вправоЁCЁC «» ЁCЁCСравнения

(отношения)<

<=

>

>=Меньше, чем



Меньше или равно

Больше, чем

Больше или равноЁCЁC «» ЁCЁC==

!=Равно


Не равноЁCЁC «» ЁCЁCТаблица 0 ЎЄ Продолжение

1234Битовые&

^
|Побитовое И

Побитовое исключающее ИЛИ (XOR)

Побитовое ИЛИЁCЁC «» ЁCЁCЁCЁC «» ЁCЁCЁCЁC «» ЁCЁCЛогические&&

||Логическое И

Логическое ИЛИЁCЁC «» ЁCЁCЁCЁC «» ЁCЁCПрисваивания=

*=

/=



%=

+=

-=Присваивание



Присваивание произведения

Присваивание частного

Присваивание остатка

Присваивание суммы

Присваивание разностиСправа

налево&=


^=
|=

<<=

>>=Присваивание побитового И

Присваивание побитового исключающего ИЛИ

Присваивание побитового ИЛИ

Присваивание сдвига влево

Присваивание сдвига вправоЁCЁC «» ЁCЁCЗапятая,Последовательное вычислениеСлева

направоАрифметические операции

К арифметическим операциям относятся: сложение +, вычитание ЁC, деление /, умножение * и остаток %. Все операции (за исключением остатка) определены для переменных целого и вещественного типа: char, int, long, float, double. Остаток не определен для переменных вещественного типа float и double. Результатом операции % является остаток от целочисленного деления первого операнда на второй.

Результатом операции деления двух целочисленных операндов является также целочисленное значение (дробная часть отбрасывается), что может привести к неверному вычислению математических выражений. Чтобы избежать этой проблемы один из операндов надо сделать вещественным. Например, вместо x = 1 / 3 (что приведет к результату x = 0), можно добавить фиктивную дробную часть и записать x = 1.0 / 3. Если же оба операнда целочисленные переменные, то можно добавить фиктивную операцию умножения на вещественную единицу: a = b * 1.0 / c.

Целочисленное сложение и вычитание выполняются без учета переполнения типа данных (overflow ЎЄ переполнение). В приведенной ниже программе (Листинг 0) будут выведены следующие значения: 32767 и ЁC32768. Для беззнаковых целых добавление единицы к наибольшему целому значению дает в результате нуль.

Листинг 0 ЎЄ Арифметическое переполнение

/* overflow.c ЁC пример арифметического переполнения. */


#include

#include

#include
void main()

{

short a = 32767;



unsigned short b = 65535;
setlocale(LC_ALL, “”);
printf(“\nЗначение a = %d. Значение a + 1 = %d\n”,

a, a + 1);

printf(“\nЗначение b = %u. Значение b + 1 = %u\n”,

b, b + 1);


getch();

return 0;

}

Рисунок 0 ЎЄ Результат выполнения программы overflow.c



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

Битовые операции

К битовым операциям относятся: отрицание ~, И &, ИЛИ |, исключающее ИЛИ ^, сдвиг вправо >> и сдвиг влево <<. В других языках программирования или в литераторе для обозначения битовых операций могут использоваться соответствующие английские слова: отрицание ЎЄ not, И ЎЄ and, ИЛИ ЎЄ or, исключающее ИЛИ ЎЄ xor. В таблице 0 ЎЄ Типы данных языка Си приведены таблицы истинности битовых операций, а в таблице 0 ЎЄ Типы данных языка Си представлены примеры выполнения битовых операций над целыми числами размером 1 байт.

Таблица 0 ЎЄ Таблицы истинности битовых операций

ОперацияБитоперанда 1операнда 2результатаОтрицание ~0ЁC11ЁC0И &000010100111ИЛИ |000011101111Исключающее ИЛИ ^000011101110Таблица 0 ЎЄ Пример выполнения битовых операций над целыми числами размером 1 байт

КодСистема счислениядесятичнаяшестнадцатеричнаядвоичнаяa = 23; 231700010111b = 81; 815101010001c = ~a;232E811101000d = ~b;174AE10101110e = a & b; 171100010001f = a | b; 875701010111g = a ^ b; 704601000110h = a >> 2; 50500000101i = b << 3;1449010010000

В листинге 0 ЎЄ Первая программа на Си представлен пример программы, использующей логические операции. Для вывода на экран чисел в двоичной системе счисления используется функция itoa() из библиотеки stdlib.h. Эта функция позволяет преобразовывать целое число, задаваемое первым параметром, в строку символов, задаваемую вторым параметром. Система счисления задается третьим параметром. Функция возвращает указатель на переданную ей строку символов, что позволяет ее использовать прямо в операторе вывода на экран. Спецификация вывода %16s задает вывод строки в поле шириной 16 символов. По умолчанию выравнивание осуществляется по правой границе поля.

Листинг 0 ЎЄ Использование битовых операций

/* bitops.c ЁC пример использования битовых операций. */
#include

#include

#include

#include


int main()

{

int a, b;



char str[25];
setlocale(LC_ALL, “”);
printf(“Введите a: ”);

scanf(“%d”, &a);


printf(“Введите b: ”);

scanf(“%d”, &b);


printf(“a = %16s\n“, itoa(a, str, 2));

printf(“b = %16s\n“, itoa(b, str, 2));

printf(“ NOT a = %16s\n“, itoa(~a, str, 2));

printf(“a AND b = %16s\n“, itoa(a & b, str, 2));

printf(“a OR b = %16s\n“, itoa(a | b, str, 2));

printf(“a XOR b = %16s\n“, itoa(a ^ b, str, 2));


getch();

return 0;

}

Рисунок 0 ЎЄ Результаты выполнения программы bitops.c



Операции отношения

В языке Си определены следующие операции отношения: проверка на равенство ==, проверка на неравенство !=, меньше <, меньше или равно <=, больше >, больше или равно >=.

Все перечисленные операции вырабатывают результат типа int. Если данное отношение между операндами истинно, то значение целого ЎЄ единица, а если отношение ложно, то нуль.

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

Рассмотрим следующий пример:

if((ch = getchar()) > ‘a’)Функция getchar() (get character ЎЄ получить символ) возвращает символ, введенный с клавиатуры. Присвоение этого символа переменной ch выполняется до того, как переменная ch будет сравниваться с символом ‘a’.

Благодаря гибкости языка Си оператор ветвления в рассмотренном случае будет выполнен и в том случае, если убрать пару скобок вокруг ch = getchar(). Компилятор будет интерпретировать получившийся оператор следующим образом: символ, получаемый от getchar(), сравнивается с ‘a’. Если он больше ‘a’, то переменной ch присваивается значение единица, в противном случае ЎЄ нуль.

Такая гибкость может приводить к непроизвольным программным ошибкам. Поскольку компилятор Си может обрабатывать много вариантов оператора, программисту следует тщательно проверять сложные выражения в своей программе, задавая при этом вопрос: «Что должно означать это выражение на самом деле?»


Внимание!

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

Логические операции

В языке Си имеются три логические операции:

&& операция И (and)

|| операция ИЛИ (or)

! отрицание НЕ (not)

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

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

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

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

if (i > 50 && j == 24)

...

if (value1 < value2 &&



(value3 > 50 || value4 < 20))

...


Студенту на заметку!

В блок-схеме оператору if соответствует блок проверки условия:


Выражение в блоке записывается без использования операций языка Си.

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

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

К операциям присваивания относятся =, +=, ЁC=, *=, /= и др., а также префиксные и постфиксные операции ++ и ЁCЁC. Все операции присваивания присваивают переменной результат вычисления выражения. Если тип левой части присваивания отличается от типа правой части, то тип правой части приводится к типу левой.

В одном операторе операция присваивания может встречаться несколько раз. Вычисления производятся справа налево. Например:

a = (b = c) * d;Вначале переменной b присваивается значение c, затем выполняется операция умножения на d, и результат присваивается переменной a.

Типичный пример многократного присваивания:

a = b = c = d = e = f = 0;осуществляет обнуление всех перечисленных переменных.

Операции +=, -=, *= и /= являются укороченной формой записи операции присваивания. Их применение иллюстрируется при помощи следующего описания:

a += b означает a = a + b

a -= b означает a = a ЁC b

a *= b означает a = a * b

a /= b означает a = a / b

Операции ++ и -- используются для увеличения (инкремент) и уменьшения (декремент) на единицу значения переменной:

a++ означает a = a + 1

a-- означает a = a - 1

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

++a увеличивает значение переменной a на единицу

до использования этой переменной в выражении;

a++ увеличивает значение переменной a на единицу

после использования этой переменной в выражении;

--a уменьшает значение переменной a на единицу

до использования этой переменной в выражении;

a-- уменьшает значение переменной a на единицу

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

В блок-схеме оператору присваивания соответствует блок вычисления:


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

a++;


s += a;Другие операции

Операцию sizeof (size ЎЄ размер) можно применить к константе, типу или переменной. В результате будет получено число байтов, занимаемых операндом. Ниже приведена программа (Листинг 0), демонстрирующая использование операции sizeof.

Листинг 0 ЎЄ Использование операции sizeof

/* sizeof.c ЁC пример использования операции sizeof. */


#include

#include

#include
int main()

{

float a;



int b;

char c;


float d[50];
setlocale(LC_ALL, “”);
printf(“Размер памяти под целое %d\n”,

sizeof(int));

printf(“Размер памяти под символ %d\n”,

sizeof(char));

printf(“Размер памяти под вещественное %d\n”,

sizeof(float));

printf(“Размер памяти под двойную точность %d\n”,

sizeof(double));

printf(“Размер памяти под переменную a %d\n”,

sizeof(a));

printf(“Размер памяти под переменную b %d\n”,

sizeof(b));

printf(“Размер памяти под переменную c %d\n”,

sizeof(c));

printf(“Размер памяти под массив d %d\n”,

sizeof(d));


getch();

return 0;

}

Рисунок 0 ЎЄ Результат выполнения программы sizeof.c



Операция «запятая» применяется для связывания между собой выражений. Список выражений, разделенный запятыми, трактуется как единое выражение и вычисляется слева направо.

Если, например, надо ввести символ с клавиатуры и сравнить введенное с ‘a’, то для этого можно использовать следующий оператор ветвления:

if (c = getchar(), c > ‘a’)

...Данное выражения вычисляются слева направо, сначала переменной c присваивается результат функции getchar(), затем выполняется проверка условия c > ‘a’, результат которого определяет целое значение логического выражения и используется для оператора if.

Математические функции

Как уже упоминалось ранее, в языке Си нет встроенных функций, поэтому, при необходимости использовать в выражениях математические функции, нужно подключить заголовочный файл math.h. При этом будут доступны функции, представленные в таблице 0 ЎЄ Типы данных языка Си. Все представленные функции принимают и возвращают значения типа double.

Таблица 0 ЎЄ Список основных функций math.h

ФункцияОписаниеfabs(x)абсолютная величина, µ §sqrt(x)квадратный корень, µ §exp(x)экспонента, µ §log(x)натуральный логарифм, µ §log10(x)десятичный логарифм, µ §pow(x, y)возведение x в степень y, µ §round(x)округление до ближайшего целого числаfloor(x)округление до целого числа внизceil(x)округление до целого числа вверхfmod(x, y)остаток от деления x на y sin(x)синус, µ §аргумент x в радианахcos(x)косинус, µ §tan(x)тангенс, µ §sinh(x)гиперболический синус, µ §cosh(x)гиперболический косинус, µ §tanh(x)гиперболический тангенс, µ §asin(x)арксинус, µ §acos(x)арккосинус, µ §atan(x)арктангенс, µ §atan2(x, y)y ЎЄ противолежащий катет,

x ЎЄ прилежащий катет

В таблице 0 ЎЄ Типы данных языка Си приведены примеры перевода некоторых математических выражений на зык Си с использованием функций из math.h.

Таблица 0 ЎЄ Пример перевода математических выражений на язык Си

Математическое выражениеЗапись на языке Сиµ §f = pow(x + 5, 3)µ §g = log10(pow(y, 0.14) / (k + 1))µ §z = exp(-2 * alpha * beta)µ §y = pow(cos(x * t), 2) + 2µ §R = sqrt(log(5) + m * m)µ §mu = pow(x*y/(tan(x) + cos(y)), 0.22)

В листинге 0 ЎЄ Первая программа на Си приведен пример программы использующей математические функции. Обратите внимание на оператор printf, осуществляющий вывод результатов расчета. В спецификации вывода координат %+.1f используется флаг +, означающий обязательный вывод знака числа (как минуса, так и плюса). Кроме этого, для переноса строки используется обратный слеш \. Если его не поставить, то компилятор будет выдавать ошибку: незавершенная строка. Текст, идущий с начала следующий строки, будет выводиться на экран с того места, на котором закончился вывод предыдущей на символе \. Сам символ \ на экран не выводится. Такой прием удобно использовать при необходимости вывода длинных строк, но при этом сохраняется нормальное форматирование программы. Другой способ избежать выхода текста программы за пределы экрана в окне редактора ЎЄ разбивать один оператор printf с длинной строкой на несколько коротких операторов printf, умещающихся в экран.

Листинг 0 ЎЄ Пример использования математических функций

/* rasst.c ЁC пример использования математических функций */
#include // scanf(), printf()

#include

#include // sqrt(), pow()
int main()

{

float x1, y1, x2, y2; // координаты двух точек



float d; // расстояние между точками
setlocale(LC_ALL, “”);
// запрос на ввод координат первой точки

printf("Введите координаты первой точки: ");

// ввод с клавиатуры двух вещественных чисел

scanf("%f %f", &x1, &y1);


// запрос на ввод координат второй точки

printf("Введите координаты второй точки: ");

// ввод с клавиатуры двух вещественных чисел

scanf("%f %f", &x2, &y2);


/*

расчет расстояния между точками

sqrt() - функция извлечения квадратного корня

pow() - функция возведения в степень

*/

d = sqrt(pow(x2 - x1, 2) + pow(y2 - y1,2));


// вывод результатов расчета

printf("Расстояние между (%+.1f, %+.1f) и \

(%+.1f, %+.1f) равно %.3f\n", x1, y1, x2, y2, d);
getch();

return 0;

}

Результаты выполнения программы rasst.c представлены на рисунке 0 ЎЄ Схема процесса создания программы на Си. Координаты точек при запросе оператором scanf могут быть введены через пробел или нажатием клавиши ENTER после ввода каждого числа.


Рисунок 0 ЎЄ Результат выполнения программы rasst.c

Управляющие структуры

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

Для реализации управляющих структур используются логические выражения. Как уже отмечалось выше, логическое выражение в качестве результата вырабатывает значение типа int (истина = 1, ложь = 0).

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

К операторам ветвления в Си относятся if (if ЎЄ если), if else (else ЎЄ иначе), тренарный оператор ?:, switch (switch ЎЄ переключить, case ЎЄ случай). Ниже приведен общий вид операторов ветвления.
if (logical_expression)

statement;Если значение логического выражения истинно, то выполняется оператор statement, иначе следующий за if оператор.


if (logical_expression)

statement_1;

else

statement_2;Если значение логического выражения истинно, то выполняется оператор statement_1, иначе выполняется оператор statement_2.


(logical_expression) ? (expression_1) : (expression_2);Если значение логического выражения истинно, то вычисляется выражение expression_1, иначе вычисляется выражение expression_2.
switch (integer_expression)

{

case value_1:



statements_1;

break;


...

case value_n:

statements_n;

break;


default:

statements_n+1;

}Если значение выражение совпадает с одним из значений ветвей case, то производится выполнения последовательности операторов данной ветви до тех пор, пока не встретится оператор break. Ветка default (значение по умолчанию) выполняется, если ни одно из значений case не равно значению выражения. Ветку default можно не описывать.

Листинг 0 ЎЄ Использование операторов ветвления

/* branch.c ЁC пример использования операторов ветвления */
#include

#include

#include
int main()

{

float a1, a2, m;


setlocale(LC_ALL, “”);
printf(“Введите два числа: ”);

scanf(“%f %f”, &a1, &a2);


if (a2 != 0)

printf(“\n%f делить на %f равно %f\n”,

a1, a2, a1 / a2);
if (a1 > a2)

printf(“Число %f больше %f\n”, a1, a2);

else

printf(“Число %f меньше или равно %f\n”, a1, a2);


m = (a1 > a2) ? a1 : a2;

printf(“Максимальное из двух чисел: %f\n”, m);


getch();

return 0;

}

Рисунок 0 ЎЄ Результат выполнения программы branch.c



Листинг 0 ЎЄ Использование оператора ветвления switch

/* switch.c ЁC пример использования оператора switch */


#include

#include

#include
int main()

{

int mark;


setlocale(LC_ALL, “”);
printf(“Введите оценку: ”);

scanf(“%d”, &mark);


printf(“\nВаша оценка: ”, mark);

switch (mark) {

case 1:

case 2:


printf(“неудовлетворительно”);

break;


case 3:

printf(“удовлетворительно”);

break;

case 4:


printf(“хорошо”);

break;


case 5:

printf(“отлично”);

break;

default:


printf(“неправильная”);

}
getch();

return 0;

}

Рисунок 0 ЎЄ Результат выполнения программы switch.c



Операторы цикла

В Си имеются следующие конструкции, позволяющие программировать циклы: while, do while и for.


Цикл «Пока» ЎЄ тело цикла выполняется, если значение логического выражения истинно:

while (logical_expression)

statement;Если значение логического выражение заведомо ложно, то тело цикла не будет выполнено ни разу.
Цикл «До» ЎЄ сначала выполняется тело цикла, затем проверяется логическое выражение, если оно ложно, то выполнение цикла завершается:

do

statement;



while (logical_expression);В отличие от предыдущей конструкции тело цикла выполняется хотя бы один раз независимо от значения логического выражения.
Общий цикл (вариант цикла «Пока» с инициализацией):

for (initialization; logical_expression; new_value)

statement;До начала выполнения цикла выполняется блок инициализации. Затем выполняется проверка ЎЄ вычисление логического выражения. Если результат ЎЄ истина, то выполняется тело цикла, после чего производится расчет нового значения и следующая проверка. Наиболее часто данный вариант применяется для реализации цикла с заранее известным числом повторений. Например, код:

for (i = 0; i < 10; i++)

printf(“%d”, i);выведет на экран целые числа от 0 до 9.
Студенту на заметку!

В блок-схеме оператору for соответствует блок цикла с заранее известным числом повторений:


Если шаг изменения переменной цикла равен 1, то его можно не указывать.

Для преждевременного выхода из цикла можно использовать оператор break.

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

Массивы


Возможно, наиважнейшим структурным типом данных является массив (array ЎЄ массив). Массив ЎЄ это набор объектов одинакового типа, доступ к которым осуществляется по индексу (аналог матриц в математике).

Массивы можно объявлять следующим образом:

type arrayname[SIZE];Здесь type ЎЄ имя типа элементов массива; arrayname ЎЄ имя массива (см. параграф ); SIZE ЎЄ размер массива, в качестве которого должна использоваться целочисленная константа.

Используя имя массива и индекс, можно обращаться к элементам массива arrayname[index], присваивать им значения, использовать их значение в выражениях, выводит на экран. Здесь index может быть целочисленными константой, переменной или выражением, например: arrayname[4], arrayname[SIZE-2], arrayname[i], arrayname[i+1], arrayname[SIZE-i+1].

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

Вот несколько примеров описания массивов:

#define SIZE1 125
const int SIZE2 = 1500;
char name[20];

int grades[SIZE1];

float income[30];

double measurements[SIZE2];Первый из массивов name содержит 20 символов. Обращением к элементам массива может быть: name[0], name[1], ..., name[19]. Так как размер типа char составляет 1 байт (см. параграф ), то в памяти компьютера данный массив займет 20 байт.

Второй массив grades содержит 125 целых чисел. Обращением к элементам массива может быть: grades[0], grades[1], ..., grades[124]. С учетом размера типа int 4 байта данный массив займет в памяти компьютера 1254 = 500 байт.

Третий массив income содержит 30 вещественных чисел. Обращением к элементам массива может быть: income[0], income[1], ..., income[29]. В памяти компьютера этот массив будет занимать 304 = 120 байт, так как размер типа float 4 байта.

Четвертый массив measurements содержит 1500 вещественных чисел с двойной точностью. Обращением к элементам массива может быть: measurements[0], measurements[1], ..., measurements[1499]. Размер типа double 8 байт, следовательно, в памяти компьютера такой массив займет 15008 = 12000 байт.

Случайные числа

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

Функция rand() возвращает псевдослучайное целое число из диапазона от 0 до RAND_MAX (значение RAND_MAX зависит от используемой библиотеки, но не меньше 32767). Для приведения значения, возвращаемого функцией rand(), к меньшему целочисленному диапазону можно воспользоваться операцией вычисления остатка от деления. Например, результатом rand() % 100 будет псевдослучайное число из диапазона от 0 до 99. Для получения целых случайных чисел из диапазона от a до b включительно можно использовать выражение:

µ §.

При необходимости получения вещественных случайных чисел из заданного диапазона от a до b можно воспользоваться выражением:



µ §.

Предварительно необходимо задаться некоторым коэффициентом k и вычислить значение N:

µ §.

Коэффициент k должен быть таким вещественным числом, чтобы обеспечить целочисленное значение N, иначе диапазон получаемых чисел окажется неточным. Для упрощения расчетов рекомендуется выбирать следующие значения k: 10,0; 100,0; 1000,0 и т. п. Выбранное значение k влияет на количество десятичных разрядов полученных случайных чисел.



Ниже на листинге 0 ЎЄ Первая программа на Си приведена программа вычисления суммы элементов массива из 10 вещественных чисел. При помощи функции rand() элементам массива назначаются случайные значения в диапазоне от 5.0 до 15.0.

Листинг 0 ЎЄ Пример использования массива

/* array.c ЁC пример использования массива. */
#include // для printf() и scanf()

#include // для setlocale()

#include // для getch()

#include // для srand() и rand()

#include // для time()
#define SIZE 10 // определение размера массива
int main()

{

int i; // индекс элементов массива



float data[SIZE]; // массив вещественных чисел

float sum = 0.0; // для вычисления суммы


setlocale(LC_ALL, “”);
// инициализация генератора случайных чисел

srand(time(NULL));


// вывод заголовка на экран

printf(“Значения элементов массива:\n”);


// цикл заполнения массива случайными числами и

// вывод их на экран

for (i = 0; i < SIZE; i++) {

// присвоение i-му элементу массива значение

// случайного числа в диапазоне от 5.0 до 15.0

data[i] = rand() % 101 / 10.0 + 5.0;


// вывод значения i-го элемента массива на экран

printf(“%8.1f”, data[i]);

}
// цикл вычисления суммы всех элементов массива

for (i = 0; i < SIZE; i++)

sum += data[i];
// вывод значения суммы всех элементов массива на экран

printf(“Сумма элементов массива data = %f\n”, sum);


getch();

return 0;

}Вызов функции srand(time(NULL)) необходим для инициализации генератора случайных чисел ЎЄ задания первого числа псевдослучайной последовательности, в качестве которого используется значение системного таймера. Для использования функций rand() и srand() в программе необходимо подключить заголовочный файл stdlib.h, для time() ЎЄ time.h.

Результаты выполнения программы array.с приведены на рисунке 0 ЎЄ Схема процесса создания программы на Си.

Рисунок 0 ЎЄ Результат выполнения программы array.c

Студенту на заметку!

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

Указатели

Указатель (pointer) ЁC переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения ЁC нулевого адреса. Если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находиться скалярная величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой. Формат объявления указателя:

type* ptrname;Нулевой указатель Ѓ| это указатель, хранящий специальное значение (0 или NULL), используемое для того, чтобы показать, что данная переменная-указатель не ссылается (не указывает) ни на какой объект.

Основные действия над указателями

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

Следующий пример демонстрирует объявление двух целочисленных переменных типа int и указателя на тип int, которому присваивается адрес переменной a.

int a = 13;

int b = 88;

int* ptr = &a;На рисунке 0 ЎЄ Схема процесса создания программы на Си показано представление этих переменных в памяти компьютера. Адреса переменных и их взаимное расположение показано условно и при выполнении на разных компьютерах будут отличаться.

Рисунок 0 ЎЄ После инициализации переменных

Следующий оператор выведет на экран значения переменных a и b, значение указателя ptr (адрес в памяти) и значение, на которое указывает ptr. Для вывода значения, на которое указывает указатель, используется унарная операция разыменования указателя *.

printf("a = %d, b = %d, ptr = %d, *ptr = %d\n",

a, b, ptr, *ptr);Так как указатель ptr указывает на переменную a, то значения, выводимые переменной a и *ptr, должны совпадать (см. рисунок 0 ЎЄ Схема процесса создания программы на Си).

Операцию разыменования указателя можно использовать и в левой части оператора присваивания. В следующем примере переменной, на которую указывает указатель ptr, присваивается значение разности переменных b и a (88ЁC13=75).

*ptr = b - a;

ptr = &b;Затем указателю присваивается адрес переменной b. Представление переменных в памяти компьютера после этих действий показано на рисунке 0 ЎЄ Схема процесса создания программы на Си.

Рисунок 0 ЎЄ После действий над указателем

Присвоим переменной, на которую указывает указатель ptr, значение 37, а самому указателю нулевой адрес с помощью специальной константы NULL. Представление переменных в памяти компьютера после этих действий показано на рисунке 0 ЎЄ Схема процесса создания программы на Си.

*ptr = 37;

ptr = NULL;

Рисунок 0 ЎЄ После обнуления указателя

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

ptr = NULL;

printf(“*ptr = %d\n”, *ptr);Полный текст программы, демонстрирующей основные действия с указателями, приведен в листинге 0 ЎЄ Первая программа на Си, а результат ее выполнения на рисунке 0 ЎЄ Схема процесса создания программы на Си.

Листинг 0 ЎЄ Пример использования указателей

/* ptrex1.c - пример использования указателей */

#include

#include

#include


int main()

{

int a = 13;



int b = 88;

int* ptr = &a;

setlocale(LC_ALL, "");

printf("a = %d, b = %d, ptr = %d, *ptr = %d\n",

a, b, ptr, *ptr);

*ptr = b - a;

ptr = &b;

printf("a = %d, b = %d, ptr = %d, *ptr = %d\n",

a, b, ptr, *ptr);

*ptr = 37;

ptr = NULL;

printf("a = %d, b = %d, ptr = %d\n", a, b, ptr);

getch();

return 0;

}

Рисунок 0 ЎЄ Результаты выполнения программы ptrex1.c


Динамические массивы

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

Для выделения памяти используется функция malloc(). Для ее использования необходимо подключить заголовочный файл stdlib.h. В качестве параметра функции malloc() передается размер блока памяти (в байтах), который необходимо выделить. Для правильного расчета размера памяти удобно использовать операцию sizeof. Функция malloc() возвращает в качестве результата указатель типа void* на начало блока выделенной памяти. Этот указатель нужно привести к типу указателя массива с помощью операции (). Ниже показан пример выделения блока памяти под динамический массив на n элементов типа int:

int* dyn_arr;

dyn_arr = (int*)malloc(n * sizeof(int));Здесь n может быть как целочисленной константой, так и переменной.

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

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

free(dyn_arr);Функция free() так же объявлена в заголовочном файле stdlib.h.

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

int* dyn_arr = (int*)malloc(n * sizeof(int));

int* ptr = dyn_arr;

int i = 1;


while (ptr <= dyn_arr + n - 1) {

*ptr++ = i++;

}Давайте разберем его более подробно. В первой строке осуществляется выделение памяти под динамический массив на n целых чисел типа int. В памяти массив будет занимать n*sizeof(int) байт (2n или 4n в зависимости от размера типа int на конкретном компьютере).

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

В третьей строке объявляется целочисленная переменная i и ей присваивается начальное значение 1. Она будет использоваться в качестве счетчика для присвоения элементам массива последовательных значений.

На рисунке 0 ЎЄ Схема процесса создания программы на Си показано представление переменных в памяти компьютера после инициализации. Адреса переменных и их взаимное расположение показано условно и при выполнении на разных компьютерах будет отличаться. Размер одной ячейки на рисунке принят 4 байта.

Рисунок 0 ЎЄ После инициализации переменных

Результатом операции dyn_arr+n-1 в условии цикла while является адрес в памяти последнего элемента динамического массива. Таким образом, цикл будет выполняться до тех пор, пока значение указателя ptr не выйдет за пределы массива.

Наибольшую сложность представляет оператор, выполняющийся в цикле *ptr++ = i++. Разберем его по действиям. Сначала выполняется операция присваивания по адресу, на который указывает указатель ptr, значения переменной i (операция разыменования указателя *ptr = i). Затем осуществляется операция i++, которая увеличивает значение переменной i на 1. И затем выполняется операция ptr++. Операция ++ над указателем в отличие от аналогичной операции для целочисленных типов увеличивает значение не на 1, а на размер типа указателя в байтах, т.е. в нашем случае на sizeof(int). Таким образом, операция ptr++ осуществляет переход к следующему элементу массива в памяти.

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

На рисунках 0 ЎЄ Схема процесса создания программы на Си и 0 ЎЄ Схема процесса создания программы на Си показано представление переменных в памяти компьютера после выполнения первой итерации цикла и всего цикла соответственно.

Рисунок 0 ЎЄ После первой итерации цикла

Рисунок 0 ЎЄ По окончании цикла

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

Листинг 0 ЎЄ Пример использования указателей

/* dynarr.c - пример использования динамической памяти */

#include

#include

#include /* malloc(), free() */

#include


int main()

{

int* dyn_arr;



int* ptr;

int i, n;

setlocale(LC_ALL, "");

printf("Введите размер динамического массива: ");

scanf("%d", &n);

dyn_arr = (int*)malloc(n * sizeof(int));

ptr = dyn_arr;

i = 1;
while (ptr <= dyn_arr + n - 1) {

*ptr++ = i++;

}
ptr = dyn_arr;

while (ptr < dyn_arr + n) {

printf("%8d", *ptr++);

}

free(dyn_arr);


getch();

return 0;

}

Рисунок 0 ЎЄ Результаты выполнения программы dynarr.c


Студенту на заметку!

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

Операции с указателями

В таблице 0 ЎЄ Типы данных языка Си собраны примеры основных операций и функций, применяемых в языке Си с указателями. В примерах подразумевается, что указатели типа int*, но эти операции применимы и для других типов данных.

Таблица 0 ЎЄ Основные операции с указателями

Пример операцииОписаниеptr = &var;Присвоить указателю ptr адрес переменной var*ptr = 5;Разыменование указателя и присвоение значения 5a = *ptr;Разыменование указателя и присвоение значения переменной aprintf(“%d”, *ptr);Разыменование указателя и вывод его значения на экран.arr = (int*)malloc(5 * sizof(int));Динамическое выделение блока памяти на 5 элементов типа int и присвоение его адреса указателю arr. ptr++;Увеличение значения указателя на размер его типа. Для динамических массивов ЎЄ переход указателя к следующему элементу.ptr--;Уменьшение значения указателя на размер его типа. Для динамических массивов ЎЄ переход указателя к предыдущему элементу.ptr2 = ptr1 + 3;Присваивает указателю ptr2 значение указателя ptr1, увеличенное на 3 размера его типа, т.е. для типа int на 12 байт.ptr2 = ptr1 ЁC 7;Присваивает указателю ptr2 значение указателя ptr1, уменьшенное на 7 размеров его типа, т.е. для типа int на 28 байт.n = ptr1 ЁC ptr2;Вычисляет разницу между значениями указателей в байтах и присваивает это значение переменной n.

Операция сложения для двух указателей смысла не имеет.free(arr);Освобождение ранее выделенной памяти.

Функции


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

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

Ниже на листинге 0 ЎЄ Первая программа на Си представлена программа, использующая функции.

Листинг 0 ЎЄ Пример использования функций

/* function.c ЁC пример использования функций. */
#include

#include

#include
#define pi 3.14159265
double cube(double x);
void main()

{

setlocale(LC_ALL, “”);


printf(“ 2 в кубе = %.0f\n”, cube(2.0));

printf(“Пи в кубе = %.10f\n”, cube(pi));


getch();

return 0;

}
double cube(double x)

{

return x * x * x;



}

Описание функции, помещенное перед функцией main,

double cube(double x);является ссылкой вперед, позволяющей использовать функцию cube в функции main. Такое описание не должно противоречить спецификации функции при ее реализации, расположенной после main. Ссылка вперед на реализацию функции является обязательной, если реализация функции размещается в тексте программы после ее вызова. Если же реализация функции размещается в тексте программы раньше ее вызова, то ссылка вперед на эту функцию не обязательна.

Оператор return (return ЎЄ возвращать) определяет значение, возвращаемое функцией.

Рисунок 0 ЎЄ Результат выполнения программы function.c

Внимание!

Частая ошибка ЎЄ постановка точки с запятой вслед за правой скобкой в реализации функции. За правой скобкой в реализации функции должна следовать открывающая тело функции фигурная скобка {.

Студенту на заметку!

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

Лабораторные работы (часть 1)

Лабораторная работа №1. Изучение интегрированной среды разработки Dev-C++

Цель: получить и закрепить навыки работы с интегрированной средой разработки DevC++.


В процессе выполнения лабораторной работы вы научитесь:

запускать интегрированную среду разработки DevC++;

создавать, открывать и сохранять файлы;

запускать программу на выполнение;

исправлять ошибки в исходном тексте программы;

просматривать результаты выполнения программы;

вызывать справку по интересующей информации.
Данная лабораторная работа предназначена для самостоятельного выполнения и не требует оформления отчета. Если в процессе выполнения последующих лабораторных работ возникнут трудности с командами и действиями в интегрированной среде разработки DevC++, то следует повторить соответствующие пункты работы №1.
Запуск

Создайте рабочий каталог C:\LAB\TTP\<номер_группы>, в котором будете сохранять свои файлы.

Для запуска среды разработки можно использовать пункт Dev-C++ в меню Пуск или ярлык в папке ТТП на рабочем столе.

Внимание!

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

Создание нового исходного файла

Для создания нового исходного файла используйте команду меню ФайлЎжСоздатьЎжИсходный файл (Ctrl+N).

Написание текста программы

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

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


Сохранение программы

Сохраните исходный файл с помощью команд ФайлЎжСохранить (Ctrl+S) или ФайлЎжСохранить какЎK (Ctrl+F12).

Перейдите в ранее созданную рабочую папку и задайте расширение (тип файла) C source files (*.c) и имя файла.

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

Компиляция и выполнение

Запустите компиляцию и запуск на выполнение с помощью команды ВыполнитьЎжСкомпилировать и выполнить (F9).

Эти команды можно выполнять и по отдельности: ВыполнитьЎжСкомпилировать (Ctrl+F9) и ВыполнитьЎжВыполнить (Ctrl+F10).

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

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

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

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

Чтобы закрыть окно командной строки нужно нажать любую клавишу на клавиатуре или кнопку Закрыть.


Выход

Выйдите из интегрированной среды разработки Dev-C++: ФайлЎжВыход (Alt-F4).

Повторное открытие программы

Чтобы открыть ранее сораненную программу воспользуйтесь командой ФайлЎжОткрыть проект или файлЎK (Ctrl-O).

Перейдите в папку с сохраненным файлом и выберите нужный файл с расширением *.c.

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


Лабораторная работа №2. Разработка простейшей программы на Си

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


В процессе выполнения данной лабораторной работы должны быть освоены следующие понятия:

константы (см. параграф ),

переменные (см. параграф ),

форматированный ввод-вывод (см. параграфы  и ),

арифметические операции (см. параграф ).
Порядок выполнения работы:

разработать решение поставленной задачи;

составить список исходных данных и результата;

составить блок-схему алгоритма;

осуществить перевод математических выражений на язык Cи;

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

проверить правильность выполнения разработанной программы;

составить отчет.


Пример. Определить площадь поверхности и объем параллелепипеда высотой 4,5 см, шириной a см и длиной b см.
Решение. Поверхность параллелепипеда состоит из шести граней, противоположные грани имеют одинаковую площадь, следовательно, можно записать следующее выражение:

µ §,


где µ § ЎЄ высота параллелепипеда.

Объем параллелепипеда вычислим по известной формуле:

µ §.
Алгоритм имеет линейную структуру и состоит из блоков ввода данных, вычисления и вывода данных (для своей задачи разработать самостоятельно).
Исходные данные: a ЎЄ ширина, b ЎЄ длина параллелепипеда.

Результат: S ЎЄ площадь, V ЎЄ объем параллелепипеда.


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

S = 2*a*b + 2*a*h + 2*b*h;

V = a*b*h;
Текст программы (Листинг 0).

Листинг 0 ЎЄ Лабораторная работа №2

/* lab2.c ЁC лабораторная работа №2. */
#include

#include

#include
#define h 4.5 /* высота параллелепипеда ЁC константа */
int main()

{

/* объявление необходимых переменных */



float a, b, S, V;
setlocale(LC_ALL, “”);
/* ввод исходных данных */

printf(“Введите ширину параллелепипеда: ”);

scanf(“%f”, &a);
printf(“Введите длину параллелепипеда: ”);

scanf(“%f”, &b);

/* вычисление площади и объема */

S = 2 * a * b + 2 * a * h + 2 * b * h;

V = a * b * h;
/* вывод результатов */

printf(“\nПлощадь параллелепипеда равна %.3f кв. см\n”,

S);

printf(“Объем параллелепипеда равен %.3f куб. см\n”, V);


getch();

return 0;

}На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.

Рисунок 0 ЎЄ Составление блок-схемы программы lab2.c

Результат выполнения (Рисунок 0).

Рисунок 0 ЎЄ Результат выполнения lab2.c

Задание

Написать программу на языке Си для решения следующей задачи.


Определить высоту h, на которой окажется тело, брошенное вертикально вверх с начальной скоростью v0 м/сек, за заданное время t сек (g=9,81м/сек2).

Определить расстояние S пройденное телом за время t сек при равноускоренном движении с ускорением a=3,5 м/сек2, если начальная скорость равнялась v0 м/сек.

Определить полную энергию E тела массой m=2,5 кг, движущегося со скоростью v м/сек на высоте h м (g=9,81м/сек2).

Определить силу тока I, протекающего через резистор сопротивлением R=2 Ом, если к нему приложено напряжения U В, а так же потребляемую мощность P.

Определить длину L и площадь S окружности диаметром d см (pi=3,14159265).

Определить объем V и площадь S поверхности шара радиусом r см (pi=3,14159265).

Определить работу A и мощность N, необходимые для подъема тела массой m=1,5 кг на высоту h м за время t сек (g=9,81 м/сек2).

Определить длину дуги L и площадь S сектора круга радиуса r м ограниченных углом a градусов (pi=3,14159265).

Определить момент инерции J цилиндрического тела массой m=2,25 кг с радиусом r м, и момент M который необходимо приложить к нему, чтобы он вращался вокруг своей оси с угловым ускорением а рад/сек2.

Определить массу M и плотность ro воздуха, находящегося в объеме V м3 при температуре t °С и атмосферном давлении p=105 Па (газовая постоянная воздуха R=286,7 Дж/(кгК)).

Определить объем V и массу M стального шара диаметром d мм (плотность стали ro=7800 кг/м3, pi=3,14159265).

Определить силу трения F и необходимую работу A для перемещения тела массой m кг на расстояние s м (коэф. трения mu=0,12, g=9,81м/сек2).

Определить силу притяжения F двух тел с массами m1 кг и m2=1000 кг, находящихся друг от друга на расстоянии r м (гравитационная постоянная G=6,67Ч10Ѓ|11 мі/(кг·секІ)).

Определить объем V и площадь S поверхности цилиндра с диаметром основания d см и высотой h см (pi=3,14159265).

Определить объем V конуса с радиусом основания r см и высотой h см, определить площадь S поперечного сечения, проходящего через его ось (pi=3,14159265).

Определить емкость плоского конденсатора в вакууме C с площадью пластин S м2 и расстоянием между ними d мм, найти энергию W заряженного конденсатора до напряжения U=25 В (электрическая постоянная e0=8,85·10-12 Ф/м).

Определить сопротивление R медного проводника длиной L см и площадью поперечного сечения S мм2, найти протекающий через него ток I при приложении напряжения U=125 В (удельное сопротивление меди ro=1,78·10-8 Ом·м).

Определить индуктивность соленоида в вакууме L с числом витков n и объемом V см3, найти энергию W запасенную соленоидом при протекании тока I=2,5 А (магнитная постоянная mu0=12,57·10-7 Гн/м).

Определить силу F, которую необходимо приложить к пружине с жесткостью k=7,5 Н/м, чтобы сжать ее на dx см, найти запасенную пружиной энергию W.

Определить количество теплоты Q, необходимое для нагрева m гр воды на DT градусов, найти необходимую мощность источника P, чтобы осуществить нагрев за t=60 сек (удельная теплоемкость воды c=4,87 кДж/(кг·К)).

Определить угловую скорость w (рад/сек) и линейную скорость v колеса радиусом r см, если оно совершает n оборотов в секунду (pi=3,14159265).

Определить количество теплоты Q, выделяющееся при сгорании m кг угля, найти мощность источника тепла P, если сгорание происходит за t мин (удельная теплота сгорания угля c=22 МДж/кг).

Определить силу F и время t торможения автомобиля массой m=1500 кг, если он двигается со скоростью v км/ч, а тормозной путь составил s м.

Определить площадь сечения трубы S и мощность насоса P, необходимую для подъема воды на высоту h=3,5 м если расход воды составляет Q л/сек, а диаметр трубы d см (плотность воды ro=1000 кг/м3, pi=3,14159265).

Определить силу тока I и мощность P на нагрузке, если к источнику тока с ЭДС E В и внутренним сопротивлением r=2,5 Ом, подключена нагрузка R Ом.

Вопросы для отчета

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

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

С какой функции начинается выполнение программы на языке Си?

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

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

Каким образом в программе будет осуществляться ввод исходных данных.

Какая функция используется для ввода?

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

Какие используются спецификации ввода и их описание?

Какой знак ставится перед именем переменной?

Каким образом будут выводиться результаты вычислений.

Какая функция используется функция вывода?

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

Какие используются спецификации вывода и их описание?

Какие используются специальные символы при выводе и их описание?

Как в программе будет решаться проблема вывода на экран русских символов в окно командной строки?

Какая используется функция?

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

Каким образом будет осуществляться пауза перед завершением работы программы?

Какая используется функция?

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

Упражнения

Запишите директиву подключения заголовочного файла stdio.h.

Запишите директиву подключения заголовочного файла locale.h.

Запишите директиву подключения заголовочного файла conio.h.

Запишите директиву объявления константы pi со значением 3,14.

Запишите директиву объявления константы g со значением 9,81.

Запишите объявление целочисленной переменной m.

Запишите объявление вещественной переменной v0.

Запишите объявление двух вещественных переменных f1 и f2.

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

Запишите оператор вывода на экран строки «Задание 1.».

Запишите оператор вывода на экран строки «Знания ЁC сила!», заканчивающейся переводом курсора на начало новой строки.

Запишите оператор вывода на экран строки «Язык программирования Си», начинающейся переводом курсора на начало новой строки.

Запишите оператор вывода на экран строки «Мир! Труд! Май!», каждое слово которой начинается с новой строки экрана.

Запишите оператор ввода с клавиатуры значения вещественной переменной mass.

Запишите оператор ввода с клавиатуры значения целочисленной переменной age.

Запишите оператор для вычисления выражения µ §.

Запишите оператор для вычисления выражения µ §.

Запишите оператор для вычисления выражения µ §.

Запишите оператор для вычисления выражения µ §.

Запишите спецификацию вывода вещественного числа в виде с фиксированной точкой и точностью 4 знака после десятичной точки.

Запишите спецификацию вывода вещественного числа в экспоненциальном виде и точностью 2 знака после десятичной точки.

Запишите спецификацию вывода вещественного числа в виде с фиксированной точкой с минимальным размером поля вывода 8 символов и точностью 3 знака после десятичной точки.

Запишите спецификацию вывода вещественного числа в экспоненциальном виде с минимальным размером поля вывода 10 символов и точностью 5 знаков после десятичной точки.

Запишите оператор вывода вещественной переменной S в виде с фиксированной точкой.

Запишите оператор вывода вещественной переменной power в экспоненциальном виде.

Запишите оператор вывода целочисленной переменной n в десятичном виде.

Запишите оператор, ожидающий нажатия любой кнопки на клавиатуре.

Лабораторная работа №3. Вычисление математических выражений

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

разработать решение поставленной задачи;

составить список исходных данных и результата;

составить блок-схему алгоритма;

осуществить перевод математических выражений на язык Cи;

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

проверить правильность выполнения разработанной программы;

составить отчет.


Действия по вычислениям промежуточных и окончательных результатов описываются операторами присваивания. Необходимо следить, чтобы порядок расположения операторов присваивания в программе от ее начала к концу соответствовал логической последовательности действий при решении поставленной задачи. При выборе имен переменных и составлении арифметических выражений необходимо правильно устанавливать тип используемых величин (целые, вещественные и так далее). При использовании в формулах греческого алфавита можно использовать их латинские названия или буквы, сходные по начертанию. Например, символ ѓС можно заменить на alfa или a, ѓз на omega или w.
Пример. Необходимо вычислить значение выражения

µ §,


где µ §, µ §, µ §.
Решение. Для вычисления заданных выражений необходимо использовать следующие функции: квадратный корень, тангенс, синус, косинус, возведение в степень. Все перечисленные функции имеются в библиотеке math.h. Так как соответствующие функции библиотеки sqrt, tan, sin, cos, pow в качестве аргументов и возвращаемых значений используют вещественный тип данных двойной точности double, то для всех переменных в программе имеет смысл использовать этот тип данных. Рассмотрим порядок вычисления выражений:

переменной y присваивается значение 0,45;

вычисляется значение переменной z, для чего необходимо значение y умножить на 0,3, из полученного произведения извлечь квадратный корень и сложить с 0,8;

переменной x присваивается значение тангенса произведения переменных y и z деленное на сумму синуса y и косинуса z;

значение переменной R ЁC частное от суммы x, y, z в степени 0,15 и суммы квадратов этих же переменных.
Алгоритм имеет линейную структуру и состоит из блоков вычисления и вывода.
Текст программы (Листинг 0).

Листинг 0 ЎЄ Лабораторная работа №3

/* lab3.c ЁC лабораторная работа №3. */
#include

#include

#include

#include


int main()

{

/* объявление и инициализация констант и переменных */



const double y = 0.45;

double z, x, R;


setlocale(LC_ALL, “”);

/* вычисления */

z = 0.8 + sqrt(0.3 * y);

x = tan(y * z) / (sin(y) + cos(z));

R = pow(x + y + z, 0.15) / (x * x + y * y + z * z);
/* вывод результатов */

printf(“y = %.5f\n”, y);

printf(“z = %.5f\n”, z);

printf(“x = %.5f\n”, x);

printf(“R = %.5f\n”, R);
getch();

return 0;

}На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.

Рисунок 0 ЎЄ Составление блок-схемы программы lab3.c


Результат выполнения (Рисунок 0).

Рисунок 0 ЎЄ Результат выполнения lab3.c

Задание

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



Таблица 0 ЎЄ Варианты заданий к лабораторной работе №3

№ вар.Вычислить выражениеПри заданных значениях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µ §µ §Вопросы для отчета

Опишите необходимый порядок вычисления выражений.

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

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

Какой заголовочный файл нужно подключить для использования математических функций в программе?

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

Осуществите запись выражений на языке Си. Опишите внесенные изменения по сравнению с математическим вариантом.

Как будут выводиться вычисленные значения.

Какая используется функция для вывода?

Какие используются спецификация вывода и их описание?

Какие специальные символы используются при выводе и их описание?

Упражнения

Запишите директиву подключения заголовочного файла math.h.

Запишите объявление вещественной константы двойной точности R равной 1,25.

Запишите объявление вещественной константы одинарной точности W2 равной 1004,115.

Запишите объявление вещественной константы двойной точности e равной 0,4·103.

Запишите объявление вещественной константы одинарной точности p равной 1,01·105.

Запишите объявление однобайтной целочисленной константы ch равной 120.

Запишите объявление двухбайтовой целочисленной константы size равной 4096.

Запишите объявление четырехбайтовой целочисленной константы NUM равной 1000000.

Запишите оператор вычисления выражения µ §.

Запишите оператор вычисления выражения µ §.

Запишите оператор вычисления выражения µ §.

Запишите оператор вычисления выражения µ §.

Запишите оператор вычисления выражения µ §.

Запишите спецификацию вывода вещественного числа в виде с фиксированной точкой с минимальным размером поля вывода 10 символов и точностью 5 знаков после десятичной точки.

Запишите спецификацию вывода вещественного числа в экспоненциальном виде с точностью 4 знака после десятичной точки.

Запишите спецификацию вывода вещественного числа в виде с фиксированной точкой с точностью 2 знака после десятичной точки.

Запишите оператор вывода вещественной переменной M в виде с фиксированной точкой с точностью 3 знака после десятичной точки.

Запишите оператор вывода вещественной переменной D3 в экспоненциальном виде с минимальным размером поля вывода 8 символов и точностью 1 знак после десятичной точки.

Лабораторная работа №4. Операторы ветвления и логические выражения

Цель: изучить операторы условия, операции отношения, логические операции и выражения.


Порядок выполнения работы:

изучить оператор ветвления if (параграф ), операции отношения (параграф ) и логические операции (параграф );

составить логическое выражение для определения точки, принадлежащей фигуре;

разработать блок-схему;

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

проверить правильность выполнения разработанной программы;

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

Логические выражения состоят из логических констант, переменных и операция отно­шения, соединенных логическими операциями. В простейших случаях в операторах используют только операции отношения: >, >=, <, <=, ==, !=, например i > 20. Но иногда возникают задачи, требующие использования более сложных логических выражений.

Пример

На плоскости задана фигура (Рисунок 0). Необходимо определить принадлежит введенная точка с координатами (x, y) фигуре или нет.



Рисунок 0 ЎЄ Пример задания к лабораторной работе №4

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

Формула окружности имеет вид:

µ §,


где (µ §, µ §) ЎЄ координаты центра окуржности, µ § ЎЄ радиус.

Уравнение прямой имеет вид:

µ §,

где (µ §, µ §) и (µ §, µ §) ЎЄ координаты двух точек, принадлежащих прямой.



Либо можно вопользоваться уравнением µ §, где µ § ЎЄ угол наклона прямой по отношению к оси µ §, а µ § ЎЄ точка пересеения с осью µ §. Для этого составляется система уравнений:

µ §


и решается относительно µ § и µ §.

Если прямая параллельна оси µ §, то ее уравнение µ §, а если параллельна оси µ §, то µ §, где µ § и µ § ЎЄ точки пересечения прямой с осью µ § или µ § соответственно.

Таким образом, для заданной фигуры имеем следующие уравнения:

µ §,


µ §,

µ §,


µ §,

µ §.


Точка принадлежит фигуре если она находится (внутри окружности (1) ИЛИ ниже прямой (3) И ниже прямой (4) И выше прямой (5)) И снаружи окружности (2).

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

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

µ §,


µ §,

µ §,


µ §,

µ §.


Теперь запишем логическое выражение на языке Си с учетом с использованием логических операций И ЎЄ &&, ИЛИ ЎЄ || (см. ):

(sqr(x ЁC 2) + sqr(y ЁC 1) < sqr(3)

||

y < 3 * x + 8



&&

y < -3.0/2 * x + 3 + 1.0/2

&&

y > -4)


&&

sqr(x) + sqr(y + 1) > sqr(2)Обратите внимание: чтобы не произошло округления при делении целых чисел, одно из них записывается в вещественном виде с добавлением фиктивной дробной части «.0». Примечание: разбивка логического выражения по строкам и отступы сделаны для удобства чтения данного выражения.

Листинг 0 ЎЄ Лабораторная работа №4

/* lab4.c ЁC лабораторная работа №4. */


#include

#include

#include
#define sqr(x) ((x) * (x))
int main()

{

float x, y;


setlocale(LC_ALL, “”);
/* ввод координат */

printf(“Введите координаты x и y: ”);

scanf(“%f %f”, &x, &y);
printf(“Введенная точка (%.1f, %.1f) “, x, y);
/* проверка логического выражения */

if (


(sqr(x ЁC 2) + sqr(y ЁC 1) < sqr(3)

||

y < 3 * x + 8



&&

y < -3.0/2 * x + 3 + 1.0/2

&&

y > -4)


&&

sqr(x) + sqr(y + 1) > sqr(2)

)

printf(“принадлежит фигуре”);



else

printf(“не принадлежит фигуре”);


getch();

return 0;

}На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.

Рисунок 0 ЎЄ Составление блок-схемы программы lab4.c

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

Рисунок 0 ЎЄ Выбор точек для проверки фигуры

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

µ §, µ §, µ §, µ §, µ § ЎЄ принадлежат фигуре;

µ §, µ §, µ §, µ §, µ §, µ § ЎЄ не принадлежат фигуре.

На рисунке 0 ЎЄ Схема процесса создания программы на Си представлены результаты многократного выполнения программы lab4.exe. Для этого после успешной компиляции исходного текста программы в среде Dev-C++ нужно запустить командную строку, перейти в рабочую папку (команда cd <полный путь к папке>), запускать программу при помощи команды lab4 или lab4.exe. При этом результаты предыдущих запусков программы сохраняются в окне командной строки.

Рисунок 0 ЎЄ Результаты выполнения lab4.exe

Задание


Написать на языки Си программу, которая по введенным координатам x и у определяет принадлежит ли точка фигуре.

Таблица 0 ЎЄ Варианты заданий к лабораторной работе №4

№ вар.Фигура№ вар.Фигура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 Вопросы для отчета

Запишите вывод уравнений прямых и окружностей заданной фигуры. Укажите на рисунке фигуры возле прямых и окружностей номера уравнений.

Запишите логическое выражение, описывающее принадлежность точки фигуре, на русском языке (используя союзы И, ИЛИ и слова выше, ниже, правее, левее, внутри, снаружи).

Осуществите перевод уравнений в неравенства с учетом предыдущего пункта.

Как при помощи макроса на языке Си можно осуществить возведение в квадрат?

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

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

Опишите проблему деления целых чисел на Си и способы ее решение в логическом выражении.

Как будет осуществляться ввод координат.

Какая используется функция для ввода?

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

Как при помощи одного оператора ввода осуществить ввод сразу нескольких значений?

Какие используются спецификации ввода и их описание?

Какой символ ставится перед именами переменных?

Опишите принцип работы оператора ветвления if. Какие операторы будут выполняться в каждой из ветвей оператора if?

Упражнения

Запишите макрос cube с параметром x, осуществляющий возведение в куб (с использованием операции умножения).

Запишите макрос sumsqr с параметрами a и b, осуществляющий вычисление суммы их квадратов (с использование операции умножения).

Запишите макрос avg с параметрами x и y, осуществляющий вычисление их среднего арифметического значения.

Запишите макрос avg3 с параметрами x, y и z, осуществляющий вычисление их среднего арифметического значения.

Запишите оператор ввода с клавиатуры значений двух вещественных переменных одинарной точности p и q.

Запишите оператор ввода с клавиатуры значений трех вещественных переменных одинарной точности a, b и c.

Запишите оператор ввода с клавиатуры значений двух целочисленных переменных m и n.

Запишите оператор ввода с клавиатуры значений трех целочисленных переменных i, j и k.

Запишите операции отношения, определяющие что:

значение переменной a меньше или равно 8;

значение переменной x не равно значению переменной W;

значение переменной d больше чем сумма значений переменных f и g;

значение переменной h равно разности между значением переменной k и 3,5;

разность значений переменных s1 и s2 меньше нуля;

произведение значений переменных v и r больше или равно нулю.

Запишите логическое выражение, определяющее что:

значения переменных p и q больше нуля;

значение одной из переменных x1 или x2 меньше или равно нуля;

значение переменной i равно 10 и значение переменной j больше 10;

значение переменной m меньше значения переменной n или значение переменной n не равно 25,1;

значения целочисленных переменных a и b являются четными числами (используйте операцию остаток от деления %);

значение одной из целочисленных переменных k или l являются нечетными числами (используйте операцию остаток от деления %).

Запишите оператор ветвления if, выполняющий следующие действия:

если значение переменной x меньше нуля, то прибавить 10 к значению переменной х;

если значение целочисленной переменной h больше 100, то вывести значение переменной h на экран;

если значение целочисленной переменной a меньше значения вещественной переменной g, то вывести на экран значение переменной a, иначе вывести на экран значение переменной g;

если значение переменной q равно значению переменной p, то прибавить 13,5 к значению переменной s, иначе присвоить переменной s значение 0;

если значения переменных y и z меньше нуля, то присвоить переменной w значение разности y и z, иначе присвоить переменной w значение суммы y и z.

Запишите оператор вывода двух вещественных переменных t и u в виде с фиксированной точкой с точностью 3 знака после десятичной точки.

Запишите оператор вывода двух вещественных переменных v и w в виде с фиксированной точкой с минимальным размером поля вывода 6 символов и точностью 2 знака после десятичной точки.

Запишите оператор вывода двух целочисленных переменных m и n в десятичном виде.

Запишите оператор вывода двух целочисленных переменных i и k в десятичном виде с минимальным размером поля вывода 4 символа.

Лабораторная работа №5. Циклы с заранее известным числом повторений

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


Порядок выполнения работы:

изучить оператор цикла for (параграф );

повторить операции отношения (параграф );

изучить целочисленные типы данных (параграф );

изучить форматированный вывод целочисленных значений (параграф );

изучить операции присваивания (параграф );

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

разработать блок-схему;

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

проверить правильность выполнения разработанной программы;

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

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

µ §.

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



Затем вычисляется выражение под знаком суммы для µ § и складывается с предыдущим значением суммы µ §. При этом в переменной µ § содержится µ §-я частичная сумма. После этого значение µ § увеличивается на единицу и проверяется не стало ли оно больше 10. Если значение µ § меньше или равно 10, то вычисляется следующая частичная сумма. В противном случае вычисление суммы будет закончено. Конечное значение суммы µ § выводится на экран.

Так как количество повторений заранее известно, то целесообразно использовать оператор цикла for, включающий в себя блоки инициализации, проверки условия продолжения цикла, изменения переменной цикла после выполнения операторов тела цикла. На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c показана простейшая блок-схема вычисления суммы при помощи цикла for. В блоке цикла указывается имя параметра цикла, его начальное и конечное значения, шаг изменения (если шаг равен 1 его можно не указывать).

Рисунок 0 ЎЄ Блок-схема алгоритма примера

Пример


Написать программу для вычисления конечной суммы:

µ §.


Результаты рассчета представить в виде таблицы.

Листинг 0 ЎЄ Лабораторная работа №5

/* lab5.c ЁC лабораторная работа №5. */
#include

#include

#include

#include


int main()

{

double s = 0; /* инициализация суммы */



int m;
setlocale(LC_ALL, “”);
/* заголовок таблицы */

printf(“------------------\n”);

printf(“| Шаг | Значение |\n”);

printf(“------------------\n”);


/* вычисление суммы при помощи цикла for */

for(m = 1; m <= 20; m++) {

s += log(m) + exp(-m);

printf(“| %3d | %8.3f |\n”, m, s);

}
printf(“------------------\n”);

/* вывод результата */

printf(“Значение суммы: %f”, s);
getch();

return 0;

}

На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.



Рисунок 0 ЎЄ Составление блок-схемы программы lab5.c

Рисунок 0 ЎЄ Результат выполнения lab5.c

Задание

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



Таблица 0 ЎЄ Варианты заданий к лабораторной работе №5

№ вар.Вычислить сумму№ вар.Вычислить сумму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µ §Вопросы для отчета

Опишите принцип вычисления конечных сумм.

Какой вид цикла удобнее всего использовать для их вычисления на языке Си?

Перечислите переменные, необходимые для решения задачи. Опишите их имя, назначение и тип данных.

Опишите параметры цикла.

Укажите начальное значение параметра цикла.

Укажите конечное значение параметра цикла.

Какая операция отношения используется для проверки условия продолжения цикла?

Как изменяется значение переменной цикла в процессе вычислений? Какая операция используется для ее изменения?

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

Если в выражении встречается проблема деления целых чисел, опишите способы ее решения?

С помощью какой операции языка Си будет осуществляться накопление суммы в цикле?

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

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

Какие спецификации вывода используются и их описание?

Какие специальные символы используются при выводе и их описание?

Упражнения

Запишите объявление вещественной переменной двойной точности p с инициализацией значением 1,0.

Запишите объявление вещественной переменной одинарной точности v0 с инициализацией значением 1020,3.

Запишите объявление вещественной переменной двойной точности r2 с инициализацией значением 2.4·106.

Запишите объявление вещественной переменной одинарной точности S1 с инициализацией значением 3.7·10-3.

Запишите объявление двухбайтовой целочисленной переменной m с инициализацией значением 0.

Запишите объявление однобайтовой целочисленной переменной k с инициализацией значением -1.

Запишите объявление четырехбайтовой целочисленной переменной age с инициализацией значением 18.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная j изменяется от 1 до 7 с шагом 1.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная n изменяется от 0 до 100 с шагом 2.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная i изменяется от 4 до 19 с шагом 3.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная m изменяется от 10 до 1
с шагом -1.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная k изменяется от 30 до 20


с шагом -2.

Запишите оператор цикла for, вычисляющий значение суммы (объявления целочисленной переменной цикла и вещественной переменной суммы включать не надо):

µ §;

µ §;


µ §;

µ §;


µ §.

Запишите оператор вывода двух переменных целочисленной j в десятичном виде с минимальным размером поля вывода 4 символа и вещественной z в виде с фиксированной точкой с минимальным размером поля вывода 7 символов и точностью 3 знака после десятичной точки.

Запишите оператор вывода двух переменных вещественной fx в виде с фиксированной точкой с точностью 2 знака после десятичной точки и целочисленной k в десятичном виде с минимальным размером поля вывода 2 символа.

Лабораторная работа №6. Циклы с заранее неизвестным числом повторений

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

изучить операторы цикла while и do while (параграф );

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

разработать блок-схему;

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

проверить правильность выполнения разработанной программы;

составить отчет.

Пример


Вычислить µ §, при µ § с точностью до µ §.

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

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

При вычислении суммы должен вычисляться факториал по формуле:

µ §,

где µ § ЎЄ знак произведения, например µ §. Факториал 0 равен 1 (µ §).



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

В языке Си под переменные типа int выделяется два или четыре байта. Для двухбайтовых целых чисел допустимые значения находятся в диапазоне от ЁC32 768 до 32 767. Поэтому число 10!, реально равное 3 628 800, в этом случае из-за переполнения будет представлено в памяти компьютера как 24 320. Для четырехбайтовых целых переполнение происходит для значения µ § Таким образом, при использовании целых типов для переменной факториала выражение под знаком суммы может никогда и не стать меньше заданной точности. Поэтому для работы с большими числами рекомендуется использовать вещественные типы float с диапазоном представления от 8,4„Є10ЁC37 до 3,4„Є10+38 или double с диапазоном от 2,2„Є10ЁC308 до 1,9„Є10+308.

Листинг 0 ЎЄ Лабораторная работа №6

/* lab6.c - лабораторная работа №6. */


#include

#include

#include

#include


#define e 1e-3 /* точность */
int main()

{

double s = 0, s_k; /* для вычисления суммы */



const double x = 0.81;

double fact = 1; /* для вычисления факториала */

int k = 1;
setlocale(LC_ALL, “”);
/* заголовок таблицы */

printf(“------------------------------\n”);

printf(“| Шаг | Факториал | Значение |\n”);

printf(“------------------------------\n”);


/* вычисление суммы при помощи цикла do-while */

do {


fact *= k;

s_k = (k + x) / fact * exp(x / k);

printf(“| %3d | %9.0f | %8.4f |\n”, k, fact, s_k);

s += s_k;

k++;

} while (fabs(s_k) > e);


printf(“------------------------------\n”);

/* вывод результатов */

printf(“Значение суммы: %f”, s);
getch();

return 0;

}

На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.



Рисунок 0 ЎЄ Составление блок-схемы программы lab6.c

Рисунок 0 ЎЄ Результат выполнения lab6.c

Задание

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



Таблица 0 ЎЄ Варианты заданий к лабораторной работе №6

№ вар.Вычислитьµ §Точность µ §1µ §0,14910ЁC52µ §5,9910ЁC33µ §3,12·10ЁC44µ §1,915·10ЁC55µ §1,4210ЁC36µ §0,993·10ЁC47µ §1,512·10ЁC58µ §3,4810ЁC39µ §7,554·10ЁC410µ §2,155·10ЁC511µ §0,4710ЁC412µ §1,213·10ЁC513µ §3,0610ЁC314µ §0,722·10ЁC415µ §2,345·10ЁC516µ §1,8510ЁC317µ §2,0910ЁC418µ §0,565·10ЁC519µ §1,1710ЁC320µ §2,882·10ЁC421µ §0,614·10ЁC522µ §4,1710ЁC323µ §1,282·10ЁC424µ §2,355·10ЁC525µ §3,8210ЁC4Вопросы для отчета

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

Какой вид цикла лучше всего подходит для вычисления такой суммы на языке Си? Почему?

Опишите итерационный способ вычисления факториала. Объясните выбор типа переменной для представления факториала в программе.

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

Перечислите переменные, необходимые для решения задачи. Опишите их имя, назначение и тип данных.

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

Опишите при помощи каких операций языка Си будет осуществляться накопление суммы и изменение переменной цикла.

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

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

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

Какие спецификации вывода используются и их описание?

Какие специальные символы используются при выводе и их описание?

Упражнения

Запишите директиву объявления константы h со значением 5·103.

Запишите директиву объявления константы err со значением 1,5·10-4.

Запишите объявление вещественной константы двойной точности Xn со значением 0,0175.

Запишите объявление вещественной константы одинарной точности ro со значением 1,2·103.

Запишите объявление вещественной переменной двойной точности Sm с инициализацией значением 0,0.

Запишите объявление вещественной переменной одинарной точности P_q с инициализацией значением 1,0.

Запишите объявление двух вещественных переменных двойной точности s0 и p1.

Запишите объявление трех вещественных переменных одинарной точности f0, F и d_n.

Запишите объявление двухбайтовой целочисленной переменной first с инициализацией значением 3.

Запишите объявление четырехбайтовой целочисленной переменной last с инициализацией значением 10504.

Запишите объявление двух четырехбайтовых целочисленных переменных i и j.

Запишите объявление трех двухбайтовых целочисленных переменных k, l и m.

Запишите заголовок оператора цикла while (без тела цикла), который выполняется до тех пор, пока:

значение переменной x меньше 15,5;

значение переменной t больше или равно нулю;

абсолютное значение переменной p0 больше 0,1;

абсолютное значение переменной z1 меньше или равно 3,3;

значение переменной bar равно 1;

значения переменных s и p меньше нуля;

значение одной из переменных f или g не равно 2.

Запишите заголовок оператора цикла do while (без тела цикла), который выполняется до тех пор, пока:

значение переменной y больше или равно 5,25;

абсолютное значение переменной qa не равно 0,5;

значения переменных a и b меньше нуля;

значение одной из переменных m или n равно 1.

Запишите оператор цикла while (с объявлением необходимых переменных), осуществляющий:

вычисление суммы чисел от 11 до 20;

вычисление произведения чисел от 5 до 13;

вывод на экран чисел от 1 до 10;

вывод на экран чисел в обратном порядке от 99 до 51;

вывод на экран чисел от 0 до 20 с шагом 2;

вычисление суммы чисел от 10 до 30 с шагом 2;

вычисление произведения чисел от 3 до 18 с шагом 3.

Запишите оператор цикла do while (с объявлением необходимых переменных), осуществляющий:

вычисление суммы чисел от 100 до 200;

вычисление произведения чисел от 7 до 15;

вывод на экран чисел от 21 до 28;

вывод на экран чисел в обратном порядке от 34 до 23;

вывод на экран чисел от -12 до 9 с шагом 3;

вычисление суммы чисел от 10 до 50 с шагом 5;

вычисление произведения чисел от 1 до 17 с шагом 4.

Запишите оператор вывода двух переменных целочисленной m в десятичном виде с минимальным размером поля вывода 3 символа и вещественной Sm в виде с фиксированной точкой с минимальным размером поля вывода 6 символов и точностью 0 знаков после десятичной точки.

Запишите оператор вывода трех переменных вещественной g в виде с фиксированной точкой с минимальным размером поля вывода 6 символов и точностью 1 знак после десятичной точки, целочисленной k в десятичном виде и вещественной s_j в виде с фиксированной точкой с минимальным размером поля вывода 8 символов и точностью 2 знака после десятичной точки.

Лабораторные работы (часть 2)

Лабораторная работа №7. Битовые операции

Цель данной работы ЎЄ научиться использовать битовые операции языка Си для установки, сброса заданных битов, сдвига разрядов.
Задачи:

изучить основные целочисленные типы языка Си;

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

изучить битовые операции языка Си: отрицание, И, ИЛИ, исключающее ИЛИ, сдвиг вправо и сдвиг влево (параграф );

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

разработать решение;

разработать блок-схему алгоритма;

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

проверить правильность выполнения разработанной программы;

составить отчет.


Биты (разряды) нумеруются справа налево, начиная с 0 (младший разряд). На рисунке 0 ЎЄ Схема процесса создания программы на Си показана нумерация бит в целых числах размером 1, 2 и 4 байта.

Рисунок 0 ЎЄ Нумерация битов (разрядов)

Данные могут быть интерпретированы как числа со знаком, так и без знака. Обычно для представления целых чисел используется дополнительный код. В этом случае для величины со знаком самый левый (старший) разряд указывает на положительное число, если содержит нуль, и на отрицательное, если ЎЄ единицу. Таким образом, для беззнаковых чисел значения лежат в диапазоне от 0 до 2nЁC1, а для знаковых: от ЁC2nЁC1 до 2nЁC1ЁC1, где n ЁC разрядность числа. Например, для двухбайтового беззнакового числа (16 разрядов): от 0 до 216ЁC1 (65 535); а для двухбайтового со знаком: от ЁC215 (ЁC32 768) до 215ЁC1 (32 767).

Минимальные и максимальные значения целочисленных типов в качестве констант определены в заголовочном файле limits.h. Список наиболее часто используемых из них приведен в таблице 0 ЎЄ Типы данных языка Си.

Таблица 0 ЎЄ Список констант минимальных и максимальных значений целочисленных типов из limits.h

Имя константыОписаниеCHAR_MINМинимальное значение для charCHAR_MAXМаксимальное значение для charUCHAR_MAXМаксимальное значение для беззнакового charSHRT_MINМинимальное значение для shortSHRT_MAXМаксимальное значение для shortUSHRT_MAXМаксимальное значение для беззнакового shortINT_MINМинимальное значение для intINT_MAXМаксимальное значение для intUINT_MAXМаксимальное значение для беззнакового intLONG_MINМинимальное значение для longLONG_MAXМаксимальное значение для longULONG_MAXМаксимальное значение для беззнакового long

В таблице 0 ЎЄ Типы данных языка Си приведен пример записи целых чисел на языке Си в десятичной (обычная запись), восьмеричной (запись числа начинается с нуля) и шестнадцатеричной (запись числа начинается префиксом 0x) системах счисления. Представление в двоичной системе счисления приведено для информации и на языке Си в прямом виде не записывается.

Таблица 0 ЎЄ Представление чисел на языке Си в различных системах счисления (двоичная для информации)

ДесятичнаяВосьмеричнаяШестнадцатеричнаяДвоичная00000x00000010010x01000120020x02001030030x03001140040x04010050050x05010160060x06011070070x07011180100x08100090110x091001100120x0A1010110130x0B1011120140x0C1100130150x0D1101140160x0E1110150170x0F1111

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

для десятичной %d для чисел со знаком, %u для беззнаковых чисел;

для восьмеричной %o;

для шестнадцатеричной %x или %X (влияет на регистр символов).

Для вывода чисел в двоичной системе их необходимо преобразовать в строку с помощью функции itoa(). Так как у функции itoa() первый параметр является целым числом типа int, то для правильного преобразования в строку с двоичным представлением чисел со знаком меньшей разрядности (8- и 16-разрядных) следует у этого параметра обнулять старшие разряды. Это можно сделать с помощью битовой операции И: a1 & 0xFF ЎЄ для 8-разрядного числа, b1 & 0xFFFF ЎЄ для 16-разрядного числа.

При выводе на экран чисел в двоичной и шестнадцатеричной системах счисления принято выводить все разряды числа полностью. Для вывода строки с двоичным представлением числа используется спецификация %0ns, где n ЎЄ количество двоичных разрядов, 0 ЎЄ означает заполнение незначащих разрядов слева нулями. Для вывода целого числа в шестнадцатеричном виде используется спецификация %0nx, где n ЎЄ количество шестнадцатеричных разрядов, 0 ЎЄ означает заполнение незначащих разрядов слева нулями.

Для установки нужных разрядов в «1» используется битовая операция ИЛИ |, в качестве второго операнда которой задается число, у которого заданные биты равны «1», а остальные «0».

Для сброса нужных разрядов в «0» используется битовая операция И &, в качестве второго операнда которой задается число, у которого заданные биты равны «0», а остальные «1».

Для сдвига разрядов вправо и влево используются операции >> и << соответственно. В качестве второго операнда указывается количество сдвигаемых разрядов.

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

устанавливающую в «1» биты 0, 5 и 7, сбрасывающую в «0» биты 1, 3 и 6 у беззнакового целого числа размером 1 байт;

устанавливающую в «1» биты 0, 5, 7 и 12, сбрасывающую в «0» биты 1, 5, 7 и 13 у целого со знаком размером 2 байта;

осуществляющую сдвиг первого числа вправо на 3 разряда, а второго влево на 5 разрядов.

Листинг 0 ЎЄ Лабораторная работа №7

#include /* printf(), scanf() */

#include /* setlocale() */

#include /* MIN, MAX constants */

#include /* itoa() */

#include /* getch() */


int main()

{

unsigned char a1, a2, a3, a4;



short b1, b2, b3, b4;

char s1[33], s2[33];

setlocale(LC_ALL, "");

printf("Введите число без знака от 0 до %u: ", UCHAR_MAX);

scanf("%u", &a1);

a2 = a1 | 0xA1; /* a1 ИЛИ 1010 0001 */

a3 = a1 & 0xB5; /* a1 И 1011 0101 */

a4 = a1 >> 3; /* сдвиг вправо на 3 разряда */

itoa(a1, s1, 2);

printf(" %08s\nИЛИ 10100001\n = %08s (%02x)\n\n",

s1, itoa(a2, s2, 2), a2);

printf(" %08s\n И 10110101\n = %08s (%02x)\n\n",

s1, itoa(a3, s2, 2), a3);

printf(" %08s >> 3\n = %08s (%02x)\n\n",

s1, itoa(a4, s2, 2), a4);

printf("Введите число co знаком от %d до %d: ",

SHRT_MIN, SHRT_MAX);

scanf("%d", &b1);

b2 = b1 | 0x10A1; /* a1 ИЛИ 0001 0000 1010 0001 */

b3 = b1 & 0xDF5D; /* a1 И 1101 1111 0101 1101 */

b4 = b1 << 5; /* сдвиг влево на 5 разрядов */

itoa(b1 & 0xFFFF, s1, 2);

printf(" %016s\nИЛИ 0001000010100001\n = %016s (%04x)\n\n", s1, itoa(b2 & 0xFFFF, s2, 2), b2 & 0xFFFF);

printf(" %016s\n И 1101111101011101\n = %016s (%04x)\n\n", s1, itoa(b3 & 0xFFFF, s2, 2), b3 & 0xFFFF);

printf(" %016s << 5\n = %016s (%04x)\n",

s1, itoa(b4 & 0xFFFF, s2, 2), b4 & 0xFFFF);

getch();

return 0;

}

На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.



Рисунок 0 ЎЄ Составление блок-схемы программы lab_bits.c
На рисунке 0 ЎЄ Схема процесса создания программы на Си представлены результаты выполнения программы lab_bits.c.

Рисунок 0 ЎЄ Результат выполнения lab_bits.c

Задание

Написать на языке Си программу, осуществляющую ввод с клавиатуры целых чисел заданного типа, устанавливающую в 1 и сбрасывающую в 0 заданные биты введенных чисел, осуществляющую их сдвиг вправо или влево. Вывести полученные результаты на экран в двоичном и шестнадцатеричном виде (см. таблицу 0 ЎЄ Типы данных языка Си).



Таблица 0 ЎЄ Варианты заданий к лабораторной работе №7

№ вар.Размер, байтЗнакУстановить в «1»Сбросить в «0»Сдвиг11


2со знаком
без знака1, 4, 6
5, 9, 10, 140, 3, 7
2, 8, 12, 15влево 3
вправо 522
4без знака
со знаком0, 6, 11
4, 13, 20, 272, 8, 13
6, 11, 17, 24вправо 4
влево 731
4со знаком
без знака2, 4, 7
5, 12, 21, 301, 5, 6
3, 9, 16, 25влево 2
вправо 642
1без знака
со знаком3, 9, 13, 14
1, 2, 60, 2, 8, 15
2, 4, 7вправо 7
влево 154
2со знаком
без знака4, 15, 19, 26
5, 10, 125, 11, 17, 29
3, 6, 14влево 8
вправо 564
1без знака
со знаком7, 10, 20, 25
0, 4, 53, 8, 16, 23
1, 6, 7вправо 9
влево 271
2без знака
со знаком2, 5, 7
3, 9, 11, 140, 3, 6
2, 6, 8, 15влево 3
вправо 682
4со знаком
без знака4, 7, 12
6, 10, 18, 305, 7, 13
4, 12, 16, 25вправо 4
влево 791
4без знака
со знаком1, 3, 6
7, 15, 23, 312, 4, 6
5, 10, 20, 30влево 1
вправо 8102
1со знаком
без знака0, 5, 8, 10
2, 5, 60, 3, 6, 11
1, 4, 5вправо 3
влево 2114
2без знака
со знаком3, 12, 16, 27
6, 10, 134, 8, 14, 26
1, 11, 15влево 6
вправо 4124
1со знаком
без знака0, 7, 23, 30
0, 4, 56, 9, 13, 31
2, 3, 7вправо 7
влево 3131
2со знаком
без знака1, 5, 7
4, 8, 10, 130, 3, 6
3, 8, 11, 15влево 2
вправо 4142
4без знака
со знаком2, 5, 12
4, 7 20, 241, 8, 11
6, 13, 21, 30вправо 5
влево 5151
4со знаком
без знака0, 4, 6
5, 15, 18, 291, 3, 7
6, 11, 24, 28влево 1
вправо 6162
1без знака
со знаком3, 5, 8, 11
1, 3, 62, 4, 8, 13
0, 4, 5вправо 4
влево 3174
2со знаком
без знака0, 11, 22, 31
2, 9, 151, 7, 13, 29
1, 6, 14влево 7
вправо 3184
1без знака
со знаком8, 10, 19, 26
1, 2, 61, 13, 18, 28
0, 3, 7вправо 8
влево 2191
2без знака
со знаком1, 3, 4
0, 5, 9, 132, 4, 7
1, 9, 10, 12влево 3
вправо 4202
4со знаком
без знака1, 6, 15
4, 9, 29, 300, 7, 14
0, 10, 19, 27вправо 5
влево 6211
4без знака
со знаком2, 3, 7
1, 2, 16, 280, 3, 5
3, 14, 21, 27влево 1
вправо 7222
1со знаком
без знака1, 4, 11, 12
0, 4, 75, 9, 10, 13
1, 3, 6вправо 3
влево 2234
2без знака
со знаком7, 11, 21, 31
2, 5, 106, 19, 24, 30
4, 8, 14влево 7
вправо 4244
1со знаком
без знака1, 14, 24, 29
2, 4, 75, 12, 17, 26
3, 4, 6вправо 9
влево 3251
2со знаком
без знака0, 3, 5
4, 9, 12, 141, 5, 7
2, 6, 11, 13влево 4
вправо 5Вопросы для отчета

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

Как с помощью констант определить минимальное и максимальное значение для выбранных типов данных? В каком заголовочном файле они определены?

Какие спецификации будут использоваться для ввода и вывода выбранных типов данных?

Какая операция будет использоваться для установки заданных бит в «1»? Запишите константы, которые будет использоваться для установки бит, в двоичной, десятичной и шестнадцатеричной системах счисления.

Какая операция будет использоваться для сброса заданных бит в «0»? Запишите константы, которые будет использоваться для сброса бит, в двоичной, десятичной и шестнадцатеричной системах счисления.

Какие операции будут использоваться для сдвига разрядов? Приведите примеры из программы.

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

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

Упражнения

Запишите директиву подключения заголовочного файла limits.h.

Запишите объявление двух беззнаковых однобайтовых целочисленных переменных ch и sh.

Запишите объявление трех однобайтовых целочисленных переменных со знаком n1, m0 и k.

Запишите объявление беззнаковой двухбайтовой целочисленной переменной D2.

Запишите объявление двух двухбайтовых целочисленных переменных со знаком row и col.

Запишите объявление двух беззнаковых четырехбайтовых переменных width и height.

Запишите объявление трех четырехбайтовых переменных со знаком start, stop и pause.

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

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

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

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

Запишите оператор ввода с клавиатуры значения беззнаковой целочисленной переменной b в десятичном виде.

Запишите оператор ввода с клавиатуры значения целочисленной переменной со знаком num в десятичном виде.

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

Запишите оператор ввода с клавиатуры значения беззнаковой целочисленной переменной mode в шестнадцатеричном виде.

Запишите оператор ввода с клавиатуры значения переменной mass типа unsigned long в десятичном виде.

Запишите оператор ввода с клавиатуры значения переменной speed типа long в десятичном виде.

Запишите оператор ввода с клавиатуры значения переменной page типа unsigned long в шестнадцатеричном виде.

Запишите оператор, который устанавливает в «1» 0-й и 7-й разряды целочисленной переменной m (используйте запись константы в шестнадцатеричном виде).

Запишите оператор, который сбрасывает в «0» 2-й и 6-й разряды целочисленной переменной lim (используйте запись константы в шестнадцатеричном виде).

Запишите оператор, который инвертирует состояния («0» в «1», а «1» в «0») 1-го и 5-го разрядов целочисленной переменной param (используйте запись константы в шестнадцатеричном виде).

Запишите оператор, который инвертирует состояние всех битов целочисленной переменной state и присваивает это значение целочисленной переменной type.

Запишите оператор сдвига значения целочисленной переменной top на 4 разряда вправо.

Запишите оператор сдвига значения целочисленной переменной val на 3 разряда влево.

Запишите оператор преобразования беззнаковой целочисленной переменной min в строку s с двоичным представлением ее значения.

Запишите оператор преобразования двухбайтовой целочисленной переменной link со знаком в строку S1 с двоичным представлением ее значения.

Запишите оператор преобразования беззнаковой целочисленной переменной crc в строку str с представлением ее значения в троичной системе счисления.

Запишите оператор вывода на экран значения беззнаковой целочисленной переменной idx в шестнадцатеричном виде с минимальным размером поля вывода 4 символа.

Запишите оператор вывода на экран значения беззнаковой целочисленной переменной vol в шестнадцатеричном виде с минимальным размером поля вывода 5 символов и заполнением нулями слева.

Запишите оператор вывода на экран значения двухбайтовой целочисленной переменной со знаком max в шестнадцатеричном виде с минимальным размером поля вывода 6 символов и заполнением нулями слева.

Запишите оператор вывода на экран значения целочисленной переменной со знаком act типа long в шестнадцатеричном виде с минимальным размером поля вывода 8 символов.

Запишите оператор вывода на экран строки str1 с минимальным размером поля вывода 10 символов.

Запишите оператор вывода на экран строки Name с минимальным размером поля вывода 20 символов и выравниванием по левому краю поля.

Запишите оператор вывода на экран строки s2 с двоичным представлением целого числа с минимальным размером поля вывода 24 символа и заполнением нулями слева.

Лабораторная работа №8. Массивы

Цель данной работы ЎЄ научиться работать с массивами в языке Си.


Задачи:

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

изучить основные операции с элементами массива (присвоение, использование в выражениях),

изучить принципы работы с массивами при помощи циклов;

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

разработать решение;

разработать блок-схему алгоритма;

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

проверить правильность выполнения разработанной программы;

составить отчет.

Пример

Написать программу сортировки по убыванию массива из 14 целых чисел в диапазоне от 0 до 999.


Текст программы представлен в листинге 0 ЎЄ Первая программа на Си.

Так как в программе несколько раз приходится использовать размер массива, то для удобства последующего изменения программы введена константа SIZE: #define SIZE 14.

По заданию массив состоит из целых чисел, поэтому при объявлении массива используется тип int: int arr[SIZE].

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

Чтобы не выйти за допустимые пределы изменения индекса массива, цикл по переменной j сделан от 0 до SIZEЁC2.

Листинг 0 ЎЄ Лабораторная работа №8

/* lab_arr.c ЁC лабораторная работа №8. */
#include

#include

#include

#include

#include
#define SIZE 14 /* размер массива */
int main()

{

int arr[SIZE]; /* объявление массива целых чисел */



int i, j; /* для индекса массива */

int tmp; /* для перестановки элементов массива */


setlocale(LC_ALL, “”);
/* заполнение массива случайными числами от 0 до 999 */

srand(time(NULL));

for (i = 0; i < SIZE; i++)

arr[i] = rand() % 1000;


/* вывод исходного массива */

printf(“Исходный массив:\n”);

for (i = 0; i < SIZE; i++)

printf(“%5d”, arr[i]);


/* сортировка */

for (i = 0; i < SIZE; i++) {

for (j = 0; j < SIZE - 1; j++) {

// если j-й элемент меньше (j+1)-го

if (arr[j] < arr[j+1]) {

// перестановка местами

// j-го и (j+1)-го элементов массива

tmp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = tmp;

}

}

}


/* вывод результатов */

printf(“\n\nОтсортированный массив:\n”);

for (i = 0; i < SIZE; i++)

printf(“%5d”, arr[i]);


getch();

return 0;

}На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.

Рисунок 0 ЎЄ Составление блок-схемы программы lab_arr.c

На рисунке 0 ЎЄ Схема процесса создания программы на Си представлены результаты выполнения программы lab_arr.c.

Рисунок 0 ЎЄ Результат выполнения lab_arr.c

Задание

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



Таблица 0 ЎЄ Варианты заданий к лабораторной работе №8

№ вар.ЗаданиеПояснениеКоличество элементов NТип элементов массиваДиапазон1Вычислить среднее арифметическое элементов массива Aµ §16floatµ §2Вычислить среднее геометрическое элементов массива Bµ §6doubleµ §3Найти значение и индекс минимального элемента массива Cµ §15floatµ §4Найти значение и индекс максимального элемента массива Dµ §12doubleµ §5Переставить элементы массива E в обратном порядкеµ §10intµ §6Присвоить каждому элементу массива F значение квадратного корняµ §13doubleµ §7Переставить соседние элементы массива G местамиµ §8shortµ §8Присвоить каждому элементу массива H значение суммы двух соседних элементовµ §7longµ §9Присвоить каждому элементу массива P значение произведения двух соседних элементовµ §9intµ §10Присвоить каждому элементу массива Q значение разницы двух соседних элементовµ §11shortµ §11Вывести значения всех элементов массива R меньше 10,5, вывести их количествоµ §10floatµ §12Вывести значения всех элементов массива S больше 25,3, вывести их количествоµ §13doubleµ §13Вычислить средние арифметические нечетных и четных элементов массива Tµ §14floatµ §14Вычислить средние арифметические первой и второй половин массива Uµ §12intµ §15Вычислить средние геометрические первой и второй половин массива Wµ §8doubleµ §16Вычислить средние геометрические нечетных и четных элементов массива Xµ §10shortµ §17Присвоить каждому элементу массива Y остаток от деления на номер элементаµ §11longµ §18Вычислить суммы всех отрицательных и всех положительных элементов массива Mµ §15floatµ §19Найти значение и индекс максимального по модулю элемента массива Kµ §13longµ §20Найти значение и индекс минимального по модулю элемента массива Zµ §12shortµ §21Вывести элементы массива F, которые больше предыдущего, вывести их количествоµ §9doubleµ §22Вывести элементы массива D, которые меньше предыдущего, вывести их количествоµ §13floatµ §23Вывести элементы массива C, лежащие в диапазоне от -100 до 50, вывести их количествоµ §11doubleµ §24Вывести все нечетные значения элементов массива B, вывести их количествоµ §14shortµ §25Вывести все четные значения элементов массива A, вывести их количествоµ §10intµ §Вопросы для отчета

Опишите каким образом в программе будет задаваться размер массива.

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

Определите необходимость задавать переменным начальные значения.

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

Выведите выражение для расчета случайного числа из заданного диапазона.

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

Какой или какие циклы будут использоваться для выполнения задания? Для циклов while или do while приведите логическое выражение выполнения цикла. Для циклов for приведите начальное значение, логическое выражение, шаг изменения.

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

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

Упражнения

Запишите директиву подключения заголовочного файла stdlib.h.

Запишите директиву подключения заголовочного файла time.h.

Запишите директиву объявления константы N со значением 17.

Запишите директиву объявления константы M со значением 8.

Запишите объявление целочисленной константы size равной 12.

Запишите объявление целочисленной константы count равной 5.

Запишите объявление массива целых чисел с именем w и количеством элементов 7.

Запишите объявление массива вещественных чисел одинарной точности с именем massiv и количеством элементов 14.

Запишите объявление массива вещественных чисел двойной точности с именем G и количеством элементов равным значению константы NUM.

Запишите объявление массива однобайтовых целых чисел с именем str и количеством элементов 32.

Запишите объявление массива беззнаковых четырехбайтовых целых чисел с именем arr1 и количеством элементов равным значению константы length.

Запишите оператор инициализации генератора случайных чисел текущим значением системного таймера.

Запишите оператор инициализации генератора случайных чисел значением 1000.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная j изменяется от начального до конечного значения индекса массива с количеством элементов 11.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная k изменяется от начального до конечного значения индекса массива с количеством элементов 100.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная ii изменяется от второго до предпоследнего значения индекса массива с количеством элементов 20.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная m изменяется от начального до предпоследнего значения индекса массива с количеством элементов равным значению константы SIZE.

Запишите заголовок оператора цикла for (без тела цикла) в котором целочисленная переменная n изменяется от второго до последнего значения индекса массива с количеством элементов равным значению константы N.

Запишите оператор цикла for (в качестве индекса используйте целочисленную переменную i):

который выводит на экран значения элементов целочисленного массива D с количеством элементов 9;

который присваивает ноль всем элементам массива X с количеством элементов равным значению константы NN;

который присваивает значение индекса i элементам массива H с количеством элементов равным значению константы len;

который вычисляет сумму S всех элементов массива DAT с количеством элементов 25;

который выводит на экран значения каждого второго элемента начиная с начального массива вещественных чисел MAS с количеством элементов равным значению константы SIZE1;

который присваивает случайные значения в диапазоне от 0 до 20 включительно элементам целочисленного массива err с количеством элементов равным значению константы col;

который присваивает случайные значения в диапазоне от 5 до 15 включительно элементам целочисленного массива states с количеством элементов равным значению константы max;

который присваивает случайные значения в диапазоне от
-3,0 до 5,0 включительно (с точностью не менее одного знака после десятичной точки) элементам массива вещественных чисел values с количеством элементов равным значению константы MAX.

Лабораторная работа №9. Указатели

Цель данной работы ЎЄ научиться использовать указатели и динамическое выделение памяти на языке Си.
Задачи:

изучить понятие указателя и основные операции с ними (глава );

изучить способы динамического выделения и освобождения памяти;

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


Порядок выполнения работы:

разработать решение;

разработать блок-схему алгоритма;

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

проверить правильность выполнения разработанной программы;

составить отчет.


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

Текст программы представлен в листинге 0 ЎЄ Первая программа на Си.

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

Затем при помощи функции malloc() осуществляется выделение памяти под динамический массив. Размер в байтах задается с использованием операции sizeof. Результат, возвращаемый функцией malloc(), приводится к типу указателя на int и присваивается переменной arr.

Далее производится инициализация генератора псевдослучайных чисел вызовом функции srand(). В качестве начального значения используется текущее время time().

Заполнение динамического массива псевдослучайными целыми числами из диапазона от 0 до 999 осуществляется в цикле while. До цикла указателю ptr присваивается адрес начала динамического массива arr. Цикл выполняется пока значение указателя ptr не выйдет за пределы массива. В цикле текущему элементу массива, на который указывает ptr, присваивается псевдослучайное число, а сам указатель перемещается на следующий элемент с помощью операции ++.

В следующем цикле while таким же образом значения элементов динамического массива выводятся на экран.

Сортировка массива осуществляется, так же как и в предыдущей лабораторной работе. Внешний цикл реализован при помощи оператора for, а внутренний при помощи оператора while. Обратите внимание, как при помощи указателя осуществляется доступ к значению следующего элемента массива с помощью операции + и разыменования *: *(ptr+1).

После сортировки значения массива выводятся на экран в цикле while. А затем осуществляется освобождение памяти при помощи функции free().

Листинг 0 ЎЄ Лабораторная работа №9

/* lab_ptr.c - лабораторная работа №9. */
#include /* printf, scanf */

#include /* setlocale */

#include /* getch */

#include /* malloc, free, srand, rand */

#include /* time */
int main()

{

int size; /* размер динамического массива */



int* arr; /* указатель на начало массива */

int* ptr; /* указатель для работы с массивом */

int i; /* вспомогательная переменная */

int tmp; /* для перестановки элементов массива */


setlocale(LC_ALL, "");

/* запрос размера для динамического массива */

printf("Введите размер массива: ");

scanf("%d", &size);

/* выделение памяти под массив */

arr = (int*)malloc(size * sizeof(int));


/* инициализация генератора случайных чисел */

srand(time(NULL));

/* заполнение массива случайными числами от 0 до 999 */

ptr = arr; /* установка указателя ptr в начало массива */

while (ptr < arr + size)

*ptr++ = rand() % 1000;


/* вывод исходного массива */

ptr = arr;

printf("Исходный массив:\n");

while (ptr < arr + size)

printf("%5d", *ptr++);
/* сортировка */

for (i = 0; i < size; i++) {

ptr = arr;

while (ptr < arr + size - 1) {

// если текущий элемент меньше следующего

if (*ptr > *(ptr + 1)) {

// перестановка местами

// текущего и следующего элементов массива

tmp = *ptr;

*ptr = *(ptr + 1);

*(ptr + 1) = tmp;

}

ptr++;



}

}
/* вывод результатов */

ptr = arr;

printf("\n\nОтсортированный массив:\n");

while (ptr < arr + size)

printf("%5d", *ptr++);


/* освобождение памяти */

free(arr);


getch();

return 0;

}На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.

Рисунок 0 ЎЄ Составление блок-схемы программы lab_ptr.c

На рисунке 0 ЎЄ Схема процесса создания программы на Си представлены результаты выполнения программы lab_ptr.c.

Рисунок 0 ЎЄ Результат выполнения lab_ptr.c

Задание

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



Таблица 0 ЎЄ Варианты заданий к лабораторной работе №9

№ вар.ЗаданиеПояснениеТип элементов массиваДиапазон1Вывести элементы массива F, которые больше предыдущего, вывести их количествоµ §floatµ §2Вывести элементы массива D, которые меньше предыдущего, вывести их количествоµ §longµ §3Вывести элементы массива C, лежащие в диапазоне от 10 до 50, вывести их количествоµ §floatµ §4Вывести все нечетные значения элементов массива B, вывести их количествоµ §intµ §5Вывести все четные значения элементов массива A, вывести их количествоµ §shortµ §6Вывести значения всех элементов массива R меньше 110,5, вывести их количествоµ §doubleµ §7Вывести значения всех элементов массива S больше 55,5, вывести их количествоµ §floatµ §8Вычислить средние арифметические нечетных и четных элементов массива Tµ §doubleµ §9Вычислить средние арифметические первой и второй половин массива Uµ §floatµ §10Вычислить средние геометрические первой и второй половин массива Wµ §intµ §11Вычислить средние геометрические нечетных и четных элементов массива Xµ §shortµ §12Присвоить каждому элементу массива Y остаток от деления на номер элементаµ §shortµ §13Вычислить суммы всех отрицательных и всех положительных элементов массива Mµ §doubleµ §14Найти значение и индекс максимального по модулю элемента массива Kµ §intµ §15Найти значение и индекс минимального по модулю элемента массива Zµ §longµ §16Вычислить среднее арифметическое элементов массива Aµ §doubleµ §17Вычислить среднее геометрическое элементов массива Bµ §intµ §18Найти значение и индекс минимального элемента массива Cµ §doubleµ §19Найти значение и индекс максимального элемента массива Dµ §shortµ §20Переставить элементы массива E в обратном порядкеµ §floatµ §21Присвоить каждому элементу массива F значение квадратного корняµ §floatµ §22Переставить соседние элементы массива G местамиµ §intµ §23Присвоить каждому элементу массива H значение суммы двух соседних элементовµ §floatµ §24Присвоить каждому элементу массива P значение произведения двух соседних элементовµ §doubleµ §25Присвоить каждому элементу массива Q значение разницы двух соседних элементовµ §longµ §Вопросы для отчета

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

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

Выведите выражение для расчета псевдослучайного числа из заданного диапазона.

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

Какой или какие циклы будут использоваться для выполнения задания? Для циклов while или do while приведите логическое выражение выполнения цикла. Для циклов for приведите начальное значение, логическое выражение, шаг изменения.

Опишите действия, которые будут выполняться внутри цикла (циклов).

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

С помощью какой функции будет осуществляться освобождение динамической памяти? В каком заголовочном файле она определена?

Упражнения

Запишите объявление указателя на четырехбайтовое целое число с именем pint.

Запишите объявление указателя на однобайтовое целое число с именем ptrch.

Запишите объявление указателя на беззнаковое четырехбайтовое целое число с именем pu.

Запишите объявление указателя на беззнаковое двухбайтовое целое число с именем ptr.

Запишите объявление указателя на вещественное число одинарной точности с именем pf.

Запишите объявление указателя на вещественное число двойной точности с именем ptrd.

Запишите оператор выделения памяти под динамический массив четырехбайтовых целых чисел с именем darr с количеством элементов 8.

Запишите оператор выделения памяти под динамический массив беззнаковых двухбайтовых целых чисел с именем ush_arr с количеством элементов равным значению константы N.

Запишите оператор выделения памяти под динамический массив вещественных чисел одинарной точности с именем data с количеством элементов равным значению константы SIZE.

Запишите оператор выделения памяти под динамический массив вещественных чисел двойной точности с именем BUF с количеством элементов равным значению константы len.

Запишите оператор инициализации указателя и заголовок оператора цикла while (без тела цикла):

который осуществляет прохождение указателя ptr по всем элементам динамического массива arr с количеством элементов равным значению константы COUNT;

который осуществляет прохождение указателя p по всем элементам динамического массива dyn_arr с количеством элементов 16;

который осуществляет прохождение указателя p2 с начального до предпоследнего элемента динамического массива DATA с количеством элементов равным значению константы N;

который осуществляет прохождение указателя ref со второго до предпоследнего элемента динамического массива SET с количеством элементов равным значению константы M.

Запишите необходимые операторы инициализации и оператор цикла while:

который осуществляет вывод на экран всех элементов целочисленного динамического массива A с количеством элементов 7;

который осуществляет вывод на экран всех элементов динамического массива вещественных чисел F с количеством элементов равным значению константы LEN;

который присваивает случайные значения в диапазоне от


0 до 200 включительно элементам целочисленного динамического массива w с количеством элементов 14;

который присваивает случайные значения в диапазоне от


31,2 до 51,9 включительно (с точностью не менее одного знака после десятичной точки) элементам динамического массива вещественных чисел val с количеством элементов равным значению константы N_2;

который осуществляет вычисление суммы всех элементов динамического массива DA с количеством элементов равным значению константы K;

который осуществляет вычисление произведения всех элементов динамического массива REAL с количеством элементов 20;

который осуществляет вычисление суммы каждого второго элемента динамического массива E с количеством элементов равным значению константы rows.

Запишите оператор освобождения памяти динамического массива G.

Запишите оператор освобождения памяти динамического массива Darr.

Лабораторная работа №10. Функции

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


Задачи:

изучить понятие функции, способы объявления, определения и вызова;

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

изучить способ возврата значений из функций.


Порядок выполнения работы:

изучить принципы работы с функциями в языке Си (глава );

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

разработать блок-схемы алгоритмов для основной программы и подпрограммы;

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

проверить правильность выполнения разработанной программы;

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

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

Пример

Вычислить µ §, µ §, µ §,



где

µ §
Запишем общую формулу для вычисления этих выражений:

µ §,

где f ЎЄ функция, arr ЎЄ массив, size ЎЄ размер массива, power ЎЄ степень для возведения элементов массива.



Используем эти обозначения в качестве формальных параметров для нашей функции. В качестве же фактических параметров будут выступать: µ §, µ §, µ §. Первый параметр ЎЄ это массив вещественных чисел, но так как количество элементов в массивах отличается, то при описании этого параметра в функции размер указываться не будет: float arr[], а будет передаваться в качестве второго параметра целочисленного типа: int size. Значение третьего параметра для заданных выражений принимает целочисленные значения, поэтому для параметра power можно использовать тип int: int power.

Обратите внимание, что в задании изменение индекса i определено от 1 до N, как принято в математике. В языке Си нумерация элементов массива осуществляется с 0, поэтому в программе для вычисления суммы используется цикл for по i от 0 до sizeЁC1. Чтобы вычисленное значение суммы соответствовало заданию, необходимо согласовать индекс и при умножении к i добавлять 1:

s += (i+1) * ...Вычисленное в функции значение суммы s возвращается в качестве ее результата при помощи оператора return.

Листинг 0 ЎЄ Лабораторная работа №10

/* lab_func.c ЁC лабораторная работа №10. */
#include

#include

#include

#include


/* определение собственной функции */

float f(float arr[], int size, int power)

{

/* описание и инициализация локальных переменных */



int i; // для индекса массива

float s = 0.0; // для вычисления суммы


/* вывод значений параметров функции */

printf(“f(arr=[“);

for (i = 0; i < size; i++)

printf(“%6.2f”, arr[i]);

printf(“], size=%d, power=%d)\n”, size, power);
/* вычисление суммы */

for (i = 0; i < size; i++) {

s += (i+1) * pow(arr[i], power);

printf(“i=%d, s=%f\n”, i, s);

}
printf(“Возвращаемое значение: s=%f\n\n”, s);

return s; /* возврат значения функции */

}
int main()

{

/* описание и инициализация массивов и переменных */



float A[5] = {0.12, -0.8, 0.2, 0.38, 0.11};

float D[4] = {0.25, 0.21, 0.12, 0.39};

float E[3] = {2.2, 3.1, 1.8};

float X, Y, Z;


setlocale(LC_ALL, “”);
/* вызов функции с разными фактическими параметрами */

X = f(A, 5, 3);

Y = f(D, 4, 1);

Z = f(E, 3, -1);


/* вывод результатов */

printf(“Значение X = %f\n”, X);

printf(“Значение Y = %f\n”, Y);

printf(“Значение Z = %f\n”, Z);


getch();

return 0;

}На рисунке 0 ЎЄ Составление блок-схемы программы lab2.c приведено соответствие программы и блок-схемы.

Рисунок 0 ЎЄ Составление блок-схемы программы lab_func.c

Рисунок 0 ЎЄ Результат выполнения lab_func.c

Задание


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

µ §


Таблица 0 ЎЄ Варианты заданий к лабораторной работе №10

№ вар.Значение XЗначение YЗначение Z1µ §µ §µ §2µ §µ §µ §3µ §µ §µ §4µ §µ §µ §5µ §µ §µ §6µ §µ §µ §7µ §µ §µ §8µ §µ §µ §9µ §µ §µ §10µ §µ §µ §11µ §µ §µ §12µ §µ §µ §13µ §µ §µ §14µ §µ §µ §15µ §µ §µ §16µ §µ §µ §17µ §µ §µ §18µ §µ §µ §19µ §µ §µ §20µ §µ §µ §21µ §µ §µ §22µ §µ §µ §23µ §µ §µ §24µ §µ §µ §25µ §µ §µ §Вопросы для отчета

Выведите и запишите обобщенную функцию для вычисления значений X, Y, Z.

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

Обоснуйте типы данных параметров функции.

Какие дополнительные переменные понадобятся для реализации функции? Зачем? Какого типа?

Надо ли задавать переменным начальные значения? Какие?

Какой или какие циклы будут использоваться для выполнения задания? Обоснуйте условие выполнения цикла для циклов while или do while. Для циклов for обоснуйте начальное значение, верхнюю границу, шаг изменения.

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

Если необходимо, обоснуйте согласование индекса элемента массива с другими переменными.

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

Опишите какие данные будут выводиться на экран в процессе выполнения функции, опишите используемые спецификации вывода.

Какой оператор будет использоваться для возврата значения функции? Какое значение (переменную) он будет возвращать?

Упражнения

Запишите описание функции Func, принимающей два четырехбайтовых целочисленных параметра a1 и a2 и возвращающей вещественное значение одинарной точности.

Запишите описание функции print, принимающей два параметра: указатель на двухбайтовое целое ptr и беззнаковое четырехбайтовое целое n и не возвращающей значения.

Запишите описание функции calc, принимающей три вещественных параметра двойной точности f, s и t и возвращающей вещественное значение двойной точности.

Запишите описание функции Min, принимающей два двухбайтовых целочисленных параметра a и b и возвращающей двухбайтовой целочисленное значение.

Запишите описание функции getF без параметров, возвращающей вещественное значение одинарной точности.

Запишите оператор вызова функции Out с передачей параметров: значение переменной temp, целого числа 5 и вещественного числа 3,25.

Запишите оператор присвоения переменной S результата вызова функции Summ с передачей параметров: значение переменной data и целого числа 8.

Запишите оператор присвоения переменной P результата вызова функции Prod с передачей параметров: значение переменной arr и вещественного числа 1,5.

Запишите оператор присвоения переменной max результата вызова функции getMax с передачей параметров: значений переменных m, n и целого числа 24.

Запишите оператор вызова функции table без параметров.

Запишите оператор возврата значения переменной s из функции.

Запишите оператор возврата целого числа -1 из функции.

Запишите оператор возврата вещественного числа 6,3 из функции.

Запишите оператор возврата значения выражения µ § из функции.

Запишите оператор возврата значения выражения µ § из функции.

Запишите оператор возврата значения выражения µ § из функции.

Запишите оператор возврата значения переменной min_idx из функции.

Запишите оператор возврата для функции, возвращающей тип void.

Список вопросов для подготовки к зачету/экзамену

Часть 1


Какие понятия являются основными понятиями программирования?

В чем особенность понятия переменной в программировании?

Как выполняется операция присваивания?

Что такое исходные данные?

В чем смысл этапа алгоритмизации?

Что такое алгоритм? Каковы основные свойства алгоритма?

Какие существуют способы представления алгоритма?

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

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

Что такое транслятор?

Каковы основные структуры алгоритмов?

Как изображаются структуры циклов «До» и «Пока» с использованием блок-схемы и на естественном языке?

Как изображаются структуры «Разветвление» и «Обход» с использованием блок-схемы и на естественном языке?

Зачем применять хорошее форматирование при оформлении исходных текстов программ?

Через какие этапы проходит исходный текст программы на Си для перевода в машинный код?

Что входит в задачи препроцессора?

Как работает компилятор языка Си? Что получается в результате его работы?

Что делает компоновщик и что получается в результате его работы?

Зачем нужны комментарии? Как оформляются комментарии на языке Си?

Зачем нужна директива include? Как производится поиск файлов?

Что такое макросы? Как они обрабатываются препроцессором?

Почему после директив не ставится точка с запятой?

Что делает функция printf? В какую библиотеку она входит?

Что можно выводить при помощи функции printf?

Что такое спецификация? Зачем она нужна?

Как определена полная спецификация вывода?

Какие могут быть значения флагов в спецификации?

Что задает поле «точность» для различных типов данных в спецификации?

Какие символы формата используются в спецификации для различных типов данных?

Какие ошибки часто происходят при указании спецификаций?

Для чего используется функция scanf? Какой знак необходимо ставить перед именами переменных в операторе scanf?

Какая спецификация ввода использутся для типа double в функции scanf?

Откуда начинается выполнение программы на языке Си?

Какие символы используются для определения начала и конца тела функции?

Где должны быть описаны переменные в программе на Си?

Как производиться описание переменных? Как можно проинициализировать значение переменной при описании?

Какие скалярные типы данных предопределены в Си?

Что такое оператор? На какие классы принято группировать операторы?

Что такое составной оператор?

Какие группы операций различают в Си?

Перечислите арифметические операции. Для каких типов данных они определены?

К чему приводит не учет переполнения при сложении и вычитании целых чисел?

Как осуществляется сложение и вычитание чисел с плавающей точкой?

Какие существуют операции отношения?

Какой тип вырабатывается в результате операций отношения? Какое значение соответствует истинному, а какое ложному отношению?

Какие логические операции существуют в Си? Как производится вычисление выражений, содержащих логические операции?

Перечислите операции присваивания. Как осуществляется приведение типов при присваивании?

Как выполняются присваивания, записанные в укороченной форме?

Как выполняются префиксные и постфиксные операции инкремента и декремента?

Перечислите основные математические функции из заголовочного файла math.h.

Зачем нужны операторы управления?

Какие операторы ветвления существуют в Си?

Обязательна ли ветка default в операторе switch, в каком случае она выполняется?

Как работает тренарный оператор ?:?

Какие операторы циклов существуют в Си?

Чем отличаются операторы while и do while?

Часть 2

Перечислите битовые операции?

Какая битовая операция используется для установки разрядов в «1»?

Какая битовая операция используется для сброса разрядов в «0»?

Какая битовая операция используется для инверсии всех разрядов числа?

Какая битовая операция используется для инверсии только заданных разрядов числа?

Какие спецификации используются для вывода чисел в восьмеричной и шестнадцатеричной системах счисления?

Какая спецификация используется для ввода-вывода беззнаковых целых чисел?

Какие спецификации используются для ввода-вывода длинных целых (типы long и unsigned long)?

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

Какая спецификация используется для вывода строк?

Что такое массив?

Как осуществляется объявление массива?

Как обращаться к элементам массива?

В каком диапазоне должны лежать значения индексов массива?

Какой оператор цикла удобно использовать для последовательного обращения ко всем элементам массива?

Что такое указатель?

Как осуществляется объявление указателя?

Перечислите основные операции, используемые с указателями?

Какие функции используются для динамического выделения и освобождения памяти?

Для чего может использовать операция sizeof?

Какие операции используются для перемещения указателя к следующему/предыдущему элементу массива?

Зачем нужны функции?

Какое количество параметров может иметь функция?

Значения каких типов может возвращать функция?

Какой оператор определяет возвращаемое функцией значение?

Что такое формальные и фактические параметры?

Зачем нужны ссылки вперед на реализацию функций (описание функции)?

Как выглядит типичная организация программы на языке Си?

Чем отличаются глобальные и локальные переменные?

Литература

Электронные вычислительные машины: В 8-ми кн.: Учеб. пособие для вузов / Под ред. А. Я. Савельева. Кн. 3. Алгоритмизация и основы программирования / Г. И. Светозарова. ЎЄ М.: Высш. Шк., 1987.

Болски М. И. Язык программирования Си. Справочник: Пер. с англ. ЎЄ М.: Радио и связь, 1998 г.

Викиверситет [Электронный ресурс] : Программирование на языке Си. ЎЄ Режим доступа: https://ru.wikiversity.org/wiki/Программирование_на_языке_Си. ЎЄ Загл. с экрана.

Громов Ю. Ю., Татаренко С. И. Программирование на языке СИ: Учебное пособие. ЁC Тамбов,1995. ЁC 169 с.
ПРИЛОЖЕНИЕ. Пример оформления отчета по лабораторной работе
Министерство образования и науки Российской Федерации

ПСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Кафедра электропривода и систем автоматизации

Лабораторная работа №2

по курсу «Теория и технология программирования»
Разработка простейшей программы на языке Си
Выполнил

студент 2-го курса

гр. 0022-02

Васильев П. А.


Принял

ст. преподаватель

Ильин А. В.
ПСКОВ 2016

Задание


Разработать на языке Си программу для определения площади поверхности и объема параллелепипеда высотой 4,5 см, шириной a см и длиной b см.
Решение

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

µ §,

где µ § ЁC ширина в см, µ § ЁC длина в см, µ § ЁC высота параллелепипеда.



Объем параллелепипеда вычисляется по формуле:

µ §.


Константа µ § задается при помощи директивы #define:

#define h 4.5Для решения задачи необходимы переменные:

исходные данные: a ЁC ширина, b ЁC длина параллелепипеда;

результат: S ЁC площадь, V ЁC объем параллелепипеда.

Все переменные вещественного типа float.

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

S = 2*a*b + 2*a*h + 2*b*h;

V = a*b*h;и так далее для всех вопросов решенияЎK

Блок-схема алгоритма

Текст программы

/* lab2.c - лабораторная работа №2. */
#include

#include

#include
#define h 4.5 /* высота параллелепипеда - константа */
int main()

{

/* объявление необходимых переменных */



float a, b, S, V;
setlocale(LC_ALL, "");

printf("Лабораторная работа №2\n");

printf("Группа 0022-02. Васильев П. А.\n");

printf("Вариант 13.\n\n");


/* ввод исходных данных */

printf("Введите ширину параллелепипеда: ");

scanf("%f", &a); /* ввод вещественного числа в переменную a */

printf("Введите длину параллелепипеда: ");

scanf("%f", &b); /* ввод вещественного числа в переменную b */
/* вычисление площади и объема */

S = 2 * a * b + 2 * a * h + 2 * b * h;

V = a * b * h;
/* вывод результатов */

printf("\nПлощадь параллелепипеда равна %.3f кв. см\n", S);

printf("Объем параллелепипеда равен %.3f куб. см\n", V);
getch();

return 0;

}

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


Проверка результатов

Выводы

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



константы (директива #define),

и т.д.


Ильин Александр Викторович
ТЕОРИЯ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ

Методические указания


Для подготовки бакалавров направления 140400 «Электроэнергетика и электро-техника» (профиль 10 «Электропривод и автоматика», профиль 16 «Электрообо-рудование и электрохозяйство предпри-ятий, учреждений и организаций»).

Технический редактор: Ильин А. В.

Компьютерная верстка: Ильин А. В.

Напечатано с готового оригинал-макета,
предоставленного автором

__________________________________________________________________

Подписано в печать __.__.____. Формат 60„e90/16.
Гарнитура Times New Roman. Усл. печ. л. ___.

Тираж ___ экз. Заказ № ____


Адрес издательства:

Россия, 180000, Псков, ул. Л. Толстого 4.



Издательство ПсковГУ

Каталог: download.php -> pskgu -> files -> PAGES -> FILE
download.php -> Рабочая программа по русскому языку представляет собой целостный документ, включающий пять разделов: пояснительную записку; учебно-тематический план; содержание тем учебного курса; перечень учебно-методического обеспечения
download.php -> Посредством цены, как существенного канала маркетинговых коммуникаций потребители оценивают качество образования в вузе, репутацию его торговой марки (брэнда)
download.php -> Дизайнер legens
download.php -> О проекте технического регламента Таможенного союза «О безопасности алкогольной продукции»
download.php -> Особенности создания и продвижения бренда
download.php -> Информационная услуга
download.php -> 1. Цели и задачи дисциплины Целью учебной дисциплины «Корпоративные коммуникации»
download.php -> «Моя семья»


Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©rekref.ru 2017
обратиться к администрации

    Главная страница