4377

Операции и выражения в программировании

Реферат

Информатика, кибернетика и программирование

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

Русский

2012-11-18

88.34 KB

9 чел.

Операции и выражения

Операторы

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

Как мы уже отмечали, программа состоит из команд, называемых по-другому инструкциями. Команды заставляют компьютер выполнить требуемое действие. Некоторые команды состоят из нескольких, скажем так, более мелких команд. Например, команда «Вывести на экран 10 чисел» состоит из десяти команд «Вывести одно число». Элементарными, самыми мелкими, командами являются операторы; именно они представляют собой кирпичики, образующие программу, подобно строительству дома. К настоящему моменту мы уже познакомились с одним оператором – оператором присваивания. В дальнейшем будут рассмотрены ряд других операторов: условные операторы, циклы и др.

Операции и выражения

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

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

Переменные и константы, над которыми производится операция, называются операндами. Операция, которая воздействует на два операнда, называется бинарной, а операция, воздействующая на один операнд – унарной. В математике также используется термин n-арная операция, если производится действие над n операндами.

Большинство операций являются бинарными: сложение, умножение, деление, различные варианты операций сравнения и т.д. Унарной операцией является «минут», например, -7.

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

  1.  7
  2.  a*b
  3.  15>10
  4.  -8
  5.  (x+4)*(y+8)

Первое выражение состоит из одного операнда; во втором выражении используется бинарная операция умножения, а в третьем – бинарная операция сравнения; в четвертом выражении используется унарная операция «минус»; в пятом выражении x+4 и y+8 являются подвыражениями.

Важным свойством выражений является то, что все они имеют значение или, если речь идет о числах, вычисляют определенное значение. Значение выражения, представляет собой результат выполнения входящих в него операций. Значение выражения определяется в момент исполнения программы и может отличаться от запуска к запуску. Например, выражения 1, 3 и 4 всегда имеют одни и те же значения, равные 7, «истина» и -8 соответственно. Остальные выражения зависят от значений, которые присвоены входящим в них переменным.

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

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

number = 10;

означает, что переменной с именем number присваивается значение 10.

Элемент слева от знака присваивания должен быть именем переменной, а значение справа – выражением. Причем, в этом выражении может присутствовать и переменная, которой присваивается значение. В частности, для увеличения переменной x на единицу можно воспользоваться следующей записью:

x=x+1;

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

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

 

Операция

Описание

Пример

+

Сложение

z = x+y

-

Вычитание

z = x-y

-

Изменение знака

z = -x

*

Умножение

z = x*y

/

Деление

z = x/y

%

Остаток от деления

z = x%y

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

Операции сравнения предназначены для определения отношения между двумя переменными или между переменной и константой. Например, a<b или a>10. Результатом операции сравнения является значение типа bool, т.е. true или false. Операции сравнения отвечают «Да» или «Нет» на вопрос «Связаны ли элементы указанным отношением?»

Опера-ция

Описание

Пример

<

Меньше

x<y

>

Больше

x>y

<=

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

x<=y

>=

Больше либо равно

x>=y

==

Равно

x==y

!=

Не равно

x!=y

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

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

Логические операции служат для соединения выражений, которые содержат операции сравнения.

 

Оператор

Описание

Пример

&&

Логическое «и»

10<x && x<20

||

Логическое «или»

X%3==0 || y%7==0

!

Логическое «не»

!(x==10)

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

x

y

x&&y

x||y

!x

false

false

false

false

true

false

true

false

true

true

true

false

false

true

false

true

true

true

true

false

Значения true и false являются своеобразными константами, созданными для того, чтобы программисту-человеку было проще с ним управляться, однако с точки зрения компьютера эти константы равны 1 и 0 соответственно.

К теме логических операций мы еще вернемся в теме «Условия», поскольку именно в условиях логические операции в полной мере раскрывают свой потенциал.

Приоритет операций

Рассмотрим следующий фрагмент кода:

result = 5*x*x – 2*y + 10/z;

В каком порядке будут выполняться присутствующие в этом фрагменте операции, есть запустить программу? Очевидно, что результат будет различным, если изменять порядок операций. Для примера положим, что x=2, y=3, а z=5. Если выполнить вначале все умножения и деление, а затем вычислить результаты сложения и вычитания, то переменная result будет равна 16. Однако, если вначале выполнить вычитание и сложение, то результат будет равен 0. Если поизменять порядок еще как-нибудь, что будут получаться новые результаты.

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

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

Приоритет арифметических операций определяется согласно следующей таблице:

Операция

Порядок вычислений

()

Слева направо

- (унарный)

Справа налево

*, /, %

Слева направо

+, - (бинарные)

Слева направо

Приоритет операций сравнения задается согласно следующей таблице:

Операция

Порядок вычислений

<, >, <=, >=

Слева направо

==, !=

Слева направо

Смешанные выражения и преобразование типов

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

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

//Цена составляет 12 рублей 50 копеек.

float price = 12.5;

//Куплено 3 булки хлеба

int quantity = 3;

//Стоимость покупки

float total = price*quantity;

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

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

Явное преобразование типов

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

Данная операция – операция явного преобразования типа – выглядит следующим образом:

(<тип>) <выражение>;

int x = (int) 13.67;

float y = 1/7;

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

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

float result=10/3;

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

float result= (float) 10/3;

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

float result= 10.0/3;

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

Сокращенная запись операций

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

 

Операция

Полная форма

Сокращенная форма

+

x = x+y

x += y

-

x = x-y

x -= y

*

x = x*y

x *= y

/

x = x/y

x /= y

%

x = x%y

x %= y

<<

x = x<<y

x <<= y

>>

x = x>>y

x >>= y

&

x = x&y

x &= y

|

x = x|y

x |= y

инкремент

x = x+1

x++ или ++x

декремент

x = x-1

x-- или --x

Директивы препроцессора #include и #define

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

Еще одна важная директива – это директива #define, предназначенная для создания макроподстановки, например, константы. Рассмотрим ее использования для вычисления длины окружности и площади круга:

#include <iostream>

using namespace std;

#define PI 3.14

int main() {

float r;

cout << "Введите радиус" << endl;

cin >> r;

float length = 2*PI*r;

float square = PI*r*r;

cout <<"Длина окружности = " <<length<<endl;

 cout<<"Площадь круга = " << square << endl;

return 0;

}

 

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

Функции и их аргументы

Мы уже рассмотрели несколько функций из библиотеки stdio.h. Рассмотрим теперь понятие функции более подробно. Итак, функция – это подпрограмма, другими словами, самостоятельная часть программы, предназначенная для выполнения каких-либо действий или вычислений. Функцию можно представлять себе как особую программу, которую можно вызвать из разрабатываемой программы. Эта «особая» программа уже написана создателем библиотеки, и мы ее можем вызвать, не разрабатывая самостоятельно.

Рассмотрим для примера функцию вычисления синуса sin() и воспользуемся ей, чтобы вычислить синус π/4 радиан.

float angle = 3.141592654/4;

cout << sin(angle) << endl;

Вызов функции состоит из нескольких частей:

  1. Название функции – sin;
  2. Круглые скобки – ():
  3. Аргумент angle.

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

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

Прелесть функции состоит в том, что одна и та же функция может использоваться с разными аргументами. Кроме того, название функции, как правило, говорит нам о том, что делает эта функция. Например, функция вычисления синуса называется не fgh, а именно sin.

Библиотека math.h

В процессе программирования может понадобиться вычисление математических функций, таких как синус, косинус, квадратный корень, логарифм. Без наличия специальных знаний реализовать их непросто, но этого делать не нужно, т.к. они реализованы в специальной библиотеке математических функций math.h. Перед вызовом этих функций нужно подключить эту библиотеку директивой #include:

#include <math.h>

Ниже приведены некоторые функции из этой библиотеки:

Прототип функции

Что возвращает

double acos(double x) 

Арккосинус: угол в радианах (от 0 до π), косинус которого равен x

double asin(double x)

Арксинус: угол в радианах (от –π/2 до π/2), синус которого равен x

