книги / Язык Си
..pdfа[ 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) ;