Классы памяти и правила областей действия 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Классы памяти и правила областей действия



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

Глобальные переменные объявляются вне какой-либо функции и могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены и проинициализированы. Область действия глобальных переменных – от точки в файле, где она объявлена и до конца файла. Сами функции всегда глобальные.

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

В языке Си каждая переменная принадлежит к одному из четырех классов памяти – автоматическая или локальная (auto), внешняя или глобальная (extern), статическая (static), регистровая (register). Тип памяти указывается одним из приведенных ключевых слов, стоящим перед указанием типа переменной: register int a. Если класс памяти для переменной не указан, она относится к классу auto. Автоматические переменные по отношению к функциям являются внутренними, или локальными. Они начинают существовать при входе в функцию и уничтожаются при выходе из нее.

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

Значения регистровых переменных- помещаются во внутренние регистры процессора с целью их интенсивного использования, для регистровых переменных допустимы два типа: int, char.

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

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

Пример функции, в которой меняются местами значения аргументов x и y:

void swap(int *x, int*y) /* x и y – указатели */

{ int t;

t=*x; *x = *y; *y=t; /* здесь(*x) и (*y) – значения, на которые указывают указатели */

}

Фрагмент кода с обращением к данной функции:

#include <stdio.h>

main (void)

void swap(int*, int*); /* описание прототипа */

int a, b;

puts(“enter a,b->”); scanf(“%d%d”,&a,&b);

printf(“\n a=%d, b=%d\n”, a, b);

swap(&a, &b); /* обращение к функции */

printf(“\n a=%d, b=%d”, a, b);

}

При таком способе передачи в вызываемую функцию аргументов их первоначальные значения теперь будут изменены:

Когда функция вызывает себя, она называется рекурсивной. Пример рекурсивной функции – вычисление факториала числа n!=1*2*3*…*n:

int fac(int n)

{ int b;

if (n= =1) return 1;

b=fac(n-1)*n;

return n; }

 

 

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

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

Листинг 11. Ввести массив NxN целых чисел; и в функции посчитать сумму его положительных элементов через обращение к функции

/*_______________________________________*/

#include <stdio.h>

#include <conio.h>

void sum(int, int b[ ][50]); /* Описание прототипа функции */

void main(void)

{int a[50][50]; int i,j,N;

clrscr();

puts("\n Введите размер массива N (до 50)\n");

scanf(“%d”,&N);

printf("\n Введите данные \n");

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

for(j=0; j<N; j++)

{

printf("\n a[%d][%d]=", i+1, j+1);

scanf("%d", &a[i][j]);

}

sum(N,a); } /* Обращение к функции */

}

void sum(int n, int b[ ][50]) /* Описание функции sum */

{ int i,j,s;

puts("ФУНКЦИЯ ");

for (s=0,i=0; i<n; i++)

{

for (j=0;j<n;j++)

if (b[i][j]>0) s+=b[i][j];

printf("\a\n СУММА = %d, Press any key... ",s);

getch();

}

 

 

Задача5. Варианты

 

Значение аргумента x меняется от a до b с шагом h. Для каждого x найти значения функции Y(X), суммы S(x) (ее разложение в ряд c заданной точностью e=1.e-6) и вывести в виде таблицы. В основной программе организовать ввод исходных данных (a, b, h), обращение к функции, вывод результатов. Вычисления Y(x), S(x) реализовать в виде функций. Указание: a b .

 

5.1. ,

 

5.2. ,

 

5.3. ,

 

5.4. ,

 

5.5.

 

5.6. ,

 

5.7. ,

 

5.8. ,

 

5.9. ,

 

5.10. ,

5.11. ,

 

5.12. ,

 

5.13.Даны отрезки a,b,c,d. Для каждой тройки этих отрезков, из которых можно построить треугольник, вычислить площади треугольников по формуле , где (x,y,z – стороны).

5.14.Дано натуральное число N. Определить, если это возможно, пару натуральных чисел x, y, таких что .

 

5.15. Дано натуральное число N (N £ 99). Выяснить, верно ли, что N2 равно кубу суммы цифр числа N.

 

5.16. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (как, например, 153=13+53+33 ). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр

 

5.17. Дано натуральное число N. Удалить из записи числа N цифры 0 и 5, оставив прежним порядок остальных цифр (например, из числа 59015509 получить число 919).

 

5.18. Дана строка символов. Выделить в ней все цифры, записать в массив.

5.19. Дана строка символов. Выделить в ней все строчные буквы латинского алфавита, записать в массив.

5.20. Задана целочисленная матрица A(N,M). Определить номер столбца (столбцов), содержащего только положительные элементы. При отсутствии такого столбца вывести сообщение.



Поделиться:


Последнее изменение этой страницы: 2016-12-17; просмотров: 211; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.63.236 (0.011 с.)