10.08 Функции

Повторное использование:

Параметризация:

Возвращаемое значение:

Кстати, возвращаемое значение main() — зто код ошибки для операционной системы; при этом 0 — это «без ошибок»

Простейшая функция

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

{OK} Сложение двух чисел

{i} Написать функцию max3() от трёх целочисленных параметров, которая возвращает их максимум

:)) Кстати. ∃ ли в Си возможность выполнить некоторый код не в теле функции

Области видимости

Имена в Си (переменная или функция) становятся видимыми после их описания.

  1. Глобальные переменные — определяются вне функции («после include»)

  2. Статические переменные — определяются в теле функции, существуют постоянно

  3. Локальные переменные — определяются в теле функции, существуют только на период выполнения тела функции

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

:)) Классифицировать эти четыре вида как «временные/постоянные» и «видимые/невидимые из других функций»

{OK} Пример

   1 #include <stdio.h>
   2 
   3 int g;
   4 
   5 void fun(void) {
   6   static int s=0;
   7   int k=0;
   8   printf("%d %d %d\n", ++s, ++k, ++g);
   9 }
  10 
  11 int main(void) {
  12         g = 2;
  13         fun();
  14         g = 10;
  15         fun();
  16         fun();
  17         return 0;
  18 }

{i} Модифицировать функцию сложения так, чтобы можно было узнать, сколько раз её вызывали (с помощью глобальной переменной)

:)) Что выведет эта программа?

   1 #include <stdio.h>
   2 void fun(int b) {
   3         int a;
   4         b = 100500;
   5         a = 42;
   6 }
   7 
   8 int main(void) {
   9         int a = 1, b = 2;
  10         fun(a);
  11         printf("%d %d\n", a, b);
  12 }

Сигнатура

Если функция где-то есть, но к моменту её вызова не описана, необходимо задать её сигнатуру (тип параметров и возвращаемого значения):

Кстати, в include-никах хранятся как раз макросы и сигнатуры, а сами функции — в библиотеках.

{i} С помощью gcc -E найти сигнатуру putchar() (одна строка)

Стек вызовов (введение)

Функции могут вызывать друг друга, при этом изолированные локальные переменные заводятся в каждом вызове

{i} Написать функцию trisquare(x0, y0, x1, y1, x2, y2) вычисления площади треугольника по формуле:

TODO Здесь и далее переформулировать текст из narhoz-chita

{i} http://grep.cs.msu.ru/narhoz-chita.ru/zadachnik/Glava12/index12.htm#z440

{i} Написать функцию get_e(double epsilon) вычисления числа e с заданной точностью по формуле

Д/З

TODO

  1. {i} http://grep.cs.msu.ru/narhoz-chita.ru/zadachnik/Glava12/index12.htm#z425

  2. {i} http://grep.cs.msu.ru/narhoz-chita.ru/zadachnik/Glava12/index12.htm#z446

  3. {i} Более хитрый ряд (как минимум, с -1ⁿ в числителе, чтобы для сравнения с epsilon нужен был abs())

  4. {i} http://grep.cs.msu.ru/narhoz-chita.ru/zadachnik/Glava12/index12.htm#z445

LecturesCMC/AL/Prac/11_Functions (последним исправлял пользователь FrBrGeorge 2026-10-08 02:10:07)