double atan(double x)

Арктангенс: угол в радианах (от –π/2 до π/2), тангенс которого равен x

double cos(double x)

Косинус угла x (x задается в радианах)

double sin(double x)

Синус угла x (x задается в радианах)

double exp(double x)

Экспоненту ex, где e=2.17…

double log(double x)

Натуральный логарифм от x

double log10(double x)

Десятичный логарифм от x

double pow(double x, double y)

xy

double sqrt(double x)

Квадратный корень x

double floor(double x)

Наибольшее целое число, не превышающее x

double ceil(double x)

Наименьшее целое число, превышающее x

double fabs(double x)

Модуль числа x

int fmod(double x, double y)

Дробную часть от x/y

Прототип функции

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

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

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

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

Рассмотрим эти понятия на примере синуса. Прототип этой функции имеет вид

double sin(double x)

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

int angle = 10;

cout << sin((float) angle) << endl;

//или

cout << sin((double) angle) << endl;

это касается и других математических функций.

 

Константы и магические числа

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

Аналогично следует поступать и с распространенными константами, такими как число π, как это уже было сделано ранее.

Примеры решения задач

Задача 1. Написать программу, которая принимает с клавиатуры оценки выпускника по трем предметам ЕГЭ: математике, русскому языку и информатике, а затем выводит средний балл. Результат вывести с точностью 3 знака после запятой.

#include <iostream>

using namespace std;

#include <locale.h>

int main() {

setlocale(LC_ALL, "Russian");

int math, russian, inform;

cout << "Оценка по математике:" << endl;

 cin >> math;

 cout << "Оценка по русскому языку" << endl;

 cin >> russian;

 cout << "Оценка по информатике:" << endl;

 cin >> inform;

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

 float average = (float) (math+russian+inform)/3;

cout << "Средний балл равен " << average << endl;

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

 system("pause");

 return 0;

}

Задача 2. Написать программу, которая принимает длины катетов прямоугольного треугольника и вычисляет длину гипотенузы. Воспользоваться теоремой Пифагора.

#include <iostream>

using namespace std;

//Подключаем математическую библиотеку

#include <math.h>

#include <locale.h>

int main() {

setlocale(LC_ALL, "Russian");

float cat1, cat2;

cout << "Длина катета 1: ";

cin >> cat1;

 cout << "Длина катета 2: ";

 cin >> cat2;

//Вычисляем квадратный корень

 float hypot = sqrt(cat1*cat1 + cat2*cat2);

 cout << "Длина гипотенузы равна " << hypot<<endl;

 system("pause");

 return 0;

}

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

#include <iostream>

using namespace std;

#include <locale.h>

#include <math.h>

int main() {

setlocale(LC_ALL, "Russian");

float a, b, alpha;

cout << "Введите длину 1-ой стороны:" << endl;

cin>>a;

cout << "Введите длину 2-ой стороны:" << endl;

 cin>>b;

cout<<"Введите угол между ними в градусах"<<endl;

 cin>>alpha;

//Переводим градусы в радианы

 float alpha_radian = 3.14*alpha/180;

float square = a*b*sin(alpha_radian)/2;

cout << "Площадь равна " << square << endl;

return 0;

}

Задача 4. Напишите программу, которая принимает с клавиатуры число и вычисляет его логарифм по основанию 3.

#include <iostream>

using namespace std;

#include <locale.h>

#include <math.h>

int main() {

setlocale(LC_ALL, "Russian");

 float x;

cout << "Введите число: ";

cin >> x;

cout << "Логарифм по основанию 3 равен ";

cout << log(x)/log((float)3) << endl;

system("pause");

 return 0;

}

Задача 5. Вычислите площадь круга и длину окружности, задав радиус. Число π задайте в виде константы.

#include <iostream>

using namespace std;

const float pi=3.141592654;

//Либо так:

//#define PI pi=3.141592654

