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) вычисления площади треугольника по формуле:

{i} Ввести последовательность целых чисел, признак конца ввода — EOF. Найти и вывести длину максимальной подпоследовательности, состоящей из степеней пятерки. Распознавание, является ли число степенью пятерки, оформить в виде функции.

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

Д/З

TODO

Во всех задачах считать ввод корректным.

1. Ввести вещественные числа s, t. Рассчитать и вывести значение формулы g(1.2, s) + g(t, s) - g(2*s-1, s*t), где g(a,b)=(a2 + b2)/(a2 + 2*a*b + 3*b2 + 4). Вычисление g(a,b) оформить в виде функции.

3.0 4.0
0.324605

2. Ввести положительное целое n. Выяснить, имеются ли среди чисел n, n+1, ..., 2*n близнецы, т.е. простые числа, разность между которыми равна двум. Если близнецы есть, программа выводит "YES" и наименьшую пару близнецов (формат "YES %d %d"), иначе выводит "NO". Проверку простоты числа оформить в виде функции.

14
YES 17 19

3. Ввести вещественное eps. Рассчитать значение $$\pi$$ при помощи формулы суммы ряда Лейбница (см. ниже). Расчет прекратить, когда очередное слагаемое суммы ряда Лейбница попадает в eps-окрестность нуля; само это слагаемое в сумме учесть. Вывести рассчитанное значение с 16 знаками после запятой (формат "%.16f"). Расчет $$\pi$$ оформить в виде функции get_pi(double epsilon).

$$ \sum_{n=0}^{\infty} \frac{(-1)^n}{2 n+1}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-...=\frac{\pi}{4} $$

0.00005
3.1416926435905346

4. Ввести четное число n>2. Проверить для этого числа гипотезу Гольдбаха. Эта гипотеза заключается в том, что каждое четное n, большее двух, представляется в виде суммы двух простых чисел. Если такие два числа существуют, программа выводит "YES" и пару таких чисел (формат "YES %d %d"), иначе выводит "ACHTUNG! GOLDBACH CONJECTURE DISPROVED.". Если пар несколько, выводить ту, в которой разность между числами наибольшая. Проверку простоты числа оформить в виде функции.

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