ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Понятие регулярного типа
Массивом называется именованная ограниченная упорядоченная совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Тип компонент может быть любым, принятым в языке СИ. Тип компонент называется базовым типом. Вся совокупность компонент определяется одним идентификатором, посредством которого к нему осуществляется обращение, указывается тип и количество элементов массива. Для обозначения отдельных компонент используется конструкция, называемая переменной с индексом или с индексами: A[5] S[k+1] B[3,5]. Пример описания массивов. float A[20],B[20]; int C[30]; В данном примере описаны одномерные массивы с именами A, B, C, причём массивы A и B имеют элементы типа float, порядковые индексы элементов изменяются от 0 до 19, а массив С – с элементами типа int, и индексами от 0 до 29. В квадратных скобках указывается количество элементов в массиве, нумерация которого всегда с 0 до N-1, где N – количество элементов массива. Математическим понятием, которое привело к появлению в языках программирования понятия "массив", являются матрица и ее частные случаи: вектор-столбец или вектор-строка. Элементы матриц в математике принято обозначать с использованием индексов. Существенно, что все элементы матриц либо вещественные, либо целые и т.п. Такая "однородность" элементов свойственна и массиву, определение которого описывает тип элементов, имя массива и его размерность, т.е. число индексов, необходимое для обозначения конкретного элемента. Кроме того, в определении указывается количество значений, принимаемых каждым индексом. Например, int a[10]; определяет массив из 10 элементов а[0], а[1],..., а[9]. float Z[13][6]; определяет двумерный массив, первый индекс которого принимает 13 значений от 0 до 12, второй индекс принимает 6 значений от 0 до 5. Таким образом, элементы двумерного массива Z можно перечислить так: Z[0][0], Z[0][l], Z[0][2],...,Z[12][4], Z[12][5] В соответствии с синтаксисом Си в языке существуют только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы. Поэтому двумерный массив определяется как массив массивов. Таким образом, в примере определен массив Z из 13 элементов-массивов, каждый из которых, в свою очередь, состоит из 6 элементов типа float. В качестве индекса может быть использовано выражение. В индексных типах, по одному для каждой размерности массива, указывается число элементов. Допустимыми индексными типами являются все порядковые типы. Ограничений на размерность массивов, т.е. на число индексов у его элементов, в языке Си теоретически нет. Стандарт языка Си требует, чтобы транслятор мог обрабатывать определения массивов с размерностью до 31. Однако чаще всего используются одномерные и двумерные массивы. Продемонстрируем на простых вычислительных задачах некоторые приемы работы с массивами. Пример: Вычисление среднего и дисперсии. Введя значение n из диапазона (0<n<=100) и значения n первых элементов массива х[0], х[1],...,х[n-1], вычислить среднее и оценку дисперсии значений введенных элементов массива. Задачу решает следующая программа:
/* Вычисление среднего и дисперсии */ #include <stdio.h> void main () { /*n - количество элементов */ int i,j,n; /*b-среднее,d-оценка дисперсии; */ float a,b,d,x[100],e; /*а,е-вспомогательные*/ while (1) { printf("\n Введите значение n="); scanf("%d", &n); if(n > 0 && n <= 100) break; printf("\n Ошибка! Необходимо 0<n<101 "); } /* Конец цикла ввода Значения n */ printf("\n Введите значения элементов: \n"); for(b=0.0,i=0; i<n; i++) { printf("x[%d] = ", i); scanf("%f", &x[i]); b+=x[i];/* Вычисление суммы элементов */ } b/=n;/* Вычисление среднего */ for(j=0,d=0.0; j<n; j++) { a=x[j]-b; d+=a*a; } /* Оценка дисперсии*/ d/=n; printf("\n Среднее =%f, дисперсия=%f",b,d); } В программе определен массив х со 100 элементами, хотя в каждом конкретном случае используются только первые n из них. Ввод значения n сопровождается проверкой допустимости вводимого значения. В качестве условия после while записано заведомо истинное выражение 1, поэтому выход из цикла (оператор break) возможен только при вводе правильного значения n, удовлетворяющего неравенству 0<n<101. Следующий цикл обеспечивает ввод n элементов массива и получение их суммы (b). Затем в цикле вычисляется сумма d квадратов отклонений элементов от среднего значения. Возможен следующий результат работы программы: Введите значение n=5 Введите значение элементов: х[0]=4 х[1]=5 х[2]=6 х[3]=7 х[4]=8 Среднее=6.000000, дисперсия=2.000000
Найти сумму Введем следующие обозначения: а - двумерный массив, содержащий значения элементов матрицы; р - произведение элементов строки матрицы; с - сумма их значений; s - искомая сумма (результат). Опустив определения переменных и операторы ввода-вывода, запишем текст на языке Си: double a[10][5]; for(s=0.0, j=0; j<10; j++) { for(p=1.0,c=0.0, i=0; i<5; i++) { p*=a[j][i]; c+=a[j][i]; } s+=c+p; При работе с вложенными циклами следует обратить внимание на правила выполнения операторов break и continue. Каждый из них действует только в том операторе, в теле которого он непосредственно использован. Оператор break прекращает выполнение ближайшего внешнего для него оператора цикла. Оператор continue передает управление на ближайшую внешнюю проверку условия продолжения цикла. Для иллюстрации рассмотрим фрагмент другой программы double a[10][5]; for (j=0,s=0.0; j<10; j++) { for (i=0,p=1.0; i<5; i++) { if (a[j][i] == 0.0) break; p*=a[j][i]; } if (i <5) continue; s+=p; } Внутренний цикл по i прерывается, если обнаруживается нулевой элемент матрицы. В этом случае произведение элементов столбца заведомо равно нулю, и его не нужно вычислять. Во внешнем цикле проверяется значение i. Если i<5, т.е. элемент a[j][i] оказался нулевым, то оператор continue передает управление на ближайший оператор цикла, и, таким образом, не происходит увеличение s на величину "недосчитанного" значения р. Если внутренний цикл завершен естественно, то i равно 5, и оператор continue не может выполняться.
Не нашли, что искали? Воспользуйтесь поиском:
|