int main() {

float r;

cout << "Введите радиус" << endl;

cin >> r;

float length = 2*pi*r;

float square = pi*r*r;

cout <<"Длина окружности = " <<length<<endl;

 cout<<"Площадь круга = " << square << endl;

return 0;

}

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Что такое операции и операнды. Приведите примеры.
  2. Что такое унарные, бинарные и n-арные операции. Приведите примеры.
  3. Что такое выражение и подвыражение? Приведите примеры.
  4. Какие логические операции вам известны? Как они обозначаются в языке Си?
  5. Какие операции сравнения вам известны? Как они обозначаются в языке Си?
  6. Приведите таблицы истинности логических операций.
  7. Что такое смешанное выражение?
  8. Что такое явное и неявное преобразование типов?
  9. Что такое приоритет операций?
  10. Какие сокращенные записи операций вам известны?
  11. Что такое формальные и фактические аргументы функций? Что такое прототип функции?
  12. Перечислите некоторые из известных вам математических функций из библиотеки math.h.
  13. Объясните работу директивы препроцессора #define.
  14. Зачем нужна директива #include?
  15. Что такое магические числа? Что нужно сделать, чтобы избегать их в программе?


 

А также другие работы, которые могут Вас заинтересовать

17312. ЗАХИСТ GRID-ТЕХНОЛОГІЙ 134.5 KB
  Лекція 24. Захист Gridтехнологій Загальні положення Технологія Grid призначена для створення географічно розподіленої обчислювальної інфраструктури що об'єднує ресурси різних типів з колективним доступом до цих ресурсів в рамках віртуальних організацій що складаютьс...
17313. ЗАСОБИ БЕЗПЕКИ GRID - ТЕХНОЛОГІЙ 124 KB
  Лекція 24. Засоби безпеки Grid технологій Сучасний стан програмного забезпечення інфраструктури GRID На сьогодняшній день розроблено нове покоління програмного забезпечення GRID ГПЗ. Представниками цього покоління є дві основні розробки: Globus Alliance випустив версію 4.0 комп...
17314. Візуальне програмування – робота з БД Компонентне програмування – робота з об'єктами БД 881.96 KB
  Парадигми програмування Кредит 1 Лабораторна робота 2. Візуальне програмування – робота з БД Компонентне програмування – робота з обєктами БД. 2 год Практикум прикладного программирования на C в среде VS.NET 2008...
17315. Створення DLL-бібліотеки 63.99 KB
  Лабораторна робота 1. Створення DLLбібліотеки Мета роботи: 1. Створення DLLбібліотеки 2. Створення рішення з кількох проектів модулів 3. Створення DLLбібліотеки як окремого рішення. 4. Вивчення структури збірки метаданих збірки В платформі Microsoft .NET реалізовано ком...
17316. Візуальне програмування – робота з БД Компонентне програмування – робота з обєктами БД 215.38 KB
  Лабораторна робота 3. Візуальне програмування – робота з БД Компонентне програмування – робота з об'єктами БД. 2 год Мета роботи: Зв'язування даних з елементами управління ListBox і TextBox У палітрі компонентів Toolbox відкрийте вкладку Data і перетягніть на форму компонент...
17318. Візуальне програмування – робота з БД Компонентне програмування – робота з обєктами БД 67 KB
  Лабораторна робота 4. Візуальне програмування – робота з БД Компонентне програмування – робота з об'єктами БД. 2 год Мета роботи: Додавання оновлення і видалення даних Розмістіть на формі дві кнопки Button які налаштуйте відповідно до таблиці властивостей ...
17319. Компонентне програмування – робота з обєктами БД 1.17 MB
  Лабораторна робота 5 Компонентне програмування – робота з об'єктами БД. Мета роботи: 1. Розробка інформаційної моделі схеми бази даних 2. Відображення даних із зв'язаних таблиць 1. Розробка інформаційної моделі схеми бази даних Розробка діаграми дозволяє візуа...
17320. Робота з XML-документами 22.45 KB
  Парадигми програмування Кредит 2 Лабораторна робота 6. Робота з XMLдокументами Мета роботи: Створення і обробка XMLдокументів Завдання для самостійної роботи 1. Виконати приклади лекцій 910 і продемонструвати їхню роботу. 2. Створити проекти з аналогічною функц...