Условные операторы и циклы




В С++ есть традиционный набор выбирающих операторов и циклов. Нижеприводятся примеры операторов if, switch и while. В следующем примере показано преобразование дюйма в сантиметр иобратно. Предполагается, что во входном потоке значение в сантиметрахзавершается символом i, а значение в дюймах - символом c: #include <iostream.h> int main () { const float fac = 2.54; float x, in, cm; char ch = 0; cout << "enter length: "; cin >> x; // ввод числа с плавающей точкой cin >> ch // ввод завершающего символа if (ch == 'i') { // дюйм in = x; cm = x * fac; } else if (ch == 'c') { // сантиметры in = x / fac; cm = x; } else in = cm = 0; cout << in << " in = " << cm << " cm\n"; } Операция >> ("ввести из") используется как оператор ввода; cinявляется стандартным входным потоком. Тип операнда, расположенного справаот операции >>, определяет, какое значение вводится; оно записывается вэтот операнд. Оператор switch (переключатель) сравнивает значение с наборомконстант. Проверку в предыдущем примере можно записать так: switch (ch) { case 'i': in = x; cm = x * fac; break; case 'c': in = x / fac; cm = x; break; default: in = cm = 0; break; } Операторы break используются для выхода из переключателя. Всеконстанты вариантов должны быть различны. Если сравниваемое значение несовпадает ни с одной из них, выполняется оператор с меткой default.Вариант default может и отсутствовать. Приведем запись, задающую копирование 10 элементов одного массива вдругой: int v1 [ 10 ]; int v2 [ 10 ]; //... for (int i=0; i<10; i++) v1 [ i ] = v2 [ i ]; Словами это можно выразить так: "Начать с i равного нулю, и пока iменьше 10, копировать i-тый элемент и увеличивать i." Инкремент (++)переменной целого типа просто сводится к увеличению на 1.

Функции

Функция - это поименованная часть программы, которая может вызыватьсяиз других частей программы столько раз, сколько необходимо. Приведемпрограмму, выдающую степени числа два: extern float pow (float, int); // pow () определена в другом месте int main () { for (int i=0; i<10; i++) cout << pow (2, i) << '\n'; } Первая строка является описанием функции. Она задает pow как функцию спараметрами типа float и int, возвращающую значение типа float. Описаниефункции необходимо для ее вызова, ее определение находится в другом месте. При вызове функции тип каждого фактического параметра сверяется стипом, указанным в описании функции, точно так же, как если быинициализировалась переменная описанного типа. Это гарантирует надлежащуюпроверку и преобразования типов. Например, вызов функции pow(12.3,"abcd")транслятор сочтет ошибочным, поскольку "abcd" является строкой, а непараметром типа int. В вызове pow(2,i) транслятор преобразует целуюконстанту (целое 2) в число с плавающей точкой (float), как того требуетфункция. Функция pow может быть определена следующим образом: float pow (float x, int n) { if (n < 0) error ("ошибка: для pow () задан отрицательный показатель"); switch (n) { case 0: return 1; case 1: return x; default: return x * pow (x, n-1); } } Первая часть определения функции задает ее имя, тип возвращаемогозначения (если оно есть), а также типы и имена формальных параметров (еслиони существуют). Значение возвращается из функции с помощью оператораreturn. Разные функции обычно имеют разные имена, но функциям, выполняющимсходные операции над объектами разных типов, лучше дать одно имя. Еслитипы параметров таких функций различны, то транслятор всегда можетразобраться, какую функцию нужно вызывать. Например, можно иметь двефункции возведения в степень: одну - для целых чисел, а другую - для чиселс плавающей точкой: int pow (int, int); double pow (double, double); //... x = pow (2,10); // вызов pow (int, int) y = pow (2.0, 10.0);// вызов pow (double, double) Такое многократное использование имени называется перегрузкой именифункции или просто перегрузкой; перегрузка рассматривается особо в главе7. Параметры функции могут передаваться либо "по значению", либо "поссылке". Рассмотрим определение функции, которая осуществляет взаимообмензначений двух целых переменных. Если используется стандартный способпередачи параметров по значению, то придется передавать указатели: void swap (int * p, int * q) { int t = * p; * p = * q; * q = t; } Унарная операция * называется косвенностью (или операциейразыменования), она выбирает значение объекта, на который настроенуказатель. Функцию можно вызывать следующим образом: void f (int i, int j) { swap (& i, & j); } Если использовать передачу параметра по ссылке, можно обойтись безявных операций с указателем: void swap (int & r1, int & r2) { int t = r1; r1 = r2; r2 = t; } void g (int i, int j) { swap (i, j); } Для любого типа T запись T& означает "ссылка на T". Ссылка служитсинонимом той переменной, которой она инициализировалась. Отметим, чтоперегрузка допускает сосуществование двух функций swap в одной программе.

Модули

Программа С++ почти всегда состоит из нескольких раздельнотранслируемых "модулей". Каждый "модуль" обычно называется исходнымфайлом, но иногда - единицей трансляции. Он состоит из последовательностиописаний типов, функций, переменных и констант. Описание extern позволяетиз одного исходного файла ссылаться на функцию или объект, определенные вдругом исходном файле. Например: extern "C" double sqrt (double); extern ostream cout; Самый распространенный способ обеспечить согласованность описанийвнешних во всех исходных файлах - поместить такие описания в специальныефайлы, называемые заголовочными. Заголовочные файлы можно включать во всеисходные файлы, в которых требуются описания внешних. Например, описаниефункции sqrt хранится в заголовочном файле стандартных математическихфункций с именем math.h, поэтому, если нужно извлечь квадратный корень из4, можно написать: #include <math.h> //... x = sqrt (4); Поскольку стандартные заголовочные файлы могут включаться во многиеисходные файлы, в них нет описаний, дублирование которых могло бы вызватьошибки. Так, тело функции присутствует в таких файлах, если только этофункция-подстановка, а инициализаторы указаны только для констант ($$4.3).Не считая таких случаев, заголовочный файл обычно служит хранилищем длятипов, он предоставляет интерфейс между раздельно транслируемыми частямипрограммы. В команде включения заключенное в угловые скобки имя файла (в нашемпримере - <math.h>) ссылается на файл, находящийся в стандартном каталогевключаемых файлов. Часто это - каталог /usr/include/CC. Файлы, находящиесяв других каталогах, обозначаются своими путевыми именами, взятыми вкавычки. Поэтому в следующих командах: #include "math1.h" #include "/usr/bs/math2.h" включаются файл math1.h из текущего каталога пользователя и файлmath2.h из каталога /usr/bs. Приведем небольшой законченный пример, в котором строка определяется водном файле, а печатается в другом. В файле header.h определяются нужныетипы: // header.h extern char * prog_name; extern void f (); Файл main.c является основной программой: // main.c #include "header.h" char * prog_name = "примитивный, но законченный пример"; int main () { f (); } а строка печатается функцией из файла f.c: // f.c #include <stream.h> #include "header.h" void f () { cout << prog_name << '\n'; } При запуске транслятора С++ и передаче ему необходимыхфайлов-параметров в различных реализациях могут использоваться разныерасширения имен для программ на С++. На машине автора трансляция и запускпрограммы выглядит так: $ CC main.c f.c -o silly $ silly примитивный, но законченный пример $ Кроме раздельной трансляции концепцию модульности в С++ поддерживаютклассы ($$5.4).


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: