Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

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

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Лекция 7. Декларации и применение функций




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

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

Декларации функций и прототипы

Каждая функция имеет следующий вид:

тип имя (список аргументов)

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

{

описания и операторы

}

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

Пример

dummy () { }

В примере функция dummy () «пустая» - не делает ничего. Такие пустые функции иногда полезны как «хранители места» или «заглушки» в процессе создания программы.

 

Если тип функции в декларации не указан, то по умолчанию принимается тип int.

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

Любая программа есть просто множество определений отдельных функций. Связь между функциями выполняется с помощью аргументов и возвращаемых функциями значений; но она может идти и через внешние переменные. Во входном файле функции следуют в любом порядке и вся входная программа может быть разделена на множество файлов. Саму же функцию разделять на несколько файлов нельзя. Передача значения из вызванной функции в вызываюшую происходит с помощью оператора возврата. Следом за словом гetuгn размещается любое выражение:

гetuгn выражение;

Если необходимо, то вызвавшая функция может игнорировать возвращаемое значение. Более того, после оператора return можно вообще не ставить никакого выражения, в этом случае вызвавшей функции никакое значение не пере­дается. В этом случае, однако, для функции должен быть определен тип void. Управление возвращается в вызвавшую функцию и в случае выхода «по концу», т.е. если функция доходит до закрывающей правой скобки. Значение при этом не передается.

Пример

double аtof (char s[]) // перевод строки s в число двойной точности

{

double val, power;

int i, sign;

for (i = 0; s[i] == ’ ‘ || s[i] == '\n' || s[i] == '\t'; i++)

// пропуск пустых символов

sign = 1;

if(s [i] == '+' || s [i ] == '-') //знак

sign = (s[i++] == '+')? 1: -1;

for (val = 0; s[i] >= '0' && s[i] <= '9'; i++)

val = 10 * val + s[i]- '0';

i f (s [i] == '.')

i++;

for (power = 1; s[i] >= '0' && s[i] <= '9'; i++)

{

val = 10 * val + s[i] - '0';

power *= 10;

}

return(sign * va1 / power);

}

Вызывающая подпрограмма должна указать, что аtоf() возвращает тип double.

 

#define МAXLINE 100

main ()

{

double sum, atof();

char line [МAXLINE).;

sum = 0;

while (getline{line, МAXLINE) > 0)

printf("\t%.2f\n", sum += atof(line));

}

 

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

Если описания функций размещаются в другом файле или после main() в том же файле, то более правильно размещать спецификации функций в том же файле до main() в виде описаний прототипов или в h-файле прототипов, включая этот файл для совместной трансляции с помощью утверждения препроцессора #include.

Например для функции atof() спецификация прототипа будет выглядеть следующим образом:

double atof(char * str);

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






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных