Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВСЯ ТЕОРИЯ по Си.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
614.4 Кб
Скачать

Функции программиста

Функция – это поименованная группа инструкций, выполняющих определённую задачу. К функции можно обратиться по имени, передать ей значения и получить из неё результат. Функцию можно вызывать несколько раз, причём с разными фактическими параметрами.

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

Описание функции в общем виде

Тип Имя(тип1 параметр1,тип2 параметр2, … типК параметрК );

{ // здесь объявление локальных переменных функции

// здесь инструкции функции

return=Выражение; // здесь передача результата через возвращаемое значение

}

Пример описания функции без результата:

void printchar(char ch, int n);

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

{ for (int i=0; i<n; i++) // тело функции

printf(”%c”,ch);

printf(”\n”);

}

Пример описания функции с результатом:

int min(int a, int b);

// функция находит максимальное из двух целых значений

{if (a>b) return a; // тело функции

else return b; }

Вся информация, которая передаётся в функцию и обратно, должна отражаться в её заголовке. Это требование не синтаксиса, а хорошего стиля программирования.

В теле функции крайне нежелательно использовать глобальные переменные!

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

Пример передачи результатов по ссылке:

int (float a, float b, float c, float &x1, float &x2);

// функция вычисляет корни квадратного уравнения

// результат функции – количество корней

// вычисленные корни квадратного уравнения передаются по ссылке

{ float D; // D-локальная переменная

D=b*b-4*a*c;

if (D>0)

{return 2; // вычисляем два корня квадратного уравнения

x1=(-b+sqrt(D))/(2*a);

x2=(-b-sqrt(D))/(2*a);}

else

if (D==0)

{return 1; // вычисляем один корень квадратного уравнения

x1=(-b)/(2*a);

x2=x1; }

else return 0; } // иначе корней нет

Пример передачи результатов через указатели:

int (float a, float b, float c, float *x1, float *x2);

// функция вычисляет корни квадратного уравнения

// функция передаёт результат – количество корней

// вычисленные корни квадратного уравнения передаются через указатели

{ float D; //D-локальная переменная

D=b*b-4*a*c;

if (D>0)

{return 2; // вычисляем два корня квадратного уравнения

*x1=(-b+sqrt(D))/(2*a);

*x2=(-b-sqrt(D))/(2*a);}

else

if (D==0)

{return 1; // вычисляем один корень квадратного уравнения

*x1=(-b)/(2*a);

*x2=x1; }

else return 0; } // иначе корней нет

Модуль программиста (библиотека)

Наличие модулей в языке С/С++ позволяет программировать и отлаживать программу по частям, создавать библиотеки подпрограмм и данных.

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

Заголовочный файл с расширением .h или .hpp содержит интерфейс для некоторого набора функций, а исходный файл с расширением .c или .cpp – реализацию этих функций.

В заголовочном файле следует размещать:

  • Определение типов, задаваемых программистом, констант, шаблонов;

  • Объявления (прототипы) функций;

  • Определение внешних (глобальных) переменных с модификатором extern;

  • Пространства имён.

Пример описания заголовочных файлов и модулей программиста:

// файл Point.h //

# ifndef POINT_H

# define POINT_H

// объявление типов

Struct Point {

int x;

int y; }

// прототипы функций

void SetXY(Point &point, int x, int y);

int GetX(Point &point);

int GetY(Point &point);

# endif /*POINT_H*/

// файл Rect.h //

# ifndef RECT_H

# include <Point.h>

# define RECT_H

// объявление типов

Struct Rect {

Point LeftPoint;

Point RightPoint; }

// прототипы функций

void SetLR(Rect &rect, Point lp, Point rp);

int GetL(Rect &rect, Point &lp);

int GetR(Rect &rect, Point &rp);

# endif /*RECT_H*/

// файл Point.cpp //

# include <Point.h>

void SetXY(Point &point, int x, int y)

{ point.x=x;

point.y=y; }

int GetX(Point &point)

{ return point.x; }

int GetY(Point &point)

{ return point.y; }

// файл Rect.cpp //

# include <Point.h>

void SetLR(Rect &rect, Point lp, Point rp)

{ rect. LeftPoint=lp;

rect. RightPoint=rp; }

int GetL(Rect &rect, Point &lp)

{ lp= rect. LeftPoint }

int GetR(Rect &rect, Point &rp);

{ rp= rect. RightPoint }

// файл Main.cpp //

# include <stdio.h>

# include <Point.h>

# include <Rect.h>

void main()

{

Point pt1,pt2,lt,rt;

Rect rect1;

SetXY(pt1,2,5);

SetXY(pt2,10,14);

SetLR(rect1,pt1,pt2);

GetL(rect1,lt);

GetR(rect1,rt);

printf(”rect.lt.x=%i rect.lt.y=%i”, lt.x, lt.y);

printf(”rect.rt.x=%i rect.rt.y=%i”, rt.x, rt.y);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]