Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Изучение Си после Паскаля.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.01 Mб
Скачать

Функции в языке си Локальные и глобальные переменные

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

Пример с глобальными переменными:

/*

Вычисление факториала числа N.

Все переменные глобальные.

ПРЕДУПРЕЖДЕНИЕ: не делайте так!

*/

// Определение константы N равной 5

#define N 5

// Глобальные переменные i и f

int i;

long f;

int main()

{

f = 1;

for (i = 1; i <= N; i++)

f *= i;

printf(“%ld”, f)

return 0;

}

Пример с локальными переменными:

/*

Вычисление факториала числа N.

Все переменные локальные.

*/

#define N 5

int main()

{

// Локальные переменные i и f

int i;

long f = 1;

for (i = 1; i <= N; i++)

f *= i;

printf(“%ld”, f)

return 0;

}

В этом примере внимания заслуживает определение константы:

#define N 5

Все инструкции, начинающиеся с символа #, являются директивами компилятору. В Турбо Паскале директивы компилятору записываются в комментариях особого типа (пример {$I-}). Директивы компилятору в Си называются директивами препроцессора.

В нашем случае используется директива #define, которая определяет подстановку. Действие ее состоит в том, что перед компиляцией программы все N в программе будут заменены на 5.

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

#define begin {

#define end }

то в Си-программе вместо символов { и } можно использовать begin и end.

Пример:

/*

Вычисление факториала числа N.

Вместо { и } используются begin и end.

ПРЕДУПРЕЖДЕНИЕ: не делайте так!

*/

#define N 5

#define begin {

#define end }

int main()

begin // перед компиляцией вместо begin будет подставлено {

// Локальные переменные i и f

int i;

long f = 1;

for (i = 1; i <= N; i++)

f *= i;

printf(“%ld”, f)

return 0;

end // перед компиляцией вместо end будет подставлено }

Функции без параметров в Си

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

Пример выполнения лабораторной работы по циклам, с использованием процедур без параметров:

/*

Задание: На экран нужно вывести набор символов:

A B C D E

B C D E F

C D E F G

D E F G H

E F G H I

*/

#include <stdio.h>

#include <conio.h>

// printLetters - процедура (функция без возвращаемого значения)

// Выводит на экран указанную в задании последовательность символов

void printLetters()

{

int i, j, c;

// Внешний цикл обеспечивает вывод 5 строк

// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’

for (i = ‘A’; i <= ‘E’; i++)

{

// Внутренний цикл обеспечивает вывод ровно 5 символов,

// начиная с символа i

for (c = i, j = 0; j < 5; c++, j++)

printf(“%c ”, c);

printf(“\n\n”);

}

}

int main()

{

clrscr(); // Вызов процедуры clrscr

printfLetters(); // Вызов процедуры printLetters

return 0;

}

Синтаксис определения процедуры (функции, не возвращающей значений) без параметров в Си:

void ИМЯ_ФУНКЦИИ()

{

ТЕЛО_ФУНКЦИИ

}

Синтаксис вызова процедуры без параметров в Си:

ИМЯ_ФУНКЦИИ();

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

ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ ИМЯ_ФУНКЦИИ()

{

ТЕЛО_ФУНКЦИИ

}

Внутри тела функции ОБЯЗАТЕЛЬНО должен быть предусмотрен возврат значения. Синтаксис выхода из функции с одновременным возвращением значения:

return ВОЗВРАЩАЕМОЕ_ЗНАЧЕНИЕ;

В Паскале аналогичные действия выполняются за 2 шага:

  1. Присвоение имени функции возвращаемого значения.

  2. Exit.

Пример функции без параметров:

int main()

{

int i, j, c;

clrscr();

printfLetters();

return 0; // выход из функции с возвращением значения 0

}