Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК-1_АЯП_рус.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.19 Mб
Скачать

Int vect[10], s1[50];

float A[5], B[25];

В этом примере описаны два целочисленных массива: vect, содержащий 10 элементов, и S1, содержащий 50 элементов, и два массива действительных чисел A и B, содержащие 5 и 25 элементов соответственно.

При описании можно инициализировать элементы массива заданными значениями. Например:

int D[5]={23, 45, 32, 12, 88};

Для задания количества элементов в массиве удобно использовать именованные константы. Например:

const N=10, M=5;

Int vect [n];

float mas [M];

При этом корректировка программы в случае изменения размера массива сводится к минимуму: достаточно только изменить значение константы.

Для обращения к отдельному элементу массива следует указать имя массива и в квадратных скобках индекс (порядковый номер) этого элемента в массиве. При определении индекса элемента нужно помнить, что элементы в массиве нумеруются, начиная с нуля, т.е. индекс первого элемента равен 0, а индекс последнего элемента – на единицу меньше размера массива. Так, в нашем примере присваивание значений элементам может выглядеть следующим образом:

vect[0]=23;

A[0]=0.75;

S1[49]=vect[0];

В качестве индексов могут выступать переменные и произвольные выражения, тип которых должен соответствовать типу индексов в описании массива.

int i=2;

vect [i]=45;

vect [(i+1)*2]=5-i+1;

Для одномерного массива легко подсчитать, сколько байт в памяти будет занимать этот массив :

колич. байт=<размер типа элемнтов>*<количество элементов>.

В языке С под массив всегда выделяется непрерывное место в оперативной памяти. Это позволяет рассматривать массив как структуру произвольного (прямого) доступа, т.е. можно обращаться к любому элементу массива по его индексу i, не просматривая при этом предыдущие i-1 элемент. Зная порядковый номер элемента в массиве (его индекс) и тип элементов, можно легко определить адрес i-го элемента:

Адрес i =Адрес начала массива + i* длина типа элементов;

Если требуется произвести какие-либо действия с каждым элементом массива, то используют циклы. Например:

const N=10,

int A [N], i;

// заполнение массива значениями с клавиатуры

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

scanf (“%d”, &A[i]);

// вывод на экран значений элементов массива

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

printf (“%d ”, A[i]);

// обнуление элементов массива

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

A[i]=0;

В языке С не проверяется выход индекса за пределы массива. Если массив А[10] описан как целочисленный, имеющий 10 элементов, а вы в программе укажете А[20], то сообщение об ошибке не будет выдано, а в качестве значения элемента А[20] будет выдано некоторое число, занимающее соответствующие 2 байта.

Ниже приведены ряд программ по обработке одномерного массива:.

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

#include <stdio.h>

#include <conio.h>

#define N 5

Void main( )

{ int a[N];

Int min; // номер минимального элемента

int i;

printf (“ Введите в одной строке элементы массива \n”);

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

scanf( “%i”,&a[i]);

min=0;

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

if ( a[i]<a[min]) min=i;

printf (“Минимальный элемент массива:’’);

printf (“a[%i]=%i’’,min+1, a[min]);

getch( );

}

Результатат программы:

Введите в одной строке элементы массива

34 56 76 23 77

Минимальный элемент массива: a[4]=23

б) изменение порядка следования элементов массива на обратный

#include <stdio.h> void main() { int p,i=0; a[10]={10,11,12,13,14, 15,16,17,18,19}; while(i<10/2) { p=a[i]; a[i]=a[9-i]; a[9-i]=p; i++; } i=0; while(i<10)       printf(" %d",a[i++]); }

Результатат программы:

19 18 17 16 15 14 13 12 11 10

в) поиск разности максимального и минимального элемента массива с испрользованием функции

#include <stdio.h> int fmax(int x[10],int n) { int i=0, max=x[0]; while(i<n) { if(x[i]> max)    max=x[i]; i++; } return(max); } void main() { int a[10]={1,-2,3,-4,5,-6,7,-8,9,-13}; max=fmax(a,10); i=0; while(i<10) { a[i]=-a[i]; i++; } min=fmax(a,10); printf("макс-мин=%d\n",max+min); }

  Результатат программы:

