Скачиваний:
71
Добавлен:
04.05.2017
Размер:
1.87 Mб
Скачать
              1. ЛАБОРАТОРНАЯ РАБОТА №2

  1. Типы данных. Арифметические и логические операции в языке Си. Разветвляющиеся программы

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

Программа работы:

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

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

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

  4. Разработать алгоритмы, написать на языке Си две программы в соответствии с заданием, выданным преподавателем.

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

К п.1. Арифметические операции.

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

В Си определены арифметическихопераций:

  • сложение (знак операции "+"),

  • вычитание ("-"),

  • умножение ("*"),

  • деление ("/"),

  • получение остатка от деления ("%").

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

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

Присваивание.

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

При выполнении этих операций сначала переменной «d» будет присвоено значение «100». Затем результат операции присваивания (число «100») будет присвоен переменной «c». Результат этой операции (всё то же число «100») будет присвоен переменной «b» и так далее. В итоге всем переменным в цепочке будет присвоено значение «100».

Более того: знак «присвоить» может использоваться даже внутри математического выражения:

Присваивание имеет более низкий приоритет, чем сложение и вычитание. Поэтому сначала переменной d будет присвоено значение 109-с. А затем переменная value получит значение 5+d.

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

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

Операция

Пример

Эквивалент

+=

b+=500;

b=b+500;

–=

С–=50;

C=C–50;

*=

d*=1.2;

d=d*1.2;

/=

F/=50;

F=F/50;

%=

M%=7;

M=M%7;

Типы данных.

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

  1. Если операция выполняется над данными двух различных типов, обе величины приводятся к "высшему" из двух типов. Этот процесс называется "повышением" типа.

  2. Последовательность имен типов, упорядоченных от "высшего" к "низшему", выглядит так: double,float,long,int,shortиchar. Применение ключевого словаunsignedповышает ранг соответствующего типа данных со знаком.

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

Следует помнить, что «понижение» типа может привести к потере данных. Например, в результате операции «intK=1.2;» дробная часть вещественной константы «1.2» будет отброшена, а переменная «К» получит целочисленное значение «1».

Пример, приведенный ниже, иллюстрирует применение правил преобразования типов:

Выполнив программу "преобразования", получим следующие результаты:

Рисунок 5. Результаты выполнения программы «преобразования»

Поясним некоторые строки программного кода:

Строка 7: Величина 'A' присваивается символьной переменной ch. Переменная i получает целое значение, являющееся кодом символа 'A': целое число '65'. Переменная fl получает значение 65.00, являющееся преобразованием числа 65 в число с плавающей точкой.

Строка 9: Значение символьной переменной 'А' преобразуется в целое число 65, к которому затем добавляется 1. После этого получившееся в результате число 66 преобразуется в символ с соответствующим кодом ('B') и помещается в переменную ch.

Строка 10: При умножении на 2 значение переменной ch преобразуется в целое число (66). При сложении с величиной переменной fl получившееся в результате число (132) преобразуется в число с плавающей точкой. Результат (197.00) преобразуется в число целого типа и присваивается переменной i.

Строка 11. Перед умножением на 2.0 значение переменной ch («В») преобразуется в число с плавающей точкой. Перед выполнением сложения величина переменной i (197) преобразуется в число с плавающей точкой, а результат операции (329.00) присваивается переменной fl.

Следует отметить, что в С, в отличие от Паскаля и некоторых других языков, не делается чётких различий между символьными и целочисленными переменными. В связи с этим в большинстве случаев тип «char» удобно воспринимать как целочисленный размером 1 байт.

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

Задание:Продолжите программу, выполнив ряд операций:

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

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

Среди логических операций следует выделить операции «и» («and»), «или» («or»), отрицание «не» («not») и сложение по модулю 2 («xor»). В языке Си логические операции обозначаются следующим образом:

В Си логический тип переменных отсутствует, поэтому в качестве операндов логических операций (x, y) выступают целочисленные (int) величины. При этом их нулевое значение соответствует понятию «ЛОЖЬ», а ненулевое – «ИСТИНА». Результат логических операций также имеет тип «int» и равен «0» («ЛОЖЬ») или «1» («ИСТИНА»).

Таблицы истинности логических операций приведены в следующих таблицах:

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

== равно

< меньше

<= меньше или равно

!= не равно

> больше

>= больше или равно

Стоит отметить, что сравнивать можно операнды любого типа, но либо они должны быть оба одного и того же встроенного типа (сравнение на равенство и неравенство работает для двух величин любого типа), либо между ними должна быть определена соответствующая операция сравнения. Результат – «0» («ЛОЖЬ») или «1» («ИСТИНА»)..

Операции инкремента (++) и декремента (-).

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

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

Операция "запятая".

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

Пример

Результат выполнения 2-го примера: r=20. Сначала q получает значение 10, затем использование операции "запятая" приведет к тому, что q получит значение 12, а затем значение q+8, т.е. 12+8=20. Результат операции «запятая» (20) будет присвоен переменной r.

Оператор «? :».

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

Вначале вычисляется выражение-условие. Если оно не равно нулю (истина), то вычисляется выражение1, иначе – выражение2. Полученное значение является результатом оператора «?».

Пример.

или

Если s>t, то переменная ans2 получается значение 10, иначе - значение 25

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

Возможны следующие варианты записи:

Вариант 1:

if (условие)

оператор 1

Если условие верно, то выполняется оператор 1

Вариант 2 :

if (условие)

оператор 1

else

оператор 2

Если условие верно, то выполняется оператор 1, а если не верно, то оператор 2.

При этом операторы 1 и 2 могут быть как простыми, так и составными (т.е. группой операторов, заключенной в фигурные скобки).

Пример 1.

Если x>y, то переменная res получается значение 10, иначе - значение 0.

Пример 2.

Если переменная u меньше 20 , то выполняется ее увеличение в 10 раз, после чего осуществится расчет значения v. Если же u больше или равно 10, то программа сразу переходит к расчету значения v.

К п.3. Стандартные математические функции.

Для вычисления математических выражений в языке Си имеется набор функций, которые хранятся в стандартной библиотеке и объявлены в заголовочном файле math.h.

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

Перечисленные функции принимают аргументы типа double. Возвращают так же число типаdouble. Тригонометрические функции работают с радианами.

Пример выполнения задания:

Пусть по нашему варианту требуется составить программу, вычисляющую значения функции:

Это выражение является слишком сложным, чтобы вычислять его через одно присваивание — можно наделать много ошибок, найти которых будет затруднительно. Поэтому выполним его декомпозицию, введя дополнительные переменные y1=ctg(2x/π), y2=ln(cos2x+π/2) иy3=ln(3-sin2x).

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

#include <stdio.h>

#include <math.h>

main(){

system("PAUSE");

return 0;

}

Формат "%3.4lf"соответствует выводу числа типаdouble,при котором под запись числа выделяется ровно 3 позиции (если это возможно), а после запятой пишется ровно четыре знака.

Важно: в функциях ввода/вывода printf/scanf используется формат lf, в котором первый символ — латинская эль, а вовсе не единица (от англ. long float). Не забывайте символ амперсанда & при вводе значения x (см. лаб1).

К п.4. Задание: напишите программу согласно выданному преподавателем варианту – в отчете представить результат ее выполнения и комментарии к каждой строке программного кода.