Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

а[ 0 ] [ 2 ] = 1 7 ;

а[ 1 ] [ 0 ] = - 5 ;

а[1] [1]=0;

а[1] [2]=3;

а[ 2 ] [ 0 ] = 2 ;

а[2][1]=1;

а[ 2 ] [ 2 ] = 1 5 ;

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

Если инициализаторов меньше, то оставшиеся значения эле­ ментов не определены.

int а [4]={2,6 >;

Неинициализированным элементам массива компилятор сам присвоит случайное значение.

В то же время инициализации

int а [3][5]={1,2,3,4,5,6,7,8,9,10,11};

И

int а[3][5]={{1,2,3},{4,5,6,7,8},{9,10,11}};

различны. Соответствующие массивы будут заполнены следую­ щим образом:

 

в первом случае

 

 

ВО ВТО зом случае

 

1

2

3

4

5

1

2

3

 

 

6

7

8

9

10

4

5

6

7

8

11

 

 

 

 

9

10

11

 

 

Если при объявлении массива сразу выполняется его инициа­ лизация, то размер массива можно не указывать, компилятор сам определит, сколько в массиве элементов. Если записать

то компилятор сам определит, что массив состоит из пяти элемен­ тов, т.е. ошибки не будет. Можно объявлять таким же способом массивы любого типа {char,float и т.д.) и многомерные массивы.

При объявлении массивов с неизвестным количеством эле­ ментов можно не указывать размер только в самых левых квадрат­ ных скобках:

int array[][3]={{1/2,3}/{5,6,7},{8,9,0}};

7.3. Обработка массивов

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

int

a,b[3]={4,2,3},c=10;

а =

b [2] ;

//а=3

Ь[0]

= с;

//теперь массив b заполнен так

b [1]

-= Ь[2]+а;

//{10,2,3}

//теперь массив b заполнен так

 

 

//{10,-4,3}

Не все компиляторы языка Си проверяют выход индекса за пределы массива:

float a[3]={12,15,4},b;

Ь = а [3];

Поскольку элемента а[3] в массиве вообще нет, то перемен­ ной Ъ будет присвоено какое-то случайное число. При этом сооб­ щение об ошибке выдано не будет, соответственно, дальнейшие вычисления с использованием Ъдадут неверные результаты.

Выход за пределы массива программист должен отсле­ живать сам.

Еще раз рассмотрим пример: вывести на экран заданный эле­ мент массива.

#include<conio.h>

#include<stdio.h> main()

{int i,a[7]={-10,4,0,7,-3,15,6};

printf("Введите номер элемента: "); scanf("%d",&i);

printf("%dM,a[i]);

getch(); return 0;

}

Введите номер элемента, например, 7 (индекс последнего элемента в массиве 6), и посмотрите, какой ответ получится.

В подавляющем большинстве случаев массивы обрабатыва­ ются через циклы.

Пример. Распечатать в столбец одномерный массив.

#include<conio.h>

#include<stdio.h>

main()

{int i,a[5]={10,20,30,40,50};

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

printf("%d\n",a[i]);

getch();

return 0;

Пример. Распечатать двумерный массив.

#include<conio.h>

#include<stdio.h>

main()

{int i,j;

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

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

printf ("%4d",a[i] [j]); printf("\n");

}

getch();

return 0;

Запомните эти примеры распечатки одномерного и двумерно­ го массивов. В дальнейшем мы будем постоянно пользоваться ими.

Пример. Найти сумму элементов одномерного массива.

#include<conio.h>

#include<stdio.h>

main()

{int i,a[5]={12,-3,4,6,12}, S=0; for(i=0;i<5;i++)

{S+=a[i]; //накапливаем сумму элементов массива //печатаем каждый элемент printf("a[%d]=%d\n",i,a[i]);

}

printf("\nSUMMA=%dM,S); //печатаем сумму getch();

return 0;

}

Пример. Найти произведение элементов одномерного мас­ сива, заданного пользователем.

#include<conio.h>

#include<stdio.h>

main()

{int i,a [5],P;

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

{printf("a[%d]=M,i);

scanf("%d",&a[i]); //считываем элементы

//массива с консоли

}

Р=1;

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

P*=a[i]; //накапливаем произведение элементов

printf("Proizvedenie=%d", Р) ;

getch(); return 0;

}

Запомните этот пример, особенно цикл, в котором мы считы­ вали элементы массива с консоли.

Пример. Найти среднее арифметическое элементов двумер­ ного массива.

#include<conio.h>

#include<stdio.h>

main()

{int i,j;

int a [3][3]={{10,20,30},{7,8,9},{11,12,13}}; float s=0;

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

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

s+=a[i] [j]; //перебираем все элементы массива, //добавляя их в s

s/=9; //делим сумму на число элементов printf("%f",s);

getch(); return 0;

}

Строка s/= 9; не относится к циклам (вспомните правило о первой точке с запятой, если нет фигурных скобок).

РЕШ ЕНИЕ ЗАДАЧ

Задача 1. Найти произведение матриц.

Вспомним правило перемножения матриц

<3° 1

сэ

*0,1

* 0 ,2

1

сэ

К,\

§* N) 1

1

о

*1,о

*1,1

*1

,2

 

К о

К

К г

=

с 1,о

 

 

_ а2,0

*2,1

* 2

,2 _

_ ^2 ,0

К

^ 2 ,2 _

_ С2,0

С0,1

си

С2,\

К) ___1

С1,2

С2 .2 _

Чтобы найти, например, элемент с12, нужно строку 1 матри­

цы А умножить на столбец 2 матрицы В (считаем, что индексация матриц начинается с 0), т.е.

^1,2 —*1,0^0,2 *1,1^1,2 *1,2^2,2

или в сокращенном виде:

^ = 2 Х а ,,>

(7.1)

где / = 1, j = 2 имеют в момент суммирования постоянные значе­ ния, а к меняется от нуля до двух.

#include<conio.h>

#include<stdio.h>

main()

{int

i, j,k, C [3] [3] ;

int

A [3][3]={{1,2,3},{4,5,6},{2,1,3}};

int

B[3][3]={{4,2,1},{3,1,2},{1,1,2}};

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

 

 

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

элементы матрицы

C[i][j]=0;

//зануляем

 

//С, поскольку к ним будем

 

//плюсовать

произведение (7.1)

//произведение матриц

for(i=0;i<3;i++) //перебираем строки матрицы А for(j=0;j<3;j++)//перебираем столбцы матрицы В f o r (k=0; k<3; k++)

C[i][j]+=A[i][k]*B[k][j]; //формула (7.1)

//стандартная печать двумерной матрицы f o r (i = 0 ; i < 3 ; i+ + )

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

printf("%4d",C[i][j]);

printf("\n");

>

getch();

return 0;

}

Отметим, что расстановка фигурных скобок f o r (i= 0 ; i< 3 ; i++)

{for(j=0;j<3;j++) for(k=0;k<3;k++)

C[i] [j]+=A[i] [k]*B[k] [j] ;

}

или

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

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

{for(k=0;k<3;k++)

C[i][j]+=A[i][k]*B[k][j];

}

}

или

for(i=0;i<3;i++) for(j=0;j<3;j++) {for(k=0;k<3;k++)

C[i][j]+=A[i][k]*B[k][j];

}

не изменит результат, поскольку первый оператор, заканчиваю­ щийся точкой с запятой после циклов, всего один:

С [i][j]+=A[i] [k]*B[k] [j];

Задача 2. Найти в одномерном массиве минимальный эле­ мент.

#include<conio.h>

 

#include<stdio.h>

 

main()

 

 

 

{int

i,k,n=5,MIN;

 

int

a [5]={13,10,-5,11,2};

 

MIN=a[0];

//пока считаем, что нулевой элемент

к=0;

 

//является минимальным

 

 

//запомним его индекс

 

for(i=l; i<n;

i++) //перебираем в цикле

{if(a[i]<MIN)

//все остальные

элементы

//если текущий элемент меньше

{MIN=a[i];

 

//минимального,

как

 

//то записываем его

 

 

 

//минимальный,

 

k=i; //запоминаем индекс минимального

//элемента

}

}

//печатаем минимальный элемент массива printf (,,MIN=%d" ,a [k] );

getch() ; return 0;

}

Задача 3. Найти в двумерном массиве максимальный эле­ мент.

#include<conio.h>

#include<stdio.h> main ()

{int i,j,n=3,imax,jmax,MAX;

int a [3] [3]={{13,10,-5}, {11,2,23}, {-6,9,0}};

MAX=-le6;

 

//начальное

значение

должно

быть

for(i=0;

 

//как можно

меньше

 

 

i<n;

i++)

//перебор

элементов по

for(j=0;

j<n;

j++)

//строкам

элементов по

//перебор

 

 

 

 

//столбцам

 

элемент

больше

{if(a[i][j]>МАХ) //если

текущий

{MAX=a[i][j];

//максимального

 

 

//то записываем его как

 

imax=i;

 

 

//максимальный

строки

 

 

//запоминаем индекс

 

jmax=j;

//минимального элемента

 

//запоминаем индекс

столбца

 

 

 

//минимального элемента

 

}

}

printf(nMAX=%d",a[imax][jmax]);

getch();

return 0;

}

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

#include<conio.h>

 

 

 

#include<stdio.h>

 

 

 

main()

 

 

 

 

{int

i,j,b ;

 

 

 

int

a[5]={13,10,-5,ll,2};

 

 

printf("Введите индексы

обмениваемых элементов:

scanf("%d%d",&i,&j);

 

 

 

b =

a[i];

//запоминаем

i-элемент в другую

a[i]

 

//переменную,

чтобы его

не потерять

= а [j]; //меняем i-элемент

на

j-элемент

а.[j] = b;

//меняем j-элемент

на

i-элемент

//печать одномерного массива for(i=0;i<5;i++) printf("%4d",a[i] );

getch() ; return 0;

}

При вводе индексов помним, что нумерация элементов начинается с нуля.

Задача 5. Поменять местами указанные строки двумерного массива.

J

0 4 - 1 8

Принцип обмена такой же, как в предыдущей задаче: необхо­ дима еще одна переменная b для временного хранения элемента из массива а, чтобы его не потерять. Однако здесь мы должны делать такой обмен, двигаясь от столбца к столбцу. Например, меняем нулевую и вторую строки двумерного массива (рисунок выше). Индексы обмениваемых строк обозначим kl, k2, индекс текущего столбца обозначим черезj.

#include<conio.h>

 

 

 

#include<stdio.h>

 

 

 

main()

 

 

 

{int

i,j,kl,k2,b;

2,

1,

3}

int

a [4] [4] ={ {3,

 

(4,

5,

7,

1}

 

{6,

1,

6,

4}

 

(0, 4,-1, 8}

 

};

 

 

 

printf("Введите номера обмениваемых строк: "); scant("%d%d",&kl, &k2) ;