Навигация по странице:
|
Программирование. Лекция 4. Функции. Массивы. Программирование. Лекция Массивы. Функции
Программирование. Лекция 4. Массивы. Функции
При использовании простых переменных каждой области памяти для хранения данных соответствует свое имя. Если с группой величин одинакового типа необходимо выполнять одинаковые действия, им дают одно имя, а различают по порядковому номеру. Это позволяет компактно записывать множество операций с помощью циклов.
Массив – это конечная именованная последовательность однотипных величин.
Размерность массива – количество его элементов.
Описание массива в программе отличается от описания простой переменной тем, что за именем переменной следуют квадратные скобки, в которых записывается размерность массива. Например:
int a[3]; // массив из 3 целых чисел
float b[5]; // массив из 5 действительных чисел
char c[15]; // массив из 15 символов
Каждый элемент массива имеет свой номер, который называется индексом элемента. Индексация (то есть нумерация) элементов в С++ начинается с нуля. Например, массив int a[3] будет содержать элементы a[0], a[1], a[2].
Начальные значения элементов массива можно задать с использованием фигурных скобок, например:
int a[3]={1,2,3}; // a[0]=1, a[1]=2, a[2]=3
Значения элементам присваиваются по порядку. Если размерность массива больше, чем число введенных элементов, остальные будут проинициализированы нулями:
float b[5] = {5.5, 1.2, 1.3}; // b[0]=5.5, b[1]=1.2, b[2]=1.3, b[3]=0, b[4]=0
Размещение элементов массива в памяти выполняется на этапе компиляции, поэтому размерность массива задается константой или константным выражением.
const int M = 5, N = 3;
int a[M*N]={};
Допустимо не задавать размерность массива, в этом случае память будет выделена по числу элементов в списке инициализации:
double d[] = {1.5,2.5,3.5};
Для доступа к элементам массива используются квадратные скобки:
// d[0]=1.5, d[1]=2.5, d[2]=0
double d[3]={1.5,2.5};
d[2]=3.5; // d[2]=3.5
double sum = 0; // переменная для хранения суммы
for (int i = 0; i < 3; i++) sum += d[i];
cout << "Сумма:" << sum << endl;
// Сумма: 7,5
Многомерные массивы.
В соответствии с синтаксисом языка Си в языке существуют только одномерные массивы, но элементами одномерного массива, в свою очередь, могут быть тоже массивы. Так, двумерный массив представляет собой массив массивов.
Многомерные массивы задаются указанием каждого измерения в квадратных скобках. Синтаксис объявления N-мерного массива:
тип имя[размерность1][размерность2]…[размерностьN];
Пример объявления двумерного массива (индексация его элементов показана на рис. 1):
int a[4][5]; // массив из 4 элементов, каждый из кот. является массивом из 5 эл-в
Рисунок . Индексация двумерного массива
Двумерный массив располагается в памяти последовательно по строкам (в порядке наиболее быстрого изменения последнего индекса).
При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае левую размерность при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти:
int mass2 [][2] = { {1, 1}, {0, 2}, {1, 0} };
int mass2 [3][2] = {1, 1, 0, 2, 1, 0};
Пример работы с двумерным массивом (программа ищет номер строки двумерного массива, в которой больше всего нулей):
const int M = 4, N = 5; // размерности массива
int b[M][N]; // описание массива
int i, j; // счетчики циклов
for (i = 0; i
for (j = 0; j
int istr = -1, max_count = 0; // номер искомой строки, максимальное количество
for (i = 0; i
{ // просмотр массива по строкам
int count = 0;
for (j = 0; j
if ( count > max_count)
{
istr = i ; max_count = count;
}
}
printf("Исходный массив:\n");
for (i = 0; i
for (j = 0; j
printf ("\n" ) ;}
if (istr == -1) printf("Нулевых элементов нет");
else printf("Hoмep строки: %d", istr + 1 );
Вложенные циклы.
В теле цикла допустимы любые вложенные операторы, в том числе и циклы. Таким образом, можно конструировать вложенные циклы. Пример (подсчет суммы элементов массива):
const int N = 2;
int a[][N]={1,2,3,4};
int sum[N]={};
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++) sum[i]+=a[i][j];
cout << "Сумма элементов " << i+1 << "-й строки равна " << sum[i] << endl;
}
При работе с вложенными циклами следует обращать внимание на правила использования операторов break и continue. Оператор break прекращает выполнение ближайшего внешнего для него оператора цикла. Оператор continue передает управление на ближайшую внешнюю проверку условия продолжения цикла.
Пример (вычисление суммы произведений элементов строк матрицы):
const int M=3, N=2;
int a[M][N] = {{1,2}, {3,4}, {5,6}};
int sum = 0;
for (int i = 0; i < M; i++)
{
// переменная для произведения
int p = 1, j;
for (j = 0; j < N; j++)
{
// если эл-т равен нулю, произведение эл-в всей строки равно нулю
if (a[i][j]==0) break;
p *= a[i][j];
}
// если выполнялся break, нужно перейти к следующей строке
if (j < N-1) continue;
sum += p;
}
cout << sum << endl;
Функции.
С увеличением объема программы становится невозможным удерживать в памяти все детали. Естественным способом борьбы со сложностью любой задачи является ее разбиение на части. В C++ задача может быть разделена на более простые и обозримые с помощью функций. Использование функций является первым шагом к повышению степени абстракции программы и ведет к упрощению ее структуры.
Разделение программы на функции позволяет также избежать избыточности кода, поскольку функцию записывают один раз, а вызывать ее на выполнение можно многократно из разных точек программы. Процесс отладки программы, содержащей функции, можно лучше структурировать. Часто используемые функции можно помещать в библиотеки. Таким образом, создаются более простые в отладке и сопровождении программы.
Функция — это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.
Любая программа на C++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров. Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
тип имя ( [ список_параметров ])
{ тело функции }
Рассмотрим составные части определения.
Тип возвращаемого функцией значения может быть любым, кроме массива и функции. Если функция не должна возвращать значение, указывается тип void.
Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать. На имена параметров ограничений по соответствию не накладывается, поскольку функцию можно вызывать с различными аргументами, а в прототипах имена компилятором игнорируются (они служат только для улучшения читаемости программы).
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов. Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция. Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Пример функции, возвращающей сумму двух целых величин:
int sum(int a, int b); // объявление функции
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Russian");
int a = 2, b = 3, c, d;
c = sum(a, b); // вызов функции
cin >> d;
cout << sum(c, d); // вызов функции
_getch();
return 0;
}
// определение функции
int sum(int а, int b)
{
return (а + b);
}
Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными параметрами, или просто параметрами, а записанные в операторе вызова функции — фактическими параметрами, или аргументами.
Керниган Б., Ритчи Д. Язык программирования Си. – СПб.: «Невский диалект», 2001. – 352 с.: ил.
Павловская Т. А. C/C++. Программирование на языке высокого уровня. – СПб.: Питер, 2003. – 461 с.: ил.
Подбельский В. В., Фомин С. С. Программирование на языке Си: Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 2004. – 600 с.
|
|
|