макс-мин=22

г)поиск наибольшего числа одинаковых идущих подряд элементов массива.

   

#include <stdio.h> void main() {int a[]={5,6,6,6,4,3,3,3,3,3,8}; int n=10; int i,k,max; i=k=max=1; while(i<n) { if(a[i]==a[i-1]) k++; else { if(k>max)max=k; k=1; }i++; } printf("kmax=%d\n",(k>max)?k:max); }

  Результатат программы:

kmax=5

Двумерные массивы

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

Двумерный массив int a[3][4] можно представить в виде таблички:

a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

a[2][0]

a[2][1]

a[2][2]

a[2][3]

Первый индекс - номер строки, второй индекс - номер столбца. Количество байт памяти, которое необходимо для хранения массива, вычисляется по формуле

Колич.байт =размер типа данных *колич. строк *колич. столбцов

В памяти компьютера массив располагается непрерывно по строкам, т. е.

а[0][0], a[0][l], a[0][2], a[0][3], а[1][0], а[1][1], а[1][2], а[2][1], ..., а[2][3].

Пример описания двумерных массивов

const N=4, M=5;

int A[N][M], B[N][N];

float X[10][5], Y[M][N];

Обращение к элементам матрицы:

A[0][3]=8; X[1][2]=0.678;

B[2][0]= A[0][3]*2;

Y[2][1]=Y[2][2]=5.5;

Для однородной обработки каждого элемента матрицы используют вложенные циклы. Например,

//заполнение матрицы с помощью датчика случайных чисел

for (int i=0; i<N; i++) //цикл по строкам

for ( int j=0; j<M ; j++) //цикл внутри строки по столбцам

A[i][j]=random (50);

// заполнение единичной матрицы:

// элементы главной диагонали равны 1,

// все остальные элементы - 0

for ( i=0; i<N; i++) //цикл по строкам

for ( j=0; j<N ; j++) цикл внутри строки по столбцам

if (i==j) B[i][j]=1; else B[i][j]=0;

//обнуление матрицы

for ( i=0; i<M; i++) //цикл по строкам

for ( j=0; j<N ; j++) //цикл внутри строки по столбцам

Y[i][j]=0.0;

//вывод матрицы на экран

for ( i=0; i<M; i++) //цикл по строкам

{ for ( j=0; j<N ; j++) //цикл внутри строки по столбцам

printf (“%5.1 “,Y[i][j] );

printf (“\n “ ); // переход на новую строку

}

Ниже приведены программаы обработки элементов матрицы.В программе определяется минимальный элемент кажой строки матрицы и выполняется обмен местами найденого и диагональю этой же строки. 

#include <stdio.h> #define M 4 void main() {   int i, j, jmin, amin, a[M][M] ;

printf (“ Введите элементы матрицы \n”);

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

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

scanf( “%i”,& a[i][j]);

i=0; while(i<M) { amin=a[i][0]; jmin=0;j=1; while(j<m) { if(a[i][j]<amin) {amin=a[i][j]; jmin=j; } j++; } a[i][jmin]=a[i][i]; a[i][i]=amin; i++; }i=0;

printf (“ Преобразованная матрица \n”);

while(i<M) { j=0; while(j<M) printf("%3d",a[i][j++]);     printf("\n"); i++; } }

Результатат программы:

Введите элементы матрицы

3 4 1 5    -1 6 7 0     1 8 7 -1    4 9 7 -1

Преобразованная матрица

1 4 3 5   6 -1 7 0     1 8 -1 7    4 9 7 -1

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

Функции для работы со случайными числами

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

n = rand(); получить случайное целое число в интервале от 0 до RAND_MAX (это очень большое целое число — 32767)

srand ( m ); установить начальное значение случайной последовательности, равное m

􀀕 Случайные числа в заданном интервале

Для практических задач надо получать случайные числа в заданном интервале [a,b]. Если интервал начинается с нуля (a=0), можно использовать свойство операции взятия остатка от деления: остаток от деления числа на некоторое N всегда больше или равен нуля, но меньше N, то есть находиться в интервале [0,N-1]. Можно написать такую функцию