Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_4.doc
Скачиваний:
14
Добавлен:
05.06.2015
Размер:
124.93 Кб
Скачать

Статические переменные.

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

. . .

int g=10; // глобальная переменная

void plus1() // определение функции plus1()

{ static int k=0; // статическая переменная (сохраняется)

int p=10; // локальная переменная (уничтожается)

g=g+1;

p=p+1;

printf("Плюс %d: g=%d\tp=%d\n",k,g,p);

}

int _tmain(int argc, _TCHAR* argv[])

{ setlocale(0,"Russian");

printf("начало: g=%d\n",g);

plus1();

plus1();

plus1();

. . .

}

В результате работы программы, на экране будет напечатано :

Начало : g=10

Плюс 1: g=11p=11

Плюс 2:g=12p=11

Плюс 3: g=13p=11

. . .

Передача параметров в функцию

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

  • для каждого формального параметра создаётся локальная переменная;

  • начальными значениями созданных переменных являются фактические параметры, определяемые при вызове функции.

Пример 5:

int sum(int a, int b)

{ return a+b;

}

void main()

{ int x =5,y=10,z;

z = sum(x,y);

}

При вызове функции создаются две локальные a bпеременные, которые инициализируются фактическими параметрамиx y :

a=x

b=y

Передача параметров по значению

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

Пример 6:функцияpower() возводитbaseвn-ю степень.

#define dec 25

int power (int base, int n)

{ int p;

for (p = 1; n > 0; --n)

p = p * base;

return p;

}

void main()

{ i,p=0;

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

p=p+power(dec , i);

….

}

При вызове функции : base=dec, n=i

Обратите внимание, что бы мы ни делали с nвнутри функцииpower(), это не окажет никакого влияния на переменнуюiв вызывающей программе.

Передача массива в функцию

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

  • Передать массив определенного размера, определение функции:

intfunc(chars[100])

{ . . . }

Такое определение функции ограничивает её применение, обрабатываться будут только массивы размером 100.

Вызов функции :

int A[100];

func (A)

  • Передать массив неопределенного размера, определение функции:

int func (char s[], int n)

{ . . . }

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

Вызов функции :

// Пример обработки массива в 100 элементов.

intA[100];

func(A, 100)

Примеры программирования.

Пример 7:Вычисление суммы массива.

В примере первый параметр определяет сам массив, а второй – его размер.

int summa (int array[ ], int n)

{ int res=0;

for (int i = 0; i < n; i++)

res+= array[i];

return res;

}

void main()

{// определение массива в 30 элементов

int mas[30];

// инициализация массива

for (int i = 0; i < 30; i++)

mas[i] = 2*i+ 1;

// создание переменной sи вычисление суммы

int s = summa (mas, 30);

}

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

#include <stdio.h>

#include <time.h>

#include <windows.h>

#define raw 5 // количество строк

#definecol5 // количество столбцов

// ______область определения функций________________________

//функция для инициализации матрицы;

voidinitmatr(doubleM[raw][col])

{int i,j;

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

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

M[i][j]=rand()%100/3.;

}

//функция для печати матрицы

void printmatr(double M[raw][col])

{int i,j;

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

{for (j=0;j<col; j++)

printf("%7.3f\t",M[i][j]);

printf("\n");

}

}

// поиск минимального элемента в строке.

double rawmin (double M[raw][col], int traw)

{ double min;

int i;

for (i=0,min=M[traw][0];i<col; i++)

if (min > M[traw][i]) min=M[traw][i];

returnmin;

}

// поиск максимального элемента в столбце

double colmax (double M[raw][col], int tcol)

{ double max;

int i;

for (i=0,max=M[0][tcol];i<raw; i++)

if (max < M[i][tcol]) max=M[i][tcol];

returnmax;

}

//конец области определения функций____________________

int _tmain(int argc, _TCHAR* argv[])

{ setlocale(0,"Russian");

// область определения объектов (выделение памяти)

double MATR[raw][col],cmax;

int i;

srand (time(0));

initmatr(MATR);

printf("Исходная матрица:\n");

printmatr(MATR);

printf("Минимальные значения в строках:\n");

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

printf("%d строка - %7.3f\n",i+1,rawmin (MATR,i));

printf("Максимальные значения в столбцах:\n");

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

{cmax=colmax (MATR,i);

printf("%d столбец - %4.3f\n",i+1,cmax);

}

return 0;

}

Функцииinitmatr()иprintmatr()не возвращают значений и имеют по одному параметру, определяющему матрицу.

Функции rawmin()иcolmax()возвращают результат и имеют по два параметра, первый определяет матрицу, а второй обрабатываемую строку (столбец). Возвращаемое значение без запоминания выводится на экран, когда вызов функцийrawmin() является параметром в функцииprintf(). Результат, возвращаемый функциейcolmax() запоминается в переменной cmax, а затем выводится на экран.

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