Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Возвращающие




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

х = power(у);

if (max (х, у) > 100) printf ("greater");

for (ch=getchar(); isdigit(ch);)...;

Тем не менее функция не может стоять с левой стороны оператора присваивания. Оператор типа

swap (х, у) = 100; /* некорректный оператор */

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

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

int t;
t = f(); /* нет значения для присваивания t */
f() + f(); /* нет значений для сложения */

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

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

Последний тип функций не имеет определенного возвращаемого значения. Функция является обычной процедурой и не выдает значения. Примером служит srand(), используемая для инициализации генератора случайных чисел функции rand(). Иногда функции, не выдающие осмысленного результата, что-то все-таки выдают. Например, printf() возвращает число напечатанных символов. Очень трудно найти программу, которая проверяет это. Следовательно, хотя все функции, кроме функций, объявленных как void, возвращают значения, нет необходимости использовать все эти значения. Типичным вопросом по возвращаемым функциями значениям является: «Не должен ли я присвоить данное значение некоторой переменной, поскольку значение возвращается?» Ответ: «Нет». Если не указано, чему присваивается возвращаемое значение, то оно просто отбрасывается. Рассмотрим следующую программу, использующую mul():

#include <stdio.h>

int mul(int a, int b);

int main(void)
{
int x, y, z;
x = 10; у = 20;
z = mul(x, у); /* 1 */
printf ("%d", mul(x, y)); /* 2 */
mul (x, y); /* 3 */
return 0;
}

int mul (int a, int b)
{
return a*b;
}

Строка 1 присваивает возвращаемое функцией mul() значение переменной z. В строке 2 возвращаемое значение напрямую не используется, но оно используется косвенно функцией printf(). Наконец, в строке 3 возвращаемое значение теряется, поскольку не происходит присваивание значения какой-либо переменной и также оно не используется ни в каком из выражений.

12. Структурный тип.

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

• название товара (char *);

• оптовая (закупочная) цена (long);

• торговая наценка в процентах (float);

• объем партии товара (int);

• дата поступления партии товара (char [9]).

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

Здесь struct - спецификатор структурного типа (служебное слово); goods - предложенное программистом название (имя) структурного типа. (Используя транслитерацию английского термина "tag", название структурного типа в русскоязычной литературе по языку Си довольно часто называют тегом.) В фигурных скобках размещаются описания элементов, которые будут входить в каждый объект типа goods. Итак, формат определения структурного типа таков:

struct имя_структурного_типа

{ определения_элементов };

где struct - спецификатор структурного типа; имя_структурного_типа - идентификатор, произвольно выбираемый программистом;

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

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

Конструкция struct имя_структурного_типа играет ту же роль, что и спецификаторы типов, например, double или int. С помощью struct goods можно либо определить конкретную структуру (как, например, объект структурного типа struct goods), либо указатель на структуры такого типа. Пример:

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

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

typedef struct {определения_элементов}

обозначение_структурного_типа

Приведенное определение вводит структурный тип struct { double real; double imag;} и присваивает ему обозначение (название, имя) complex. С помощью этого обозначения можно вводить структуры (объекты) так же, как с обычным именем структурного типа (например, struct goods в предыдущем примере). Пример:

Структурный тип, которому программист назначает имя с помощью typedef, может в то же время иметь второе имя, вводимое стандартным образом после служебного слова struct. В качестве примера введем определение структурного типа "рациональная дробь". Будем считать, что рациональная дробь -это пара целых чисел (m;n), где число n отлично от нуля. Определение такой дроби:

Здесь fraction - обозначение структурного типа, вводимое с помощью typedef. Имя rational_fraction введено для того же структурного типа стандартным способом. После такого определения структуры типа "рациональная дробь" могут вводиться как с помощью названия fraction, так и с помощью обозначения того же типа struct rational_fraction.

С помощью директивы #define можно вводить имена типов подобно тому, как это делается с помощью typedef. Например, сведения о книге могут быть введены таким образом:

Здесь BOOK - препроцессорный идентификатор, вслед за которым в нескольких строках размещена "строка замещения". Обратите внимание на использование символа продолжения '\' для переноса строковой константы. Кроме того, отметим отсутствие точки с запятой после закрывающей скобки '}'. Далее в программе можно определять конкретные объекты-структуры или указатели с помощью имени BOOK, введенного на препроцессорном уровне:

После препроцессорных замен и исключения комментариев это предложение примет вид (с точностью до размещения по строкам):

(Сотрите ниже определение структур и определение указателей на структуры.)

13. Статические массивы в С(С++)

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



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



 

Таблица 5.1. Одномерный числовой массив

№ элемента массива                
Значение 13.65 -0.95 16.78 8.09 -11.76 9.07 5.13 -25.64


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



 

Таблица 5.2. Двумерный числовой массив

1.5 -0.9 1.8 7.09 -1.76
3.6 0.5 6.7 0.09 -1.33
13.65 0.95 16.78 8.09 -11.76
7.5 0.95 7.3 8.9 0.11


Если при описании массива определён его размер, то массив называют статическим. Рассмотрим работу с одномерными статическими массивами в языке С(С++). Двумерные массивы подробно описаны в следующей главе.






Поделиться с друзьями:


Дата добавления: 2015-06-25; Просмотров: 354; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.